+
+## Overview
+
+Rollup is a module bundler for JavaScript which compiles small pieces of code into something larger and more complex, such as a library or application. It uses the standardized ES module format for code, instead of previous idiosyncratic solutions such as CommonJS and AMD. ES modules let you freely and seamlessly combine the most useful individual functions from your favorite libraries. Rollup can optimize ES modules for faster native loading in modern browsers, or output a legacy module format allowing ES module workflows today.
+
+## Quick Start Guide
+
+Install with `npm install --global rollup`. Rollup can be used either through a [command line interface](https://rollupjs.org/#command-line-reference) with an optional configuration file, or else through its [JavaScript API](https://rollupjs.org/guide/en/#javascript-api). Run `rollup --help` to see the available options and parameters. The starter project templates, [rollup-starter-lib](https://github.com/rollup/rollup-starter-lib) and [rollup-starter-app](https://github.com/rollup/rollup-starter-app), demonstrate common configuration options, and more detailed instructions are available throughout the [user guide](https://rollupjs.org/).
+
+### Commands
+
+These commands assume the entry point to your application is named main.js, and that you'd like all imports compiled into a single file named bundle.js.
+
+For browsers:
+
+```bash
+# compile to a -->
+
+--------------------------------------------------------------------------------
+
+
+
+
+
+## Table of Contents
+
+- [Examples](#examples)
+ - [Consuming a source map](#consuming-a-source-map)
+ - [Generating a source map](#generating-a-source-map)
+ - [With SourceNode (high level API)](#with-sourcenode-high-level-api)
+ - [With SourceMapGenerator (low level API)](#with-sourcemapgenerator-low-level-api)
+- [API](#api)
+ - [SourceMapConsumer](#sourcemapconsumer)
+ - [new SourceMapConsumer(rawSourceMap)](#new-sourcemapconsumerrawsourcemap)
+ - [SourceMapConsumer.prototype.computeColumnSpans()](#sourcemapconsumerprototypecomputecolumnspans)
+ - [SourceMapConsumer.prototype.originalPositionFor(generatedPosition)](#sourcemapconsumerprototypeoriginalpositionforgeneratedposition)
+ - [SourceMapConsumer.prototype.generatedPositionFor(originalPosition)](#sourcemapconsumerprototypegeneratedpositionfororiginalposition)
+ - [SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)](#sourcemapconsumerprototypeallgeneratedpositionsfororiginalposition)
+ - [SourceMapConsumer.prototype.hasContentsOfAllSources()](#sourcemapconsumerprototypehascontentsofallsources)
+ - [SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])](#sourcemapconsumerprototypesourcecontentforsource-returnnullonmissing)
+ - [SourceMapConsumer.prototype.eachMapping(callback, context, order)](#sourcemapconsumerprototypeeachmappingcallback-context-order)
+ - [SourceMapGenerator](#sourcemapgenerator)
+ - [new SourceMapGenerator([startOfSourceMap])](#new-sourcemapgeneratorstartofsourcemap)
+ - [SourceMapGenerator.fromSourceMap(sourceMapConsumer)](#sourcemapgeneratorfromsourcemapsourcemapconsumer)
+ - [SourceMapGenerator.prototype.addMapping(mapping)](#sourcemapgeneratorprototypeaddmappingmapping)
+ - [SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)](#sourcemapgeneratorprototypesetsourcecontentsourcefile-sourcecontent)
+ - [SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])](#sourcemapgeneratorprototypeapplysourcemapsourcemapconsumer-sourcefile-sourcemappath)
+ - [SourceMapGenerator.prototype.toString()](#sourcemapgeneratorprototypetostring)
+ - [SourceNode](#sourcenode)
+ - [new SourceNode([line, column, source[, chunk[, name]]])](#new-sourcenodeline-column-source-chunk-name)
+ - [SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])](#sourcenodefromstringwithsourcemapcode-sourcemapconsumer-relativepath)
+ - [SourceNode.prototype.add(chunk)](#sourcenodeprototypeaddchunk)
+ - [SourceNode.prototype.prepend(chunk)](#sourcenodeprototypeprependchunk)
+ - [SourceNode.prototype.setSourceContent(sourceFile, sourceContent)](#sourcenodeprototypesetsourcecontentsourcefile-sourcecontent)
+ - [SourceNode.prototype.walk(fn)](#sourcenodeprototypewalkfn)
+ - [SourceNode.prototype.walkSourceContents(fn)](#sourcenodeprototypewalksourcecontentsfn)
+ - [SourceNode.prototype.join(sep)](#sourcenodeprototypejoinsep)
+ - [SourceNode.prototype.replaceRight(pattern, replacement)](#sourcenodeprototypereplacerightpattern-replacement)
+ - [SourceNode.prototype.toString()](#sourcenodeprototypetostring)
+ - [SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])](#sourcenodeprototypetostringwithsourcemapstartofsourcemap)
+
+
+
+## Examples
+
+### Consuming a source map
+
+```js
+var rawSourceMap = {
+ version: 3,
+ file: 'min.js',
+ names: ['bar', 'baz', 'n'],
+ sources: ['one.js', 'two.js'],
+ sourceRoot: 'http://example.com/www/js/',
+ mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA'
+};
+
+var smc = new SourceMapConsumer(rawSourceMap);
+
+console.log(smc.sources);
+// [ 'http://example.com/www/js/one.js',
+// 'http://example.com/www/js/two.js' ]
+
+console.log(smc.originalPositionFor({
+ line: 2,
+ column: 28
+}));
+// { source: 'http://example.com/www/js/two.js',
+// line: 2,
+// column: 10,
+// name: 'n' }
+
+console.log(smc.generatedPositionFor({
+ source: 'http://example.com/www/js/two.js',
+ line: 2,
+ column: 10
+}));
+// { line: 2, column: 28 }
+
+smc.eachMapping(function (m) {
+ // ...
+});
+```
+
+### Generating a source map
+
+In depth guide:
+[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/)
+
+#### With SourceNode (high level API)
+
+```js
+function compile(ast) {
+ switch (ast.type) {
+ case 'BinaryExpression':
+ return new SourceNode(
+ ast.location.line,
+ ast.location.column,
+ ast.location.source,
+ [compile(ast.left), " + ", compile(ast.right)]
+ );
+ case 'Literal':
+ return new SourceNode(
+ ast.location.line,
+ ast.location.column,
+ ast.location.source,
+ String(ast.value)
+ );
+ // ...
+ default:
+ throw new Error("Bad AST");
+ }
+}
+
+var ast = parse("40 + 2", "add.js");
+console.log(compile(ast).toStringWithSourceMap({
+ file: 'add.js'
+}));
+// { code: '40 + 2',
+// map: [object SourceMapGenerator] }
+```
+
+#### With SourceMapGenerator (low level API)
+
+```js
+var map = new SourceMapGenerator({
+ file: "source-mapped.js"
+});
+
+map.addMapping({
+ generated: {
+ line: 10,
+ column: 35
+ },
+ source: "foo.js",
+ original: {
+ line: 33,
+ column: 2
+ },
+ name: "christopher"
+});
+
+console.log(map.toString());
+// '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}'
+```
+
+## API
+
+Get a reference to the module:
+
+```js
+// Node.js
+var sourceMap = require('source-map');
+
+// Browser builds
+var sourceMap = window.sourceMap;
+
+// Inside Firefox
+const sourceMap = require("devtools/toolkit/sourcemap/source-map.js");
+```
+
+### SourceMapConsumer
+
+A SourceMapConsumer instance represents a parsed source map which we can query
+for information about the original file positions by giving it a file position
+in the generated source.
+
+#### new SourceMapConsumer(rawSourceMap)
+
+The only parameter is the raw source map (either as a string which can be
+`JSON.parse`'d, or an object). According to the spec, source maps have the
+following attributes:
+
+* `version`: Which version of the source map spec this map is following.
+
+* `sources`: An array of URLs to the original source files.
+
+* `names`: An array of identifiers which can be referenced by individual
+ mappings.
+
+* `sourceRoot`: Optional. The URL root from which all sources are relative.
+
+* `sourcesContent`: Optional. An array of contents of the original source files.
+
+* `mappings`: A string of base64 VLQs which contain the actual mappings.
+
+* `file`: Optional. The generated filename this source map is associated with.
+
+```js
+var consumer = new sourceMap.SourceMapConsumer(rawSourceMapJsonData);
+```
+
+#### SourceMapConsumer.prototype.computeColumnSpans()
+
+Compute the last column for each generated mapping. The last column is
+inclusive.
+
+```js
+// Before:
+consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" })
+// [ { line: 2,
+// column: 1 },
+// { line: 2,
+// column: 10 },
+// { line: 2,
+// column: 20 } ]
+
+consumer.computeColumnSpans();
+
+// After:
+consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" })
+// [ { line: 2,
+// column: 1,
+// lastColumn: 9 },
+// { line: 2,
+// column: 10,
+// lastColumn: 19 },
+// { line: 2,
+// column: 20,
+// lastColumn: Infinity } ]
+
+```
+
+#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition)
+
+Returns the original source, line, and column information for the generated
+source's line and column positions provided. The only argument is an object with
+the following properties:
+
+* `line`: The line number in the generated source. Line numbers in
+ this library are 1-based (note that the underlying source map
+ specification uses 0-based line numbers -- this library handles the
+ translation).
+
+* `column`: The column number in the generated source. Column numbers
+ in this library are 0-based.
+
+* `bias`: Either `SourceMapConsumer.GREATEST_LOWER_BOUND` or
+ `SourceMapConsumer.LEAST_UPPER_BOUND`. Specifies whether to return the closest
+ element that is smaller than or greater than the one we are searching for,
+ respectively, if the exact element cannot be found. Defaults to
+ `SourceMapConsumer.GREATEST_LOWER_BOUND`.
+
+and an object is returned with the following properties:
+
+* `source`: The original source file, or null if this information is not
+ available.
+
+* `line`: The line number in the original source, or null if this information is
+ not available. The line number is 1-based.
+
+* `column`: The column number in the original source, or null if this
+ information is not available. The column number is 0-based.
+
+* `name`: The original identifier, or null if this information is not available.
+
+```js
+consumer.originalPositionFor({ line: 2, column: 10 })
+// { source: 'foo.coffee',
+// line: 2,
+// column: 2,
+// name: null }
+
+consumer.originalPositionFor({ line: 99999999999999999, column: 999999999999999 })
+// { source: null,
+// line: null,
+// column: null,
+// name: null }
+```
+
+#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition)
+
+Returns the generated line and column information for the original source,
+line, and column positions provided. The only argument is an object with
+the following properties:
+
+* `source`: The filename of the original source.
+
+* `line`: The line number in the original source. The line number is
+ 1-based.
+
+* `column`: The column number in the original source. The column
+ number is 0-based.
+
+and an object is returned with the following properties:
+
+* `line`: The line number in the generated source, or null. The line
+ number is 1-based.
+
+* `column`: The column number in the generated source, or null. The
+ column number is 0-based.
+
+```js
+consumer.generatedPositionFor({ source: "example.js", line: 2, column: 10 })
+// { line: 1,
+// column: 56 }
+```
+
+#### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)
+
+Returns all generated line and column information for the original source, line,
+and column provided. If no column is provided, returns all mappings
+corresponding to a either the line we are searching for or the next closest line
+that has any mappings. Otherwise, returns all mappings corresponding to the
+given line and either the column we are searching for or the next closest column
+that has any offsets.
+
+The only argument is an object with the following properties:
+
+* `source`: The filename of the original source.
+
+* `line`: The line number in the original source. The line number is
+ 1-based.
+
+* `column`: Optional. The column number in the original source. The
+ column number is 0-based.
+
+and an array of objects is returned, each with the following properties:
+
+* `line`: The line number in the generated source, or null. The line
+ number is 1-based.
+
+* `column`: The column number in the generated source, or null. The
+ column number is 0-based.
+
+```js
+consumer.allGeneratedpositionsfor({ line: 2, source: "foo.coffee" })
+// [ { line: 2,
+// column: 1 },
+// { line: 2,
+// column: 10 },
+// { line: 2,
+// column: 20 } ]
+```
+
+#### SourceMapConsumer.prototype.hasContentsOfAllSources()
+
+Return true if we have the embedded source content for every source listed in
+the source map, false otherwise.
+
+In other words, if this method returns `true`, then
+`consumer.sourceContentFor(s)` will succeed for every source `s` in
+`consumer.sources`.
+
+```js
+// ...
+if (consumer.hasContentsOfAllSources()) {
+ consumerReadyCallback(consumer);
+} else {
+ fetchSources(consumer, consumerReadyCallback);
+}
+// ...
+```
+
+#### SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])
+
+Returns the original source content for the source provided. The only
+argument is the URL of the original source file.
+
+If the source content for the given source is not found, then an error is
+thrown. Optionally, pass `true` as the second param to have `null` returned
+instead.
+
+```js
+consumer.sources
+// [ "my-cool-lib.clj" ]
+
+consumer.sourceContentFor("my-cool-lib.clj")
+// "..."
+
+consumer.sourceContentFor("this is not in the source map");
+// Error: "this is not in the source map" is not in the source map
+
+consumer.sourceContentFor("this is not in the source map", true);
+// null
+```
+
+#### SourceMapConsumer.prototype.eachMapping(callback, context, order)
+
+Iterate over each mapping between an original source/line/column and a
+generated line/column in this source map.
+
+* `callback`: The function that is called with each mapping. Mappings have the
+ form `{ source, generatedLine, generatedColumn, originalLine, originalColumn,
+ name }`
+
+* `context`: Optional. If specified, this object will be the value of `this`
+ every time that `callback` is called.
+
+* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or
+ `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over
+ the mappings sorted by the generated file's line/column order or the
+ original's source/line/column order, respectively. Defaults to
+ `SourceMapConsumer.GENERATED_ORDER`.
+
+```js
+consumer.eachMapping(function (m) { console.log(m); })
+// ...
+// { source: 'illmatic.js',
+// generatedLine: 1,
+// generatedColumn: 0,
+// originalLine: 1,
+// originalColumn: 0,
+// name: null }
+// { source: 'illmatic.js',
+// generatedLine: 2,
+// generatedColumn: 0,
+// originalLine: 2,
+// originalColumn: 0,
+// name: null }
+// ...
+```
+### SourceMapGenerator
+
+An instance of the SourceMapGenerator represents a source map which is being
+built incrementally.
+
+#### new SourceMapGenerator([startOfSourceMap])
+
+You may pass an object with the following properties:
+
+* `file`: The filename of the generated source that this source map is
+ associated with.
+
+* `sourceRoot`: A root for all relative URLs in this source map.
+
+* `skipValidation`: Optional. When `true`, disables validation of mappings as
+ they are added. This can improve performance but should be used with
+ discretion, as a last resort. Even then, one should avoid using this flag when
+ running tests, if possible.
+
+```js
+var generator = new sourceMap.SourceMapGenerator({
+ file: "my-generated-javascript-file.js",
+ sourceRoot: "http://example.com/app/js/"
+});
+```
+
+#### SourceMapGenerator.fromSourceMap(sourceMapConsumer)
+
+Creates a new `SourceMapGenerator` from an existing `SourceMapConsumer` instance.
+
+* `sourceMapConsumer` The SourceMap.
+
+```js
+var generator = sourceMap.SourceMapGenerator.fromSourceMap(consumer);
+```
+
+#### SourceMapGenerator.prototype.addMapping(mapping)
+
+Add a single mapping from original source line and column to the generated
+source's line and column for this source map being created. The mapping object
+should have the following properties:
+
+* `generated`: An object with the generated line and column positions.
+
+* `original`: An object with the original line and column positions.
+
+* `source`: The original source file (relative to the sourceRoot).
+
+* `name`: An optional original token name for this mapping.
+
+```js
+generator.addMapping({
+ source: "module-one.scm",
+ original: { line: 128, column: 0 },
+ generated: { line: 3, column: 456 }
+})
+```
+
+#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)
+
+Set the source content for an original source file.
+
+* `sourceFile` the URL of the original source file.
+
+* `sourceContent` the content of the source file.
+
+```js
+generator.setSourceContent("module-one.scm",
+ fs.readFileSync("path/to/module-one.scm"))
+```
+
+#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])
+
+Applies a SourceMap for a source file to the SourceMap.
+Each mapping to the supplied source file is rewritten using the
+supplied SourceMap. Note: The resolution for the resulting mappings
+is the minimum of this map and the supplied map.
+
+* `sourceMapConsumer`: The SourceMap to be applied.
+
+* `sourceFile`: Optional. The filename of the source file.
+ If omitted, sourceMapConsumer.file will be used, if it exists.
+ Otherwise an error will be thrown.
+
+* `sourceMapPath`: Optional. The dirname of the path to the SourceMap
+ to be applied. If relative, it is relative to the SourceMap.
+
+ This parameter is needed when the two SourceMaps aren't in the same
+ directory, and the SourceMap to be applied contains relative source
+ paths. If so, those relative source paths need to be rewritten
+ relative to the SourceMap.
+
+ If omitted, it is assumed that both SourceMaps are in the same directory,
+ thus not needing any rewriting. (Supplying `'.'` has the same effect.)
+
+#### SourceMapGenerator.prototype.toString()
+
+Renders the source map being generated to a string.
+
+```js
+generator.toString()
+// '{"version":3,"sources":["module-one.scm"],"names":[],"mappings":"...snip...","file":"my-generated-javascript-file.js","sourceRoot":"http://example.com/app/js/"}'
+```
+
+### SourceNode
+
+SourceNodes provide a way to abstract over interpolating and/or concatenating
+snippets of generated JavaScript source code, while maintaining the line and
+column information associated between those snippets and the original source
+code. This is useful as the final intermediate representation a compiler might
+use before outputting the generated JS and source map.
+
+#### new SourceNode([line, column, source[, chunk[, name]]])
+
+* `line`: The original line number associated with this source node, or null if
+ it isn't associated with an original line. The line number is 1-based.
+
+* `column`: The original column number associated with this source node, or null
+ if it isn't associated with an original column. The column number
+ is 0-based.
+
+* `source`: The original source's filename; null if no filename is provided.
+
+* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see
+ below.
+
+* `name`: Optional. The original identifier.
+
+```js
+var node = new SourceNode(1, 2, "a.cpp", [
+ new SourceNode(3, 4, "b.cpp", "extern int status;\n"),
+ new SourceNode(5, 6, "c.cpp", "std::string* make_string(size_t n);\n"),
+ new SourceNode(7, 8, "d.cpp", "int main(int argc, char** argv) {}\n"),
+]);
+```
+
+#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])
+
+Creates a SourceNode from generated code and a SourceMapConsumer.
+
+* `code`: The generated code
+
+* `sourceMapConsumer` The SourceMap for the generated code
+
+* `relativePath` The optional path that relative sources in `sourceMapConsumer`
+ should be relative to.
+
+```js
+var consumer = new SourceMapConsumer(fs.readFileSync("path/to/my-file.js.map", "utf8"));
+var node = SourceNode.fromStringWithSourceMap(fs.readFileSync("path/to/my-file.js"),
+ consumer);
+```
+
+#### SourceNode.prototype.add(chunk)
+
+Add a chunk of generated JS to this source node.
+
+* `chunk`: A string snippet of generated JS code, another instance of
+ `SourceNode`, or an array where each member is one of those things.
+
+```js
+node.add(" + ");
+node.add(otherNode);
+node.add([leftHandOperandNode, " + ", rightHandOperandNode]);
+```
+
+#### SourceNode.prototype.prepend(chunk)
+
+Prepend a chunk of generated JS to this source node.
+
+* `chunk`: A string snippet of generated JS code, another instance of
+ `SourceNode`, or an array where each member is one of those things.
+
+```js
+node.prepend("/** Build Id: f783haef86324gf **/\n\n");
+```
+
+#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent)
+
+Set the source content for a source file. This will be added to the
+`SourceMap` in the `sourcesContent` field.
+
+* `sourceFile`: The filename of the source file
+
+* `sourceContent`: The content of the source file
+
+```js
+node.setSourceContent("module-one.scm",
+ fs.readFileSync("path/to/module-one.scm"))
+```
+
+#### SourceNode.prototype.walk(fn)
+
+Walk over the tree of JS snippets in this node and its children. The walking
+function is called once for each snippet of JS and is passed that snippet and
+the its original associated source's line/column location.
+
+* `fn`: The traversal function.
+
+```js
+var node = new SourceNode(1, 2, "a.js", [
+ new SourceNode(3, 4, "b.js", "uno"),
+ "dos",
+ [
+ "tres",
+ new SourceNode(5, 6, "c.js", "quatro")
+ ]
+]);
+
+node.walk(function (code, loc) { console.log("WALK:", code, loc); })
+// WALK: uno { source: 'b.js', line: 3, column: 4, name: null }
+// WALK: dos { source: 'a.js', line: 1, column: 2, name: null }
+// WALK: tres { source: 'a.js', line: 1, column: 2, name: null }
+// WALK: quatro { source: 'c.js', line: 5, column: 6, name: null }
+```
+
+#### SourceNode.prototype.walkSourceContents(fn)
+
+Walk over the tree of SourceNodes. The walking function is called for each
+source file content and is passed the filename and source content.
+
+* `fn`: The traversal function.
+
+```js
+var a = new SourceNode(1, 2, "a.js", "generated from a");
+a.setSourceContent("a.js", "original a");
+var b = new SourceNode(1, 2, "b.js", "generated from b");
+b.setSourceContent("b.js", "original b");
+var c = new SourceNode(1, 2, "c.js", "generated from c");
+c.setSourceContent("c.js", "original c");
+
+var node = new SourceNode(null, null, null, [a, b, c]);
+node.walkSourceContents(function (source, contents) { console.log("WALK:", source, ":", contents); })
+// WALK: a.js : original a
+// WALK: b.js : original b
+// WALK: c.js : original c
+```
+
+#### SourceNode.prototype.join(sep)
+
+Like `Array.prototype.join` except for SourceNodes. Inserts the separator
+between each of this source node's children.
+
+* `sep`: The separator.
+
+```js
+var lhs = new SourceNode(1, 2, "a.rs", "my_copy");
+var operand = new SourceNode(3, 4, "a.rs", "=");
+var rhs = new SourceNode(5, 6, "a.rs", "orig.clone()");
+
+var node = new SourceNode(null, null, null, [ lhs, operand, rhs ]);
+var joinedNode = node.join(" ");
+```
+
+#### SourceNode.prototype.replaceRight(pattern, replacement)
+
+Call `String.prototype.replace` on the very right-most source snippet. Useful
+for trimming white space from the end of a source node, etc.
+
+* `pattern`: The pattern to replace.
+
+* `replacement`: The thing to replace the pattern with.
+
+```js
+// Trim trailing white space.
+node.replaceRight(/\s*$/, "");
+```
+
+#### SourceNode.prototype.toString()
+
+Return the string representation of this source node. Walks over the tree and
+concatenates all the various snippets together to one string.
+
+```js
+var node = new SourceNode(1, 2, "a.js", [
+ new SourceNode(3, 4, "b.js", "uno"),
+ "dos",
+ [
+ "tres",
+ new SourceNode(5, 6, "c.js", "quatro")
+ ]
+]);
+
+node.toString()
+// 'unodostresquatro'
+```
+
+#### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])
+
+Returns the string representation of this tree of source nodes, plus a
+SourceMapGenerator which contains all the mappings between the generated and
+original sources.
+
+The arguments are the same as those to `new SourceMapGenerator`.
+
+```js
+var node = new SourceNode(1, 2, "a.js", [
+ new SourceNode(3, 4, "b.js", "uno"),
+ "dos",
+ [
+ "tres",
+ new SourceNode(5, 6, "c.js", "quatro")
+ ]
+]);
+
+node.toStringWithSourceMap({ file: "my-output-file.js" })
+// { code: 'unodostresquatro',
+// map: [object SourceMapGenerator] }
+```
diff --git a/frontend/node_modules/source-map-js/lib/array-set.js b/frontend/node_modules/source-map-js/lib/array-set.js
new file mode 100644
index 00000000..fbd5c81c
--- /dev/null
+++ b/frontend/node_modules/source-map-js/lib/array-set.js
@@ -0,0 +1,121 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+var util = require('./util');
+var has = Object.prototype.hasOwnProperty;
+var hasNativeMap = typeof Map !== "undefined";
+
+/**
+ * A data structure which is a combination of an array and a set. Adding a new
+ * member is O(1), testing for membership is O(1), and finding the index of an
+ * element is O(1). Removing elements from the set is not supported. Only
+ * strings are supported for membership.
+ */
+function ArraySet() {
+ this._array = [];
+ this._set = hasNativeMap ? new Map() : Object.create(null);
+}
+
+/**
+ * Static method for creating ArraySet instances from an existing array.
+ */
+ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
+ var set = new ArraySet();
+ for (var i = 0, len = aArray.length; i < len; i++) {
+ set.add(aArray[i], aAllowDuplicates);
+ }
+ return set;
+};
+
+/**
+ * Return how many unique items are in this ArraySet. If duplicates have been
+ * added, than those do not count towards the size.
+ *
+ * @returns Number
+ */
+ArraySet.prototype.size = function ArraySet_size() {
+ return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
+};
+
+/**
+ * Add the given string to this set.
+ *
+ * @param String aStr
+ */
+ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
+ var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
+ var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
+ var idx = this._array.length;
+ if (!isDuplicate || aAllowDuplicates) {
+ this._array.push(aStr);
+ }
+ if (!isDuplicate) {
+ if (hasNativeMap) {
+ this._set.set(aStr, idx);
+ } else {
+ this._set[sStr] = idx;
+ }
+ }
+};
+
+/**
+ * Is the given string a member of this set?
+ *
+ * @param String aStr
+ */
+ArraySet.prototype.has = function ArraySet_has(aStr) {
+ if (hasNativeMap) {
+ return this._set.has(aStr);
+ } else {
+ var sStr = util.toSetString(aStr);
+ return has.call(this._set, sStr);
+ }
+};
+
+/**
+ * What is the index of the given string in the array?
+ *
+ * @param String aStr
+ */
+ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
+ if (hasNativeMap) {
+ var idx = this._set.get(aStr);
+ if (idx >= 0) {
+ return idx;
+ }
+ } else {
+ var sStr = util.toSetString(aStr);
+ if (has.call(this._set, sStr)) {
+ return this._set[sStr];
+ }
+ }
+
+ throw new Error('"' + aStr + '" is not in the set.');
+};
+
+/**
+ * What is the element at the given index?
+ *
+ * @param Number aIdx
+ */
+ArraySet.prototype.at = function ArraySet_at(aIdx) {
+ if (aIdx >= 0 && aIdx < this._array.length) {
+ return this._array[aIdx];
+ }
+ throw new Error('No element indexed by ' + aIdx);
+};
+
+/**
+ * Returns the array representation of this set (which has the proper indices
+ * indicated by indexOf). Note that this is a copy of the internal array used
+ * for storing the members so that no one can mess with internal state.
+ */
+ArraySet.prototype.toArray = function ArraySet_toArray() {
+ return this._array.slice();
+};
+
+exports.ArraySet = ArraySet;
diff --git a/frontend/node_modules/source-map-js/lib/base64-vlq.js b/frontend/node_modules/source-map-js/lib/base64-vlq.js
new file mode 100644
index 00000000..612b4040
--- /dev/null
+++ b/frontend/node_modules/source-map-js/lib/base64-vlq.js
@@ -0,0 +1,140 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ *
+ * Based on the Base 64 VLQ implementation in Closure Compiler:
+ * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
+ *
+ * Copyright 2011 The Closure Compiler Authors. All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+var base64 = require('./base64');
+
+// A single base 64 digit can contain 6 bits of data. For the base 64 variable
+// length quantities we use in the source map spec, the first bit is the sign,
+// the next four bits are the actual value, and the 6th bit is the
+// continuation bit. The continuation bit tells us whether there are more
+// digits in this value following this digit.
+//
+// Continuation
+// | Sign
+// | |
+// V V
+// 101011
+
+var VLQ_BASE_SHIFT = 5;
+
+// binary: 100000
+var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
+
+// binary: 011111
+var VLQ_BASE_MASK = VLQ_BASE - 1;
+
+// binary: 100000
+var VLQ_CONTINUATION_BIT = VLQ_BASE;
+
+/**
+ * Converts from a two-complement value to a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
+ * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
+ */
+function toVLQSigned(aValue) {
+ return aValue < 0
+ ? ((-aValue) << 1) + 1
+ : (aValue << 1) + 0;
+}
+
+/**
+ * Converts to a two-complement value from a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1
+ * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2
+ */
+function fromVLQSigned(aValue) {
+ var isNegative = (aValue & 1) === 1;
+ var shifted = aValue >> 1;
+ return isNegative
+ ? -shifted
+ : shifted;
+}
+
+/**
+ * Returns the base 64 VLQ encoded value.
+ */
+exports.encode = function base64VLQ_encode(aValue) {
+ var encoded = "";
+ var digit;
+
+ var vlq = toVLQSigned(aValue);
+
+ do {
+ digit = vlq & VLQ_BASE_MASK;
+ vlq >>>= VLQ_BASE_SHIFT;
+ if (vlq > 0) {
+ // There are still more digits in this value, so we must make sure the
+ // continuation bit is marked.
+ digit |= VLQ_CONTINUATION_BIT;
+ }
+ encoded += base64.encode(digit);
+ } while (vlq > 0);
+
+ return encoded;
+};
+
+/**
+ * Decodes the next base 64 VLQ value from the given string and returns the
+ * value and the rest of the string via the out parameter.
+ */
+exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
+ var strLen = aStr.length;
+ var result = 0;
+ var shift = 0;
+ var continuation, digit;
+
+ do {
+ if (aIndex >= strLen) {
+ throw new Error("Expected more digits in base 64 VLQ value.");
+ }
+
+ digit = base64.decode(aStr.charCodeAt(aIndex++));
+ if (digit === -1) {
+ throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
+ }
+
+ continuation = !!(digit & VLQ_CONTINUATION_BIT);
+ digit &= VLQ_BASE_MASK;
+ result = result + (digit << shift);
+ shift += VLQ_BASE_SHIFT;
+ } while (continuation);
+
+ aOutParam.value = fromVLQSigned(result);
+ aOutParam.rest = aIndex;
+};
diff --git a/frontend/node_modules/source-map-js/lib/base64.js b/frontend/node_modules/source-map-js/lib/base64.js
new file mode 100644
index 00000000..8aa86b30
--- /dev/null
+++ b/frontend/node_modules/source-map-js/lib/base64.js
@@ -0,0 +1,67 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
+
+/**
+ * Encode an integer in the range of 0 to 63 to a single base 64 digit.
+ */
+exports.encode = function (number) {
+ if (0 <= number && number < intToCharMap.length) {
+ return intToCharMap[number];
+ }
+ throw new TypeError("Must be between 0 and 63: " + number);
+};
+
+/**
+ * Decode a single base 64 character code digit to an integer. Returns -1 on
+ * failure.
+ */
+exports.decode = function (charCode) {
+ var bigA = 65; // 'A'
+ var bigZ = 90; // 'Z'
+
+ var littleA = 97; // 'a'
+ var littleZ = 122; // 'z'
+
+ var zero = 48; // '0'
+ var nine = 57; // '9'
+
+ var plus = 43; // '+'
+ var slash = 47; // '/'
+
+ var littleOffset = 26;
+ var numberOffset = 52;
+
+ // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ if (bigA <= charCode && charCode <= bigZ) {
+ return (charCode - bigA);
+ }
+
+ // 26 - 51: abcdefghijklmnopqrstuvwxyz
+ if (littleA <= charCode && charCode <= littleZ) {
+ return (charCode - littleA + littleOffset);
+ }
+
+ // 52 - 61: 0123456789
+ if (zero <= charCode && charCode <= nine) {
+ return (charCode - zero + numberOffset);
+ }
+
+ // 62: +
+ if (charCode == plus) {
+ return 62;
+ }
+
+ // 63: /
+ if (charCode == slash) {
+ return 63;
+ }
+
+ // Invalid base64 digit.
+ return -1;
+};
diff --git a/frontend/node_modules/source-map-js/lib/binary-search.js b/frontend/node_modules/source-map-js/lib/binary-search.js
new file mode 100644
index 00000000..010ac941
--- /dev/null
+++ b/frontend/node_modules/source-map-js/lib/binary-search.js
@@ -0,0 +1,111 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+exports.GREATEST_LOWER_BOUND = 1;
+exports.LEAST_UPPER_BOUND = 2;
+
+/**
+ * Recursive implementation of binary search.
+ *
+ * @param aLow Indices here and lower do not contain the needle.
+ * @param aHigh Indices here and higher do not contain the needle.
+ * @param aNeedle The element being searched for.
+ * @param aHaystack The non-empty array being searched.
+ * @param aCompare Function which takes two elements and returns -1, 0, or 1.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ */
+function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
+ // This function terminates when one of the following is true:
+ //
+ // 1. We find the exact element we are looking for.
+ //
+ // 2. We did not find the exact element, but we can return the index of
+ // the next-closest element.
+ //
+ // 3. We did not find the exact element, and there is no next-closest
+ // element than the one we are searching for, so we return -1.
+ var mid = Math.floor((aHigh - aLow) / 2) + aLow;
+ var cmp = aCompare(aNeedle, aHaystack[mid], true);
+ if (cmp === 0) {
+ // Found the element we are looking for.
+ return mid;
+ }
+ else if (cmp > 0) {
+ // Our needle is greater than aHaystack[mid].
+ if (aHigh - mid > 1) {
+ // The element is in the upper half.
+ return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
+ }
+
+ // The exact needle element was not found in this haystack. Determine if
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return aHigh < aHaystack.length ? aHigh : -1;
+ } else {
+ return mid;
+ }
+ }
+ else {
+ // Our needle is less than aHaystack[mid].
+ if (mid - aLow > 1) {
+ // The element is in the lower half.
+ return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
+ }
+
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return mid;
+ } else {
+ return aLow < 0 ? -1 : aLow;
+ }
+ }
+}
+
+/**
+ * This is an implementation of binary search which will always try and return
+ * the index of the closest element if there is no exact hit. This is because
+ * mappings between original and generated line/col pairs are single points,
+ * and there is an implicit region between each of them, so a miss just means
+ * that you aren't on the very start of a region.
+ *
+ * @param aNeedle The element you are looking for.
+ * @param aHaystack The array that is being searched.
+ * @param aCompare A function which takes the needle and an element in the
+ * array and returns -1, 0, or 1 depending on whether the needle is less
+ * than, equal to, or greater than the element, respectively.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
+ */
+exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
+ if (aHaystack.length === 0) {
+ return -1;
+ }
+
+ var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
+ aCompare, aBias || exports.GREATEST_LOWER_BOUND);
+ if (index < 0) {
+ return -1;
+ }
+
+ // We have found either the exact element, or the next-closest element than
+ // the one we are searching for. However, there may be more than one such
+ // element. Make sure we always return the smallest of these.
+ while (index - 1 >= 0) {
+ if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
+ break;
+ }
+ --index;
+ }
+
+ return index;
+};
diff --git a/frontend/node_modules/source-map-js/lib/mapping-list.js b/frontend/node_modules/source-map-js/lib/mapping-list.js
new file mode 100644
index 00000000..06d1274a
--- /dev/null
+++ b/frontend/node_modules/source-map-js/lib/mapping-list.js
@@ -0,0 +1,79 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2014 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+var util = require('./util');
+
+/**
+ * Determine whether mappingB is after mappingA with respect to generated
+ * position.
+ */
+function generatedPositionAfter(mappingA, mappingB) {
+ // Optimized for most common case
+ var lineA = mappingA.generatedLine;
+ var lineB = mappingB.generatedLine;
+ var columnA = mappingA.generatedColumn;
+ var columnB = mappingB.generatedColumn;
+ return lineB > lineA || lineB == lineA && columnB >= columnA ||
+ util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
+}
+
+/**
+ * A data structure to provide a sorted view of accumulated mappings in a
+ * performance conscious manner. It trades a neglibable overhead in general
+ * case for a large speedup in case of mappings being added in order.
+ */
+function MappingList() {
+ this._array = [];
+ this._sorted = true;
+ // Serves as infimum
+ this._last = {generatedLine: -1, generatedColumn: 0};
+}
+
+/**
+ * Iterate through internal items. This method takes the same arguments that
+ * `Array.prototype.forEach` takes.
+ *
+ * NOTE: The order of the mappings is NOT guaranteed.
+ */
+MappingList.prototype.unsortedForEach =
+ function MappingList_forEach(aCallback, aThisArg) {
+ this._array.forEach(aCallback, aThisArg);
+ };
+
+/**
+ * Add the given source mapping.
+ *
+ * @param Object aMapping
+ */
+MappingList.prototype.add = function MappingList_add(aMapping) {
+ if (generatedPositionAfter(this._last, aMapping)) {
+ this._last = aMapping;
+ this._array.push(aMapping);
+ } else {
+ this._sorted = false;
+ this._array.push(aMapping);
+ }
+};
+
+/**
+ * Returns the flat, sorted array of mappings. The mappings are sorted by
+ * generated position.
+ *
+ * WARNING: This method returns internal data without copying, for
+ * performance. The return value must NOT be mutated, and should be treated as
+ * an immutable borrow. If you want to take ownership, you must make your own
+ * copy.
+ */
+MappingList.prototype.toArray = function MappingList_toArray() {
+ if (!this._sorted) {
+ this._array.sort(util.compareByGeneratedPositionsInflated);
+ this._sorted = true;
+ }
+ return this._array;
+};
+
+exports.MappingList = MappingList;
diff --git a/frontend/node_modules/source-map-js/lib/quick-sort.js b/frontend/node_modules/source-map-js/lib/quick-sort.js
new file mode 100644
index 00000000..23f9eda5
--- /dev/null
+++ b/frontend/node_modules/source-map-js/lib/quick-sort.js
@@ -0,0 +1,132 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+// It turns out that some (most?) JavaScript engines don't self-host
+// `Array.prototype.sort`. This makes sense because C++ will likely remain
+// faster than JS when doing raw CPU-intensive sorting. However, when using a
+// custom comparator function, calling back and forth between the VM's C++ and
+// JIT'd JS is rather slow *and* loses JIT type information, resulting in
+// worse generated code for the comparator function than would be optimal. In
+// fact, when sorting with a comparator, these costs outweigh the benefits of
+// sorting in C++. By using our own JS-implemented Quick Sort (below), we get
+// a ~3500ms mean speed-up in `bench/bench.html`.
+
+function SortTemplate(comparator) {
+
+/**
+ * Swap the elements indexed by `x` and `y` in the array `ary`.
+ *
+ * @param {Array} ary
+ * The array.
+ * @param {Number} x
+ * The index of the first item.
+ * @param {Number} y
+ * The index of the second item.
+ */
+function swap(ary, x, y) {
+ var temp = ary[x];
+ ary[x] = ary[y];
+ ary[y] = temp;
+}
+
+/**
+ * Returns a random integer within the range `low .. high` inclusive.
+ *
+ * @param {Number} low
+ * The lower bound on the range.
+ * @param {Number} high
+ * The upper bound on the range.
+ */
+function randomIntInRange(low, high) {
+ return Math.round(low + (Math.random() * (high - low)));
+}
+
+/**
+ * The Quick Sort algorithm.
+ *
+ * @param {Array} ary
+ * An array to sort.
+ * @param {function} comparator
+ * Function to use to compare two items.
+ * @param {Number} p
+ * Start index of the array
+ * @param {Number} r
+ * End index of the array
+ */
+function doQuickSort(ary, comparator, p, r) {
+ // If our lower bound is less than our upper bound, we (1) partition the
+ // array into two pieces and (2) recurse on each half. If it is not, this is
+ // the empty array and our base case.
+
+ if (p < r) {
+ // (1) Partitioning.
+ //
+ // The partitioning chooses a pivot between `p` and `r` and moves all
+ // elements that are less than or equal to the pivot to the before it, and
+ // all the elements that are greater than it after it. The effect is that
+ // once partition is done, the pivot is in the exact place it will be when
+ // the array is put in sorted order, and it will not need to be moved
+ // again. This runs in O(n) time.
+
+ // Always choose a random pivot so that an input array which is reverse
+ // sorted does not cause O(n^2) running time.
+ var pivotIndex = randomIntInRange(p, r);
+ var i = p - 1;
+
+ swap(ary, pivotIndex, r);
+ var pivot = ary[r];
+
+ // Immediately after `j` is incremented in this loop, the following hold
+ // true:
+ //
+ // * Every element in `ary[p .. i]` is less than or equal to the pivot.
+ //
+ // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.
+ for (var j = p; j < r; j++) {
+ if (comparator(ary[j], pivot, false) <= 0) {
+ i += 1;
+ swap(ary, i, j);
+ }
+ }
+
+ swap(ary, i + 1, j);
+ var q = i + 1;
+
+ // (2) Recurse on each half.
+
+ doQuickSort(ary, comparator, p, q - 1);
+ doQuickSort(ary, comparator, q + 1, r);
+ }
+}
+
+ return doQuickSort;
+}
+
+function cloneSort(comparator) {
+ let template = SortTemplate.toString();
+ let templateFn = new Function(`return ${template}`)();
+ return templateFn(comparator);
+}
+
+/**
+ * Sort the given array in-place with the given comparator function.
+ *
+ * @param {Array} ary
+ * An array to sort.
+ * @param {function} comparator
+ * Function to use to compare two items.
+ */
+
+let sortCache = new WeakMap();
+exports.quickSort = function (ary, comparator, start = 0) {
+ let doQuickSort = sortCache.get(comparator);
+ if (doQuickSort === void 0) {
+ doQuickSort = cloneSort(comparator);
+ sortCache.set(comparator, doQuickSort);
+ }
+ doQuickSort(ary, comparator, start, ary.length - 1);
+};
diff --git a/frontend/node_modules/source-map-js/lib/source-map-consumer.js b/frontend/node_modules/source-map-js/lib/source-map-consumer.js
new file mode 100644
index 00000000..4bd7a4a5
--- /dev/null
+++ b/frontend/node_modules/source-map-js/lib/source-map-consumer.js
@@ -0,0 +1,1184 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+var util = require('./util');
+var binarySearch = require('./binary-search');
+var ArraySet = require('./array-set').ArraySet;
+var base64VLQ = require('./base64-vlq');
+var quickSort = require('./quick-sort').quickSort;
+
+function SourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ return sourceMap.sections != null
+ ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
+ : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
+}
+
+SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {
+ return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
+}
+
+/**
+ * The version of the source mapping spec that we are consuming.
+ */
+SourceMapConsumer.prototype._version = 3;
+
+// `__generatedMappings` and `__originalMappings` are arrays that hold the
+// parsed mapping coordinates from the source map's "mappings" attribute. They
+// are lazily instantiated, accessed via the `_generatedMappings` and
+// `_originalMappings` getters respectively, and we only parse the mappings
+// and create these arrays once queried for a source location. We jump through
+// these hoops because there can be many thousands of mappings, and parsing
+// them is expensive, so we only want to do it if we must.
+//
+// Each object in the arrays is of the form:
+//
+// {
+// generatedLine: The line number in the generated code,
+// generatedColumn: The column number in the generated code,
+// source: The path to the original source file that generated this
+// chunk of code,
+// originalLine: The line number in the original source that
+// corresponds to this chunk of generated code,
+// originalColumn: The column number in the original source that
+// corresponds to this chunk of generated code,
+// name: The name of the original symbol which generated this chunk of
+// code.
+// }
+//
+// All properties except for `generatedLine` and `generatedColumn` can be
+// `null`.
+//
+// `_generatedMappings` is ordered by the generated positions.
+//
+// `_originalMappings` is ordered by the original positions.
+
+SourceMapConsumer.prototype.__generatedMappings = null;
+Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ if (!this.__generatedMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__generatedMappings;
+ }
+});
+
+SourceMapConsumer.prototype.__originalMappings = null;
+Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ if (!this.__originalMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__originalMappings;
+ }
+});
+
+SourceMapConsumer.prototype._charIsMappingSeparator =
+ function SourceMapConsumer_charIsMappingSeparator(aStr, index) {
+ var c = aStr.charAt(index);
+ return c === ";" || c === ",";
+ };
+
+/**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+SourceMapConsumer.prototype._parseMappings =
+ function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ throw new Error("Subclasses must implement _parseMappings");
+ };
+
+SourceMapConsumer.GENERATED_ORDER = 1;
+SourceMapConsumer.ORIGINAL_ORDER = 2;
+
+SourceMapConsumer.GREATEST_LOWER_BOUND = 1;
+SourceMapConsumer.LEAST_UPPER_BOUND = 2;
+
+/**
+ * Iterate over each mapping between an original source/line/column and a
+ * generated line/column in this source map.
+ *
+ * @param Function aCallback
+ * The function that is called with each mapping.
+ * @param Object aContext
+ * Optional. If specified, this object will be the value of `this` every
+ * time that `aCallback` is called.
+ * @param aOrder
+ * Either `SourceMapConsumer.GENERATED_ORDER` or
+ * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
+ * iterate over the mappings sorted by the generated file's line/column
+ * order or the original's source/line/column order, respectively. Defaults to
+ * `SourceMapConsumer.GENERATED_ORDER`.
+ */
+SourceMapConsumer.prototype.eachMapping =
+ function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
+ var context = aContext || null;
+ var order = aOrder || SourceMapConsumer.GENERATED_ORDER;
+
+ var mappings;
+ switch (order) {
+ case SourceMapConsumer.GENERATED_ORDER:
+ mappings = this._generatedMappings;
+ break;
+ case SourceMapConsumer.ORIGINAL_ORDER:
+ mappings = this._originalMappings;
+ break;
+ default:
+ throw new Error("Unknown order of iteration.");
+ }
+
+ var sourceRoot = this.sourceRoot;
+ var boundCallback = aCallback.bind(context);
+ var names = this._names;
+ var sources = this._sources;
+ var sourceMapURL = this._sourceMapURL;
+
+ for (var i = 0, n = mappings.length; i < n; i++) {
+ var mapping = mappings[i];
+ var source = mapping.source === null ? null : sources.at(mapping.source);
+ source = util.computeSourceURL(sourceRoot, source, sourceMapURL);
+ boundCallback({
+ source: source,
+ generatedLine: mapping.generatedLine,
+ generatedColumn: mapping.generatedColumn,
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name: mapping.name === null ? null : names.at(mapping.name)
+ });
+ }
+ };
+
+/**
+ * Returns all generated line and column information for the original source,
+ * line, and column provided. If no column is provided, returns all mappings
+ * corresponding to a either the line we are searching for or the next
+ * closest line that has any mappings. Otherwise, returns all mappings
+ * corresponding to the given line and either the column we are searching for
+ * or the next closest column that has any offsets.
+ *
+ * The only argument is an object with the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number is 1-based.
+ * - column: Optional. the column number in the original source.
+ * The column number is 0-based.
+ *
+ * and an array of objects is returned, each with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+SourceMapConsumer.prototype.allGeneratedPositionsFor =
+ function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
+ var line = util.getArg(aArgs, 'line');
+
+ // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
+ // returns the index of the closest mapping less than the needle. By
+ // setting needle.originalColumn to 0, we thus find the last mapping for
+ // the given line, provided such a mapping exists.
+ var needle = {
+ source: util.getArg(aArgs, 'source'),
+ originalLine: line,
+ originalColumn: util.getArg(aArgs, 'column', 0)
+ };
+
+ needle.source = this._findSourceIndex(needle.source);
+ if (needle.source < 0) {
+ return [];
+ }
+
+ var mappings = [];
+
+ var index = this._findMapping(needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions,
+ binarySearch.LEAST_UPPER_BOUND);
+ if (index >= 0) {
+ var mapping = this._originalMappings[index];
+
+ if (aArgs.column === undefined) {
+ var originalLine = mapping.originalLine;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we found. Since
+ // mappings are sorted, this is guaranteed to find all mappings for
+ // the line we found.
+ while (mapping && mapping.originalLine === originalLine) {
+ mappings.push({
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ } else {
+ var originalColumn = mapping.originalColumn;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we were searching for.
+ // Since mappings are sorted, this is guaranteed to find all mappings for
+ // the line we are searching for.
+ while (mapping &&
+ mapping.originalLine === line &&
+ mapping.originalColumn == originalColumn) {
+ mappings.push({
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ }
+ }
+
+ return mappings;
+ };
+
+exports.SourceMapConsumer = SourceMapConsumer;
+
+/**
+ * A BasicSourceMapConsumer instance represents a parsed source map which we can
+ * query for information about the original file positions by giving it a file
+ * position in the generated source.
+ *
+ * The first parameter is the raw source map (either as a JSON string, or
+ * already parsed to an object). According to the spec, source maps have the
+ * following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - sources: An array of URLs to the original source files.
+ * - names: An array of identifiers which can be referrenced by individual mappings.
+ * - sourceRoot: Optional. The URL root from which all sources are relative.
+ * - sourcesContent: Optional. An array of contents of the original source files.
+ * - mappings: A string of base64 VLQs which contain the actual mappings.
+ * - file: Optional. The generated file this source map is associated with.
+ *
+ * Here is an example source map, taken from the source map spec[0]:
+ *
+ * {
+ * version : 3,
+ * file: "out.js",
+ * sourceRoot : "",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AA,AB;;ABCDE;"
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
+ */
+function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ var version = util.getArg(sourceMap, 'version');
+ var sources = util.getArg(sourceMap, 'sources');
+ // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
+ // requires the array) to play nice here.
+ var names = util.getArg(sourceMap, 'names', []);
+ var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
+ var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
+ var mappings = util.getArg(sourceMap, 'mappings');
+ var file = util.getArg(sourceMap, 'file', null);
+
+ // Once again, Sass deviates from the spec and supplies the version as a
+ // string rather than a number, so we use loose equality checking here.
+ if (version != this._version) {
+ throw new Error('Unsupported version: ' + version);
+ }
+
+ if (sourceRoot) {
+ sourceRoot = util.normalize(sourceRoot);
+ }
+
+ sources = sources
+ .map(String)
+ // Some source maps produce relative source paths like "./foo.js" instead of
+ // "foo.js". Normalize these first so that future comparisons will succeed.
+ // See bugzil.la/1090768.
+ .map(util.normalize)
+ // Always ensure that absolute sources are internally stored relative to
+ // the source root, if the source root is absolute. Not doing this would
+ // be particularly problematic when the source root is a prefix of the
+ // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
+ .map(function (source) {
+ return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)
+ ? util.relative(sourceRoot, source)
+ : source;
+ });
+
+ // Pass `true` below to allow duplicate names and sources. While source maps
+ // are intended to be compressed and deduplicated, the TypeScript compiler
+ // sometimes generates source maps with duplicates in them. See Github issue
+ // #72 and bugzil.la/889492.
+ this._names = ArraySet.fromArray(names.map(String), true);
+ this._sources = ArraySet.fromArray(sources, true);
+
+ this._absoluteSources = this._sources.toArray().map(function (s) {
+ return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
+ });
+
+ this.sourceRoot = sourceRoot;
+ this.sourcesContent = sourcesContent;
+ this._mappings = mappings;
+ this._sourceMapURL = aSourceMapURL;
+ this.file = file;
+}
+
+BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
+BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;
+
+/**
+ * Utility function to find the index of a source. Returns -1 if not
+ * found.
+ */
+BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ if (this._sources.has(relativeSource)) {
+ return this._sources.indexOf(relativeSource);
+ }
+
+ // Maybe aSource is an absolute URL as returned by |sources|. In
+ // this case we can't simply undo the transform.
+ var i;
+ for (i = 0; i < this._absoluteSources.length; ++i) {
+ if (this._absoluteSources[i] == aSource) {
+ return i;
+ }
+ }
+
+ return -1;
+};
+
+/**
+ * Create a BasicSourceMapConsumer from a SourceMapGenerator.
+ *
+ * @param SourceMapGenerator aSourceMap
+ * The source map that will be consumed.
+ * @param String aSourceMapURL
+ * The URL at which the source map can be found (optional)
+ * @returns BasicSourceMapConsumer
+ */
+BasicSourceMapConsumer.fromSourceMap =
+ function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
+ var smc = Object.create(BasicSourceMapConsumer.prototype);
+
+ var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
+ var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
+ smc.sourceRoot = aSourceMap._sourceRoot;
+ smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
+ smc.sourceRoot);
+ smc.file = aSourceMap._file;
+ smc._sourceMapURL = aSourceMapURL;
+ smc._absoluteSources = smc._sources.toArray().map(function (s) {
+ return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
+ });
+
+ // Because we are modifying the entries (by converting string sources and
+ // names to indices into the sources and names ArraySets), we have to make
+ // a copy of the entry or else bad things happen. Shared mutable state
+ // strikes again! See github issue #191.
+
+ var generatedMappings = aSourceMap._mappings.toArray().slice();
+ var destGeneratedMappings = smc.__generatedMappings = [];
+ var destOriginalMappings = smc.__originalMappings = [];
+
+ for (var i = 0, length = generatedMappings.length; i < length; i++) {
+ var srcMapping = generatedMappings[i];
+ var destMapping = new Mapping;
+ destMapping.generatedLine = srcMapping.generatedLine;
+ destMapping.generatedColumn = srcMapping.generatedColumn;
+
+ if (srcMapping.source) {
+ destMapping.source = sources.indexOf(srcMapping.source);
+ destMapping.originalLine = srcMapping.originalLine;
+ destMapping.originalColumn = srcMapping.originalColumn;
+
+ if (srcMapping.name) {
+ destMapping.name = names.indexOf(srcMapping.name);
+ }
+
+ destOriginalMappings.push(destMapping);
+ }
+
+ destGeneratedMappings.push(destMapping);
+ }
+
+ quickSort(smc.__originalMappings, util.compareByOriginalPositions);
+
+ return smc;
+ };
+
+/**
+ * The version of the source mapping spec that we are consuming.
+ */
+BasicSourceMapConsumer.prototype._version = 3;
+
+/**
+ * The list of original sources.
+ */
+Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {
+ get: function () {
+ return this._absoluteSources.slice();
+ }
+});
+
+/**
+ * Provide the JIT with a nice shape / hidden class.
+ */
+function Mapping() {
+ this.generatedLine = 0;
+ this.generatedColumn = 0;
+ this.source = null;
+ this.originalLine = null;
+ this.originalColumn = null;
+ this.name = null;
+}
+
+/**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+
+const compareGenerated = util.compareByGeneratedPositionsDeflatedNoLine;
+function sortGenerated(array, start) {
+ let l = array.length;
+ let n = array.length - start;
+ if (n <= 1) {
+ return;
+ } else if (n == 2) {
+ let a = array[start];
+ let b = array[start + 1];
+ if (compareGenerated(a, b) > 0) {
+ array[start] = b;
+ array[start + 1] = a;
+ }
+ } else if (n < 20) {
+ for (let i = start; i < l; i++) {
+ for (let j = i; j > start; j--) {
+ let a = array[j - 1];
+ let b = array[j];
+ if (compareGenerated(a, b) <= 0) {
+ break;
+ }
+ array[j - 1] = b;
+ array[j] = a;
+ }
+ }
+ } else {
+ quickSort(array, compareGenerated, start);
+ }
+}
+BasicSourceMapConsumer.prototype._parseMappings =
+ function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ var generatedLine = 1;
+ var previousGeneratedColumn = 0;
+ var previousOriginalLine = 0;
+ var previousOriginalColumn = 0;
+ var previousSource = 0;
+ var previousName = 0;
+ var length = aStr.length;
+ var index = 0;
+ var cachedSegments = {};
+ var temp = {};
+ var originalMappings = [];
+ var generatedMappings = [];
+ var mapping, str, segment, end, value;
+
+ let subarrayStart = 0;
+ while (index < length) {
+ if (aStr.charAt(index) === ';') {
+ generatedLine++;
+ index++;
+ previousGeneratedColumn = 0;
+
+ sortGenerated(generatedMappings, subarrayStart);
+ subarrayStart = generatedMappings.length;
+ }
+ else if (aStr.charAt(index) === ',') {
+ index++;
+ }
+ else {
+ mapping = new Mapping();
+ mapping.generatedLine = generatedLine;
+
+ for (end = index; end < length; end++) {
+ if (this._charIsMappingSeparator(aStr, end)) {
+ break;
+ }
+ }
+ str = aStr.slice(index, end);
+
+ segment = [];
+ while (index < end) {
+ base64VLQ.decode(aStr, index, temp);
+ value = temp.value;
+ index = temp.rest;
+ segment.push(value);
+ }
+
+ if (segment.length === 2) {
+ throw new Error('Found a source, but no line and column');
+ }
+
+ if (segment.length === 3) {
+ throw new Error('Found a source and line, but no column');
+ }
+
+ // Generated column.
+ mapping.generatedColumn = previousGeneratedColumn + segment[0];
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (segment.length > 1) {
+ // Original source.
+ mapping.source = previousSource + segment[1];
+ previousSource += segment[1];
+
+ // Original line.
+ mapping.originalLine = previousOriginalLine + segment[2];
+ previousOriginalLine = mapping.originalLine;
+ // Lines are stored 0-based
+ mapping.originalLine += 1;
+
+ // Original column.
+ mapping.originalColumn = previousOriginalColumn + segment[3];
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (segment.length > 4) {
+ // Original name.
+ mapping.name = previousName + segment[4];
+ previousName += segment[4];
+ }
+ }
+
+ generatedMappings.push(mapping);
+ if (typeof mapping.originalLine === 'number') {
+ let currentSource = mapping.source;
+ while (originalMappings.length <= currentSource) {
+ originalMappings.push(null);
+ }
+ if (originalMappings[currentSource] === null) {
+ originalMappings[currentSource] = [];
+ }
+ originalMappings[currentSource].push(mapping);
+ }
+ }
+ }
+
+ sortGenerated(generatedMappings, subarrayStart);
+ this.__generatedMappings = generatedMappings;
+
+ for (var i = 0; i < originalMappings.length; i++) {
+ if (originalMappings[i] != null) {
+ quickSort(originalMappings[i], util.compareByOriginalPositionsNoSource);
+ }
+ }
+ this.__originalMappings = [].concat(...originalMappings);
+ };
+
+/**
+ * Find the mapping that best matches the hypothetical "needle" mapping that
+ * we are searching for in the given "haystack" of mappings.
+ */
+BasicSourceMapConsumer.prototype._findMapping =
+ function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
+ aColumnName, aComparator, aBias) {
+ // To return the position we are searching for, we must first find the
+ // mapping for the given position and then return the opposite position it
+ // points to. Because the mappings are sorted, we can use binary search to
+ // find the best mapping.
+
+ if (aNeedle[aLineName] <= 0) {
+ throw new TypeError('Line must be greater than or equal to 1, got '
+ + aNeedle[aLineName]);
+ }
+ if (aNeedle[aColumnName] < 0) {
+ throw new TypeError('Column must be greater than or equal to 0, got '
+ + aNeedle[aColumnName]);
+ }
+
+ return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
+ };
+
+/**
+ * Compute the last column for each generated mapping. The last column is
+ * inclusive.
+ */
+BasicSourceMapConsumer.prototype.computeColumnSpans =
+ function SourceMapConsumer_computeColumnSpans() {
+ for (var index = 0; index < this._generatedMappings.length; ++index) {
+ var mapping = this._generatedMappings[index];
+
+ // Mappings do not contain a field for the last generated columnt. We
+ // can come up with an optimistic estimate, however, by assuming that
+ // mappings are contiguous (i.e. given two consecutive mappings, the
+ // first mapping ends where the second one starts).
+ if (index + 1 < this._generatedMappings.length) {
+ var nextMapping = this._generatedMappings[index + 1];
+
+ if (mapping.generatedLine === nextMapping.generatedLine) {
+ mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
+ continue;
+ }
+ }
+
+ // The last mapping for each line spans the entire line.
+ mapping.lastGeneratedColumn = Infinity;
+ }
+ };
+
+/**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - name: The original identifier, or null.
+ */
+BasicSourceMapConsumer.prototype.originalPositionFor =
+ function SourceMapConsumer_originalPositionFor(aArgs) {
+ var needle = {
+ generatedLine: util.getArg(aArgs, 'line'),
+ generatedColumn: util.getArg(aArgs, 'column')
+ };
+
+ var index = this._findMapping(
+ needle,
+ this._generatedMappings,
+ "generatedLine",
+ "generatedColumn",
+ util.compareByGeneratedPositionsDeflated,
+ util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
+ );
+
+ if (index >= 0) {
+ var mapping = this._generatedMappings[index];
+
+ if (mapping.generatedLine === needle.generatedLine) {
+ var source = util.getArg(mapping, 'source', null);
+ if (source !== null) {
+ source = this._sources.at(source);
+ source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
+ }
+ var name = util.getArg(mapping, 'name', null);
+ if (name !== null) {
+ name = this._names.at(name);
+ }
+ return {
+ source: source,
+ line: util.getArg(mapping, 'originalLine', null),
+ column: util.getArg(mapping, 'originalColumn', null),
+ name: name
+ };
+ }
+ }
+
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ };
+
+/**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+BasicSourceMapConsumer.prototype.hasContentsOfAllSources =
+ function BasicSourceMapConsumer_hasContentsOfAllSources() {
+ if (!this.sourcesContent) {
+ return false;
+ }
+ return this.sourcesContent.length >= this._sources.size() &&
+ !this.sourcesContent.some(function (sc) { return sc == null; });
+ };
+
+/**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+BasicSourceMapConsumer.prototype.sourceContentFor =
+ function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
+ if (!this.sourcesContent) {
+ return null;
+ }
+
+ var index = this._findSourceIndex(aSource);
+ if (index >= 0) {
+ return this.sourcesContent[index];
+ }
+
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ var url;
+ if (this.sourceRoot != null
+ && (url = util.urlParse(this.sourceRoot))) {
+ // XXX: file:// URIs and absolute paths lead to unexpected behavior for
+ // many users. We can help them out when they expect file:// URIs to
+ // behave like it would if they were running a local HTTP server. See
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
+ var fileUriAbsPath = relativeSource.replace(/^file:\/\//, "");
+ if (url.scheme == "file"
+ && this._sources.has(fileUriAbsPath)) {
+ return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
+ }
+
+ if ((!url.path || url.path == "/")
+ && this._sources.has("/" + relativeSource)) {
+ return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
+ }
+ }
+
+ // This function is used recursively from
+ // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
+ // don't want to throw if we can't find the source - we just want to
+ // return null, so we provide a flag to exit gracefully.
+ if (nullOnMissing) {
+ return null;
+ }
+ else {
+ throw new Error('"' + relativeSource + '" is not in the SourceMap.');
+ }
+ };
+
+/**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+BasicSourceMapConsumer.prototype.generatedPositionFor =
+ function SourceMapConsumer_generatedPositionFor(aArgs) {
+ var source = util.getArg(aArgs, 'source');
+ source = this._findSourceIndex(source);
+ if (source < 0) {
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ }
+
+ var needle = {
+ source: source,
+ originalLine: util.getArg(aArgs, 'line'),
+ originalColumn: util.getArg(aArgs, 'column')
+ };
+
+ var index = this._findMapping(
+ needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions,
+ util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
+ );
+
+ if (index >= 0) {
+ var mapping = this._originalMappings[index];
+
+ if (mapping.source === needle.source) {
+ return {
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ };
+ }
+ }
+
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ };
+
+exports.BasicSourceMapConsumer = BasicSourceMapConsumer;
+
+/**
+ * An IndexedSourceMapConsumer instance represents a parsed source map which
+ * we can query for information. It differs from BasicSourceMapConsumer in
+ * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
+ * input.
+ *
+ * The first parameter is a raw source map (either as a JSON string, or already
+ * parsed to an object). According to the spec for indexed source maps, they
+ * have the following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - file: Optional. The generated file this source map is associated with.
+ * - sections: A list of section definitions.
+ *
+ * Each value under the "sections" field has two fields:
+ * - offset: The offset into the original specified at which this section
+ * begins to apply, defined as an object with a "line" and "column"
+ * field.
+ * - map: A source map definition. This source map could also be indexed,
+ * but doesn't have to be.
+ *
+ * Instead of the "map" field, it's also possible to have a "url" field
+ * specifying a URL to retrieve a source map from, but that's currently
+ * unsupported.
+ *
+ * Here's an example source map, taken from the source map spec[0], but
+ * modified to omit a section which uses the "url" field.
+ *
+ * {
+ * version : 3,
+ * file: "app.js",
+ * sections: [{
+ * offset: {line:100, column:10},
+ * map: {
+ * version : 3,
+ * file: "section.js",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AAAA,E;;ABCDE;"
+ * }
+ * }],
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
+ */
+function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ var version = util.getArg(sourceMap, 'version');
+ var sections = util.getArg(sourceMap, 'sections');
+
+ if (version != this._version) {
+ throw new Error('Unsupported version: ' + version);
+ }
+
+ this._sources = new ArraySet();
+ this._names = new ArraySet();
+
+ var lastOffset = {
+ line: -1,
+ column: 0
+ };
+ this._sections = sections.map(function (s) {
+ if (s.url) {
+ // The url field will require support for asynchronicity.
+ // See https://github.com/mozilla/source-map/issues/16
+ throw new Error('Support for url field in sections not implemented.');
+ }
+ var offset = util.getArg(s, 'offset');
+ var offsetLine = util.getArg(offset, 'line');
+ var offsetColumn = util.getArg(offset, 'column');
+
+ if (offsetLine < lastOffset.line ||
+ (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
+ throw new Error('Section offsets must be ordered and non-overlapping.');
+ }
+ lastOffset = offset;
+
+ return {
+ generatedOffset: {
+ // The offset fields are 0-based, but we use 1-based indices when
+ // encoding/decoding from VLQ.
+ generatedLine: offsetLine + 1,
+ generatedColumn: offsetColumn + 1
+ },
+ consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)
+ }
+ });
+}
+
+IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
+IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;
+
+/**
+ * The version of the source mapping spec that we are consuming.
+ */
+IndexedSourceMapConsumer.prototype._version = 3;
+
+/**
+ * The list of original sources.
+ */
+Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {
+ get: function () {
+ var sources = [];
+ for (var i = 0; i < this._sections.length; i++) {
+ for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
+ sources.push(this._sections[i].consumer.sources[j]);
+ }
+ }
+ return sources;
+ }
+});
+
+/**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - name: The original identifier, or null.
+ */
+IndexedSourceMapConsumer.prototype.originalPositionFor =
+ function IndexedSourceMapConsumer_originalPositionFor(aArgs) {
+ var needle = {
+ generatedLine: util.getArg(aArgs, 'line'),
+ generatedColumn: util.getArg(aArgs, 'column')
+ };
+
+ // Find the section containing the generated position we're trying to map
+ // to an original position.
+ var sectionIndex = binarySearch.search(needle, this._sections,
+ function(needle, section) {
+ var cmp = needle.generatedLine - section.generatedOffset.generatedLine;
+ if (cmp) {
+ return cmp;
+ }
+
+ return (needle.generatedColumn -
+ section.generatedOffset.generatedColumn);
+ });
+ var section = this._sections[sectionIndex];
+
+ if (!section) {
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ }
+
+ return section.consumer.originalPositionFor({
+ line: needle.generatedLine -
+ (section.generatedOffset.generatedLine - 1),
+ column: needle.generatedColumn -
+ (section.generatedOffset.generatedLine === needle.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ bias: aArgs.bias
+ });
+ };
+
+/**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+IndexedSourceMapConsumer.prototype.hasContentsOfAllSources =
+ function IndexedSourceMapConsumer_hasContentsOfAllSources() {
+ return this._sections.every(function (s) {
+ return s.consumer.hasContentsOfAllSources();
+ });
+ };
+
+/**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+IndexedSourceMapConsumer.prototype.sourceContentFor =
+ function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+
+ var content = section.consumer.sourceContentFor(aSource, true);
+ if (content) {
+ return content;
+ }
+ }
+ if (nullOnMissing) {
+ return null;
+ }
+ else {
+ throw new Error('"' + aSource + '" is not in the SourceMap.');
+ }
+ };
+
+/**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+IndexedSourceMapConsumer.prototype.generatedPositionFor =
+ function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+
+ // Only consider this section if the requested source is in the list of
+ // sources of the consumer.
+ if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {
+ continue;
+ }
+ var generatedPosition = section.consumer.generatedPositionFor(aArgs);
+ if (generatedPosition) {
+ var ret = {
+ line: generatedPosition.line +
+ (section.generatedOffset.generatedLine - 1),
+ column: generatedPosition.column +
+ (section.generatedOffset.generatedLine === generatedPosition.line
+ ? section.generatedOffset.generatedColumn - 1
+ : 0)
+ };
+ return ret;
+ }
+ }
+
+ return {
+ line: null,
+ column: null
+ };
+ };
+
+/**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+IndexedSourceMapConsumer.prototype._parseMappings =
+ function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ this.__generatedMappings = [];
+ this.__originalMappings = [];
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+ var sectionMappings = section.consumer._generatedMappings;
+ for (var j = 0; j < sectionMappings.length; j++) {
+ var mapping = sectionMappings[j];
+
+ var source = section.consumer._sources.at(mapping.source);
+ source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
+ this._sources.add(source);
+ source = this._sources.indexOf(source);
+
+ var name = null;
+ if (mapping.name) {
+ name = section.consumer._names.at(mapping.name);
+ this._names.add(name);
+ name = this._names.indexOf(name);
+ }
+
+ // The mappings coming from the consumer for the section have
+ // generated positions relative to the start of the section, so we
+ // need to offset them to be relative to the start of the concatenated
+ // generated file.
+ var adjustedMapping = {
+ source: source,
+ generatedLine: mapping.generatedLine +
+ (section.generatedOffset.generatedLine - 1),
+ generatedColumn: mapping.generatedColumn +
+ (section.generatedOffset.generatedLine === mapping.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name: name
+ };
+
+ this.__generatedMappings.push(adjustedMapping);
+ if (typeof adjustedMapping.originalLine === 'number') {
+ this.__originalMappings.push(adjustedMapping);
+ }
+ }
+ }
+
+ quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);
+ quickSort(this.__originalMappings, util.compareByOriginalPositions);
+ };
+
+exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;
diff --git a/frontend/node_modules/source-map-js/lib/source-map-generator.js b/frontend/node_modules/source-map-js/lib/source-map-generator.js
new file mode 100644
index 00000000..508bcfbb
--- /dev/null
+++ b/frontend/node_modules/source-map-js/lib/source-map-generator.js
@@ -0,0 +1,425 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+var base64VLQ = require('./base64-vlq');
+var util = require('./util');
+var ArraySet = require('./array-set').ArraySet;
+var MappingList = require('./mapping-list').MappingList;
+
+/**
+ * An instance of the SourceMapGenerator represents a source map which is
+ * being built incrementally. You may pass an object with the following
+ * properties:
+ *
+ * - file: The filename of the generated source.
+ * - sourceRoot: A root for all relative URLs in this source map.
+ */
+function SourceMapGenerator(aArgs) {
+ if (!aArgs) {
+ aArgs = {};
+ }
+ this._file = util.getArg(aArgs, 'file', null);
+ this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
+ this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
+ this._sources = new ArraySet();
+ this._names = new ArraySet();
+ this._mappings = new MappingList();
+ this._sourcesContents = null;
+}
+
+SourceMapGenerator.prototype._version = 3;
+
+/**
+ * Creates a new SourceMapGenerator based on a SourceMapConsumer
+ *
+ * @param aSourceMapConsumer The SourceMap.
+ */
+SourceMapGenerator.fromSourceMap =
+ function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
+ var sourceRoot = aSourceMapConsumer.sourceRoot;
+ var generator = new SourceMapGenerator({
+ file: aSourceMapConsumer.file,
+ sourceRoot: sourceRoot
+ });
+ aSourceMapConsumer.eachMapping(function (mapping) {
+ var newMapping = {
+ generated: {
+ line: mapping.generatedLine,
+ column: mapping.generatedColumn
+ }
+ };
+
+ if (mapping.source != null) {
+ newMapping.source = mapping.source;
+ if (sourceRoot != null) {
+ newMapping.source = util.relative(sourceRoot, newMapping.source);
+ }
+
+ newMapping.original = {
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ };
+
+ if (mapping.name != null) {
+ newMapping.name = mapping.name;
+ }
+ }
+
+ generator.addMapping(newMapping);
+ });
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var sourceRelative = sourceFile;
+ if (sourceRoot !== null) {
+ sourceRelative = util.relative(sourceRoot, sourceFile);
+ }
+
+ if (!generator._sources.has(sourceRelative)) {
+ generator._sources.add(sourceRelative);
+ }
+
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ generator.setSourceContent(sourceFile, content);
+ }
+ });
+ return generator;
+ };
+
+/**
+ * Add a single mapping from original source line and column to the generated
+ * source's line and column for this source map being created. The mapping
+ * object should have the following properties:
+ *
+ * - generated: An object with the generated line and column positions.
+ * - original: An object with the original line and column positions.
+ * - source: The original source file (relative to the sourceRoot).
+ * - name: An optional original token name for this mapping.
+ */
+SourceMapGenerator.prototype.addMapping =
+ function SourceMapGenerator_addMapping(aArgs) {
+ var generated = util.getArg(aArgs, 'generated');
+ var original = util.getArg(aArgs, 'original', null);
+ var source = util.getArg(aArgs, 'source', null);
+ var name = util.getArg(aArgs, 'name', null);
+
+ if (!this._skipValidation) {
+ this._validateMapping(generated, original, source, name);
+ }
+
+ if (source != null) {
+ source = String(source);
+ if (!this._sources.has(source)) {
+ this._sources.add(source);
+ }
+ }
+
+ if (name != null) {
+ name = String(name);
+ if (!this._names.has(name)) {
+ this._names.add(name);
+ }
+ }
+
+ this._mappings.add({
+ generatedLine: generated.line,
+ generatedColumn: generated.column,
+ originalLine: original != null && original.line,
+ originalColumn: original != null && original.column,
+ source: source,
+ name: name
+ });
+ };
+
+/**
+ * Set the source content for a source file.
+ */
+SourceMapGenerator.prototype.setSourceContent =
+ function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
+ var source = aSourceFile;
+ if (this._sourceRoot != null) {
+ source = util.relative(this._sourceRoot, source);
+ }
+
+ if (aSourceContent != null) {
+ // Add the source content to the _sourcesContents map.
+ // Create a new _sourcesContents map if the property is null.
+ if (!this._sourcesContents) {
+ this._sourcesContents = Object.create(null);
+ }
+ this._sourcesContents[util.toSetString(source)] = aSourceContent;
+ } else if (this._sourcesContents) {
+ // Remove the source file from the _sourcesContents map.
+ // If the _sourcesContents map is empty, set the property to null.
+ delete this._sourcesContents[util.toSetString(source)];
+ if (Object.keys(this._sourcesContents).length === 0) {
+ this._sourcesContents = null;
+ }
+ }
+ };
+
+/**
+ * Applies the mappings of a sub-source-map for a specific source file to the
+ * source map being generated. Each mapping to the supplied source file is
+ * rewritten using the supplied source map. Note: The resolution for the
+ * resulting mappings is the minimium of this map and the supplied map.
+ *
+ * @param aSourceMapConsumer The source map to be applied.
+ * @param aSourceFile Optional. The filename of the source file.
+ * If omitted, SourceMapConsumer's file property will be used.
+ * @param aSourceMapPath Optional. The dirname of the path to the source map
+ * to be applied. If relative, it is relative to the SourceMapConsumer.
+ * This parameter is needed when the two source maps aren't in the same
+ * directory, and the source map to be applied contains relative source
+ * paths. If so, those relative source paths need to be rewritten
+ * relative to the SourceMapGenerator.
+ */
+SourceMapGenerator.prototype.applySourceMap =
+ function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
+ var sourceFile = aSourceFile;
+ // If aSourceFile is omitted, we will use the file property of the SourceMap
+ if (aSourceFile == null) {
+ if (aSourceMapConsumer.file == null) {
+ throw new Error(
+ 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
+ 'or the source map\'s "file" property. Both were omitted.'
+ );
+ }
+ sourceFile = aSourceMapConsumer.file;
+ }
+ var sourceRoot = this._sourceRoot;
+ // Make "sourceFile" relative if an absolute Url is passed.
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ // Applying the SourceMap can add and remove items from the sources and
+ // the names array.
+ var newSources = new ArraySet();
+ var newNames = new ArraySet();
+
+ // Find mappings for the "sourceFile"
+ this._mappings.unsortedForEach(function (mapping) {
+ if (mapping.source === sourceFile && mapping.originalLine != null) {
+ // Check if it can be mapped by the source map, then update the mapping.
+ var original = aSourceMapConsumer.originalPositionFor({
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ });
+ if (original.source != null) {
+ // Copy mapping
+ mapping.source = original.source;
+ if (aSourceMapPath != null) {
+ mapping.source = util.join(aSourceMapPath, mapping.source)
+ }
+ if (sourceRoot != null) {
+ mapping.source = util.relative(sourceRoot, mapping.source);
+ }
+ mapping.originalLine = original.line;
+ mapping.originalColumn = original.column;
+ if (original.name != null) {
+ mapping.name = original.name;
+ }
+ }
+ }
+
+ var source = mapping.source;
+ if (source != null && !newSources.has(source)) {
+ newSources.add(source);
+ }
+
+ var name = mapping.name;
+ if (name != null && !newNames.has(name)) {
+ newNames.add(name);
+ }
+
+ }, this);
+ this._sources = newSources;
+ this._names = newNames;
+
+ // Copy sourcesContents of applied map.
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aSourceMapPath != null) {
+ sourceFile = util.join(aSourceMapPath, sourceFile);
+ }
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ this.setSourceContent(sourceFile, content);
+ }
+ }, this);
+ };
+
+/**
+ * A mapping can have one of the three levels of data:
+ *
+ * 1. Just the generated position.
+ * 2. The Generated position, original position, and original source.
+ * 3. Generated and original position, original source, as well as a name
+ * token.
+ *
+ * To maintain consistency, we validate that any new mapping being added falls
+ * in to one of these categories.
+ */
+SourceMapGenerator.prototype._validateMapping =
+ function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
+ aName) {
+ // When aOriginal is truthy but has empty values for .line and .column,
+ // it is most likely a programmer error. In this case we throw a very
+ // specific error message to try to guide them the right way.
+ // For example: https://github.com/Polymer/polymer-bundler/pull/519
+ if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
+ throw new Error(
+ 'original.line and original.column are not numbers -- you probably meant to omit ' +
+ 'the original mapping entirely and only map the generated position. If so, pass ' +
+ 'null for the original mapping instead of an object with empty or null values.'
+ );
+ }
+
+ if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && !aOriginal && !aSource && !aName) {
+ // Case 1.
+ return;
+ }
+ else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+ && aOriginal && 'line' in aOriginal && 'column' in aOriginal
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && aOriginal.line > 0 && aOriginal.column >= 0
+ && aSource) {
+ // Cases 2 and 3.
+ return;
+ }
+ else {
+ throw new Error('Invalid mapping: ' + JSON.stringify({
+ generated: aGenerated,
+ source: aSource,
+ original: aOriginal,
+ name: aName
+ }));
+ }
+ };
+
+/**
+ * Serialize the accumulated mappings in to the stream of base 64 VLQs
+ * specified by the source map format.
+ */
+SourceMapGenerator.prototype._serializeMappings =
+ function SourceMapGenerator_serializeMappings() {
+ var previousGeneratedColumn = 0;
+ var previousGeneratedLine = 1;
+ var previousOriginalColumn = 0;
+ var previousOriginalLine = 0;
+ var previousName = 0;
+ var previousSource = 0;
+ var result = '';
+ var next;
+ var mapping;
+ var nameIdx;
+ var sourceIdx;
+
+ var mappings = this._mappings.toArray();
+ for (var i = 0, len = mappings.length; i < len; i++) {
+ mapping = mappings[i];
+ next = ''
+
+ if (mapping.generatedLine !== previousGeneratedLine) {
+ previousGeneratedColumn = 0;
+ while (mapping.generatedLine !== previousGeneratedLine) {
+ next += ';';
+ previousGeneratedLine++;
+ }
+ }
+ else {
+ if (i > 0) {
+ if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
+ continue;
+ }
+ next += ',';
+ }
+ }
+
+ next += base64VLQ.encode(mapping.generatedColumn
+ - previousGeneratedColumn);
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (mapping.source != null) {
+ sourceIdx = this._sources.indexOf(mapping.source);
+ next += base64VLQ.encode(sourceIdx - previousSource);
+ previousSource = sourceIdx;
+
+ // lines are stored 0-based in SourceMap spec version 3
+ next += base64VLQ.encode(mapping.originalLine - 1
+ - previousOriginalLine);
+ previousOriginalLine = mapping.originalLine - 1;
+
+ next += base64VLQ.encode(mapping.originalColumn
+ - previousOriginalColumn);
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (mapping.name != null) {
+ nameIdx = this._names.indexOf(mapping.name);
+ next += base64VLQ.encode(nameIdx - previousName);
+ previousName = nameIdx;
+ }
+ }
+
+ result += next;
+ }
+
+ return result;
+ };
+
+SourceMapGenerator.prototype._generateSourcesContent =
+ function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
+ return aSources.map(function (source) {
+ if (!this._sourcesContents) {
+ return null;
+ }
+ if (aSourceRoot != null) {
+ source = util.relative(aSourceRoot, source);
+ }
+ var key = util.toSetString(source);
+ return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
+ ? this._sourcesContents[key]
+ : null;
+ }, this);
+ };
+
+/**
+ * Externalize the source map.
+ */
+SourceMapGenerator.prototype.toJSON =
+ function SourceMapGenerator_toJSON() {
+ var map = {
+ version: this._version,
+ sources: this._sources.toArray(),
+ names: this._names.toArray(),
+ mappings: this._serializeMappings()
+ };
+ if (this._file != null) {
+ map.file = this._file;
+ }
+ if (this._sourceRoot != null) {
+ map.sourceRoot = this._sourceRoot;
+ }
+ if (this._sourcesContents) {
+ map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
+ }
+
+ return map;
+ };
+
+/**
+ * Render the source map being generated to a string.
+ */
+SourceMapGenerator.prototype.toString =
+ function SourceMapGenerator_toString() {
+ return JSON.stringify(this.toJSON());
+ };
+
+exports.SourceMapGenerator = SourceMapGenerator;
diff --git a/frontend/node_modules/source-map-js/lib/source-node.js b/frontend/node_modules/source-map-js/lib/source-node.js
new file mode 100644
index 00000000..8bcdbe38
--- /dev/null
+++ b/frontend/node_modules/source-map-js/lib/source-node.js
@@ -0,0 +1,413 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;
+var util = require('./util');
+
+// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
+// operating systems these days (capturing the result).
+var REGEX_NEWLINE = /(\r?\n)/;
+
+// Newline character code for charCodeAt() comparisons
+var NEWLINE_CODE = 10;
+
+// Private symbol for identifying `SourceNode`s when multiple versions of
+// the source-map library are loaded. This MUST NOT CHANGE across
+// versions!
+var isSourceNode = "$$$isSourceNode$$$";
+
+/**
+ * SourceNodes provide a way to abstract over interpolating/concatenating
+ * snippets of generated JavaScript source code while maintaining the line and
+ * column information associated with the original source code.
+ *
+ * @param aLine The original line number.
+ * @param aColumn The original column number.
+ * @param aSource The original source's filename.
+ * @param aChunks Optional. An array of strings which are snippets of
+ * generated JS, or other SourceNodes.
+ * @param aName The original identifier.
+ */
+function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
+ this.children = [];
+ this.sourceContents = {};
+ this.line = aLine == null ? null : aLine;
+ this.column = aColumn == null ? null : aColumn;
+ this.source = aSource == null ? null : aSource;
+ this.name = aName == null ? null : aName;
+ this[isSourceNode] = true;
+ if (aChunks != null) this.add(aChunks);
+}
+
+/**
+ * Creates a SourceNode from generated code and a SourceMapConsumer.
+ *
+ * @param aGeneratedCode The generated code
+ * @param aSourceMapConsumer The SourceMap for the generated code
+ * @param aRelativePath Optional. The path that relative sources in the
+ * SourceMapConsumer should be relative to.
+ */
+SourceNode.fromStringWithSourceMap =
+ function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
+ // The SourceNode we want to fill with the generated code
+ // and the SourceMap
+ var node = new SourceNode();
+
+ // All even indices of this array are one line of the generated code,
+ // while all odd indices are the newlines between two adjacent lines
+ // (since `REGEX_NEWLINE` captures its match).
+ // Processed fragments are accessed by calling `shiftNextLine`.
+ var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
+ var remainingLinesIndex = 0;
+ var shiftNextLine = function() {
+ var lineContents = getNextLine();
+ // The last line of a file might not have a newline.
+ var newLine = getNextLine() || "";
+ return lineContents + newLine;
+
+ function getNextLine() {
+ return remainingLinesIndex < remainingLines.length ?
+ remainingLines[remainingLinesIndex++] : undefined;
+ }
+ };
+
+ // We need to remember the position of "remainingLines"
+ var lastGeneratedLine = 1, lastGeneratedColumn = 0;
+
+ // The generate SourceNodes we need a code range.
+ // To extract it current and last mapping is used.
+ // Here we store the last mapping.
+ var lastMapping = null;
+
+ aSourceMapConsumer.eachMapping(function (mapping) {
+ if (lastMapping !== null) {
+ // We add the code from "lastMapping" to "mapping":
+ // First check if there is a new line in between.
+ if (lastGeneratedLine < mapping.generatedLine) {
+ // Associate first line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ lastGeneratedLine++;
+ lastGeneratedColumn = 0;
+ // The remaining code is added without mapping
+ } else {
+ // There is no new line in between.
+ // Associate the code between "lastGeneratedColumn" and
+ // "mapping.generatedColumn" with "lastMapping"
+ var nextLine = remainingLines[remainingLinesIndex] || '';
+ var code = nextLine.substr(0, mapping.generatedColumn -
+ lastGeneratedColumn);
+ remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
+ lastGeneratedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ addMappingWithCode(lastMapping, code);
+ // No more remaining code, continue
+ lastMapping = mapping;
+ return;
+ }
+ }
+ // We add the generated code until the first mapping
+ // to the SourceNode without any mapping.
+ // Each line is added as separate string.
+ while (lastGeneratedLine < mapping.generatedLine) {
+ node.add(shiftNextLine());
+ lastGeneratedLine++;
+ }
+ if (lastGeneratedColumn < mapping.generatedColumn) {
+ var nextLine = remainingLines[remainingLinesIndex] || '';
+ node.add(nextLine.substr(0, mapping.generatedColumn));
+ remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ }
+ lastMapping = mapping;
+ }, this);
+ // We have processed all mappings.
+ if (remainingLinesIndex < remainingLines.length) {
+ if (lastMapping) {
+ // Associate the remaining code in the current line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ }
+ // and add the remaining lines without any mapping
+ node.add(remainingLines.splice(remainingLinesIndex).join(""));
+ }
+
+ // Copy sourcesContent into SourceNode
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aRelativePath != null) {
+ sourceFile = util.join(aRelativePath, sourceFile);
+ }
+ node.setSourceContent(sourceFile, content);
+ }
+ });
+
+ return node;
+
+ function addMappingWithCode(mapping, code) {
+ if (mapping === null || mapping.source === undefined) {
+ node.add(code);
+ } else {
+ var source = aRelativePath
+ ? util.join(aRelativePath, mapping.source)
+ : mapping.source;
+ node.add(new SourceNode(mapping.originalLine,
+ mapping.originalColumn,
+ source,
+ code,
+ mapping.name));
+ }
+ }
+ };
+
+/**
+ * Add a chunk of generated JS to this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+SourceNode.prototype.add = function SourceNode_add(aChunk) {
+ if (Array.isArray(aChunk)) {
+ aChunk.forEach(function (chunk) {
+ this.add(chunk);
+ }, this);
+ }
+ else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ if (aChunk) {
+ this.children.push(aChunk);
+ }
+ }
+ else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+};
+
+/**
+ * Add a chunk of generated JS to the beginning of this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
+ if (Array.isArray(aChunk)) {
+ for (var i = aChunk.length-1; i >= 0; i--) {
+ this.prepend(aChunk[i]);
+ }
+ }
+ else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ this.children.unshift(aChunk);
+ }
+ else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+};
+
+/**
+ * Walk over the tree of JS snippets in this node and its children. The
+ * walking function is called once for each snippet of JS and is passed that
+ * snippet and the its original associated source's line/column location.
+ *
+ * @param aFn The traversal function.
+ */
+SourceNode.prototype.walk = function SourceNode_walk(aFn) {
+ var chunk;
+ for (var i = 0, len = this.children.length; i < len; i++) {
+ chunk = this.children[i];
+ if (chunk[isSourceNode]) {
+ chunk.walk(aFn);
+ }
+ else {
+ if (chunk !== '') {
+ aFn(chunk, { source: this.source,
+ line: this.line,
+ column: this.column,
+ name: this.name });
+ }
+ }
+ }
+};
+
+/**
+ * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
+ * each of `this.children`.
+ *
+ * @param aSep The separator.
+ */
+SourceNode.prototype.join = function SourceNode_join(aSep) {
+ var newChildren;
+ var i;
+ var len = this.children.length;
+ if (len > 0) {
+ newChildren = [];
+ for (i = 0; i < len-1; i++) {
+ newChildren.push(this.children[i]);
+ newChildren.push(aSep);
+ }
+ newChildren.push(this.children[i]);
+ this.children = newChildren;
+ }
+ return this;
+};
+
+/**
+ * Call String.prototype.replace on the very right-most source snippet. Useful
+ * for trimming whitespace from the end of a source node, etc.
+ *
+ * @param aPattern The pattern to replace.
+ * @param aReplacement The thing to replace the pattern with.
+ */
+SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
+ var lastChild = this.children[this.children.length - 1];
+ if (lastChild[isSourceNode]) {
+ lastChild.replaceRight(aPattern, aReplacement);
+ }
+ else if (typeof lastChild === 'string') {
+ this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
+ }
+ else {
+ this.children.push(''.replace(aPattern, aReplacement));
+ }
+ return this;
+};
+
+/**
+ * Set the source content for a source file. This will be added to the SourceMapGenerator
+ * in the sourcesContent field.
+ *
+ * @param aSourceFile The filename of the source file
+ * @param aSourceContent The content of the source file
+ */
+SourceNode.prototype.setSourceContent =
+ function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
+ this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
+ };
+
+/**
+ * Walk over the tree of SourceNodes. The walking function is called for each
+ * source file content and is passed the filename and source content.
+ *
+ * @param aFn The traversal function.
+ */
+SourceNode.prototype.walkSourceContents =
+ function SourceNode_walkSourceContents(aFn) {
+ for (var i = 0, len = this.children.length; i < len; i++) {
+ if (this.children[i][isSourceNode]) {
+ this.children[i].walkSourceContents(aFn);
+ }
+ }
+
+ var sources = Object.keys(this.sourceContents);
+ for (var i = 0, len = sources.length; i < len; i++) {
+ aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
+ }
+ };
+
+/**
+ * Return the string representation of this source node. Walks over the tree
+ * and concatenates all the various snippets together to one string.
+ */
+SourceNode.prototype.toString = function SourceNode_toString() {
+ var str = "";
+ this.walk(function (chunk) {
+ str += chunk;
+ });
+ return str;
+};
+
+/**
+ * Returns the string representation of this source node along with a source
+ * map.
+ */
+SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
+ var generated = {
+ code: "",
+ line: 1,
+ column: 0
+ };
+ var map = new SourceMapGenerator(aArgs);
+ var sourceMappingActive = false;
+ var lastOriginalSource = null;
+ var lastOriginalLine = null;
+ var lastOriginalColumn = null;
+ var lastOriginalName = null;
+ this.walk(function (chunk, original) {
+ generated.code += chunk;
+ if (original.source !== null
+ && original.line !== null
+ && original.column !== null) {
+ if(lastOriginalSource !== original.source
+ || lastOriginalLine !== original.line
+ || lastOriginalColumn !== original.column
+ || lastOriginalName !== original.name) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ lastOriginalSource = original.source;
+ lastOriginalLine = original.line;
+ lastOriginalColumn = original.column;
+ lastOriginalName = original.name;
+ sourceMappingActive = true;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ generated: {
+ line: generated.line,
+ column: generated.column
+ }
+ });
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ }
+ for (var idx = 0, length = chunk.length; idx < length; idx++) {
+ if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
+ generated.line++;
+ generated.column = 0;
+ // Mappings end at eol
+ if (idx + 1 === length) {
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ } else {
+ generated.column++;
+ }
+ }
+ });
+ this.walkSourceContents(function (sourceFile, sourceContent) {
+ map.setSourceContent(sourceFile, sourceContent);
+ });
+
+ return { code: generated.code, map: map };
+};
+
+exports.SourceNode = SourceNode;
diff --git a/frontend/node_modules/source-map-js/lib/util.js b/frontend/node_modules/source-map-js/lib/util.js
new file mode 100644
index 00000000..430e2d0f
--- /dev/null
+++ b/frontend/node_modules/source-map-js/lib/util.js
@@ -0,0 +1,594 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+/**
+ * This is a helper function for getting values from parameter/options
+ * objects.
+ *
+ * @param args The object we are extracting values from
+ * @param name The name of the property we are getting.
+ * @param defaultValue An optional value to return if the property is missing
+ * from the object. If this is not specified and the property is missing, an
+ * error will be thrown.
+ */
+function getArg(aArgs, aName, aDefaultValue) {
+ if (aName in aArgs) {
+ return aArgs[aName];
+ } else if (arguments.length === 3) {
+ return aDefaultValue;
+ } else {
+ throw new Error('"' + aName + '" is a required argument.');
+ }
+}
+exports.getArg = getArg;
+
+var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
+var dataUrlRegexp = /^data:.+\,.+$/;
+
+function urlParse(aUrl) {
+ var match = aUrl.match(urlRegexp);
+ if (!match) {
+ return null;
+ }
+ return {
+ scheme: match[1],
+ auth: match[2],
+ host: match[3],
+ port: match[4],
+ path: match[5]
+ };
+}
+exports.urlParse = urlParse;
+
+function urlGenerate(aParsedUrl) {
+ var url = '';
+ if (aParsedUrl.scheme) {
+ url += aParsedUrl.scheme + ':';
+ }
+ url += '//';
+ if (aParsedUrl.auth) {
+ url += aParsedUrl.auth + '@';
+ }
+ if (aParsedUrl.host) {
+ url += aParsedUrl.host;
+ }
+ if (aParsedUrl.port) {
+ url += ":" + aParsedUrl.port
+ }
+ if (aParsedUrl.path) {
+ url += aParsedUrl.path;
+ }
+ return url;
+}
+exports.urlGenerate = urlGenerate;
+
+var MAX_CACHED_INPUTS = 32;
+
+/**
+ * Takes some function `f(input) -> result` and returns a memoized version of
+ * `f`.
+ *
+ * We keep at most `MAX_CACHED_INPUTS` memoized results of `f` alive. The
+ * memoization is a dumb-simple, linear least-recently-used cache.
+ */
+function lruMemoize(f) {
+ var cache = [];
+
+ return function(input) {
+ for (var i = 0; i < cache.length; i++) {
+ if (cache[i].input === input) {
+ var temp = cache[0];
+ cache[0] = cache[i];
+ cache[i] = temp;
+ return cache[0].result;
+ }
+ }
+
+ var result = f(input);
+
+ cache.unshift({
+ input,
+ result,
+ });
+
+ if (cache.length > MAX_CACHED_INPUTS) {
+ cache.pop();
+ }
+
+ return result;
+ };
+}
+
+/**
+ * Normalizes a path, or the path portion of a URL:
+ *
+ * - Replaces consecutive slashes with one slash.
+ * - Removes unnecessary '.' parts.
+ * - Removes unnecessary '/..' parts.
+ *
+ * Based on code in the Node.js 'path' core module.
+ *
+ * @param aPath The path or url to normalize.
+ */
+var normalize = lruMemoize(function normalize(aPath) {
+ var path = aPath;
+ var url = urlParse(aPath);
+ if (url) {
+ if (!url.path) {
+ return aPath;
+ }
+ path = url.path;
+ }
+ var isAbsolute = exports.isAbsolute(path);
+ // Split the path into parts between `/` characters. This is much faster than
+ // using `.split(/\/+/g)`.
+ var parts = [];
+ var start = 0;
+ var i = 0;
+ while (true) {
+ start = i;
+ i = path.indexOf("/", start);
+ if (i === -1) {
+ parts.push(path.slice(start));
+ break;
+ } else {
+ parts.push(path.slice(start, i));
+ while (i < path.length && path[i] === "/") {
+ i++;
+ }
+ }
+ }
+
+ for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
+ part = parts[i];
+ if (part === '.') {
+ parts.splice(i, 1);
+ } else if (part === '..') {
+ up++;
+ } else if (up > 0) {
+ if (part === '') {
+ // The first part is blank if the path is absolute. Trying to go
+ // above the root is a no-op. Therefore we can remove all '..' parts
+ // directly after the root.
+ parts.splice(i + 1, up);
+ up = 0;
+ } else {
+ parts.splice(i, 2);
+ up--;
+ }
+ }
+ }
+ path = parts.join('/');
+
+ if (path === '') {
+ path = isAbsolute ? '/' : '.';
+ }
+
+ if (url) {
+ url.path = path;
+ return urlGenerate(url);
+ }
+ return path;
+});
+exports.normalize = normalize;
+
+/**
+ * Joins two paths/URLs.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be joined with the root.
+ *
+ * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
+ * scheme-relative URL: Then the scheme of aRoot, if any, is prepended
+ * first.
+ * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
+ * is updated with the result and aRoot is returned. Otherwise the result
+ * is returned.
+ * - If aPath is absolute, the result is aPath.
+ * - Otherwise the two paths are joined with a slash.
+ * - Joining for example 'http://' and 'www.example.com' is also supported.
+ */
+function join(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+ if (aPath === "") {
+ aPath = ".";
+ }
+ var aPathUrl = urlParse(aPath);
+ var aRootUrl = urlParse(aRoot);
+ if (aRootUrl) {
+ aRoot = aRootUrl.path || '/';
+ }
+
+ // `join(foo, '//www.example.org')`
+ if (aPathUrl && !aPathUrl.scheme) {
+ if (aRootUrl) {
+ aPathUrl.scheme = aRootUrl.scheme;
+ }
+ return urlGenerate(aPathUrl);
+ }
+
+ if (aPathUrl || aPath.match(dataUrlRegexp)) {
+ return aPath;
+ }
+
+ // `join('http://', 'www.example.com')`
+ if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
+ aRootUrl.host = aPath;
+ return urlGenerate(aRootUrl);
+ }
+
+ var joined = aPath.charAt(0) === '/'
+ ? aPath
+ : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);
+
+ if (aRootUrl) {
+ aRootUrl.path = joined;
+ return urlGenerate(aRootUrl);
+ }
+ return joined;
+}
+exports.join = join;
+
+exports.isAbsolute = function (aPath) {
+ return aPath.charAt(0) === '/' || urlRegexp.test(aPath);
+};
+
+/**
+ * Make a path relative to a URL or another path.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be made relative to aRoot.
+ */
+function relative(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+
+ aRoot = aRoot.replace(/\/$/, '');
+
+ // It is possible for the path to be above the root. In this case, simply
+ // checking whether the root is a prefix of the path won't work. Instead, we
+ // need to remove components from the root one by one, until either we find
+ // a prefix that fits, or we run out of components to remove.
+ var level = 0;
+ while (aPath.indexOf(aRoot + '/') !== 0) {
+ var index = aRoot.lastIndexOf("/");
+ if (index < 0) {
+ return aPath;
+ }
+
+ // If the only part of the root that is left is the scheme (i.e. http://,
+ // file:///, etc.), one or more slashes (/), or simply nothing at all, we
+ // have exhausted all components, so the path is not relative to the root.
+ aRoot = aRoot.slice(0, index);
+ if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
+ return aPath;
+ }
+
+ ++level;
+ }
+
+ // Make sure we add a "../" for each component we removed from the root.
+ return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
+}
+exports.relative = relative;
+
+var supportsNullProto = (function () {
+ var obj = Object.create(null);
+ return !('__proto__' in obj);
+}());
+
+function identity (s) {
+ return s;
+}
+
+/**
+ * Because behavior goes wacky when you set `__proto__` on objects, we
+ * have to prefix all the strings in our set with an arbitrary character.
+ *
+ * See https://github.com/mozilla/source-map/pull/31 and
+ * https://github.com/mozilla/source-map/issues/30
+ *
+ * @param String aStr
+ */
+function toSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return '$' + aStr;
+ }
+
+ return aStr;
+}
+exports.toSetString = supportsNullProto ? identity : toSetString;
+
+function fromSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return aStr.slice(1);
+ }
+
+ return aStr;
+}
+exports.fromSetString = supportsNullProto ? identity : fromSetString;
+
+function isProtoString(s) {
+ if (!s) {
+ return false;
+ }
+
+ var length = s.length;
+
+ if (length < 9 /* "__proto__".length */) {
+ return false;
+ }
+
+ if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 2) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 4) !== 116 /* 't' */ ||
+ s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
+ s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
+ s.charCodeAt(length - 8) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 9) !== 95 /* '_' */) {
+ return false;
+ }
+
+ for (var i = length - 10; i >= 0; i--) {
+ if (s.charCodeAt(i) !== 36 /* '$' */) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/**
+ * Comparator between two mappings where the original positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same original source/line/column, but different generated
+ * line and column the same. Useful when searching for a mapping with a
+ * stubbed out mapping.
+ */
+function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
+ var cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0 || onlyCompareOriginal) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+}
+exports.compareByOriginalPositions = compareByOriginalPositions;
+
+function compareByOriginalPositionsNoSource(mappingA, mappingB, onlyCompareOriginal) {
+ var cmp
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0 || onlyCompareOriginal) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+}
+exports.compareByOriginalPositionsNoSource = compareByOriginalPositionsNoSource;
+
+/**
+ * Comparator between two mappings with deflated source and name indices where
+ * the generated positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same generated line and column, but different
+ * source/name/original line and column the same. Useful when searching for a
+ * mapping with a stubbed out mapping.
+ */
+function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
+ var cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0 || onlyCompareGenerated) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+}
+exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
+
+function compareByGeneratedPositionsDeflatedNoLine(mappingA, mappingB, onlyCompareGenerated) {
+ var cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0 || onlyCompareGenerated) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+}
+exports.compareByGeneratedPositionsDeflatedNoLine = compareByGeneratedPositionsDeflatedNoLine;
+
+function strcmp(aStr1, aStr2) {
+ if (aStr1 === aStr2) {
+ return 0;
+ }
+
+ if (aStr1 === null) {
+ return 1; // aStr2 !== null
+ }
+
+ if (aStr2 === null) {
+ return -1; // aStr1 !== null
+ }
+
+ if (aStr1 > aStr2) {
+ return 1;
+ }
+
+ return -1;
+}
+
+/**
+ * Comparator between two mappings with inflated source and name strings where
+ * the generated positions are compared.
+ */
+function compareByGeneratedPositionsInflated(mappingA, mappingB) {
+ var cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+}
+exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;
+
+/**
+ * Strip any JSON XSSI avoidance prefix from the string (as documented
+ * in the source maps specification), and then parse the string as
+ * JSON.
+ */
+function parseSourceMapInput(str) {
+ return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
+}
+exports.parseSourceMapInput = parseSourceMapInput;
+
+/**
+ * Compute the URL of a source given the the source root, the source's
+ * URL, and the source map's URL.
+ */
+function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
+ sourceURL = sourceURL || '';
+
+ if (sourceRoot) {
+ // This follows what Chrome does.
+ if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
+ sourceRoot += '/';
+ }
+ // The spec says:
+ // Line 4: An optional source root, useful for relocating source
+ // files on a server or removing repeated values in the
+ // “sources” entry. This value is prepended to the individual
+ // entries in the “source” field.
+ sourceURL = sourceRoot + sourceURL;
+ }
+
+ // Historically, SourceMapConsumer did not take the sourceMapURL as
+ // a parameter. This mode is still somewhat supported, which is why
+ // this code block is conditional. However, it's preferable to pass
+ // the source map URL to SourceMapConsumer, so that this function
+ // can implement the source URL resolution algorithm as outlined in
+ // the spec. This block is basically the equivalent of:
+ // new URL(sourceURL, sourceMapURL).toString()
+ // ... except it avoids using URL, which wasn't available in the
+ // older releases of node still supported by this library.
+ //
+ // The spec says:
+ // If the sources are not absolute URLs after prepending of the
+ // “sourceRoot”, the sources are resolved relative to the
+ // SourceMap (like resolving script src in a html document).
+ if (sourceMapURL) {
+ var parsed = urlParse(sourceMapURL);
+ if (!parsed) {
+ throw new Error("sourceMapURL could not be parsed");
+ }
+ if (parsed.path) {
+ // Strip the last path component, but keep the "/".
+ var index = parsed.path.lastIndexOf('/');
+ if (index >= 0) {
+ parsed.path = parsed.path.substring(0, index + 1);
+ }
+ }
+ sourceURL = join(urlGenerate(parsed), sourceURL);
+ }
+
+ return normalize(sourceURL);
+}
+exports.computeSourceURL = computeSourceURL;
diff --git a/frontend/node_modules/source-map-js/package.json b/frontend/node_modules/source-map-js/package.json
new file mode 100644
index 00000000..501fafe1
--- /dev/null
+++ b/frontend/node_modules/source-map-js/package.json
@@ -0,0 +1,71 @@
+{
+ "name": "source-map-js",
+ "description": "Generates and consumes source maps",
+ "version": "1.0.2",
+ "homepage": "https://github.com/7rulnik/source-map-js",
+ "author": "Valentin 7rulnik Semirulnik ",
+ "contributors": [
+ "Nick Fitzgerald ",
+ "Tobias Koppers ",
+ "Duncan Beevers ",
+ "Stephen Crane ",
+ "Ryan Seddon ",
+ "Miles Elam ",
+ "Mihai Bazon ",
+ "Michael Ficarra ",
+ "Todd Wolfson ",
+ "Alexander Solovyov ",
+ "Felix Gnass ",
+ "Conrad Irwin ",
+ "usrbincc ",
+ "David Glasser ",
+ "Chase Douglas ",
+ "Evan Wallace ",
+ "Heather Arthur ",
+ "Hugh Kennedy ",
+ "David Glasser ",
+ "Simon Lydell ",
+ "Jmeas Smith ",
+ "Michael Z Goddard ",
+ "azu ",
+ "John Gozde ",
+ "Adam Kirkton ",
+ "Chris Montgomery ",
+ "J. Ryan Stinnett ",
+ "Jack Herrington ",
+ "Chris Truter ",
+ "Daniel Espeset ",
+ "Jamie Wong ",
+ "Eddy Bruël ",
+ "Hawken Rives ",
+ "Gilad Peleg ",
+ "djchie ",
+ "Gary Ye ",
+ "Nicolas Lalevée "
+ ],
+ "repository": "7rulnik/source-map-js",
+ "main": "./source-map.js",
+ "files": [
+ "source-map.js",
+ "source-map.d.ts",
+ "lib/"
+ ],
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "license": "BSD-3-Clause",
+ "scripts": {
+ "test": "npm run build && node test/run-tests.js",
+ "build": "webpack --color",
+ "toc": "doctoc --title '## Table of Contents' README.md && doctoc --title '## Table of Contents' CONTRIBUTING.md"
+ },
+ "devDependencies": {
+ "clean-publish": "^3.1.0",
+ "doctoc": "^0.15.0",
+ "webpack": "^1.12.0"
+ },
+ "clean-publish": {
+ "cleanDocs": true
+ },
+ "typings": "source-map.d.ts"
+}
diff --git a/frontend/node_modules/source-map-js/source-map.d.ts b/frontend/node_modules/source-map-js/source-map.d.ts
new file mode 100644
index 00000000..9f8a4b38
--- /dev/null
+++ b/frontend/node_modules/source-map-js/source-map.d.ts
@@ -0,0 +1,115 @@
+declare module 'source-map-js' {
+ export interface StartOfSourceMap {
+ file?: string;
+ sourceRoot?: string;
+ }
+
+ export interface RawSourceMap extends StartOfSourceMap {
+ version: string;
+ sources: string[];
+ names: string[];
+ sourcesContent?: string[];
+ mappings: string;
+ }
+
+ export interface Position {
+ line: number;
+ column: number;
+ }
+
+ export interface LineRange extends Position {
+ lastColumn: number;
+ }
+
+ export interface FindPosition extends Position {
+ // SourceMapConsumer.GREATEST_LOWER_BOUND or SourceMapConsumer.LEAST_UPPER_BOUND
+ bias?: number;
+ }
+
+ export interface SourceFindPosition extends FindPosition {
+ source: string;
+ }
+
+ export interface MappedPosition extends Position {
+ source: string;
+ name?: string;
+ }
+
+ export interface MappingItem {
+ source: string;
+ generatedLine: number;
+ generatedColumn: number;
+ originalLine: number;
+ originalColumn: number;
+ name: string;
+ }
+
+ export class SourceMapConsumer {
+ static GENERATED_ORDER: number;
+ static ORIGINAL_ORDER: number;
+
+ static GREATEST_LOWER_BOUND: number;
+ static LEAST_UPPER_BOUND: number;
+
+ constructor(rawSourceMap: RawSourceMap);
+ computeColumnSpans(): void;
+ originalPositionFor(generatedPosition: FindPosition): MappedPosition;
+ generatedPositionFor(originalPosition: SourceFindPosition): LineRange;
+ allGeneratedPositionsFor(originalPosition: MappedPosition): Position[];
+ hasContentsOfAllSources(): boolean;
+ sourceContentFor(source: string, returnNullOnMissing?: boolean): string;
+ eachMapping(callback: (mapping: MappingItem) => void, context?: any, order?: number): void;
+ }
+
+ export interface Mapping {
+ generated: Position;
+ original: Position;
+ source: string;
+ name?: string;
+ }
+
+ export class SourceMapGenerator {
+ constructor(startOfSourceMap?: StartOfSourceMap);
+ static fromSourceMap(sourceMapConsumer: SourceMapConsumer): SourceMapGenerator;
+ addMapping(mapping: Mapping): void;
+ setSourceContent(sourceFile: string, sourceContent: string): void;
+ applySourceMap(sourceMapConsumer: SourceMapConsumer, sourceFile?: string, sourceMapPath?: string): void;
+ toString(): string;
+ }
+
+ export interface CodeWithSourceMap {
+ code: string;
+ map: SourceMapGenerator;
+ }
+
+ export class SourceNode {
+ constructor();
+ constructor(line: number, column: number, source: string);
+ constructor(line: number, column: number, source: string, chunk?: string, name?: string);
+ static fromStringWithSourceMap(code: string, sourceMapConsumer: SourceMapConsumer, relativePath?: string): SourceNode;
+ add(chunk: string): void;
+ prepend(chunk: string): void;
+ setSourceContent(sourceFile: string, sourceContent: string): void;
+ walk(fn: (chunk: string, mapping: MappedPosition) => void): void;
+ walkSourceContents(fn: (file: string, content: string) => void): void;
+ join(sep: string): SourceNode;
+ replaceRight(pattern: string, replacement: string): SourceNode;
+ toString(): string;
+ toStringWithSourceMap(startOfSourceMap?: StartOfSourceMap): CodeWithSourceMap;
+ }
+}
+
+declare module 'source-map-js/lib/source-map-generator' {
+ import { SourceMapGenerator } from 'source-map-js'
+ export { SourceMapGenerator }
+}
+
+declare module 'source-map-js/lib/source-map-consumer' {
+ import { SourceMapConsumer } from 'source-map-js'
+ export { SourceMapConsumer }
+}
+
+declare module 'source-map-js/lib/source-node' {
+ import { SourceNode } from 'source-map-js'
+ export { SourceNode }
+}
diff --git a/frontend/node_modules/source-map-js/source-map.js b/frontend/node_modules/source-map-js/source-map.js
new file mode 100644
index 00000000..bc88fe82
--- /dev/null
+++ b/frontend/node_modules/source-map-js/source-map.js
@@ -0,0 +1,8 @@
+/*
+ * Copyright 2009-2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE.txt or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+exports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;
+exports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;
+exports.SourceNode = require('./lib/source-node').SourceNode;
diff --git a/frontend/node_modules/supports-preserve-symlinks-flag/.eslintrc b/frontend/node_modules/supports-preserve-symlinks-flag/.eslintrc
new file mode 100644
index 00000000..346ffeca
--- /dev/null
+++ b/frontend/node_modules/supports-preserve-symlinks-flag/.eslintrc
@@ -0,0 +1,14 @@
+{
+ "root": true,
+
+ "extends": "@ljharb",
+
+ "env": {
+ "browser": true,
+ "node": true,
+ },
+
+ "rules": {
+ "id-length": "off",
+ },
+}
diff --git a/frontend/node_modules/supports-preserve-symlinks-flag/.github/FUNDING.yml b/frontend/node_modules/supports-preserve-symlinks-flag/.github/FUNDING.yml
new file mode 100644
index 00000000..e8d64f37
--- /dev/null
+++ b/frontend/node_modules/supports-preserve-symlinks-flag/.github/FUNDING.yml
@@ -0,0 +1,12 @@
+# These are supported funding model platforms
+
+github: [ljharb]
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: npm/supports-preserve-symlink-flag
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/frontend/node_modules/supports-preserve-symlinks-flag/.nycrc b/frontend/node_modules/supports-preserve-symlinks-flag/.nycrc
new file mode 100644
index 00000000..bdd626ce
--- /dev/null
+++ b/frontend/node_modules/supports-preserve-symlinks-flag/.nycrc
@@ -0,0 +1,9 @@
+{
+ "all": true,
+ "check-coverage": false,
+ "reporter": ["text-summary", "text", "html", "json"],
+ "exclude": [
+ "coverage",
+ "test"
+ ]
+}
diff --git a/frontend/node_modules/supports-preserve-symlinks-flag/CHANGELOG.md b/frontend/node_modules/supports-preserve-symlinks-flag/CHANGELOG.md
new file mode 100644
index 00000000..61f607f4
--- /dev/null
+++ b/frontend/node_modules/supports-preserve-symlinks-flag/CHANGELOG.md
@@ -0,0 +1,22 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## v1.0.0 - 2022-01-02
+
+### Commits
+
+- Tests [`e2f59ad`](https://github.com/inspect-js/node-supports-preserve-symlinks-flag/commit/e2f59ad74e2ae0f5f4899fcde6a6f693ab7cc074)
+- Initial commit [`dc222aa`](https://github.com/inspect-js/node-supports-preserve-symlinks-flag/commit/dc222aad3c0b940d8d3af1ca9937d108bd2dc4b9)
+- [meta] do not publish workflow files [`5ef77f7`](https://github.com/inspect-js/node-supports-preserve-symlinks-flag/commit/5ef77f7cb6946d16ee38672be9ec0f1bbdf63262)
+- npm init [`992b068`](https://github.com/inspect-js/node-supports-preserve-symlinks-flag/commit/992b068503a461f7e8676f40ca2aab255fd8d6ff)
+- read me [`6c9afa9`](https://github.com/inspect-js/node-supports-preserve-symlinks-flag/commit/6c9afa9fabc8eaf0814aaed6dd01e6df0931b76d)
+- Initial implementation [`2f98925`](https://github.com/inspect-js/node-supports-preserve-symlinks-flag/commit/2f9892546396d4ab0ad9f1ff83e76c3f01234ae8)
+- [meta] add `auto-changelog` [`6c476ae`](https://github.com/inspect-js/node-supports-preserve-symlinks-flag/commit/6c476ae1ed7ce68b0480344f090ac2844f35509d)
+- [Dev Deps] add `eslint`, `@ljharb/eslint-config` [`d0fffc8`](https://github.com/inspect-js/node-supports-preserve-symlinks-flag/commit/d0fffc886d25fba119355520750a909d64da0087)
+- Only apps should have lockfiles [`ab318ed`](https://github.com/inspect-js/node-supports-preserve-symlinks-flag/commit/ab318ed7ae62f6c2c0e80a50398d40912afd8f69)
+- [meta] add `safe-publish-latest` [`2bb23b3`](https://github.com/inspect-js/node-supports-preserve-symlinks-flag/commit/2bb23b3ebab02dc4135c4cdf0217db82835b9fca)
+- [meta] add `sideEffects` flag [`600223b`](https://github.com/inspect-js/node-supports-preserve-symlinks-flag/commit/600223ba24f30779f209d9097721eff35ed62741)
diff --git a/frontend/node_modules/supports-preserve-symlinks-flag/LICENSE b/frontend/node_modules/supports-preserve-symlinks-flag/LICENSE
new file mode 100644
index 00000000..2e7b9a3e
--- /dev/null
+++ b/frontend/node_modules/supports-preserve-symlinks-flag/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 Inspect JS
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/frontend/node_modules/supports-preserve-symlinks-flag/README.md b/frontend/node_modules/supports-preserve-symlinks-flag/README.md
new file mode 100644
index 00000000..eb05b124
--- /dev/null
+++ b/frontend/node_modules/supports-preserve-symlinks-flag/README.md
@@ -0,0 +1,42 @@
+# node-supports-preserve-symlinks-flag [![Version Badge][npm-version-svg]][package-url]
+
+[![github actions][actions-image]][actions-url]
+[![coverage][codecov-image]][codecov-url]
+[![dependency status][deps-svg]][deps-url]
+[![dev dependency status][dev-deps-svg]][dev-deps-url]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][npm-badge-png]][package-url]
+
+Determine if the current node version supports the `--preserve-symlinks` flag.
+
+## Example
+
+```js
+var supportsPreserveSymlinks = require('node-supports-preserve-symlinks-flag');
+var assert = require('assert');
+
+assert.equal(supportsPreserveSymlinks, null); // in a browser
+assert.equal(supportsPreserveSymlinks, false); // in node < v6.2
+assert.equal(supportsPreserveSymlinks, true); // in node v6.2+
+```
+
+## Tests
+Simply clone the repo, `npm install`, and run `npm test`
+
+[package-url]: https://npmjs.org/package/node-supports-preserve-symlinks-flag
+[npm-version-svg]: https://versionbadg.es/inspect-js/node-supports-preserve-symlinks-flag.svg
+[deps-svg]: https://david-dm.org/inspect-js/node-supports-preserve-symlinks-flag.svg
+[deps-url]: https://david-dm.org/inspect-js/node-supports-preserve-symlinks-flag
+[dev-deps-svg]: https://david-dm.org/inspect-js/node-supports-preserve-symlinks-flag/dev-status.svg
+[dev-deps-url]: https://david-dm.org/inspect-js/node-supports-preserve-symlinks-flag#info=devDependencies
+[npm-badge-png]: https://nodei.co/npm/node-supports-preserve-symlinks-flag.png?downloads=true&stars=true
+[license-image]: https://img.shields.io/npm/l/node-supports-preserve-symlinks-flag.svg
+[license-url]: LICENSE
+[downloads-image]: https://img.shields.io/npm/dm/node-supports-preserve-symlinks-flag.svg
+[downloads-url]: https://npm-stat.com/charts.html?package=node-supports-preserve-symlinks-flag
+[codecov-image]: https://codecov.io/gh/inspect-js/node-supports-preserve-symlinks-flag/branch/main/graphs/badge.svg
+[codecov-url]: https://app.codecov.io/gh/inspect-js/node-supports-preserve-symlinks-flag/
+[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/inspect-js/node-supports-preserve-symlinks-flag
+[actions-url]: https://github.com/inspect-js/node-supports-preserve-symlinks-flag/actions
diff --git a/frontend/node_modules/supports-preserve-symlinks-flag/browser.js b/frontend/node_modules/supports-preserve-symlinks-flag/browser.js
new file mode 100644
index 00000000..087be1fe
--- /dev/null
+++ b/frontend/node_modules/supports-preserve-symlinks-flag/browser.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = null;
diff --git a/frontend/node_modules/supports-preserve-symlinks-flag/index.js b/frontend/node_modules/supports-preserve-symlinks-flag/index.js
new file mode 100644
index 00000000..86fd5d33
--- /dev/null
+++ b/frontend/node_modules/supports-preserve-symlinks-flag/index.js
@@ -0,0 +1,9 @@
+'use strict';
+
+module.exports = (
+// node 12+
+ process.allowedNodeEnvironmentFlags && process.allowedNodeEnvironmentFlags.has('--preserve-symlinks')
+) || (
+// node v6.2 - v11
+ String(module.constructor._findPath).indexOf('preserveSymlinks') >= 0 // eslint-disable-line no-underscore-dangle
+);
diff --git a/frontend/node_modules/supports-preserve-symlinks-flag/package.json b/frontend/node_modules/supports-preserve-symlinks-flag/package.json
new file mode 100644
index 00000000..56edadca
--- /dev/null
+++ b/frontend/node_modules/supports-preserve-symlinks-flag/package.json
@@ -0,0 +1,70 @@
+{
+ "name": "supports-preserve-symlinks-flag",
+ "version": "1.0.0",
+ "description": "Determine if the current node version supports the `--preserve-symlinks` flag.",
+ "main": "./index.js",
+ "browser": "./browser.js",
+ "exports": {
+ ".": [
+ {
+ "browser": "./browser.js",
+ "default": "./index.js"
+ },
+ "./index.js"
+ ],
+ "./package.json": "./package.json"
+ },
+ "sideEffects": false,
+ "scripts": {
+ "prepublishOnly": "safe-publish-latest",
+ "prepublish": "not-in-publish || npm run prepublishOnly",
+ "lint": "eslint --ext=js,mjs .",
+ "pretest": "npm run lint",
+ "tests-only": "nyc tape 'test/**/*.js'",
+ "test": "npm run tests-only",
+ "posttest": "aud --production",
+ "version": "auto-changelog && git add CHANGELOG.md",
+ "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/inspect-js/node-supports-preserve-symlinks-flag.git"
+ },
+ "keywords": [
+ "node",
+ "flag",
+ "symlink",
+ "symlinks",
+ "preserve-symlinks"
+ ],
+ "author": "Jordan Harband ",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/inspect-js/node-supports-preserve-symlinks-flag/issues"
+ },
+ "homepage": "https://github.com/inspect-js/node-supports-preserve-symlinks-flag#readme",
+ "devDependencies": {
+ "@ljharb/eslint-config": "^20.1.0",
+ "aud": "^1.1.5",
+ "auto-changelog": "^2.3.0",
+ "eslint": "^8.6.0",
+ "nyc": "^10.3.2",
+ "safe-publish-latest": "^2.0.0",
+ "semver": "^6.3.0",
+ "tape": "^5.4.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "auto-changelog": {
+ "output": "CHANGELOG.md",
+ "template": "keepachangelog",
+ "unreleased": false,
+ "commitLimit": false,
+ "backfillLimit": false,
+ "hideCredit": true
+ }
+}
diff --git a/frontend/node_modules/supports-preserve-symlinks-flag/test/index.js b/frontend/node_modules/supports-preserve-symlinks-flag/test/index.js
new file mode 100644
index 00000000..9938d671
--- /dev/null
+++ b/frontend/node_modules/supports-preserve-symlinks-flag/test/index.js
@@ -0,0 +1,29 @@
+'use strict';
+
+var test = require('tape');
+var semver = require('semver');
+
+var supportsPreserveSymlinks = require('../');
+var browser = require('../browser');
+
+test('supportsPreserveSymlinks', function (t) {
+ t.equal(typeof supportsPreserveSymlinks, 'boolean', 'is a boolean');
+
+ t.equal(browser, null, 'browser file is `null`');
+ t.equal(
+ supportsPreserveSymlinks,
+ null,
+ 'in a browser, is null',
+ { skip: typeof window === 'undefined' }
+ );
+
+ var expected = semver.satisfies(process.version, '>= 6.2');
+ t.equal(
+ supportsPreserveSymlinks,
+ expected,
+ 'is true in node v6.2+, false otherwise (actual: ' + supportsPreserveSymlinks + ', expected ' + expected + ')',
+ { skip: typeof window !== 'undefined' }
+ );
+
+ t.end();
+});
diff --git a/frontend/node_modules/vite/LICENSE.md b/frontend/node_modules/vite/LICENSE.md
new file mode 100644
index 00000000..80feb7f9
--- /dev/null
+++ b/frontend/node_modules/vite/LICENSE.md
@@ -0,0 +1,3819 @@
+# Vite core license
+Vite is released under the MIT license:
+
+MIT License
+
+Copyright (c) 2019-present, Yuxi (Evan) You and Vite contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+# Licenses of bundled dependencies
+The published Vite artifact additionally contains code with the following licenses:
+Apache-2.0, BSD-2-Clause, CC0-1.0, ISC, MIT, (BSD-3-Clause OR GPL-2.0)
+
+# Bundled dependencies:
+## @ampproject/remapping
+License: Apache-2.0
+By: Justin Ridgewell
+Repository: git+https://github.com/ampproject/remapping.git
+
+> Apache License
+> Version 2.0, January 2004
+> http://www.apache.org/licenses/
+>
+> TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+>
+> 1. Definitions.
+>
+> "License" shall mean the terms and conditions for use, reproduction,
+> and distribution as defined by Sections 1 through 9 of this document.
+>
+> "Licensor" shall mean the copyright owner or entity authorized by
+> the copyright owner that is granting the License.
+>
+> "Legal Entity" shall mean the union of the acting entity and all
+> other entities that control, are controlled by, or are under common
+> control with that entity. For the purposes of this definition,
+> "control" means (i) the power, direct or indirect, to cause the
+> direction or management of such entity, whether by contract or
+> otherwise, or (ii) ownership of fifty percent (50%) or more of the
+> outstanding shares, or (iii) beneficial ownership of such entity.
+>
+> "You" (or "Your") shall mean an individual or Legal Entity
+> exercising permissions granted by this License.
+>
+> "Source" form shall mean the preferred form for making modifications,
+> including but not limited to software source code, documentation
+> source, and configuration files.
+>
+> "Object" form shall mean any form resulting from mechanical
+> transformation or translation of a Source form, including but
+> not limited to compiled object code, generated documentation,
+> and conversions to other media types.
+>
+> "Work" shall mean the work of authorship, whether in Source or
+> Object form, made available under the License, as indicated by a
+> copyright notice that is included in or attached to the work
+> (an example is provided in the Appendix below).
+>
+> "Derivative Works" shall mean any work, whether in Source or Object
+> form, that is based on (or derived from) the Work and for which the
+> editorial revisions, annotations, elaborations, or other modifications
+> represent, as a whole, an original work of authorship. For the purposes
+> of this License, Derivative Works shall not include works that remain
+> separable from, or merely link (or bind by name) to the interfaces of,
+> the Work and Derivative Works thereof.
+>
+> "Contribution" shall mean any work of authorship, including
+> the original version of the Work and any modifications or additions
+> to that Work or Derivative Works thereof, that is intentionally
+> submitted to Licensor for inclusion in the Work by the copyright owner
+> or by an individual or Legal Entity authorized to submit on behalf of
+> the copyright owner. For the purposes of this definition, "submitted"
+> means any form of electronic, verbal, or written communication sent
+> to the Licensor or its representatives, including but not limited to
+> communication on electronic mailing lists, source code control systems,
+> and issue tracking systems that are managed by, or on behalf of, the
+> Licensor for the purpose of discussing and improving the Work, but
+> excluding communication that is conspicuously marked or otherwise
+> designated in writing by the copyright owner as "Not a Contribution."
+>
+> "Contributor" shall mean Licensor and any individual or Legal Entity
+> on behalf of whom a Contribution has been received by Licensor and
+> subsequently incorporated within the Work.
+>
+> 2. Grant of Copyright License. Subject to the terms and conditions of
+> this License, each Contributor hereby grants to You a perpetual,
+> worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+> copyright license to reproduce, prepare Derivative Works of,
+> publicly display, publicly perform, sublicense, and distribute the
+> Work and such Derivative Works in Source or Object form.
+>
+> 3. Grant of Patent License. Subject to the terms and conditions of
+> this License, each Contributor hereby grants to You a perpetual,
+> worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+> (except as stated in this section) patent license to make, have made,
+> use, offer to sell, sell, import, and otherwise transfer the Work,
+> where such license applies only to those patent claims licensable
+> by such Contributor that are necessarily infringed by their
+> Contribution(s) alone or by combination of their Contribution(s)
+> with the Work to which such Contribution(s) was submitted. If You
+> institute patent litigation against any entity (including a
+> cross-claim or counterclaim in a lawsuit) alleging that the Work
+> or a Contribution incorporated within the Work constitutes direct
+> or contributory patent infringement, then any patent licenses
+> granted to You under this License for that Work shall terminate
+> as of the date such litigation is filed.
+>
+> 4. Redistribution. You may reproduce and distribute copies of the
+> Work or Derivative Works thereof in any medium, with or without
+> modifications, and in Source or Object form, provided that You
+> meet the following conditions:
+>
+> (a) You must give any other recipients of the Work or
+> Derivative Works a copy of this License; and
+>
+> (b) You must cause any modified files to carry prominent notices
+> stating that You changed the files; and
+>
+> (c) You must retain, in the Source form of any Derivative Works
+> that You distribute, all copyright, patent, trademark, and
+> attribution notices from the Source form of the Work,
+> excluding those notices that do not pertain to any part of
+> the Derivative Works; and
+>
+> (d) If the Work includes a "NOTICE" text file as part of its
+> distribution, then any Derivative Works that You distribute must
+> include a readable copy of the attribution notices contained
+> within such NOTICE file, excluding those notices that do not
+> pertain to any part of the Derivative Works, in at least one
+> of the following places: within a NOTICE text file distributed
+> as part of the Derivative Works; within the Source form or
+> documentation, if provided along with the Derivative Works; or,
+> within a display generated by the Derivative Works, if and
+> wherever such third-party notices normally appear. The contents
+> of the NOTICE file are for informational purposes only and
+> do not modify the License. You may add Your own attribution
+> notices within Derivative Works that You distribute, alongside
+> or as an addendum to the NOTICE text from the Work, provided
+> that such additional attribution notices cannot be construed
+> as modifying the License.
+>
+> You may add Your own copyright statement to Your modifications and
+> may provide additional or different license terms and conditions
+> for use, reproduction, or distribution of Your modifications, or
+> for any such Derivative Works as a whole, provided Your use,
+> reproduction, and distribution of the Work otherwise complies with
+> the conditions stated in this License.
+>
+> 5. Submission of Contributions. Unless You explicitly state otherwise,
+> any Contribution intentionally submitted for inclusion in the Work
+> by You to the Licensor shall be under the terms and conditions of
+> this License, without any additional terms or conditions.
+> Notwithstanding the above, nothing herein shall supersede or modify
+> the terms of any separate license agreement you may have executed
+> with Licensor regarding such Contributions.
+>
+> 6. Trademarks. This License does not grant permission to use the trade
+> names, trademarks, service marks, or product names of the Licensor,
+> except as required for reasonable and customary use in describing the
+> origin of the Work and reproducing the content of the NOTICE file.
+>
+> 7. Disclaimer of Warranty. Unless required by applicable law or
+> agreed to in writing, Licensor provides the Work (and each
+> Contributor provides its Contributions) on an "AS IS" BASIS,
+> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+> implied, including, without limitation, any warranties or conditions
+> of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+> PARTICULAR PURPOSE. You are solely responsible for determining the
+> appropriateness of using or redistributing the Work and assume any
+> risks associated with Your exercise of permissions under this License.
+>
+> 8. Limitation of Liability. In no event and under no legal theory,
+> whether in tort (including negligence), contract, or otherwise,
+> unless required by applicable law (such as deliberate and grossly
+> negligent acts) or agreed to in writing, shall any Contributor be
+> liable to You for damages, including any direct, indirect, special,
+> incidental, or consequential damages of any character arising as a
+> result of this License or out of the use or inability to use the
+> Work (including but not limited to damages for loss of goodwill,
+> work stoppage, computer failure or malfunction, or any and all
+> other commercial damages or losses), even if such Contributor
+> has been advised of the possibility of such damages.
+>
+> 9. Accepting Warranty or Additional Liability. While redistributing
+> the Work or Derivative Works thereof, You may choose to offer,
+> and charge a fee for, acceptance of support, warranty, indemnity,
+> or other liability obligations and/or rights consistent with this
+> License. However, in accepting such obligations, You may act only
+> on Your own behalf and on Your sole responsibility, not on behalf
+> of any other Contributor, and only if You agree to indemnify,
+> defend, and hold each Contributor harmless for any liability
+> incurred by, or claims asserted against, such Contributor by reason
+> of your accepting any such warranty or additional liability.
+>
+> END OF TERMS AND CONDITIONS
+>
+> APPENDIX: How to apply the Apache License to your work.
+>
+> To apply the Apache License to your work, attach the following
+> boilerplate notice, with the fields enclosed by brackets "[]"
+> replaced with your own identifying information. (Don't include
+> the brackets!) The text should be enclosed in the appropriate
+> comment syntax for the file format. We also recommend that a
+> file or class name and description of purpose be included on the
+> same "printed page" as the copyright notice for easier
+> identification within third-party archives.
+>
+> Copyright 2019 Google LLC
+>
+> Licensed under the Apache License, Version 2.0 (the "License");
+> you may not use this file except in compliance with the License.
+> You may obtain a copy of the License at
+>
+> http://www.apache.org/licenses/LICENSE-2.0
+>
+> Unless required by applicable law or agreed to in writing, software
+> distributed under the License is distributed on an "AS IS" BASIS,
+> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+> See the License for the specific language governing permissions and
+> limitations under the License.
+
+---------------------------------------
+
+## @jridgewell/gen-mapping
+License: MIT
+By: Justin Ridgewell
+Repository: https://github.com/jridgewell/gen-mapping
+
+> Copyright 2022 Justin Ridgewell
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## @jridgewell/resolve-uri
+License: MIT
+By: Justin Ridgewell
+Repository: https://github.com/jridgewell/resolve-uri
+
+> Copyright 2019 Justin Ridgewell
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## @jridgewell/set-array
+License: MIT
+By: Justin Ridgewell
+Repository: https://github.com/jridgewell/set-array
+
+> Copyright 2022 Justin Ridgewell
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## @jridgewell/sourcemap-codec
+License: MIT
+By: Rich Harris
+Repository: git+https://github.com/jridgewell/sourcemap-codec.git
+
+> The MIT License
+>
+> Copyright (c) 2015 Rich Harris
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## @jridgewell/trace-mapping
+License: MIT
+By: Justin Ridgewell
+Repository: git+https://github.com/jridgewell/trace-mapping.git
+
+> Copyright 2022 Justin Ridgewell
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## @nodelib/fs.scandir
+License: MIT
+Repository: https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.scandir
+
+> The MIT License (MIT)
+>
+> Copyright (c) Denis Malinochkin
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## @nodelib/fs.stat
+License: MIT
+Repository: https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.stat
+
+> The MIT License (MIT)
+>
+> Copyright (c) Denis Malinochkin
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## @nodelib/fs.walk
+License: MIT
+Repository: https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.walk
+
+> The MIT License (MIT)
+>
+> Copyright (c) Denis Malinochkin
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## @polka/url
+License: MIT
+By: Luke Edwards
+Repository: lukeed/polka
+
+> The MIT License (MIT)
+>
+> Copyright (c) Luke Edwards (https://lukeed.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## @rollup/plugin-alias
+License: MIT
+By: Johannes Stein
+Repository: rollup/plugins
+
+---------------------------------------
+
+## @rollup/plugin-commonjs
+License: MIT
+By: Rich Harris
+Repository: rollup/plugins
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2019 RollupJS Plugin Contributors (https://github.com/rollup/plugins/graphs/contributors)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## @rollup/plugin-dynamic-import-vars
+License: MIT
+By: LarsDenBakker
+Repository: rollup/plugins
+
+---------------------------------------
+
+## @rollup/pluginutils
+License: MIT
+By: Rich Harris
+Repository: rollup/plugins
+
+---------------------------------------
+
+## @vue/compiler-core
+License: MIT
+By: Evan You
+Repository: git+https://github.com/vuejs/core.git
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2018-present, Yuxi (Evan) You
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## @vue/compiler-dom
+License: MIT
+By: Evan You
+Repository: git+https://github.com/vuejs/core.git
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2018-present, Yuxi (Evan) You
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## @vue/shared
+License: MIT
+By: Evan You
+Repository: git+https://github.com/vuejs/core.git
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2018-present, Yuxi (Evan) You
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## acorn
+License: MIT
+By: Marijn Haverbeke, Ingvar Stepanyan, Adrian Heine
+Repository: https://github.com/acornjs/acorn.git
+
+> MIT License
+>
+> Copyright (C) 2012-2022 by various contributors (see AUTHORS)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## ansi-regex
+License: MIT
+By: Sindre Sorhus
+Repository: chalk/ansi-regex
+
+> MIT License
+>
+> Copyright (c) Sindre Sorhus (sindresorhus.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## anymatch
+License: ISC
+By: Elan Shanker
+Repository: https://github.com/micromatch/anymatch
+
+> The ISC License
+>
+> Copyright (c) 2019 Elan Shanker, Paul Miller (https://paulmillr.com)
+>
+> 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.
+
+---------------------------------------
+
+## balanced-match
+License: MIT
+By: Julian Gruber
+Repository: git://github.com/juliangruber/balanced-match.git
+
+> (MIT)
+>
+> Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of
+> this software and associated documentation files (the "Software"), to deal in
+> the Software without restriction, including without limitation the rights to
+> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+> of the Software, and to permit persons to whom the Software is furnished to do
+> so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## binary-extensions
+License: MIT
+By: Sindre Sorhus
+Repository: sindresorhus/binary-extensions
+
+> MIT License
+>
+> Copyright (c) 2019 Sindre Sorhus (https://sindresorhus.com), Paul Miller (https://paulmillr.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## brace-expansion
+License: MIT
+By: Julian Gruber
+Repository: git://github.com/juliangruber/brace-expansion.git
+
+> MIT License
+>
+> Copyright (c) 2013 Julian Gruber
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## braces
+License: MIT
+By: Jon Schlinkert, Brian Woodward, Elan Shanker, Eugene Sharygin, hemanth.hm
+Repository: micromatch/braces
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2014-2018, Jon Schlinkert.
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## cac
+License: MIT
+By: egoist
+Repository: egoist/cac
+
+> The MIT License (MIT)
+>
+> Copyright (c) EGOIST <0x142857@gmail.com> (https://github.com/egoist)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## chokidar
+License: MIT
+By: Paul Miller, Elan Shanker
+Repository: git+https://github.com/paulmillr/chokidar.git
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2012-2019 Paul Miller (https://paulmillr.com), Elan Shanker
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the “Software”), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## commondir
+License: MIT
+By: James Halliday
+Repository: http://github.com/substack/node-commondir.git
+
+> The MIT License
+>
+> Copyright (c) 2013 James Halliday (mail@substack.net)
+>
+> Permission is hereby granted, free of charge,
+> to any person obtaining a copy of this software and
+> associated documentation files (the "Software"), to
+> deal in the Software without restriction, including
+> without limitation the rights to use, copy, modify,
+> merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom
+> the Software is furnished to do so,
+> subject to the following conditions:
+>
+> The above copyright notice and this permission notice
+> shall be included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+> ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## concat-map
+License: MIT
+By: James Halliday
+Repository: git://github.com/substack/node-concat-map.git
+
+> This software is released under the MIT license:
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of
+> this software and associated documentation files (the "Software"), to deal in
+> the Software without restriction, including without limitation the rights to
+> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+> the Software, and to permit persons to whom the Software is furnished to do so,
+> subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## connect
+License: MIT
+By: TJ Holowaychuk, Douglas Christopher Wilson, Jonathan Ong, Tim Caswell
+Repository: senchalabs/connect
+
+> (The MIT License)
+>
+> Copyright (c) 2010 Sencha Inc.
+> Copyright (c) 2011 LearnBoost
+> Copyright (c) 2011-2014 TJ Holowaychuk
+> Copyright (c) 2015 Douglas Christopher Wilson
+>
+> Permission is hereby granted, free of charge, to any person obtaining
+> a copy of this software and associated documentation files (the
+> 'Software'), to deal in the Software without restriction, including
+> without limitation the rights to use, copy, modify, merge, publish,
+> distribute, sublicense, and/or sell copies of the Software, and to
+> permit persons to whom the Software is furnished to do so, subject to
+> the following conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## connect-history-api-fallback
+License: MIT
+By: Ben Ripkens, Craig Myles
+Repository: http://github.com/bripkens/connect-history-api-fallback.git
+
+> The MIT License
+>
+> Copyright (c) 2012 Ben Ripkens http://bripkens.de
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## convert-source-map
+License: MIT
+By: Thorsten Lorenz
+Repository: git://github.com/thlorenz/convert-source-map.git
+
+> Copyright 2013 Thorsten Lorenz.
+> All rights reserved.
+>
+> Permission is hereby granted, free of charge, to any person
+> obtaining a copy of this software and associated documentation
+> files (the "Software"), to deal in the Software without
+> restriction, including without limitation the rights to use,
+> copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the
+> Software is furnished to do so, subject to the following
+> conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+> HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+> OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## cors
+License: MIT
+By: Troy Goode
+Repository: expressjs/cors
+
+> (The MIT License)
+>
+> Copyright (c) 2013 Troy Goode
+>
+> Permission is hereby granted, free of charge, to any person obtaining
+> a copy of this software and associated documentation files (the
+> 'Software'), to deal in the Software without restriction, including
+> without limitation the rights to use, copy, modify, merge, publish,
+> distribute, sublicense, and/or sell copies of the Software, and to
+> permit persons to whom the Software is furnished to do so, subject to
+> the following conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## cross-spawn
+License: MIT
+By: André Cruz
+Repository: git@github.com:moxystudio/node-cross-spawn.git
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2018 Made With MOXY Lda
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## cssesc
+License: MIT
+By: Mathias Bynens
+Repository: https://github.com/mathiasbynens/cssesc.git
+
+> Copyright Mathias Bynens
+>
+> Permission is hereby granted, free of charge, to any person obtaining
+> a copy of this software and associated documentation files (the
+> "Software"), to deal in the Software without restriction, including
+> without limitation the rights to use, copy, modify, merge, publish,
+> distribute, sublicense, and/or sell copies of the Software, and to
+> permit persons to whom the Software is furnished to do so, subject to
+> the following conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## debug
+License: MIT
+By: Josh Junon, TJ Holowaychuk, Nathan Rajlich, Andrew Rhyne
+Repository: git://github.com/debug-js/debug.git
+
+> (The MIT License)
+>
+> Copyright (c) 2014-2017 TJ Holowaychuk
+> Copyright (c) 2018-2021 Josh Junon
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+> and associated documentation files (the 'Software'), to deal in the Software without restriction,
+> including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+> and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+> subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all copies or substantial
+> portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+> LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## define-lazy-prop
+License: MIT
+By: Sindre Sorhus
+Repository: sindresorhus/define-lazy-prop
+
+> MIT License
+>
+> Copyright (c) Sindre Sorhus (sindresorhus.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## dotenv
+License: BSD-2-Clause
+Repository: git://github.com/motdotla/dotenv.git
+
+> Copyright (c) 2015, Scott Motte
+> All rights reserved.
+>
+> Redistribution and use in source and binary forms, with or without
+> modification, are permitted provided that the following conditions are met:
+>
+> * Redistributions of source code must retain the above copyright notice, this
+> list of conditions and the following disclaimer.
+>
+> * Redistributions in binary form must reproduce the above copyright notice,
+> this list of conditions and the following disclaimer in the documentation
+> and/or other materials provided with the distribution.
+>
+> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+> AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+> IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+> DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+> FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+> DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+> SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+> OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+> OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+---------------------------------------
+
+## dotenv-expand
+License: BSD-2-Clause
+By: motdotla
+
+> Copyright (c) 2016, Scott Motte
+> All rights reserved.
+>
+> Redistribution and use in source and binary forms, with or without
+> modification, are permitted provided that the following conditions are met:
+>
+> * Redistributions of source code must retain the above copyright notice, this
+> list of conditions and the following disclaimer.
+>
+> * Redistributions in binary form must reproduce the above copyright notice,
+> this list of conditions and the following disclaimer in the documentation
+> and/or other materials provided with the distribution.
+>
+> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+> AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+> IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+> DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+> FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+> DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+> SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+> OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+> OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+---------------------------------------
+
+## ee-first
+License: MIT
+By: Jonathan Ong, Douglas Christopher Wilson
+Repository: jonathanong/ee-first
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2014 Jonathan Ong me@jongleberry.com
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## encodeurl
+License: MIT
+By: Douglas Christopher Wilson
+Repository: pillarjs/encodeurl
+
+> (The MIT License)
+>
+> Copyright (c) 2016 Douglas Christopher Wilson
+>
+> Permission is hereby granted, free of charge, to any person obtaining
+> a copy of this software and associated documentation files (the
+> 'Software'), to deal in the Software without restriction, including
+> without limitation the rights to use, copy, modify, merge, publish,
+> distribute, sublicense, and/or sell copies of the Software, and to
+> permit persons to whom the Software is furnished to do so, subject to
+> the following conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## es-module-lexer
+License: MIT
+By: Guy Bedford
+Repository: git+https://github.com/guybedford/es-module-lexer.git
+
+> MIT License
+> -----------
+>
+> Copyright (C) 2018-2022 Guy Bedford
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## escape-html
+License: MIT
+Repository: component/escape-html
+
+> (The MIT License)
+>
+> Copyright (c) 2012-2013 TJ Holowaychuk
+> Copyright (c) 2015 Andreas Lubbe
+> Copyright (c) 2015 Tiancheng "Timothy" Gu
+>
+> Permission is hereby granted, free of charge, to any person obtaining
+> a copy of this software and associated documentation files (the
+> 'Software'), to deal in the Software without restriction, including
+> without limitation the rights to use, copy, modify, merge, publish,
+> distribute, sublicense, and/or sell copies of the Software, and to
+> permit persons to whom the Software is furnished to do so, subject to
+> the following conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## estree-walker
+License: MIT
+By: Rich Harris
+Repository: https://github.com/Rich-Harris/estree-walker
+
+> Copyright (c) 2015-20 [these people](https://github.com/Rich-Harris/estree-walker/graphs/contributors)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## etag
+License: MIT
+By: Douglas Christopher Wilson, David Björklund
+Repository: jshttp/etag
+
+> (The MIT License)
+>
+> Copyright (c) 2014-2016 Douglas Christopher Wilson
+>
+> Permission is hereby granted, free of charge, to any person obtaining
+> a copy of this software and associated documentation files (the
+> 'Software'), to deal in the Software without restriction, including
+> without limitation the rights to use, copy, modify, merge, publish,
+> distribute, sublicense, and/or sell copies of the Software, and to
+> permit persons to whom the Software is furnished to do so, subject to
+> the following conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## eventemitter3
+License: MIT
+By: Arnout Kazemier
+Repository: git://github.com/primus/eventemitter3.git
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2014 Arnout Kazemier
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## fast-glob
+License: MIT
+By: Denis Malinochkin
+Repository: mrmlnc/fast-glob
+
+> The MIT License (MIT)
+>
+> Copyright (c) Denis Malinochkin
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## fastq
+License: ISC
+By: Matteo Collina
+Repository: git+https://github.com/mcollina/fastq.git
+
+> Copyright (c) 2015-2020, Matteo Collina
+>
+> 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.
+
+---------------------------------------
+
+## fill-range
+License: MIT
+By: Jon Schlinkert, Edo Rivai, Paul Miller, Rouven Weßling
+Repository: jonschlinkert/fill-range
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2014-present, Jon Schlinkert.
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## finalhandler
+License: MIT
+By: Douglas Christopher Wilson
+Repository: pillarjs/finalhandler
+
+> (The MIT License)
+>
+> Copyright (c) 2014-2017 Douglas Christopher Wilson
+>
+> Permission is hereby granted, free of charge, to any person obtaining
+> a copy of this software and associated documentation files (the
+> 'Software'), to deal in the Software without restriction, including
+> without limitation the rights to use, copy, modify, merge, publish,
+> distribute, sublicense, and/or sell copies of the Software, and to
+> permit persons to whom the Software is furnished to do so, subject to
+> the following conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## follow-redirects
+License: MIT
+By: Ruben Verborgh, Olivier Lalonde, James Talmage
+Repository: git@github.com:follow-redirects/follow-redirects.git
+
+> Copyright 2014–present Olivier Lalonde , James Talmage , Ruben Verborgh
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of
+> this software and associated documentation files (the "Software"), to deal in
+> the Software without restriction, including without limitation the rights to
+> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+> of the Software, and to permit persons to whom the Software is furnished to do
+> so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+> IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## fs.realpath
+License: ISC
+By: Isaac Z. Schlueter
+Repository: git+https://github.com/isaacs/fs.realpath.git
+
+> The ISC License
+>
+> Copyright (c) Isaac Z. Schlueter and Contributors
+>
+> 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.
+>
+> ----
+>
+> This library bundles a version of the `fs.realpath` and `fs.realpathSync`
+> methods from Node.js v0.10 under the terms of the Node.js MIT license.
+>
+> Node's license follows, also included at the header of `old.js` which contains
+> the licensed code:
+>
+> Copyright Joyent, Inc. and other Node contributors.
+>
+> Permission is hereby granted, free of charge, to any person obtaining a
+> copy of this software and associated documentation files (the "Software"),
+> to deal in the Software without restriction, including without limitation
+> the rights to use, copy, modify, merge, publish, distribute, sublicense,
+> and/or sell copies of the Software, and to permit persons to whom the
+> Software is furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+> DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## generic-names
+License: MIT
+By: Alexey Litvinov
+Repository: git+https://github.com/css-modules/generic-names.git
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2015 Alexey Litvinov
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## glob
+License: ISC
+By: Isaac Z. Schlueter
+Repository: git://github.com/isaacs/node-glob.git
+
+> The ISC License
+>
+> Copyright (c) Isaac Z. Schlueter and Contributors
+>
+> 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.
+>
+> ## Glob Logo
+>
+> Glob's logo created by Tanya Brassie , licensed
+> under a Creative Commons Attribution-ShareAlike 4.0 International License
+> https://creativecommons.org/licenses/by-sa/4.0/
+
+---------------------------------------
+
+## glob-parent
+License: ISC
+By: Gulp Team, Elan Shanker, Blaine Bublitz
+Repository: gulpjs/glob-parent
+
+> The ISC License
+>
+> Copyright (c) 2015, 2019 Elan Shanker
+>
+> 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.
+
+---------------------------------------
+
+## http-proxy
+License: MIT
+By: Charlie Robbins
+Repository: https://github.com/http-party/node-http-proxy.git
+
+> node-http-proxy
+>
+> Copyright (c) 2010-2016 Charlie Robbins, Jarrett Cruger & the Contributors.
+>
+> Permission is hereby granted, free of charge, to any person obtaining
+> a copy of this software and associated documentation files (the
+> "Software"), to deal in the Software without restriction, including
+> without limitation the rights to use, copy, modify, merge, publish,
+> distribute, sublicense, and/or sell copies of the Software, and to
+> permit persons to whom the Software is furnished to do so, subject to
+> the following conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## icss-replace-symbols
+License: ISC
+By: Glen Maddern
+Repository: git+https://github.com/css-modules/icss-replace-symbols.git
+
+---------------------------------------
+
+## icss-utils
+License: ISC
+By: Glen Maddern
+Repository: git+https://github.com/css-modules/icss-utils.git
+
+> ISC License (ISC)
+> Copyright 2018 Glen Maddern
+>
+> 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.
+
+---------------------------------------
+
+## inflight
+License: ISC
+By: Isaac Z. Schlueter
+Repository: https://github.com/npm/inflight.git
+
+> The ISC License
+>
+> Copyright (c) Isaac Z. Schlueter
+>
+> 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.
+
+---------------------------------------
+
+## inherits
+License: ISC
+Repository: git://github.com/isaacs/inherits
+
+> The ISC License
+>
+> Copyright (c) Isaac Z. Schlueter
+>
+> 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.
+
+---------------------------------------
+
+## is-binary-path
+License: MIT
+By: Sindre Sorhus
+Repository: sindresorhus/is-binary-path
+
+> MIT License
+>
+> Copyright (c) 2019 Sindre Sorhus (https://sindresorhus.com), Paul Miller (https://paulmillr.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## is-docker
+License: MIT
+By: Sindre Sorhus
+Repository: sindresorhus/is-docker
+
+> MIT License
+>
+> Copyright (c) Sindre Sorhus (https://sindresorhus.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## is-extglob
+License: MIT
+By: Jon Schlinkert
+Repository: jonschlinkert/is-extglob
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2014-2016, Jon Schlinkert
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## is-glob
+License: MIT
+By: Jon Schlinkert, Brian Woodward, Daniel Perez
+Repository: micromatch/is-glob
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2014-2017, Jon Schlinkert.
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## is-number
+License: MIT
+By: Jon Schlinkert, Olsten Larck, Rouven Weßling
+Repository: jonschlinkert/is-number
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2014-present, Jon Schlinkert.
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## is-reference
+License: MIT
+By: Rich Harris
+Repository: git+https://github.com/Rich-Harris/is-reference.git
+
+---------------------------------------
+
+## is-wsl
+License: MIT
+By: Sindre Sorhus
+Repository: sindresorhus/is-wsl
+
+> MIT License
+>
+> Copyright (c) Sindre Sorhus (sindresorhus.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## isexe
+License: ISC
+By: Isaac Z. Schlueter
+Repository: git+https://github.com/isaacs/isexe.git
+
+> The ISC License
+>
+> Copyright (c) Isaac Z. Schlueter and Contributors
+>
+> 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.
+
+---------------------------------------
+
+## json5
+License: MIT
+By: Aseem Kishore, Max Nanasy, Andrew Eisenberg, Jordan Tucker
+Repository: git+https://github.com/json5/json5.git
+
+> MIT License
+>
+> Copyright (c) 2012-2018 Aseem Kishore, and [others].
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+>
+> [others]: https://github.com/json5/json5/contributors
+
+---------------------------------------
+
+## launch-editor
+License: MIT
+By: Evan You
+Repository: git+https://github.com/yyx990803/launch-editor.git
+
+---------------------------------------
+
+## launch-editor-middleware
+License: MIT
+By: Evan You
+Repository: git+https://github.com/yyx990803/launch-editor.git
+
+---------------------------------------
+
+## lilconfig
+License: MIT
+By: antonk52
+Repository: https://github.com/antonk52/lilconfig
+
+---------------------------------------
+
+## loader-utils
+License: MIT
+By: Tobias Koppers @sokra
+Repository: https://github.com/webpack/loader-utils.git
+
+> Copyright JS Foundation and other contributors
+>
+> Permission is hereby granted, free of charge, to any person obtaining
+> a copy of this software and associated documentation files (the
+> 'Software'), to deal in the Software without restriction, including
+> without limitation the rights to use, copy, modify, merge, publish,
+> distribute, sublicense, and/or sell copies of the Software, and to
+> permit persons to whom the Software is furnished to do so, subject to
+> the following conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## lodash.camelcase
+License: MIT
+By: John-David Dalton, Blaine Bublitz, Mathias Bynens
+Repository: lodash/lodash
+
+> Copyright jQuery Foundation and other contributors
+>
+> Based on Underscore.js, copyright Jeremy Ashkenas,
+> DocumentCloud and Investigative Reporters & Editors
+>
+> This software consists of voluntary contributions made by many
+> individuals. For exact contribution history, see the revision history
+> available at https://github.com/lodash/lodash
+>
+> The following license applies to all parts of this software except as
+> documented below:
+>
+> ====
+>
+> Permission is hereby granted, free of charge, to any person obtaining
+> a copy of this software and associated documentation files (the
+> "Software"), to deal in the Software without restriction, including
+> without limitation the rights to use, copy, modify, merge, publish,
+> distribute, sublicense, and/or sell copies of the Software, and to
+> permit persons to whom the Software is furnished to do so, subject to
+> the following conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+>
+> ====
+>
+> Copyright and related rights for sample code are waived via CC0. Sample
+> code is defined as all source code displayed within the prose of the
+> documentation.
+>
+> CC0: http://creativecommons.org/publicdomain/zero/1.0/
+>
+> ====
+>
+> Files located in the node_modules and vendor directories are externally
+> maintained libraries used by this software which have their own
+> licenses; we recommend you read them, as their terms may differ from the
+> terms above.
+
+---------------------------------------
+
+## magic-string
+License: MIT
+By: Rich Harris
+Repository: https://github.com/rich-harris/magic-string
+
+> Copyright 2018 Rich Harris
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## merge2
+License: MIT
+Repository: git@github.com:teambition/merge2.git
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2014-2020 Teambition
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## micromatch
+License: MIT
+By: Jon Schlinkert, Amila Welihinda, Bogdan Chadkin, Brian Woodward, Devon Govett, Elan Shanker, Fabrício Matté, Martin Kolárik, Olsten Larck, Paul Miller, Tom Byrer, Tyler Akins, Peter Bright, Kuba Juszczyk
+Repository: micromatch/micromatch
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2014-present, Jon Schlinkert.
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## minimatch
+License: ISC
+By: Isaac Z. Schlueter
+Repository: git://github.com/isaacs/minimatch.git
+
+> The ISC License
+>
+> Copyright (c) Isaac Z. Schlueter and Contributors
+>
+> 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.
+
+---------------------------------------
+
+## mrmime
+License: MIT
+By: Luke Edwards
+Repository: lukeed/mrmime
+
+> The MIT License (MIT)
+>
+> Copyright (c) Luke Edwards (https://lukeed.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## ms
+License: MIT
+Repository: zeit/ms
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2016 Zeit, Inc.
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## node-forge
+License: (BSD-3-Clause OR GPL-2.0)
+By: Digital Bazaar, Inc., Dave Longley, David I. Lehn, Stefan Siegl, Christoph Dorn
+Repository: https://github.com/digitalbazaar/forge
+
+> You may use the Forge project under the terms of either the BSD License or the
+> GNU General Public License (GPL) Version 2.
+>
+> The BSD License is recommended for most projects. It is simple and easy to
+> understand and it places almost no restrictions on what you can do with the
+> Forge project.
+>
+> If the GPL suits your project better you are also free to use Forge under
+> that license.
+>
+> You don't have to do anything special to choose one license or the other and
+> you don't have to notify anyone which license you are using. You are free to
+> use this project in commercial projects as long as the copyright header is
+> left intact.
+>
+> If you are a commercial entity and use this set of libraries in your
+> commercial software then reasonable payment to Digital Bazaar, if you can
+> afford it, is not required but is expected and would be appreciated. If this
+> library saves you time, then it's saving you money. The cost of developing
+> the Forge software was on the order of several hundred hours and tens of
+> thousands of dollars. We are attempting to strike a balance between helping
+> the development community while not being taken advantage of by lucrative
+> commercial entities for our efforts.
+>
+> -------------------------------------------------------------------------------
+> New BSD License (3-clause)
+> Copyright (c) 2010, Digital Bazaar, Inc.
+> All rights reserved.
+>
+> Redistribution and use in source and binary forms, with or without
+> modification, are permitted provided that the following conditions are met:
+> * Redistributions of source code must retain the above copyright
+> notice, this list of conditions and the following disclaimer.
+> * Redistributions in binary form must reproduce the above copyright
+> notice, this list of conditions and the following disclaimer in the
+> documentation and/or other materials provided with the distribution.
+> * Neither the name of Digital Bazaar, Inc. nor the
+> names of its contributors may be used to endorse or promote products
+> derived from this software without specific prior written permission.
+>
+> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+> ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+> WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+> DISCLAIMED. IN NO EVENT SHALL DIGITAL BAZAAR BE LIABLE FOR ANY
+> DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+> (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+> LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+> ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+> (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+> SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+>
+> -------------------------------------------------------------------------------
+> GNU GENERAL PUBLIC LICENSE
+> Version 2, June 1991
+>
+> Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+> 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+> Everyone is permitted to copy and distribute verbatim copies
+> of this license document, but changing it is not allowed.
+>
+> Preamble
+>
+> The licenses for most software are designed to take away your
+> freedom to share and change it. By contrast, the GNU General Public
+> License is intended to guarantee your freedom to share and change free
+> software--to make sure the software is free for all its users. This
+> General Public License applies to most of the Free Software
+> Foundation's software and to any other program whose authors commit to
+> using it. (Some other Free Software Foundation software is covered by
+> the GNU Lesser General Public License instead.) You can apply it to
+> your programs, too.
+>
+> When we speak of free software, we are referring to freedom, not
+> price. Our General Public Licenses are designed to make sure that you
+> have the freedom to distribute copies of free software (and charge for
+> this service if you wish), that you receive source code or can get it
+> if you want it, that you can change the software or use pieces of it
+> in new free programs; and that you know you can do these things.
+>
+> To protect your rights, we need to make restrictions that forbid
+> anyone to deny you these rights or to ask you to surrender the rights.
+> These restrictions translate to certain responsibilities for you if you
+> distribute copies of the software, or if you modify it.
+>
+> For example, if you distribute copies of such a program, whether
+> gratis or for a fee, you must give the recipients all the rights that
+> you have. You must make sure that they, too, receive or can get the
+> source code. And you must show them these terms so they know their
+> rights.
+>
+> We protect your rights with two steps: (1) copyright the software, and
+> (2) offer you this license which gives you legal permission to copy,
+> distribute and/or modify the software.
+>
+> Also, for each author's protection and ours, we want to make certain
+> that everyone understands that there is no warranty for this free
+> software. If the software is modified by someone else and passed on, we
+> want its recipients to know that what they have is not the original, so
+> that any problems introduced by others will not reflect on the original
+> authors' reputations.
+>
+> Finally, any free program is threatened constantly by software
+> patents. We wish to avoid the danger that redistributors of a free
+> program will individually obtain patent licenses, in effect making the
+> program proprietary. To prevent this, we have made it clear that any
+> patent must be licensed for everyone's free use or not licensed at all.
+>
+> The precise terms and conditions for copying, distribution and
+> modification follow.
+>
+> GNU GENERAL PUBLIC LICENSE
+> TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+>
+> 0. This License applies to any program or other work which contains
+> a notice placed by the copyright holder saying it may be distributed
+> under the terms of this General Public License. The "Program", below,
+> refers to any such program or work, and a "work based on the Program"
+> means either the Program or any derivative work under copyright law:
+> that is to say, a work containing the Program or a portion of it,
+> either verbatim or with modifications and/or translated into another
+> language. (Hereinafter, translation is included without limitation in
+> the term "modification".) Each licensee is addressed as "you".
+>
+> Activities other than copying, distribution and modification are not
+> covered by this License; they are outside its scope. The act of
+> running the Program is not restricted, and the output from the Program
+> is covered only if its contents constitute a work based on the
+> Program (independent of having been made by running the Program).
+> Whether that is true depends on what the Program does.
+>
+> 1. You may copy and distribute verbatim copies of the Program's
+> source code as you receive it, in any medium, provided that you
+> conspicuously and appropriately publish on each copy an appropriate
+> copyright notice and disclaimer of warranty; keep intact all the
+> notices that refer to this License and to the absence of any warranty;
+> and give any other recipients of the Program a copy of this License
+> along with the Program.
+>
+> You may charge a fee for the physical act of transferring a copy, and
+> you may at your option offer warranty protection in exchange for a fee.
+>
+> 2. You may modify your copy or copies of the Program or any portion
+> of it, thus forming a work based on the Program, and copy and
+> distribute such modifications or work under the terms of Section 1
+> above, provided that you also meet all of these conditions:
+>
+> a) You must cause the modified files to carry prominent notices
+> stating that you changed the files and the date of any change.
+>
+> b) You must cause any work that you distribute or publish, that in
+> whole or in part contains or is derived from the Program or any
+> part thereof, to be licensed as a whole at no charge to all third
+> parties under the terms of this License.
+>
+> c) If the modified program normally reads commands interactively
+> when run, you must cause it, when started running for such
+> interactive use in the most ordinary way, to print or display an
+> announcement including an appropriate copyright notice and a
+> notice that there is no warranty (or else, saying that you provide
+> a warranty) and that users may redistribute the program under
+> these conditions, and telling the user how to view a copy of this
+> License. (Exception: if the Program itself is interactive but
+> does not normally print such an announcement, your work based on
+> the Program is not required to print an announcement.)
+>
+> These requirements apply to the modified work as a whole. If
+> identifiable sections of that work are not derived from the Program,
+> and can be reasonably considered independent and separate works in
+> themselves, then this License, and its terms, do not apply to those
+> sections when you distribute them as separate works. But when you
+> distribute the same sections as part of a whole which is a work based
+> on the Program, the distribution of the whole must be on the terms of
+> this License, whose permissions for other licensees extend to the
+> entire whole, and thus to each and every part regardless of who wrote it.
+>
+> Thus, it is not the intent of this section to claim rights or contest
+> your rights to work written entirely by you; rather, the intent is to
+> exercise the right to control the distribution of derivative or
+> collective works based on the Program.
+>
+> In addition, mere aggregation of another work not based on the Program
+> with the Program (or with a work based on the Program) on a volume of
+> a storage or distribution medium does not bring the other work under
+> the scope of this License.
+>
+> 3. You may copy and distribute the Program (or a work based on it,
+> under Section 2) in object code or executable form under the terms of
+> Sections 1 and 2 above provided that you also do one of the following:
+>
+> a) Accompany it with the complete corresponding machine-readable
+> source code, which must be distributed under the terms of Sections
+> 1 and 2 above on a medium customarily used for software interchange; or,
+>
+> b) Accompany it with a written offer, valid for at least three
+> years, to give any third party, for a charge no more than your
+> cost of physically performing source distribution, a complete
+> machine-readable copy of the corresponding source code, to be
+> distributed under the terms of Sections 1 and 2 above on a medium
+> customarily used for software interchange; or,
+>
+> c) Accompany it with the information you received as to the offer
+> to distribute corresponding source code. (This alternative is
+> allowed only for noncommercial distribution and only if you
+> received the program in object code or executable form with such
+> an offer, in accord with Subsection b above.)
+>
+> The source code for a work means the preferred form of the work for
+> making modifications to it. For an executable work, complete source
+> code means all the source code for all modules it contains, plus any
+> associated interface definition files, plus the scripts used to
+> control compilation and installation of the executable. However, as a
+> special exception, the source code distributed need not include
+> anything that is normally distributed (in either source or binary
+> form) with the major components (compiler, kernel, and so on) of the
+> operating system on which the executable runs, unless that component
+> itself accompanies the executable.
+>
+> If distribution of executable or object code is made by offering
+> access to copy from a designated place, then offering equivalent
+> access to copy the source code from the same place counts as
+> distribution of the source code, even though third parties are not
+> compelled to copy the source along with the object code.
+>
+> 4. You may not copy, modify, sublicense, or distribute the Program
+> except as expressly provided under this License. Any attempt
+> otherwise to copy, modify, sublicense or distribute the Program is
+> void, and will automatically terminate your rights under this License.
+> However, parties who have received copies, or rights, from you under
+> this License will not have their licenses terminated so long as such
+> parties remain in full compliance.
+>
+> 5. You are not required to accept this License, since you have not
+> signed it. However, nothing else grants you permission to modify or
+> distribute the Program or its derivative works. These actions are
+> prohibited by law if you do not accept this License. Therefore, by
+> modifying or distributing the Program (or any work based on the
+> Program), you indicate your acceptance of this License to do so, and
+> all its terms and conditions for copying, distributing or modifying
+> the Program or works based on it.
+>
+> 6. Each time you redistribute the Program (or any work based on the
+> Program), the recipient automatically receives a license from the
+> original licensor to copy, distribute or modify the Program subject to
+> these terms and conditions. You may not impose any further
+> restrictions on the recipients' exercise of the rights granted herein.
+> You are not responsible for enforcing compliance by third parties to
+> this License.
+>
+> 7. If, as a consequence of a court judgment or allegation of patent
+> infringement or for any other reason (not limited to patent issues),
+> conditions are imposed on you (whether by court order, agreement or
+> otherwise) that contradict the conditions of this License, they do not
+> excuse you from the conditions of this License. If you cannot
+> distribute so as to satisfy simultaneously your obligations under this
+> License and any other pertinent obligations, then as a consequence you
+> may not distribute the Program at all. For example, if a patent
+> license would not permit royalty-free redistribution of the Program by
+> all those who receive copies directly or indirectly through you, then
+> the only way you could satisfy both it and this License would be to
+> refrain entirely from distribution of the Program.
+>
+> If any portion of this section is held invalid or unenforceable under
+> any particular circumstance, the balance of the section is intended to
+> apply and the section as a whole is intended to apply in other
+> circumstances.
+>
+> It is not the purpose of this section to induce you to infringe any
+> patents or other property right claims or to contest validity of any
+> such claims; this section has the sole purpose of protecting the
+> integrity of the free software distribution system, which is
+> implemented by public license practices. Many people have made
+> generous contributions to the wide range of software distributed
+> through that system in reliance on consistent application of that
+> system; it is up to the author/donor to decide if he or she is willing
+> to distribute software through any other system and a licensee cannot
+> impose that choice.
+>
+> This section is intended to make thoroughly clear what is believed to
+> be a consequence of the rest of this License.
+>
+> 8. If the distribution and/or use of the Program is restricted in
+> certain countries either by patents or by copyrighted interfaces, the
+> original copyright holder who places the Program under this License
+> may add an explicit geographical distribution limitation excluding
+> those countries, so that distribution is permitted only in or among
+> countries not thus excluded. In such case, this License incorporates
+> the limitation as if written in the body of this License.
+>
+> 9. The Free Software Foundation may publish revised and/or new versions
+> of the General Public License from time to time. Such new versions will
+> be similar in spirit to the present version, but may differ in detail to
+> address new problems or concerns.
+>
+> Each version is given a distinguishing version number. If the Program
+> specifies a version number of this License which applies to it and "any
+> later version", you have the option of following the terms and conditions
+> either of that version or of any later version published by the Free
+> Software Foundation. If the Program does not specify a version number of
+> this License, you may choose any version ever published by the Free Software
+> Foundation.
+>
+> 10. If you wish to incorporate parts of the Program into other free
+> programs whose distribution conditions are different, write to the author
+> to ask for permission. For software which is copyrighted by the Free
+> Software Foundation, write to the Free Software Foundation; we sometimes
+> make exceptions for this. Our decision will be guided by the two goals
+> of preserving the free status of all derivatives of our free software and
+> of promoting the sharing and reuse of software generally.
+>
+> NO WARRANTY
+>
+> 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+> FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+> OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+> PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+> OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+> MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+> TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+> PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+> REPAIR OR CORRECTION.
+>
+> 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+> WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+> REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+> INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+> OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+> TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+> YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+> PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+> POSSIBILITY OF SUCH DAMAGES.
+
+---------------------------------------
+
+## normalize-path
+License: MIT
+By: Jon Schlinkert, Blaine Bublitz
+Repository: jonschlinkert/normalize-path
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2014-2018, Jon Schlinkert.
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## object-assign
+License: MIT
+By: Sindre Sorhus
+Repository: sindresorhus/object-assign
+
+> The MIT License (MIT)
+>
+> Copyright (c) Sindre Sorhus (sindresorhus.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## okie
+License: MIT
+By: Evan You
+Repository: git+https://github.com/yyx990803/okie.git
+
+> MIT License
+>
+> Copyright (c) 2020-present, Yuxi (Evan) You
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## on-finished
+License: MIT
+By: Douglas Christopher Wilson, Jonathan Ong
+Repository: jshttp/on-finished
+
+> (The MIT License)
+>
+> Copyright (c) 2013 Jonathan Ong
+> Copyright (c) 2014 Douglas Christopher Wilson
+>
+> Permission is hereby granted, free of charge, to any person obtaining
+> a copy of this software and associated documentation files (the
+> 'Software'), to deal in the Software without restriction, including
+> without limitation the rights to use, copy, modify, merge, publish,
+> distribute, sublicense, and/or sell copies of the Software, and to
+> permit persons to whom the Software is furnished to do so, subject to
+> the following conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## once
+License: ISC
+By: Isaac Z. Schlueter
+Repository: git://github.com/isaacs/once
+
+> The ISC License
+>
+> Copyright (c) Isaac Z. Schlueter and Contributors
+>
+> 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.
+
+---------------------------------------
+
+## open
+License: MIT
+By: Sindre Sorhus
+Repository: sindresorhus/open
+
+> MIT License
+>
+> Copyright (c) Sindre Sorhus (https://sindresorhus.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## parseurl
+License: MIT
+By: Douglas Christopher Wilson, Jonathan Ong
+Repository: pillarjs/parseurl
+
+> (The MIT License)
+>
+> Copyright (c) 2014 Jonathan Ong
+> Copyright (c) 2014-2017 Douglas Christopher Wilson
+>
+> Permission is hereby granted, free of charge, to any person obtaining
+> a copy of this software and associated documentation files (the
+> 'Software'), to deal in the Software without restriction, including
+> without limitation the rights to use, copy, modify, merge, publish,
+> distribute, sublicense, and/or sell copies of the Software, and to
+> permit persons to whom the Software is furnished to do so, subject to
+> the following conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## path-is-absolute
+License: MIT
+By: Sindre Sorhus
+Repository: sindresorhus/path-is-absolute
+
+> The MIT License (MIT)
+>
+> Copyright (c) Sindre Sorhus (sindresorhus.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## path-key
+License: MIT
+By: Sindre Sorhus
+Repository: sindresorhus/path-key
+
+> MIT License
+>
+> Copyright (c) Sindre Sorhus (sindresorhus.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## periscopic
+License: MIT
+Repository: Rich-Harris/periscopic
+
+> Copyright (c) 2019 Rich Harris
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## picocolors
+License: ISC
+By: Alexey Raspopov
+Repository: alexeyraspopov/picocolors
+
+> ISC License
+>
+> Copyright (c) 2021 Alexey Raspopov, Kostiantyn Denysov, Anton Verinov
+>
+> 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.
+
+---------------------------------------
+
+## picomatch
+License: MIT
+By: Jon Schlinkert
+Repository: micromatch/picomatch
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2017-present, Jon Schlinkert.
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## pify
+License: MIT
+By: Sindre Sorhus
+Repository: sindresorhus/pify
+
+> The MIT License (MIT)
+>
+> Copyright (c) Sindre Sorhus (sindresorhus.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## postcss-import
+License: MIT
+By: Maxime Thirouin
+Repository: https://github.com/postcss/postcss-import.git
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2014 Maxime Thirouin, Jason Campbell & Kevin Mårtensson
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of
+> this software and associated documentation files (the "Software"), to deal in
+> the Software without restriction, including without limitation the rights to
+> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+> the Software, and to permit persons to whom the Software is furnished to do so,
+> subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## postcss-load-config
+License: MIT
+By: Michael Ciniawky, Ryan Dunckel, Mateusz Derks, Dalton Santos, Patrick Gilday, François Wouts
+Repository: postcss/postcss-load-config
+
+> The MIT License (MIT)
+>
+> Copyright Michael Ciniawsky
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of
+> this software and associated documentation files (the "Software"), to deal in
+> the Software without restriction, including without limitation the rights to
+> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+> the Software, and to permit persons to whom the Software is furnished to do so,
+> subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## postcss-modules
+License: MIT
+By: Alexander Madyankin
+Repository: https://github.com/css-modules/postcss-modules.git
+
+> The MIT License (MIT)
+>
+> Copyright 2015-present Alexander Madyankin
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of
+> this software and associated documentation files (the "Software"), to deal in
+> the Software without restriction, including without limitation the rights to
+> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+> the Software, and to permit persons to whom the Software is furnished to do so,
+> subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## postcss-modules-extract-imports
+License: ISC
+By: Glen Maddern
+Repository: https://github.com/css-modules/postcss-modules-extract-imports.git
+
+> Copyright 2015 Glen Maddern
+>
+> 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.
+
+---------------------------------------
+
+## postcss-modules-local-by-default
+License: MIT
+By: Mark Dalgleish
+Repository: https://github.com/css-modules/postcss-modules-local-by-default.git
+
+> The MIT License (MIT)
+>
+> Copyright 2015 Mark Dalgleish
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of
+> this software and associated documentation files (the "Software"), to deal in
+> the Software without restriction, including without limitation the rights to
+> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+> the Software, and to permit persons to whom the Software is furnished to do so,
+> subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## postcss-modules-scope
+License: ISC
+By: Glen Maddern
+Repository: https://github.com/css-modules/postcss-modules-scope.git
+
+> ISC License (ISC)
+>
+> Copyright (c) 2015, Glen Maddern
+>
+> 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.
+
+---------------------------------------
+
+## postcss-modules-values
+License: ISC
+By: Glen Maddern
+Repository: git+https://github.com/css-modules/postcss-modules-values.git
+
+> ISC License (ISC)
+>
+> Copyright (c) 2015, Glen Maddern
+>
+> 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.
+
+---------------------------------------
+
+## postcss-selector-parser
+License: MIT
+By: Ben Briggs, Chris Eppstein
+Repository: postcss/postcss-selector-parser
+
+> Copyright (c) Ben Briggs (http://beneb.info)
+>
+> Permission is hereby granted, free of charge, to any person
+> obtaining a copy of this software and associated documentation
+> files (the "Software"), to deal in the Software without
+> restriction, including without limitation the rights to use,
+> copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the
+> Software is furnished to do so, subject to the following
+> conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+> HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+> OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## postcss-value-parser
+License: MIT
+By: Bogdan Chadkin
+Repository: https://github.com/TrySound/postcss-value-parser.git
+
+> Copyright (c) Bogdan Chadkin
+>
+> Permission is hereby granted, free of charge, to any person
+> obtaining a copy of this software and associated documentation
+> files (the "Software"), to deal in the Software without
+> restriction, including without limitation the rights to use,
+> copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the
+> Software is furnished to do so, subject to the following
+> conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+> HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+> OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## queue-microtask
+License: MIT
+By: Feross Aboukhadijeh
+Repository: git://github.com/feross/queue-microtask.git
+
+> The MIT License (MIT)
+>
+> Copyright (c) Feross Aboukhadijeh
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of
+> this software and associated documentation files (the "Software"), to deal in
+> the Software without restriction, including without limitation the rights to
+> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+> the Software, and to permit persons to whom the Software is furnished to do so,
+> subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## read-cache
+License: MIT
+By: Bogdan Chadkin
+Repository: git+https://github.com/TrySound/read-cache.git
+
+> The MIT License (MIT)
+>
+> Copyright 2016 Bogdan Chadkin
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of
+> this software and associated documentation files (the "Software"), to deal in
+> the Software without restriction, including without limitation the rights to
+> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+> the Software, and to permit persons to whom the Software is furnished to do so,
+> subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## readdirp
+License: MIT
+By: Thorsten Lorenz, Paul Miller
+Repository: git://github.com/paulmillr/readdirp.git
+
+> MIT License
+>
+> Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller (https://paulmillr.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## requires-port
+License: MIT
+By: Arnout Kazemier
+Repository: https://github.com/unshiftio/requires-port
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2015 Unshift.io, Arnout Kazemier, the Contributors.
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## resolve.exports
+License: MIT
+By: Luke Edwards
+Repository: lukeed/resolve.exports
+
+> The MIT License (MIT)
+>
+> Copyright (c) Luke Edwards (lukeed.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## reusify
+License: MIT
+By: Matteo Collina
+Repository: git+https://github.com/mcollina/reusify.git
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2015 Matteo Collina
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## run-parallel
+License: MIT
+By: Feross Aboukhadijeh
+Repository: git://github.com/feross/run-parallel.git
+
+> The MIT License (MIT)
+>
+> Copyright (c) Feross Aboukhadijeh
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of
+> this software and associated documentation files (the "Software"), to deal in
+> the Software without restriction, including without limitation the rights to
+> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+> the Software, and to permit persons to whom the Software is furnished to do so,
+> subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## safe-buffer
+License: MIT
+By: Feross Aboukhadijeh
+Repository: git://github.com/feross/safe-buffer.git
+
+> The MIT License (MIT)
+>
+> Copyright (c) Feross Aboukhadijeh
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## shebang-command
+License: MIT
+By: Kevin Mårtensson
+Repository: kevva/shebang-command
+
+> MIT License
+>
+> Copyright (c) Kevin Mårtensson (github.com/kevva)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## shebang-regex
+License: MIT
+By: Sindre Sorhus
+Repository: sindresorhus/shebang-regex
+
+> MIT License
+>
+> Copyright (c) Sindre Sorhus (sindresorhus.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## shell-quote
+License: MIT
+By: James Halliday
+Repository: http://github.com/substack/node-shell-quote.git
+
+> The MIT License
+>
+> Copyright (c) 2013 James Halliday (mail@substack.net)
+>
+> Permission is hereby granted, free of charge,
+> to any person obtaining a copy of this software and
+> associated documentation files (the "Software"), to
+> deal in the Software without restriction, including
+> without limitation the rights to use, copy, modify,
+> merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom
+> the Software is furnished to do so,
+> subject to the following conditions:
+>
+> The above copyright notice and this permission notice
+> shall be included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+> ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## sirv
+License: MIT
+By: Luke Edwards
+Repository: lukeed/sirv
+
+---------------------------------------
+
+## sourcemap-codec
+License: MIT
+By: Rich Harris
+Repository: https://github.com/Rich-Harris/sourcemap-codec
+
+> The MIT License
+>
+> Copyright (c) 2015 Rich Harris
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## statuses
+License: MIT
+By: Douglas Christopher Wilson, Jonathan Ong
+Repository: jshttp/statuses
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2014 Jonathan Ong
+> Copyright (c) 2016 Douglas Christopher Wilson
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## string-hash
+License: CC0-1.0
+By: The Dark Sky Company
+Repository: git://github.com/darkskyapp/string-hash.git
+
+---------------------------------------
+
+## strip-ansi
+License: MIT
+By: Sindre Sorhus
+Repository: chalk/strip-ansi
+
+> MIT License
+>
+> Copyright (c) Sindre Sorhus (sindresorhus.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## strip-literal
+License: MIT
+By: Anthony Fu
+Repository: git+https://github.com/antfu/strip-literal.git
+
+> MIT License
+>
+> Copyright (c) 2022 Anthony Fu
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## to-regex-range
+License: MIT
+By: Jon Schlinkert, Rouven Weßling
+Repository: micromatch/to-regex-range
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2015-present, Jon Schlinkert.
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## totalist
+License: MIT
+By: Luke Edwards
+Repository: lukeed/totalist
+
+> The MIT License (MIT)
+>
+> Copyright (c) Luke Edwards (lukeed.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
+
+---------------------------------------
+
+## tsconfck
+License: MIT
+By: dominikg
+Repository: git+https://github.com/dominikg/tsconfck.git
+
+> MIT License
+>
+> Copyright (c) 2021-present dominikg and [contributors](https://github.com/dominikg/tsconfck/graphs/contributors)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+>
+> -- Licenses for 3rd-party code included in tsconfck --
+>
+> # strip-bom and strip-json-comments
+> MIT License
+>
+> Copyright (c) Sindre Sorhus (https://sindresorhus.com)
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## unpipe
+License: MIT
+By: Douglas Christopher Wilson
+Repository: stream-utils/unpipe
+
+> (The MIT License)
+>
+> Copyright (c) 2015 Douglas Christopher Wilson
+>
+> Permission is hereby granted, free of charge, to any person obtaining
+> a copy of this software and associated documentation files (the
+> 'Software'), to deal in the Software without restriction, including
+> without limitation the rights to use, copy, modify, merge, publish,
+> distribute, sublicense, and/or sell copies of the Software, and to
+> permit persons to whom the Software is furnished to do so, subject to
+> the following conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## util-deprecate
+License: MIT
+By: Nathan Rajlich
+Repository: git://github.com/TooTallNate/util-deprecate.git
+
+> (The MIT License)
+>
+> Copyright (c) 2014 Nathan Rajlich
+>
+> Permission is hereby granted, free of charge, to any person
+> obtaining a copy of this software and associated documentation
+> files (the "Software"), to deal in the Software without
+> restriction, including without limitation the rights to use,
+> copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the
+> Software is furnished to do so, subject to the following
+> conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+> HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+> OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## utils-merge
+License: MIT
+By: Jared Hanson
+Repository: git://github.com/jaredhanson/utils-merge.git
+
+> The MIT License (MIT)
+>
+> Copyright (c) 2013-2017 Jared Hanson
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy of
+> this software and associated documentation files (the "Software"), to deal in
+> the Software without restriction, including without limitation the rights to
+> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+> the Software, and to permit persons to whom the Software is furnished to do so,
+> subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## vary
+License: MIT
+By: Douglas Christopher Wilson
+Repository: jshttp/vary
+
+> (The MIT License)
+>
+> Copyright (c) 2014-2017 Douglas Christopher Wilson
+>
+> Permission is hereby granted, free of charge, to any person obtaining
+> a copy of this software and associated documentation files (the
+> 'Software'), to deal in the Software without restriction, including
+> without limitation the rights to use, copy, modify, merge, publish,
+> distribute, sublicense, and/or sell copies of the Software, and to
+> permit persons to whom the Software is furnished to do so, subject to
+> the following conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------
+
+## which
+License: ISC
+By: Isaac Z. Schlueter
+Repository: git://github.com/isaacs/node-which.git
+
+> The ISC License
+>
+> Copyright (c) Isaac Z. Schlueter and Contributors
+>
+> 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.
+
+---------------------------------------
+
+## wrappy
+License: ISC
+By: Isaac Z. Schlueter
+Repository: https://github.com/npm/wrappy
+
+> The ISC License
+>
+> Copyright (c) Isaac Z. Schlueter and Contributors
+>
+> 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.
+
+---------------------------------------
+
+## ws
+License: MIT
+By: Einar Otto Stangvik
+Repository: websockets/ws
+
+> Copyright (c) 2011 Einar Otto Stangvik
+>
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in all
+> copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.
+
+---------------------------------------
+
+## yaml
+License: ISC
+By: Eemeli Aro
+Repository: github:eemeli/yaml
+
+> Copyright 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.
diff --git a/frontend/node_modules/vite/README.md b/frontend/node_modules/vite/README.md
new file mode 100644
index 00000000..89490d7b
--- /dev/null
+++ b/frontend/node_modules/vite/README.md
@@ -0,0 +1,20 @@
+# vite ⚡
+
+> Next Generation Frontend Tooling
+
+- 💡 Instant Server Start
+- ⚡️ Lightning Fast HMR
+- 🛠️ Rich Features
+- 📦 Optimized Build
+- 🔩 Universal Plugin Interface
+- 🔑 Fully Typed APIs
+
+Vite (French word for "fast", pronounced `/vit/`) is a new breed of frontend build tool that significantly improves the frontend development experience. It consists of two major parts:
+
+- A dev server that serves your source files over [native ES modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules), with [rich built-in features](https://vitejs.dev/guide/features.html) and astonishingly fast [Hot Module Replacement (HMR)](https://vitejs.dev/guide/features.html#hot-module-replacement).
+
+- A [build command](https://vitejs.dev/guide/build.html) that bundles your code with [Rollup](https://rollupjs.org), pre-configured to output highly optimized static assets for production.
+
+In addition, Vite is highly extensible via its [Plugin API](https://vitejs.dev/guide/api-plugin.html) and [JavaScript API](https://vitejs.dev/guide/api-javascript.html) with full typing support.
+
+[Read the Docs to Learn More](https://vitejs.dev).
diff --git a/frontend/node_modules/vite/bin/openChrome.applescript b/frontend/node_modules/vite/bin/openChrome.applescript
new file mode 100644
index 00000000..25d496b3
--- /dev/null
+++ b/frontend/node_modules/vite/bin/openChrome.applescript
@@ -0,0 +1,86 @@
+(*
+Copyright (c) 2015-present, Facebook, Inc.
+
+This source code is licensed under the MIT license found in the
+LICENSE file at
+https://github.com/facebookincubator/create-react-app/blob/master/LICENSE
+*)
+
+property targetTab: null
+property targetTabIndex: -1
+property targetWindow: null
+
+on run argv
+ set theURL to item 1 of argv
+
+ with timeout of 2 seconds
+ tell application "Chrome"
+
+ if (count every window) = 0 then
+ make new window
+ end if
+
+ -- 1: Looking for tab running debugger
+ -- then, Reload debugging tab if found
+ -- then return
+ set found to my lookupTabWithUrl(theURL)
+ if found then
+ set targetWindow's active tab index to targetTabIndex
+ tell targetTab to reload
+ tell targetWindow to activate
+ set index of targetWindow to 1
+ return
+ end if
+
+ -- 2: Looking for Empty tab
+ -- In case debugging tab was not found
+ -- We try to find an empty tab instead
+ set found to my lookupTabWithUrl("chrome://newtab/")
+ if found then
+ set targetWindow's active tab index to targetTabIndex
+ set URL of targetTab to theURL
+ tell targetWindow to activate
+ return
+ end if
+
+ -- 3: Create new tab
+ -- both debugging and empty tab were not found
+ -- make a new tab with url
+ tell window 1
+ activate
+ make new tab with properties {URL:theURL}
+ end tell
+ end tell
+ end timeout
+end run
+
+-- Function:
+-- Lookup tab with given url
+-- if found, store tab, index, and window in properties
+-- (properties were declared on top of file)
+on lookupTabWithUrl(lookupUrl)
+ tell application "Chrome"
+ -- Find a tab with the given url
+ set found to false
+ set theTabIndex to -1
+ repeat with theWindow in every window
+ set theTabIndex to 0
+ repeat with theTab in every tab of theWindow
+ set theTabIndex to theTabIndex + 1
+ if (theTab's URL as string) contains lookupUrl then
+ -- assign tab, tab index, and window to properties
+ set targetTab to theTab
+ set targetTabIndex to theTabIndex
+ set targetWindow to theWindow
+ set found to true
+ exit repeat
+ end if
+ end repeat
+
+ if found then
+ exit repeat
+ end if
+ end repeat
+ end tell
+ return found
+end lookupTabWithUrl
diff --git a/frontend/node_modules/vite/bin/vite.js b/frontend/node_modules/vite/bin/vite.js
new file mode 100755
index 00000000..75eb0ac5
--- /dev/null
+++ b/frontend/node_modules/vite/bin/vite.js
@@ -0,0 +1,61 @@
+#!/usr/bin/env node
+const { performance } = require('perf_hooks')
+
+if (!__dirname.includes('node_modules')) {
+ try {
+ // only available as dev dependency
+ require('source-map-support').install()
+ } catch (e) {}
+}
+
+global.__vite_start_time = performance.now()
+
+// check debug mode first before requiring the CLI.
+const debugIndex = process.argv.findIndex((arg) => /^(?:-d|--debug)$/.test(arg))
+const filterIndex = process.argv.findIndex((arg) =>
+ /^(?:-f|--filter)$/.test(arg)
+)
+const profileIndex = process.argv.indexOf('--profile')
+
+if (debugIndex > 0) {
+ let value = process.argv[debugIndex + 1]
+ if (!value || value.startsWith('-')) {
+ value = 'vite:*'
+ } else {
+ // support debugging multiple flags with comma-separated list
+ value = value
+ .split(',')
+ .map((v) => `vite:${v}`)
+ .join(',')
+ }
+ process.env.DEBUG = `${
+ process.env.DEBUG ? process.env.DEBUG + ',' : ''
+ }${value}`
+
+ if (filterIndex > 0) {
+ const filter = process.argv[filterIndex + 1]
+ if (filter && !filter.startsWith('-')) {
+ process.env.VITE_DEBUG_FILTER = filter
+ }
+ }
+}
+
+function start() {
+ require('../dist/node/cli')
+}
+
+if (profileIndex > 0) {
+ process.argv.splice(profileIndex, 1)
+ const next = process.argv[profileIndex]
+ if (next && !next.startsWith('-')) {
+ process.argv.splice(profileIndex, 1)
+ }
+ const inspector = require('inspector')
+ const session = (global.__vite_profile_session = new inspector.Session())
+ session.connect()
+ session.post('Profiler.enable', () => {
+ session.post('Profiler.start', start)
+ })
+} else {
+ start()
+}
diff --git a/frontend/node_modules/vite/client.d.ts b/frontend/node_modules/vite/client.d.ts
new file mode 100644
index 00000000..aaac1ea9
--- /dev/null
+++ b/frontend/node_modules/vite/client.d.ts
@@ -0,0 +1,208 @@
+///
+///
+
+// CSS modules
+type CSSModuleClasses = { readonly [key: string]: string }
+
+declare module '*.module.css' {
+ const classes: CSSModuleClasses
+ export default classes
+}
+declare module '*.module.scss' {
+ const classes: CSSModuleClasses
+ export default classes
+}
+declare module '*.module.sass' {
+ const classes: CSSModuleClasses
+ export default classes
+}
+declare module '*.module.less' {
+ const classes: CSSModuleClasses
+ export default classes
+}
+declare module '*.module.styl' {
+ const classes: CSSModuleClasses
+ export default classes
+}
+declare module '*.module.stylus' {
+ const classes: CSSModuleClasses
+ export default classes
+}
+declare module '*.module.pcss' {
+ const classes: CSSModuleClasses
+ export default classes
+}
+
+// CSS
+declare module '*.css' {
+ const css: string
+ export default css
+}
+declare module '*.scss' {
+ const css: string
+ export default css
+}
+declare module '*.sass' {
+ const css: string
+ export default css
+}
+declare module '*.less' {
+ const css: string
+ export default css
+}
+declare module '*.styl' {
+ const css: string
+ export default css
+}
+declare module '*.stylus' {
+ const css: string
+ export default css
+}
+declare module '*.pcss' {
+ const css: string
+ export default css
+}
+
+// Built-in asset types
+// see `src/constants.ts`
+
+// images
+declare module '*.jpg' {
+ const src: string
+ export default src
+}
+declare module '*.jpeg' {
+ const src: string
+ export default src
+}
+declare module '*.png' {
+ const src: string
+ export default src
+}
+declare module '*.gif' {
+ const src: string
+ export default src
+}
+declare module '*.svg' {
+ const src: string
+ export default src
+}
+declare module '*.ico' {
+ const src: string
+ export default src
+}
+declare module '*.webp' {
+ const src: string
+ export default src
+}
+declare module '*.avif' {
+ const src: string
+ export default src
+}
+
+// media
+declare module '*.mp4' {
+ const src: string
+ export default src
+}
+declare module '*.webm' {
+ const src: string
+ export default src
+}
+declare module '*.ogg' {
+ const src: string
+ export default src
+}
+declare module '*.mp3' {
+ const src: string
+ export default src
+}
+declare module '*.wav' {
+ const src: string
+ export default src
+}
+declare module '*.flac' {
+ const src: string
+ export default src
+}
+declare module '*.aac' {
+ const src: string
+ export default src
+}
+
+// fonts
+declare module '*.woff' {
+ const src: string
+ export default src
+}
+declare module '*.woff2' {
+ const src: string
+ export default src
+}
+declare module '*.eot' {
+ const src: string
+ export default src
+}
+declare module '*.ttf' {
+ const src: string
+ export default src
+}
+declare module '*.otf' {
+ const src: string
+ export default src
+}
+
+// other
+declare module '*.wasm' {
+ const initWasm: (options: WebAssembly.Imports) => Promise
+ export default initWasm
+}
+declare module '*.webmanifest' {
+ const src: string
+ export default src
+}
+declare module '*.pdf' {
+ const src: string
+ export default src
+}
+declare module '*.txt' {
+ const src: string
+ export default src
+}
+
+// web worker
+declare module '*?worker' {
+ const workerConstructor: {
+ new (): Worker
+ }
+ export default workerConstructor
+}
+
+declare module '*?worker&inline' {
+ const workerConstructor: {
+ new (): Worker
+ }
+ export default workerConstructor
+}
+
+declare module '*?sharedworker' {
+ const sharedWorkerConstructor: {
+ new (): SharedWorker
+ }
+ export default sharedWorkerConstructor
+}
+
+declare module '*?raw' {
+ const src: string
+ export default src
+}
+
+declare module '*?url' {
+ const src: string
+ export default src
+}
+
+declare module '*?inline' {
+ const src: string
+ export default src
+}
diff --git a/frontend/node_modules/vite/dist/client/client.mjs b/frontend/node_modules/vite/dist/client/client.mjs
new file mode 100644
index 00000000..5cc7526f
--- /dev/null
+++ b/frontend/node_modules/vite/dist/client/client.mjs
@@ -0,0 +1,583 @@
+import '@vite/env';
+
+const template = /*html*/ `
+
+
+
+
+
+
+
+ Click outside or fix the code to dismiss.
+ You can also disable this overlay by setting
+ server.hmr.overlay to false in vite.config.js.
+
+
+`;
+const fileRE = /(?:[a-zA-Z]:\\|\/).*?:\d+:\d+/g;
+const codeframeRE = /^(?:>?\s+\d+\s+\|.*|\s+\|\s*\^.*)\r?\n/gm;
+class ErrorOverlay extends HTMLElement {
+ constructor(err) {
+ var _a;
+ super();
+ this.root = this.attachShadow({ mode: 'open' });
+ this.root.innerHTML = template;
+ codeframeRE.lastIndex = 0;
+ const hasFrame = err.frame && codeframeRE.test(err.frame);
+ const message = hasFrame
+ ? err.message.replace(codeframeRE, '')
+ : err.message;
+ if (err.plugin) {
+ this.text('.plugin', `[plugin:${err.plugin}] `);
+ }
+ this.text('.message-body', message.trim());
+ const [file] = (((_a = err.loc) === null || _a === void 0 ? void 0 : _a.file) || err.id || 'unknown file').split(`?`);
+ if (err.loc) {
+ this.text('.file', `${file}:${err.loc.line}:${err.loc.column}`, true);
+ }
+ else if (err.id) {
+ this.text('.file', file);
+ }
+ if (hasFrame) {
+ this.text('.frame', err.frame.trim());
+ }
+ this.text('.stack', err.stack, true);
+ this.root.querySelector('.window').addEventListener('click', (e) => {
+ e.stopPropagation();
+ });
+ this.addEventListener('click', () => {
+ this.close();
+ });
+ }
+ text(selector, text, linkFiles = false) {
+ const el = this.root.querySelector(selector);
+ if (!linkFiles) {
+ el.textContent = text;
+ }
+ else {
+ let curIndex = 0;
+ let match;
+ while ((match = fileRE.exec(text))) {
+ const { 0: file, index } = match;
+ if (index != null) {
+ const frag = text.slice(curIndex, index);
+ el.appendChild(document.createTextNode(frag));
+ const link = document.createElement('a');
+ link.textContent = file;
+ link.className = 'file-link';
+ link.onclick = () => {
+ fetch('/__open-in-editor?file=' + encodeURIComponent(file));
+ };
+ el.appendChild(link);
+ curIndex += frag.length + file.length;
+ }
+ }
+ }
+ }
+ close() {
+ var _a;
+ (_a = this.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(this);
+ }
+}
+const overlayId = 'vite-error-overlay';
+if (customElements && !customElements.get(overlayId)) {
+ customElements.define(overlayId, ErrorOverlay);
+}
+
+console.log('[vite] connecting...');
+// use server configuration, then fallback to inference
+const socketProtocol = __HMR_PROTOCOL__ || (location.protocol === 'https:' ? 'wss' : 'ws');
+const socketHost = `${__HMR_HOSTNAME__ || location.hostname}:${__HMR_PORT__}`;
+const socket = new WebSocket(`${socketProtocol}://${socketHost}`, 'vite-hmr');
+const base = __BASE__ || '/';
+const messageBuffer = [];
+function warnFailedFetch(err, path) {
+ if (!err.message.match('fetch')) {
+ console.error(err);
+ }
+ console.error(`[hmr] Failed to reload ${path}. ` +
+ `This could be due to syntax errors or importing non-existent ` +
+ `modules. (see errors above)`);
+}
+function cleanUrl(pathname) {
+ const url = new URL(pathname, location.toString());
+ url.searchParams.delete('direct');
+ return url.pathname + url.search;
+}
+// Listen for messages
+socket.addEventListener('message', async ({ data }) => {
+ handleMessage(JSON.parse(data));
+});
+let isFirstUpdate = true;
+async function handleMessage(payload) {
+ switch (payload.type) {
+ case 'connected':
+ console.log(`[vite] connected.`);
+ sendMessageBuffer();
+ // proxy(nginx, docker) hmr ws maybe caused timeout,
+ // so send ping package let ws keep alive.
+ setInterval(() => socket.send('{"type":"ping"}'), __HMR_TIMEOUT__);
+ break;
+ case 'update':
+ notifyListeners('vite:beforeUpdate', payload);
+ // if this is the first update and there's already an error overlay, it
+ // means the page opened with existing server compile error and the whole
+ // module script failed to load (since one of the nested imports is 500).
+ // in this case a normal update won't work and a full reload is needed.
+ if (isFirstUpdate && hasErrorOverlay()) {
+ window.location.reload();
+ return;
+ }
+ else {
+ clearErrorOverlay();
+ isFirstUpdate = false;
+ }
+ payload.updates.forEach((update) => {
+ if (update.type === 'js-update') {
+ queueUpdate(fetchUpdate(update));
+ }
+ else {
+ // css-update
+ // this is only sent when a css file referenced with is updated
+ const { path, timestamp } = update;
+ const searchUrl = cleanUrl(path);
+ // can't use querySelector with `[href*=]` here since the link may be
+ // using relative paths so we need to use link.href to grab the full
+ // URL for the include check.
+ const el = Array.from(document.querySelectorAll('link')).find((e) => cleanUrl(e.href).includes(searchUrl));
+ if (el) {
+ const newPath = `${base}${searchUrl.slice(1)}${searchUrl.includes('?') ? '&' : '?'}t=${timestamp}`;
+ // rather than swapping the href on the existing tag, we will
+ // create a new link tag. Once the new stylesheet has loaded we
+ // will remove the existing link tag. This removes a Flash Of
+ // Unstyled Content that can occur when swapping out the tag href
+ // directly, as the new stylesheet has not yet been loaded.
+ const newLinkTag = el.cloneNode();
+ newLinkTag.href = new URL(newPath, el.href).href;
+ const removeOldEl = () => el.remove();
+ newLinkTag.addEventListener('load', removeOldEl);
+ newLinkTag.addEventListener('error', removeOldEl);
+ el.after(newLinkTag);
+ }
+ console.log(`[vite] css hot updated: ${searchUrl}`);
+ }
+ });
+ break;
+ case 'custom': {
+ notifyListeners(payload.event, payload.data);
+ break;
+ }
+ case 'full-reload':
+ notifyListeners('vite:beforeFullReload', payload);
+ if (payload.path && payload.path.endsWith('.html')) {
+ // if html file is edited, only reload the page if the browser is
+ // currently on that page.
+ const pagePath = decodeURI(location.pathname);
+ const payloadPath = base + payload.path.slice(1);
+ if (pagePath === payloadPath ||
+ (pagePath.endsWith('/') && pagePath + 'index.html' === payloadPath)) {
+ location.reload();
+ }
+ return;
+ }
+ else {
+ location.reload();
+ }
+ break;
+ case 'prune':
+ notifyListeners('vite:beforePrune', payload);
+ // After an HMR update, some modules are no longer imported on the page
+ // but they may have left behind side effects that need to be cleaned up
+ // (.e.g style injections)
+ // TODO Trigger their dispose callbacks.
+ payload.paths.forEach((path) => {
+ const fn = pruneMap.get(path);
+ if (fn) {
+ fn(dataMap.get(path));
+ }
+ });
+ break;
+ case 'error': {
+ notifyListeners('vite:error', payload);
+ const err = payload.err;
+ if (enableOverlay) {
+ createErrorOverlay(err);
+ }
+ else {
+ console.error(`[vite] Internal Server Error\n${err.message}\n${err.stack}`);
+ }
+ break;
+ }
+ default: {
+ const check = payload;
+ return check;
+ }
+ }
+}
+function notifyListeners(event, data) {
+ const cbs = customListenersMap.get(event);
+ if (cbs) {
+ cbs.forEach((cb) => cb(data));
+ }
+}
+const enableOverlay = __HMR_ENABLE_OVERLAY__;
+function createErrorOverlay(err) {
+ if (!enableOverlay)
+ return;
+ clearErrorOverlay();
+ document.body.appendChild(new ErrorOverlay(err));
+}
+function clearErrorOverlay() {
+ document
+ .querySelectorAll(overlayId)
+ .forEach((n) => n.close());
+}
+function hasErrorOverlay() {
+ return document.querySelectorAll(overlayId).length;
+}
+let pending = false;
+let queued = [];
+/**
+ * buffer multiple hot updates triggered by the same src change
+ * so that they are invoked in the same order they were sent.
+ * (otherwise the order may be inconsistent because of the http request round trip)
+ */
+async function queueUpdate(p) {
+ queued.push(p);
+ if (!pending) {
+ pending = true;
+ await Promise.resolve();
+ pending = false;
+ const loading = [...queued];
+ queued = [];
+ (await Promise.all(loading)).forEach((fn) => fn && fn());
+ }
+}
+async function waitForSuccessfulPing(ms = 1000) {
+ // eslint-disable-next-line no-constant-condition
+ while (true) {
+ try {
+ const pingResponse = await fetch(`${base}__vite_ping`);
+ // success - 2xx status code
+ if (pingResponse.ok)
+ break;
+ // failure - non-2xx status code
+ else
+ throw new Error();
+ }
+ catch (e) {
+ // wait ms before attempting to ping again
+ await new Promise((resolve) => setTimeout(resolve, ms));
+ }
+ }
+}
+// ping server
+socket.addEventListener('close', async ({ wasClean }) => {
+ if (wasClean)
+ return;
+ console.log(`[vite] server connection lost. polling for restart...`);
+ await waitForSuccessfulPing();
+ location.reload();
+});
+const sheetsMap = new Map();
+function updateStyle(id, content) {
+ let style = sheetsMap.get(id);
+ {
+ if (style && !(style instanceof HTMLStyleElement)) {
+ removeStyle(id);
+ style = undefined;
+ }
+ if (!style) {
+ style = document.createElement('style');
+ style.setAttribute('type', 'text/css');
+ style.innerHTML = content;
+ document.head.appendChild(style);
+ }
+ else {
+ style.innerHTML = content;
+ }
+ }
+ sheetsMap.set(id, style);
+}
+function removeStyle(id) {
+ const style = sheetsMap.get(id);
+ if (style) {
+ if (style instanceof CSSStyleSheet) {
+ // @ts-expect-error: using experimental API
+ document.adoptedStyleSheets = document.adoptedStyleSheets.filter((s) => s !== style);
+ }
+ else {
+ document.head.removeChild(style);
+ }
+ sheetsMap.delete(id);
+ }
+}
+async function fetchUpdate({ path, acceptedPath, timestamp }) {
+ const mod = hotModulesMap.get(path);
+ if (!mod) {
+ // In a code-splitting project,
+ // it is common that the hot-updating module is not loaded yet.
+ // https://github.com/vitejs/vite/issues/721
+ return;
+ }
+ const moduleMap = new Map();
+ const isSelfUpdate = path === acceptedPath;
+ // make sure we only import each dep once
+ const modulesToUpdate = new Set();
+ if (isSelfUpdate) {
+ // self update - only update self
+ modulesToUpdate.add(path);
+ }
+ else {
+ // dep update
+ for (const { deps } of mod.callbacks) {
+ deps.forEach((dep) => {
+ if (acceptedPath === dep) {
+ modulesToUpdate.add(dep);
+ }
+ });
+ }
+ }
+ // determine the qualified callbacks before we re-import the modules
+ const qualifiedCallbacks = mod.callbacks.filter(({ deps }) => {
+ return deps.some((dep) => modulesToUpdate.has(dep));
+ });
+ await Promise.all(Array.from(modulesToUpdate).map(async (dep) => {
+ const disposer = disposeMap.get(dep);
+ if (disposer)
+ await disposer(dataMap.get(dep));
+ const [path, query] = dep.split(`?`);
+ try {
+ const newMod = await import(
+ /* @vite-ignore */
+ base +
+ path.slice(1) +
+ `?import&t=${timestamp}${query ? `&${query}` : ''}`);
+ moduleMap.set(dep, newMod);
+ }
+ catch (e) {
+ warnFailedFetch(e, dep);
+ }
+ }));
+ return () => {
+ for (const { deps, fn } of qualifiedCallbacks) {
+ fn(deps.map((dep) => moduleMap.get(dep)));
+ }
+ const loggedPath = isSelfUpdate ? path : `${acceptedPath} via ${path}`;
+ console.log(`[vite] hot updated: ${loggedPath}`);
+ };
+}
+function sendMessageBuffer() {
+ if (socket.readyState === 1) {
+ messageBuffer.forEach((msg) => socket.send(msg));
+ messageBuffer.length = 0;
+ }
+}
+const hotModulesMap = new Map();
+const disposeMap = new Map();
+const pruneMap = new Map();
+const dataMap = new Map();
+const customListenersMap = new Map();
+const ctxToListenersMap = new Map();
+function createHotContext(ownerPath) {
+ if (!dataMap.has(ownerPath)) {
+ dataMap.set(ownerPath, {});
+ }
+ // when a file is hot updated, a new context is created
+ // clear its stale callbacks
+ const mod = hotModulesMap.get(ownerPath);
+ if (mod) {
+ mod.callbacks = [];
+ }
+ // clear stale custom event listeners
+ const staleListeners = ctxToListenersMap.get(ownerPath);
+ if (staleListeners) {
+ for (const [event, staleFns] of staleListeners) {
+ const listeners = customListenersMap.get(event);
+ if (listeners) {
+ customListenersMap.set(event, listeners.filter((l) => !staleFns.includes(l)));
+ }
+ }
+ }
+ const newListeners = new Map();
+ ctxToListenersMap.set(ownerPath, newListeners);
+ function acceptDeps(deps, callback = () => { }) {
+ const mod = hotModulesMap.get(ownerPath) || {
+ id: ownerPath,
+ callbacks: []
+ };
+ mod.callbacks.push({
+ deps,
+ fn: callback
+ });
+ hotModulesMap.set(ownerPath, mod);
+ }
+ const hot = {
+ get data() {
+ return dataMap.get(ownerPath);
+ },
+ accept(deps, callback) {
+ if (typeof deps === 'function' || !deps) {
+ // self-accept: hot.accept(() => {})
+ acceptDeps([ownerPath], ([mod]) => deps && deps(mod));
+ }
+ else if (typeof deps === 'string') {
+ // explicit deps
+ acceptDeps([deps], ([mod]) => callback && callback(mod));
+ }
+ else if (Array.isArray(deps)) {
+ acceptDeps(deps, callback);
+ }
+ else {
+ throw new Error(`invalid hot.accept() usage.`);
+ }
+ },
+ acceptDeps() {
+ throw new Error(`hot.acceptDeps() is deprecated. ` +
+ `Use hot.accept() with the same signature instead.`);
+ },
+ dispose(cb) {
+ disposeMap.set(ownerPath, cb);
+ },
+ // @ts-expect-error untyped
+ prune(cb) {
+ pruneMap.set(ownerPath, cb);
+ },
+ // TODO
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
+ decline() { },
+ invalidate() {
+ // TODO should tell the server to re-perform hmr propagation
+ // from this module as root
+ location.reload();
+ },
+ // custom events
+ on(event, cb) {
+ const addToMap = (map) => {
+ const existing = map.get(event) || [];
+ existing.push(cb);
+ map.set(event, existing);
+ };
+ addToMap(customListenersMap);
+ addToMap(newListeners);
+ },
+ send(event, data) {
+ messageBuffer.push(JSON.stringify({ type: 'custom', event, data }));
+ sendMessageBuffer();
+ }
+ };
+ return hot;
+}
+/**
+ * urls here are dynamic import() urls that couldn't be statically analyzed
+ */
+function injectQuery(url, queryToInject) {
+ // skip urls that won't be handled by vite
+ if (!url.startsWith('.') && !url.startsWith('/')) {
+ return url;
+ }
+ // can't use pathname from URL since it may be relative like ../
+ const pathname = url.replace(/#.*$/, '').replace(/\?.*$/, '');
+ const { search, hash } = new URL(url, 'http://vitejs.dev');
+ return `${pathname}?${queryToInject}${search ? `&` + search.slice(1) : ''}${hash || ''}`;
+}
+
+export { ErrorOverlay, createHotContext, injectQuery, removeStyle, updateStyle };
+//# sourceMappingURL=client.mjs.map
diff --git a/frontend/node_modules/vite/dist/client/client.mjs.map b/frontend/node_modules/vite/dist/client/client.mjs.map
new file mode 100644
index 00000000..ea16b084
--- /dev/null
+++ b/frontend/node_modules/vite/dist/client/client.mjs.map
@@ -0,0 +1 @@
+{"version":3,"file":"client.mjs","sources":["../../src/client/overlay.ts","../../src/client/client.ts"],"sourcesContent":["import type { ErrorPayload } from 'types/hmrPayload'\n\nconst template = /*html*/ `\n\n
\n
\n \n \n \n
\n Click outside or fix the code to dismiss. \n You can also disable this overlay by setting\n server.hmr.overlay to false in vite.config.js.\n
\n
\n`\n\nconst fileRE = /(?:[a-zA-Z]:\\\\|\\/).*?:\\d+:\\d+/g\nconst codeframeRE = /^(?:>?\\s+\\d+\\s+\\|.*|\\s+\\|\\s*\\^.*)\\r?\\n/gm\n\nexport class ErrorOverlay extends HTMLElement {\n root: ShadowRoot\n\n constructor(err: ErrorPayload['err']) {\n super()\n this.root = this.attachShadow({ mode: 'open' })\n this.root.innerHTML = template\n\n codeframeRE.lastIndex = 0\n const hasFrame = err.frame && codeframeRE.test(err.frame)\n const message = hasFrame\n ? err.message.replace(codeframeRE, '')\n : err.message\n if (err.plugin) {\n this.text('.plugin', `[plugin:${err.plugin}] `)\n }\n this.text('.message-body', message.trim())\n\n const [file] = (err.loc?.file || err.id || 'unknown file').split(`?`)\n if (err.loc) {\n this.text('.file', `${file}:${err.loc.line}:${err.loc.column}`, true)\n } else if (err.id) {\n this.text('.file', file)\n }\n\n if (hasFrame) {\n this.text('.frame', err.frame!.trim())\n }\n this.text('.stack', err.stack, true)\n\n this.root.querySelector('.window')!.addEventListener('click', (e) => {\n e.stopPropagation()\n })\n this.addEventListener('click', () => {\n this.close()\n })\n }\n\n text(selector: string, text: string, linkFiles = false): void {\n const el = this.root.querySelector(selector)!\n if (!linkFiles) {\n el.textContent = text\n } else {\n let curIndex = 0\n let match: RegExpExecArray | null\n while ((match = fileRE.exec(text))) {\n const { 0: file, index } = match\n if (index != null) {\n const frag = text.slice(curIndex, index)\n el.appendChild(document.createTextNode(frag))\n const link = document.createElement('a')\n link.textContent = file\n link.className = 'file-link'\n link.onclick = () => {\n fetch('/__open-in-editor?file=' + encodeURIComponent(file))\n }\n el.appendChild(link)\n curIndex += frag.length + file.length\n }\n }\n }\n }\n\n close(): void {\n this.parentNode?.removeChild(this)\n }\n}\n\nexport const overlayId = 'vite-error-overlay'\nif (customElements && !customElements.get(overlayId)) {\n customElements.define(overlayId, ErrorOverlay)\n}\n","import type { ErrorPayload, HMRPayload, Update } from 'types/hmrPayload'\nimport type { ViteHotContext } from 'types/hot'\nimport type { InferCustomEventPayload } from 'types/customEvent'\nimport { ErrorOverlay, overlayId } from './overlay'\n// eslint-disable-next-line node/no-missing-import\nimport '@vite/env'\n\n// injected by the hmr plugin when served\ndeclare const __BASE__: string\ndeclare const __HMR_PROTOCOL__: string\ndeclare const __HMR_HOSTNAME__: string\ndeclare const __HMR_PORT__: string\ndeclare const __HMR_TIMEOUT__: number\ndeclare const __HMR_ENABLE_OVERLAY__: boolean\n\nconsole.log('[vite] connecting...')\n\n// use server configuration, then fallback to inference\nconst socketProtocol =\n __HMR_PROTOCOL__ || (location.protocol === 'https:' ? 'wss' : 'ws')\nconst socketHost = `${__HMR_HOSTNAME__ || location.hostname}:${__HMR_PORT__}`\nconst socket = new WebSocket(`${socketProtocol}://${socketHost}`, 'vite-hmr')\nconst base = __BASE__ || '/'\nconst messageBuffer: string[] = []\n\nfunction warnFailedFetch(err: Error, path: string | string[]) {\n if (!err.message.match('fetch')) {\n console.error(err)\n }\n console.error(\n `[hmr] Failed to reload ${path}. ` +\n `This could be due to syntax errors or importing non-existent ` +\n `modules. (see errors above)`\n )\n}\n\nfunction cleanUrl(pathname: string): string {\n const url = new URL(pathname, location.toString())\n url.searchParams.delete('direct')\n return url.pathname + url.search\n}\n\n// Listen for messages\nsocket.addEventListener('message', async ({ data }) => {\n handleMessage(JSON.parse(data))\n})\n\nlet isFirstUpdate = true\n\nasync function handleMessage(payload: HMRPayload) {\n switch (payload.type) {\n case 'connected':\n console.log(`[vite] connected.`)\n sendMessageBuffer()\n // proxy(nginx, docker) hmr ws maybe caused timeout,\n // so send ping package let ws keep alive.\n setInterval(() => socket.send('{\"type\":\"ping\"}'), __HMR_TIMEOUT__)\n break\n case 'update':\n notifyListeners('vite:beforeUpdate', payload)\n // if this is the first update and there's already an error overlay, it\n // means the page opened with existing server compile error and the whole\n // module script failed to load (since one of the nested imports is 500).\n // in this case a normal update won't work and a full reload is needed.\n if (isFirstUpdate && hasErrorOverlay()) {\n window.location.reload()\n return\n } else {\n clearErrorOverlay()\n isFirstUpdate = false\n }\n payload.updates.forEach((update) => {\n if (update.type === 'js-update') {\n queueUpdate(fetchUpdate(update))\n } else {\n // css-update\n // this is only sent when a css file referenced with is updated\n const { path, timestamp } = update\n const searchUrl = cleanUrl(path)\n // can't use querySelector with `[href*=]` here since the link may be\n // using relative paths so we need to use link.href to grab the full\n // URL for the include check.\n const el = Array.from(\n document.querySelectorAll('link')\n ).find((e) => cleanUrl(e.href).includes(searchUrl))\n if (el) {\n const newPath = `${base}${searchUrl.slice(1)}${\n searchUrl.includes('?') ? '&' : '?'\n }t=${timestamp}`\n\n // rather than swapping the href on the existing tag, we will\n // create a new link tag. Once the new stylesheet has loaded we\n // will remove the existing link tag. This removes a Flash Of\n // Unstyled Content that can occur when swapping out the tag href\n // directly, as the new stylesheet has not yet been loaded.\n const newLinkTag = el.cloneNode() as HTMLLinkElement\n newLinkTag.href = new URL(newPath, el.href).href\n const removeOldEl = () => el.remove()\n newLinkTag.addEventListener('load', removeOldEl)\n newLinkTag.addEventListener('error', removeOldEl)\n el.after(newLinkTag)\n }\n console.log(`[vite] css hot updated: ${searchUrl}`)\n }\n })\n break\n case 'custom': {\n notifyListeners(payload.event, payload.data)\n break\n }\n case 'full-reload':\n notifyListeners('vite:beforeFullReload', payload)\n if (payload.path && payload.path.endsWith('.html')) {\n // if html file is edited, only reload the page if the browser is\n // currently on that page.\n const pagePath = decodeURI(location.pathname)\n const payloadPath = base + payload.path.slice(1)\n if (\n pagePath === payloadPath ||\n (pagePath.endsWith('/') && pagePath + 'index.html' === payloadPath)\n ) {\n location.reload()\n }\n return\n } else {\n location.reload()\n }\n break\n case 'prune':\n notifyListeners('vite:beforePrune', payload)\n // After an HMR update, some modules are no longer imported on the page\n // but they may have left behind side effects that need to be cleaned up\n // (.e.g style injections)\n // TODO Trigger their dispose callbacks.\n payload.paths.forEach((path) => {\n const fn = pruneMap.get(path)\n if (fn) {\n fn(dataMap.get(path))\n }\n })\n break\n case 'error': {\n notifyListeners('vite:error', payload)\n const err = payload.err\n if (enableOverlay) {\n createErrorOverlay(err)\n } else {\n console.error(\n `[vite] Internal Server Error\\n${err.message}\\n${err.stack}`\n )\n }\n break\n }\n default: {\n const check: never = payload\n return check\n }\n }\n}\n\nfunction notifyListeners(\n event: T,\n data: InferCustomEventPayload\n): void\nfunction notifyListeners(event: string, data: any): void {\n const cbs = customListenersMap.get(event)\n if (cbs) {\n cbs.forEach((cb) => cb(data))\n }\n}\n\nconst enableOverlay = __HMR_ENABLE_OVERLAY__\n\nfunction createErrorOverlay(err: ErrorPayload['err']) {\n if (!enableOverlay) return\n clearErrorOverlay()\n document.body.appendChild(new ErrorOverlay(err))\n}\n\nfunction clearErrorOverlay() {\n document\n .querySelectorAll(overlayId)\n .forEach((n) => (n as ErrorOverlay).close())\n}\n\nfunction hasErrorOverlay() {\n return document.querySelectorAll(overlayId).length\n}\n\nlet pending = false\nlet queued: Promise<(() => void) | undefined>[] = []\n\n/**\n * buffer multiple hot updates triggered by the same src change\n * so that they are invoked in the same order they were sent.\n * (otherwise the order may be inconsistent because of the http request round trip)\n */\nasync function queueUpdate(p: Promise<(() => void) | undefined>) {\n queued.push(p)\n if (!pending) {\n pending = true\n await Promise.resolve()\n pending = false\n const loading = [...queued]\n queued = []\n ;(await Promise.all(loading)).forEach((fn) => fn && fn())\n }\n}\n\nasync function waitForSuccessfulPing(ms = 1000) {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n const pingResponse = await fetch(`${base}__vite_ping`)\n\n // success - 2xx status code\n if (pingResponse.ok) break\n // failure - non-2xx status code\n else throw new Error()\n } catch (e) {\n // wait ms before attempting to ping again\n await new Promise((resolve) => setTimeout(resolve, ms))\n }\n }\n}\n\n// ping server\nsocket.addEventListener('close', async ({ wasClean }) => {\n if (wasClean) return\n console.log(`[vite] server connection lost. polling for restart...`)\n await waitForSuccessfulPing()\n location.reload()\n})\n\n// https://wicg.github.io/construct-stylesheets\nconst supportsConstructedSheet = (() => {\n // TODO: re-enable this try block once Chrome fixes the performance of\n // rule insertion in really big stylesheets\n // try {\n // new CSSStyleSheet()\n // return true\n // } catch (e) {}\n return false\n})()\n\nconst sheetsMap = new Map()\n\nexport function updateStyle(id: string, content: string): void {\n let style = sheetsMap.get(id)\n if (supportsConstructedSheet && !content.includes('@import')) {\n if (style && !(style instanceof CSSStyleSheet)) {\n removeStyle(id)\n style = undefined\n }\n\n if (!style) {\n style = new CSSStyleSheet()\n style.replaceSync(content)\n // @ts-expect-error: using experimental API\n document.adoptedStyleSheets = [...document.adoptedStyleSheets, style]\n } else {\n style.replaceSync(content)\n }\n } else {\n if (style && !(style instanceof HTMLStyleElement)) {\n removeStyle(id)\n style = undefined\n }\n\n if (!style) {\n style = document.createElement('style')\n style.setAttribute('type', 'text/css')\n style.innerHTML = content\n document.head.appendChild(style)\n } else {\n style.innerHTML = content\n }\n }\n sheetsMap.set(id, style)\n}\n\nexport function removeStyle(id: string): void {\n const style = sheetsMap.get(id)\n if (style) {\n if (style instanceof CSSStyleSheet) {\n // @ts-expect-error: using experimental API\n document.adoptedStyleSheets = document.adoptedStyleSheets.filter(\n (s: CSSStyleSheet) => s !== style\n )\n } else {\n document.head.removeChild(style)\n }\n sheetsMap.delete(id)\n }\n}\n\nasync function fetchUpdate({ path, acceptedPath, timestamp }: Update) {\n const mod = hotModulesMap.get(path)\n if (!mod) {\n // In a code-splitting project,\n // it is common that the hot-updating module is not loaded yet.\n // https://github.com/vitejs/vite/issues/721\n return\n }\n\n const moduleMap = new Map()\n const isSelfUpdate = path === acceptedPath\n\n // make sure we only import each dep once\n const modulesToUpdate = new Set()\n if (isSelfUpdate) {\n // self update - only update self\n modulesToUpdate.add(path)\n } else {\n // dep update\n for (const { deps } of mod.callbacks) {\n deps.forEach((dep) => {\n if (acceptedPath === dep) {\n modulesToUpdate.add(dep)\n }\n })\n }\n }\n\n // determine the qualified callbacks before we re-import the modules\n const qualifiedCallbacks = mod.callbacks.filter(({ deps }) => {\n return deps.some((dep) => modulesToUpdate.has(dep))\n })\n\n await Promise.all(\n Array.from(modulesToUpdate).map(async (dep) => {\n const disposer = disposeMap.get(dep)\n if (disposer) await disposer(dataMap.get(dep))\n const [path, query] = dep.split(`?`)\n try {\n const newMod = await import(\n /* @vite-ignore */\n base +\n path.slice(1) +\n `?import&t=${timestamp}${query ? `&${query}` : ''}`\n )\n moduleMap.set(dep, newMod)\n } catch (e) {\n warnFailedFetch(e, dep)\n }\n })\n )\n\n return () => {\n for (const { deps, fn } of qualifiedCallbacks) {\n fn(deps.map((dep) => moduleMap.get(dep)))\n }\n const loggedPath = isSelfUpdate ? path : `${acceptedPath} via ${path}`\n console.log(`[vite] hot updated: ${loggedPath}`)\n }\n}\n\nfunction sendMessageBuffer() {\n if (socket.readyState === 1) {\n messageBuffer.forEach((msg) => socket.send(msg))\n messageBuffer.length = 0\n }\n}\n\ninterface HotModule {\n id: string\n callbacks: HotCallback[]\n}\n\ninterface HotCallback {\n // the dependencies must be fetchable paths\n deps: string[]\n fn: (modules: object[]) => void\n}\n\nconst hotModulesMap = new Map()\nconst disposeMap = new Map void | Promise>()\nconst pruneMap = new Map void | Promise>()\nconst dataMap = new Map()\nconst customListenersMap = new Map void)[]>()\nconst ctxToListenersMap = new Map<\n string,\n Map void)[]>\n>()\n\nexport function createHotContext(ownerPath: string): ViteHotContext {\n if (!dataMap.has(ownerPath)) {\n dataMap.set(ownerPath, {})\n }\n\n // when a file is hot updated, a new context is created\n // clear its stale callbacks\n const mod = hotModulesMap.get(ownerPath)\n if (mod) {\n mod.callbacks = []\n }\n\n // clear stale custom event listeners\n const staleListeners = ctxToListenersMap.get(ownerPath)\n if (staleListeners) {\n for (const [event, staleFns] of staleListeners) {\n const listeners = customListenersMap.get(event)\n if (listeners) {\n customListenersMap.set(\n event,\n listeners.filter((l) => !staleFns.includes(l))\n )\n }\n }\n }\n\n const newListeners = new Map()\n ctxToListenersMap.set(ownerPath, newListeners)\n\n function acceptDeps(deps: string[], callback: HotCallback['fn'] = () => {}) {\n const mod: HotModule = hotModulesMap.get(ownerPath) || {\n id: ownerPath,\n callbacks: []\n }\n mod.callbacks.push({\n deps,\n fn: callback\n })\n hotModulesMap.set(ownerPath, mod)\n }\n\n const hot: ViteHotContext = {\n get data() {\n return dataMap.get(ownerPath)\n },\n\n accept(deps?: any, callback?: any) {\n if (typeof deps === 'function' || !deps) {\n // self-accept: hot.accept(() => {})\n acceptDeps([ownerPath], ([mod]) => deps && deps(mod))\n } else if (typeof deps === 'string') {\n // explicit deps\n acceptDeps([deps], ([mod]) => callback && callback(mod))\n } else if (Array.isArray(deps)) {\n acceptDeps(deps, callback)\n } else {\n throw new Error(`invalid hot.accept() usage.`)\n }\n },\n\n acceptDeps() {\n throw new Error(\n `hot.acceptDeps() is deprecated. ` +\n `Use hot.accept() with the same signature instead.`\n )\n },\n\n dispose(cb) {\n disposeMap.set(ownerPath, cb)\n },\n\n // @ts-expect-error untyped\n prune(cb: (data: any) => void) {\n pruneMap.set(ownerPath, cb)\n },\n\n // TODO\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n decline() {},\n\n invalidate() {\n // TODO should tell the server to re-perform hmr propagation\n // from this module as root\n location.reload()\n },\n\n // custom events\n on(event, cb) {\n const addToMap = (map: Map) => {\n const existing = map.get(event) || []\n existing.push(cb)\n map.set(event, existing)\n }\n addToMap(customListenersMap)\n addToMap(newListeners)\n },\n\n send(event, data) {\n messageBuffer.push(JSON.stringify({ type: 'custom', event, data }))\n sendMessageBuffer()\n }\n }\n\n return hot\n}\n\n/**\n * urls here are dynamic import() urls that couldn't be statically analyzed\n */\nexport function injectQuery(url: string, queryToInject: string): string {\n // skip urls that won't be handled by vite\n if (!url.startsWith('.') && !url.startsWith('/')) {\n return url\n }\n\n // can't use pathname from URL since it may be relative like ../\n const pathname = url.replace(/#.*$/, '').replace(/\\?.*$/, '')\n const { search, hash } = new URL(url, 'http://vitejs.dev')\n\n return `${pathname}?${queryToInject}${search ? `&` + search.slice(1) : ''}${\n hash || ''\n }`\n}\n\nexport { ErrorOverlay }\n"],"names":[],"mappings":";;AAEA,MAAM,QAAQ,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8GzB,CAAA;AAED,MAAM,MAAM,GAAG,gCAAgC,CAAA;AAC/C,MAAM,WAAW,GAAG,0CAA0C,CAAA;MAEjD,YAAa,SAAQ,WAAW;IAG3C,YAAY,GAAwB;;QAClC,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;QAC/C,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QAE9B,WAAW,CAAC,SAAS,GAAG,CAAC,CAAA;QACzB,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACzD,MAAM,OAAO,GAAG,QAAQ;cACpB,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;cACpC,GAAG,CAAC,OAAO,CAAA;QACf,IAAI,GAAG,CAAC,MAAM,EAAE;YACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,CAAA;SAChD;QACD,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;QAE1C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,MAAA,GAAG,CAAC,GAAG,0CAAE,IAAI,KAAI,GAAG,CAAC,EAAE,IAAI,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;QACrE,IAAI,GAAG,CAAC,GAAG,EAAE;YACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAA;SACtE;aAAM,IAAI,GAAG,CAAC,EAAE,EAAE;YACjB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;SACzB;QAED,IAAI,QAAQ,EAAE;YACZ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAM,CAAC,IAAI,EAAE,CAAC,CAAA;SACvC;QACD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAEpC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9D,CAAC,CAAC,eAAe,EAAE,CAAA;SACpB,CAAC,CAAA;QACF,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE;YAC7B,IAAI,CAAC,KAAK,EAAE,CAAA;SACb,CAAC,CAAA;KACH;IAED,IAAI,CAAC,QAAgB,EAAE,IAAY,EAAE,SAAS,GAAG,KAAK;QACpD,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAE,CAAA;QAC7C,IAAI,CAAC,SAAS,EAAE;YACd,EAAE,CAAC,WAAW,GAAG,IAAI,CAAA;SACtB;aAAM;YACL,IAAI,QAAQ,GAAG,CAAC,CAAA;YAChB,IAAI,KAA6B,CAAA;YACjC,QAAQ,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBAClC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,CAAA;gBAChC,IAAI,KAAK,IAAI,IAAI,EAAE;oBACjB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;oBACxC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAA;oBAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;oBACxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;oBACvB,IAAI,CAAC,SAAS,GAAG,WAAW,CAAA;oBAC5B,IAAI,CAAC,OAAO,GAAG;wBACb,KAAK,CAAC,yBAAyB,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAA;qBAC5D,CAAA;oBACD,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;oBACpB,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;iBACtC;aACF;SACF;KACF;IAED,KAAK;;QACH,MAAA,IAAI,CAAC,UAAU,0CAAE,WAAW,CAAC,IAAI,CAAC,CAAA;KACnC;CACF;AAEM,MAAM,SAAS,GAAG,oBAAoB,CAAA;AAC7C,IAAI,cAAc,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;IACpD,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;;;AC5KhD,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;AAEnC;AACA,MAAM,cAAc,GAClB,gBAAgB,KAAK,QAAQ,CAAC,QAAQ,KAAK,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC,CAAA;AACrE,MAAM,UAAU,GAAG,GAAG,gBAAgB,IAAI,QAAQ,CAAC,QAAQ,IAAI,YAAY,EAAE,CAAA;AAC7E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,GAAG,cAAc,MAAM,UAAU,EAAE,EAAE,UAAU,CAAC,CAAA;AAC7E,MAAM,IAAI,GAAG,QAAQ,IAAI,GAAG,CAAA;AAC5B,MAAM,aAAa,GAAa,EAAE,CAAA;AAElC,SAAS,eAAe,CAAC,GAAU,EAAE,IAAuB;IAC1D,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;QAC/B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;KACnB;IACD,OAAO,CAAC,KAAK,CACX,0BAA0B,IAAI,IAAI;QAChC,+DAA+D;QAC/D,6BAA6B,CAChC,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,QAAgB;IAChC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;IAClD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACjC,OAAO,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAA;AAClC,CAAC;AAED;AACA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;IAChD,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;AACjC,CAAC,CAAC,CAAA;AAEF,IAAI,aAAa,GAAG,IAAI,CAAA;AAExB,eAAe,aAAa,CAAC,OAAmB;IAC9C,QAAQ,OAAO,CAAC,IAAI;QAClB,KAAK,WAAW;YACd,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;YAChC,iBAAiB,EAAE,CAAA;;;YAGnB,WAAW,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,eAAe,CAAC,CAAA;YAClE,MAAK;QACP,KAAK,QAAQ;YACX,eAAe,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAA;;;;;YAK7C,IAAI,aAAa,IAAI,eAAe,EAAE,EAAE;gBACtC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAA;gBACxB,OAAM;aACP;iBAAM;gBACL,iBAAiB,EAAE,CAAA;gBACnB,aAAa,GAAG,KAAK,CAAA;aACtB;YACD,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM;gBAC7B,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE;oBAC/B,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAA;iBACjC;qBAAM;;;oBAGL,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;oBAClC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;;;;oBAIhC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CACnB,QAAQ,CAAC,gBAAgB,CAAkB,MAAM,CAAC,CACnD,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAA;oBACnD,IAAI,EAAE,EAAE;wBACN,MAAM,OAAO,GAAG,GAAG,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,GAC1C,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAClC,KAAK,SAAS,EAAE,CAAA;;;;;;wBAOhB,MAAM,UAAU,GAAG,EAAE,CAAC,SAAS,EAAqB,CAAA;wBACpD,UAAU,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAA;wBAChD,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,CAAA;wBACrC,UAAU,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;wBAChD,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;wBACjD,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;qBACrB;oBACD,OAAO,CAAC,GAAG,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAA;iBACpD;aACF,CAAC,CAAA;YACF,MAAK;QACP,KAAK,QAAQ,EAAE;YACb,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;YAC5C,MAAK;SACN;QACD,KAAK,aAAa;YAChB,eAAe,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAA;YACjD,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;;;gBAGlD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;gBAC7C,MAAM,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;gBAChD,IACE,QAAQ,KAAK,WAAW;qBACvB,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,GAAG,YAAY,KAAK,WAAW,CAAC,EACnE;oBACA,QAAQ,CAAC,MAAM,EAAE,CAAA;iBAClB;gBACD,OAAM;aACP;iBAAM;gBACL,QAAQ,CAAC,MAAM,EAAE,CAAA;aAClB;YACD,MAAK;QACP,KAAK,OAAO;YACV,eAAe,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAA;;;;;YAK5C,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI;gBACzB,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBAC7B,IAAI,EAAE,EAAE;oBACN,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;iBACtB;aACF,CAAC,CAAA;YACF,MAAK;QACP,KAAK,OAAO,EAAE;YACZ,eAAe,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;YACtC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAA;YACvB,IAAI,aAAa,EAAE;gBACjB,kBAAkB,CAAC,GAAG,CAAC,CAAA;aACxB;iBAAM;gBACL,OAAO,CAAC,KAAK,CACX,iCAAiC,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,KAAK,EAAE,CAC7D,CAAA;aACF;YACD,MAAK;SACN;QACD,SAAS;YACP,MAAM,KAAK,GAAU,OAAO,CAAA;YAC5B,OAAO,KAAK,CAAA;SACb;KACF;AACH,CAAC;AAMD,SAAS,eAAe,CAAC,KAAa,EAAE,IAAS;IAC/C,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACzC,IAAI,GAAG,EAAE;QACP,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;KAC9B;AACH,CAAC;AAED,MAAM,aAAa,GAAG,sBAAsB,CAAA;AAE5C,SAAS,kBAAkB,CAAC,GAAwB;IAClD,IAAI,CAAC,aAAa;QAAE,OAAM;IAC1B,iBAAiB,EAAE,CAAA;IACnB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;AAClD,CAAC;AAED,SAAS,iBAAiB;IACxB,QAAQ;SACL,gBAAgB,CAAC,SAAS,CAAC;SAC3B,OAAO,CAAC,CAAC,CAAC,KAAM,CAAkB,CAAC,KAAK,EAAE,CAAC,CAAA;AAChD,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,QAAQ,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAA;AACpD,CAAC;AAED,IAAI,OAAO,GAAG,KAAK,CAAA;AACnB,IAAI,MAAM,GAAwC,EAAE,CAAA;AAEpD;;;;;AAKA,eAAe,WAAW,CAAC,CAAoC;IAC7D,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACd,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,GAAG,IAAI,CAAA;QACd,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;QACvB,OAAO,GAAG,KAAK,CAAA;QACf,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;QAC3B,MAAM,GAAG,EAAE,CACV;QAAA,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;KAC1D;AACH,CAAC;AAED,eAAe,qBAAqB,CAAC,EAAE,GAAG,IAAI;;IAE5C,OAAO,IAAI,EAAE;QACX,IAAI;YACF,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,aAAa,CAAC,CAAA;;YAGtD,IAAI,YAAY,CAAC,EAAE;gBAAE,MAAK;;;gBAErB,MAAM,IAAI,KAAK,EAAE,CAAA;SACvB;QAAC,OAAO,CAAC,EAAE;;YAEV,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;SACxD;KACF;AACH,CAAC;AAED;AACA,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE;IAClD,IAAI,QAAQ;QAAE,OAAM;IACpB,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAA;IACpE,MAAM,qBAAqB,EAAE,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,CAAA;AACnB,CAAC,CAAC,CAAA;AAaF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,CAAA;SAEX,WAAW,CAAC,EAAU,EAAE,OAAe;IACrD,IAAI,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAetB;QACL,IAAI,KAAK,IAAI,EAAE,KAAK,YAAY,gBAAgB,CAAC,EAAE;YACjD,WAAW,CAAC,EAAE,CAAC,CAAA;YACf,KAAK,GAAG,SAAS,CAAA;SAClB;QAED,IAAI,CAAC,KAAK,EAAE;YACV,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;YACvC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;YACtC,KAAK,CAAC,SAAS,GAAG,OAAO,CAAA;YACzB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;SACjC;aAAM;YACL,KAAK,CAAC,SAAS,GAAG,OAAO,CAAA;SAC1B;KACF;IACD,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;AAC1B,CAAC;SAEe,WAAW,CAAC,EAAU;IACpC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC/B,IAAI,KAAK,EAAE;QACT,IAAI,KAAK,YAAY,aAAa,EAAE;;YAElC,QAAQ,CAAC,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAC9D,CAAC,CAAgB,KAAK,CAAC,KAAK,KAAK,CAClC,CAAA;SACF;aAAM;YACL,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;SACjC;QACD,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;KACrB;AACH,CAAC;AAED,eAAe,WAAW,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAU;IAClE,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACnC,IAAI,CAAC,GAAG,EAAE;;;;QAIR,OAAM;KACP;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,CAAA;IAC3B,MAAM,YAAY,GAAG,IAAI,KAAK,YAAY,CAAA;;IAG1C,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAA;IACzC,IAAI,YAAY,EAAE;;QAEhB,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;KAC1B;SAAM;;QAEL,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,SAAS,EAAE;YACpC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG;gBACf,IAAI,YAAY,KAAK,GAAG,EAAE;oBACxB,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;iBACzB;aACF,CAAC,CAAA;SACH;KACF;;IAGD,MAAM,kBAAkB,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE;QACvD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;KACpD,CAAC,CAAA;IAEF,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,OAAO,GAAG;QACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACpC,IAAI,QAAQ;YAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;QAC9C,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACpC,IAAI;YACF,MAAM,MAAM,GAAG,MAAM;;YAEnB,IAAI;gBACF,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACb,aAAa,SAAS,GAAG,KAAK,GAAG,IAAI,KAAK,EAAE,GAAG,EAAE,EAAE,CACtD,CAAA;YACD,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;SAC3B;QAAC,OAAO,CAAC,EAAE;YACV,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;SACxB;KACF,CAAC,CACH,CAAA;IAED,OAAO;QACL,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,kBAAkB,EAAE;YAC7C,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;SAC1C;QACD,MAAM,UAAU,GAAG,YAAY,GAAG,IAAI,GAAG,GAAG,YAAY,QAAQ,IAAI,EAAE,CAAA;QACtE,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAA;KACjD,CAAA;AACH,CAAC;AAED,SAAS,iBAAiB;IACxB,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC,EAAE;QAC3B,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAChD,aAAa,CAAC,MAAM,GAAG,CAAC,CAAA;KACzB;AACH,CAAC;AAaD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAqB,CAAA;AAClD,MAAM,UAAU,GAAG,IAAI,GAAG,EAA+C,CAAA;AACzE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+C,CAAA;AACvE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAe,CAAA;AACtC,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAmC,CAAA;AACrE,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAG9B,CAAA;SAEa,gBAAgB,CAAC,SAAiB;IAChD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;QAC3B,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;KAC3B;;;IAID,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACxC,IAAI,GAAG,EAAE;QACP,GAAG,CAAC,SAAS,GAAG,EAAE,CAAA;KACnB;;IAGD,MAAM,cAAc,GAAG,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACvD,IAAI,cAAc,EAAE;QAClB,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,cAAc,EAAE;YAC9C,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YAC/C,IAAI,SAAS,EAAE;gBACb,kBAAkB,CAAC,GAAG,CACpB,KAAK,EACL,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAC/C,CAAA;aACF;SACF;KACF;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAE,CAAA;IAC9B,iBAAiB,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;IAE9C,SAAS,UAAU,CAAC,IAAc,EAAE,WAA8B,SAAQ;QACxE,MAAM,GAAG,GAAc,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI;YACrD,EAAE,EAAE,SAAS;YACb,SAAS,EAAE,EAAE;SACd,CAAA;QACD,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;YACjB,IAAI;YACJ,EAAE,EAAE,QAAQ;SACb,CAAC,CAAA;QACF,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;KAClC;IAED,MAAM,GAAG,GAAmB;QAC1B,IAAI,IAAI;YACN,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;SAC9B;QAED,MAAM,CAAC,IAAU,EAAE,QAAc;YAC/B,IAAI,OAAO,IAAI,KAAK,UAAU,IAAI,CAAC,IAAI,EAAE;;gBAEvC,UAAU,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;aACtD;iBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;;gBAEnC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;aACzD;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC9B,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;aAC3B;iBAAM;gBACL,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;aAC/C;SACF;QAED,UAAU;YACR,MAAM,IAAI,KAAK,CACb,kCAAkC;gBAChC,mDAAmD,CACtD,CAAA;SACF;QAED,OAAO,CAAC,EAAE;YACR,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;SAC9B;;QAGD,KAAK,CAAC,EAAuB;YAC3B,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;SAC5B;;;QAID,OAAO,MAAK;QAEZ,UAAU;;;YAGR,QAAQ,CAAC,MAAM,EAAE,CAAA;SAClB;;QAGD,EAAE,CAAC,KAAK,EAAE,EAAE;YACV,MAAM,QAAQ,GAAG,CAAC,GAAuB;gBACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;gBACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACjB,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;aACzB,CAAA;YACD,QAAQ,CAAC,kBAAkB,CAAC,CAAA;YAC5B,QAAQ,CAAC,YAAY,CAAC,CAAA;SACvB;QAED,IAAI,CAAC,KAAK,EAAE,IAAI;YACd,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;YACnE,iBAAiB,EAAE,CAAA;SACpB;KACF,CAAA;IAED,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;SAGgB,WAAW,CAAC,GAAW,EAAE,aAAqB;;IAE5D,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;QAChD,OAAO,GAAG,CAAA;KACX;;IAGD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAC7D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAA;IAE1D,OAAO,GAAG,QAAQ,IAAI,aAAa,GAAG,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,GACvE,IAAI,IAAI,EACV,EAAE,CAAA;AACJ;;;;"}
\ No newline at end of file
diff --git a/frontend/node_modules/vite/dist/client/env.mjs b/frontend/node_modules/vite/dist/client/env.mjs
new file mode 100644
index 00000000..1b3a7d26
--- /dev/null
+++ b/frontend/node_modules/vite/dist/client/env.mjs
@@ -0,0 +1,30 @@
+const context = (() => {
+ if (typeof globalThis !== 'undefined') {
+ return globalThis;
+ }
+ else if (typeof self !== 'undefined') {
+ return self;
+ }
+ else if (typeof window !== 'undefined') {
+ return window;
+ }
+ else {
+ return Function('return this')();
+ }
+})();
+// assign defines
+const defines = __DEFINES__;
+Object.keys(defines).forEach((key) => {
+ const segments = key.split('.');
+ let target = context;
+ for (let i = 0; i < segments.length; i++) {
+ const segment = segments[i];
+ if (i === segments.length - 1) {
+ target[segment] = defines[key];
+ }
+ else {
+ target = target[segment] || (target[segment] = {});
+ }
+ }
+});
+//# sourceMappingURL=env.mjs.map
diff --git a/frontend/node_modules/vite/dist/client/env.mjs.map b/frontend/node_modules/vite/dist/client/env.mjs.map
new file mode 100644
index 00000000..592b5231
--- /dev/null
+++ b/frontend/node_modules/vite/dist/client/env.mjs.map
@@ -0,0 +1 @@
+{"version":3,"file":"env.mjs","sources":["../../src/client/env.ts"],"sourcesContent":["declare const __MODE__: string\ndeclare const __DEFINES__: Record\n\nconst context = (() => {\n if (typeof globalThis !== 'undefined') {\n return globalThis\n } else if (typeof self !== 'undefined') {\n return self\n } else if (typeof window !== 'undefined') {\n return window\n } else {\n return Function('return this')()\n }\n})()\n\n// assign defines\nconst defines = __DEFINES__\nObject.keys(defines).forEach((key) => {\n const segments = key.split('.')\n let target = context\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]\n if (i === segments.length - 1) {\n target[segment] = defines[key]\n } else {\n target = target[segment] || (target[segment] = {})\n }\n }\n})\n"],"names":[],"mappings":"AAGA,MAAM,OAAO,GAAG,CAAC;IACf,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE;QACrC,OAAO,UAAU,CAAA;KAClB;SAAM,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE;QACtC,OAAO,IAAI,CAAA;KACZ;SAAM,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACxC,OAAO,MAAM,CAAA;KACd;SAAM;QACL,OAAO,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAA;KACjC;AACH,CAAC,GAAG,CAAA;AAEJ;AACA,MAAM,OAAO,GAAG,WAAW,CAAA;AAC3B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG;IAC/B,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,MAAM,GAAG,OAAO,CAAA;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;QAC3B,IAAI,CAAC,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;SAC/B;aAAM;YACL,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;SACnD;KACF;AACH,CAAC,CAAC"}
\ No newline at end of file
diff --git a/frontend/node_modules/vite/dist/node/chunks/dep-2056ae8a.js b/frontend/node_modules/vite/dist/node/chunks/dep-2056ae8a.js
new file mode 100644
index 00000000..dc9d07db
--- /dev/null
+++ b/frontend/node_modules/vite/dist/node/chunks/dep-2056ae8a.js
@@ -0,0 +1,547 @@
+'use strict';
+
+var openParentheses = "(".charCodeAt(0);
+var closeParentheses = ")".charCodeAt(0);
+var singleQuote = "'".charCodeAt(0);
+var doubleQuote = '"'.charCodeAt(0);
+var backslash = "\\".charCodeAt(0);
+var slash = "/".charCodeAt(0);
+var comma = ",".charCodeAt(0);
+var colon = ":".charCodeAt(0);
+var star = "*".charCodeAt(0);
+var uLower = "u".charCodeAt(0);
+var uUpper = "U".charCodeAt(0);
+var plus$1 = "+".charCodeAt(0);
+var isUnicodeRange = /^[a-f0-9?-]+$/i;
+
+var parse$1 = function(input) {
+ var tokens = [];
+ var value = input;
+
+ var next,
+ quote,
+ prev,
+ token,
+ escape,
+ escapePos,
+ whitespacePos,
+ parenthesesOpenPos;
+ var pos = 0;
+ var code = value.charCodeAt(pos);
+ var max = value.length;
+ var stack = [{ nodes: tokens }];
+ var balanced = 0;
+ var parent;
+
+ var name = "";
+ var before = "";
+ var after = "";
+
+ while (pos < max) {
+ // Whitespaces
+ if (code <= 32) {
+ next = pos;
+ do {
+ next += 1;
+ code = value.charCodeAt(next);
+ } while (code <= 32);
+ token = value.slice(pos, next);
+
+ prev = tokens[tokens.length - 1];
+ if (code === closeParentheses && balanced) {
+ after = token;
+ } else if (prev && prev.type === "div") {
+ prev.after = token;
+ prev.sourceEndIndex += token.length;
+ } else if (
+ code === comma ||
+ code === colon ||
+ (code === slash &&
+ value.charCodeAt(next + 1) !== star &&
+ (!parent ||
+ (parent && parent.type === "function" && parent.value !== "calc")))
+ ) {
+ before = token;
+ } else {
+ tokens.push({
+ type: "space",
+ sourceIndex: pos,
+ sourceEndIndex: next,
+ value: token
+ });
+ }
+
+ pos = next;
+
+ // Quotes
+ } else if (code === singleQuote || code === doubleQuote) {
+ next = pos;
+ quote = code === singleQuote ? "'" : '"';
+ token = {
+ type: "string",
+ sourceIndex: pos,
+ quote: quote
+ };
+ do {
+ escape = false;
+ next = value.indexOf(quote, next + 1);
+ if (~next) {
+ escapePos = next;
+ while (value.charCodeAt(escapePos - 1) === backslash) {
+ escapePos -= 1;
+ escape = !escape;
+ }
+ } else {
+ value += quote;
+ next = value.length - 1;
+ token.unclosed = true;
+ }
+ } while (escape);
+ token.value = value.slice(pos + 1, next);
+ token.sourceEndIndex = token.unclosed ? next : next + 1;
+ tokens.push(token);
+ pos = next + 1;
+ code = value.charCodeAt(pos);
+
+ // Comments
+ } else if (code === slash && value.charCodeAt(pos + 1) === star) {
+ next = value.indexOf("*/", pos);
+
+ token = {
+ type: "comment",
+ sourceIndex: pos,
+ sourceEndIndex: next + 2
+ };
+
+ if (next === -1) {
+ token.unclosed = true;
+ next = value.length;
+ token.sourceEndIndex = next;
+ }
+
+ token.value = value.slice(pos + 2, next);
+ tokens.push(token);
+
+ pos = next + 2;
+ code = value.charCodeAt(pos);
+
+ // Operation within calc
+ } else if (
+ (code === slash || code === star) &&
+ parent &&
+ parent.type === "function" &&
+ parent.value === "calc"
+ ) {
+ token = value[pos];
+ tokens.push({
+ type: "word",
+ sourceIndex: pos - before.length,
+ sourceEndIndex: pos + token.length,
+ value: token
+ });
+ pos += 1;
+ code = value.charCodeAt(pos);
+
+ // Dividers
+ } else if (code === slash || code === comma || code === colon) {
+ token = value[pos];
+
+ tokens.push({
+ type: "div",
+ sourceIndex: pos - before.length,
+ sourceEndIndex: pos + token.length,
+ value: token,
+ before: before,
+ after: ""
+ });
+ before = "";
+
+ pos += 1;
+ code = value.charCodeAt(pos);
+
+ // Open parentheses
+ } else if (openParentheses === code) {
+ // Whitespaces after open parentheses
+ next = pos;
+ do {
+ next += 1;
+ code = value.charCodeAt(next);
+ } while (code <= 32);
+ parenthesesOpenPos = pos;
+ token = {
+ type: "function",
+ sourceIndex: pos - name.length,
+ value: name,
+ before: value.slice(parenthesesOpenPos + 1, next)
+ };
+ pos = next;
+
+ if (name === "url" && code !== singleQuote && code !== doubleQuote) {
+ next -= 1;
+ do {
+ escape = false;
+ next = value.indexOf(")", next + 1);
+ if (~next) {
+ escapePos = next;
+ while (value.charCodeAt(escapePos - 1) === backslash) {
+ escapePos -= 1;
+ escape = !escape;
+ }
+ } else {
+ value += ")";
+ next = value.length - 1;
+ token.unclosed = true;
+ }
+ } while (escape);
+ // Whitespaces before closed
+ whitespacePos = next;
+ do {
+ whitespacePos -= 1;
+ code = value.charCodeAt(whitespacePos);
+ } while (code <= 32);
+ if (parenthesesOpenPos < whitespacePos) {
+ if (pos !== whitespacePos + 1) {
+ token.nodes = [
+ {
+ type: "word",
+ sourceIndex: pos,
+ sourceEndIndex: whitespacePos + 1,
+ value: value.slice(pos, whitespacePos + 1)
+ }
+ ];
+ } else {
+ token.nodes = [];
+ }
+ if (token.unclosed && whitespacePos + 1 !== next) {
+ token.after = "";
+ token.nodes.push({
+ type: "space",
+ sourceIndex: whitespacePos + 1,
+ sourceEndIndex: next,
+ value: value.slice(whitespacePos + 1, next)
+ });
+ } else {
+ token.after = value.slice(whitespacePos + 1, next);
+ token.sourceEndIndex = next;
+ }
+ } else {
+ token.after = "";
+ token.nodes = [];
+ }
+ pos = next + 1;
+ token.sourceEndIndex = token.unclosed ? next : pos;
+ code = value.charCodeAt(pos);
+ tokens.push(token);
+ } else {
+ balanced += 1;
+ token.after = "";
+ token.sourceEndIndex = pos + 1;
+ tokens.push(token);
+ stack.push(token);
+ tokens = token.nodes = [];
+ parent = token;
+ }
+ name = "";
+
+ // Close parentheses
+ } else if (closeParentheses === code && balanced) {
+ pos += 1;
+ code = value.charCodeAt(pos);
+
+ parent.after = after;
+ parent.sourceEndIndex += after.length;
+ after = "";
+ balanced -= 1;
+ stack[stack.length - 1].sourceEndIndex = pos;
+ stack.pop();
+ parent = stack[balanced];
+ tokens = parent.nodes;
+
+ // Words
+ } else {
+ next = pos;
+ do {
+ if (code === backslash) {
+ next += 1;
+ }
+ next += 1;
+ code = value.charCodeAt(next);
+ } while (
+ next < max &&
+ !(
+ code <= 32 ||
+ code === singleQuote ||
+ code === doubleQuote ||
+ code === comma ||
+ code === colon ||
+ code === slash ||
+ code === openParentheses ||
+ (code === star &&
+ parent &&
+ parent.type === "function" &&
+ parent.value === "calc") ||
+ (code === slash &&
+ parent.type === "function" &&
+ parent.value === "calc") ||
+ (code === closeParentheses && balanced)
+ )
+ );
+ token = value.slice(pos, next);
+
+ if (openParentheses === code) {
+ name = token;
+ } else if (
+ (uLower === token.charCodeAt(0) || uUpper === token.charCodeAt(0)) &&
+ plus$1 === token.charCodeAt(1) &&
+ isUnicodeRange.test(token.slice(2))
+ ) {
+ tokens.push({
+ type: "unicode-range",
+ sourceIndex: pos,
+ sourceEndIndex: next,
+ value: token
+ });
+ } else {
+ tokens.push({
+ type: "word",
+ sourceIndex: pos,
+ sourceEndIndex: next,
+ value: token
+ });
+ }
+
+ pos = next;
+ }
+ }
+
+ for (pos = stack.length - 1; pos; pos -= 1) {
+ stack[pos].unclosed = true;
+ stack[pos].sourceEndIndex = value.length;
+ }
+
+ return stack[0].nodes;
+};
+
+var walk$1 = function walk(nodes, cb, bubble) {
+ var i, max, node, result;
+
+ for (i = 0, max = nodes.length; i < max; i += 1) {
+ node = nodes[i];
+ if (!bubble) {
+ result = cb(node, i, nodes);
+ }
+
+ if (
+ result !== false &&
+ node.type === "function" &&
+ Array.isArray(node.nodes)
+ ) {
+ walk(node.nodes, cb, bubble);
+ }
+
+ if (bubble) {
+ cb(node, i, nodes);
+ }
+ }
+};
+
+function stringifyNode(node, custom) {
+ var type = node.type;
+ var value = node.value;
+ var buf;
+ var customResult;
+
+ if (custom && (customResult = custom(node)) !== undefined) {
+ return customResult;
+ } else if (type === "word" || type === "space") {
+ return value;
+ } else if (type === "string") {
+ buf = node.quote || "";
+ return buf + value + (node.unclosed ? "" : buf);
+ } else if (type === "comment") {
+ return "/*" + value + (node.unclosed ? "" : "*/");
+ } else if (type === "div") {
+ return (node.before || "") + value + (node.after || "");
+ } else if (Array.isArray(node.nodes)) {
+ buf = stringify$1(node.nodes, custom);
+ if (type !== "function") {
+ return buf;
+ }
+ return (
+ value +
+ "(" +
+ (node.before || "") +
+ buf +
+ (node.after || "") +
+ (node.unclosed ? "" : ")")
+ );
+ }
+ return value;
+}
+
+function stringify$1(nodes, custom) {
+ var result, i;
+
+ if (Array.isArray(nodes)) {
+ result = "";
+ for (i = nodes.length - 1; ~i; i -= 1) {
+ result = stringifyNode(nodes[i], custom) + result;
+ }
+ return result;
+ }
+ return stringifyNode(nodes, custom);
+}
+
+var stringify_1 = stringify$1;
+
+var minus = "-".charCodeAt(0);
+var plus = "+".charCodeAt(0);
+var dot = ".".charCodeAt(0);
+var exp = "e".charCodeAt(0);
+var EXP = "E".charCodeAt(0);
+
+// Check if three code points would start a number
+// https://www.w3.org/TR/css-syntax-3/#starts-with-a-number
+function likeNumber(value) {
+ var code = value.charCodeAt(0);
+ var nextCode;
+
+ if (code === plus || code === minus) {
+ nextCode = value.charCodeAt(1);
+
+ if (nextCode >= 48 && nextCode <= 57) {
+ return true;
+ }
+
+ var nextNextCode = value.charCodeAt(2);
+
+ if (nextCode === dot && nextNextCode >= 48 && nextNextCode <= 57) {
+ return true;
+ }
+
+ return false;
+ }
+
+ if (code === dot) {
+ nextCode = value.charCodeAt(1);
+
+ if (nextCode >= 48 && nextCode <= 57) {
+ return true;
+ }
+
+ return false;
+ }
+
+ if (code >= 48 && code <= 57) {
+ return true;
+ }
+
+ return false;
+}
+
+// Consume a number
+// https://www.w3.org/TR/css-syntax-3/#consume-number
+var unit = function(value) {
+ var pos = 0;
+ var length = value.length;
+ var code;
+ var nextCode;
+ var nextNextCode;
+
+ if (length === 0 || !likeNumber(value)) {
+ return false;
+ }
+
+ code = value.charCodeAt(pos);
+
+ if (code === plus || code === minus) {
+ pos++;
+ }
+
+ while (pos < length) {
+ code = value.charCodeAt(pos);
+
+ if (code < 48 || code > 57) {
+ break;
+ }
+
+ pos += 1;
+ }
+
+ code = value.charCodeAt(pos);
+ nextCode = value.charCodeAt(pos + 1);
+
+ if (code === dot && nextCode >= 48 && nextCode <= 57) {
+ pos += 2;
+
+ while (pos < length) {
+ code = value.charCodeAt(pos);
+
+ if (code < 48 || code > 57) {
+ break;
+ }
+
+ pos += 1;
+ }
+ }
+
+ code = value.charCodeAt(pos);
+ nextCode = value.charCodeAt(pos + 1);
+ nextNextCode = value.charCodeAt(pos + 2);
+
+ if (
+ (code === exp || code === EXP) &&
+ ((nextCode >= 48 && nextCode <= 57) ||
+ ((nextCode === plus || nextCode === minus) &&
+ nextNextCode >= 48 &&
+ nextNextCode <= 57))
+ ) {
+ pos += nextCode === plus || nextCode === minus ? 3 : 2;
+
+ while (pos < length) {
+ code = value.charCodeAt(pos);
+
+ if (code < 48 || code > 57) {
+ break;
+ }
+
+ pos += 1;
+ }
+ }
+
+ return {
+ number: value.slice(0, pos),
+ unit: value.slice(pos)
+ };
+};
+
+var parse = parse$1;
+var walk = walk$1;
+var stringify = stringify_1;
+
+function ValueParser(value) {
+ if (this instanceof ValueParser) {
+ this.nodes = parse(value);
+ return this;
+ }
+ return new ValueParser(value);
+}
+
+ValueParser.prototype.toString = function() {
+ return Array.isArray(this.nodes) ? stringify(this.nodes) : "";
+};
+
+ValueParser.prototype.walk = function(cb, bubble) {
+ walk(this.nodes, cb, bubble);
+ return this;
+};
+
+ValueParser.unit = unit;
+
+ValueParser.walk = walk;
+
+ValueParser.stringify = stringify;
+
+var lib = ValueParser;
+
+exports.lib = lib;
diff --git a/frontend/node_modules/vite/dist/node/chunks/dep-6e2fe41e.js b/frontend/node_modules/vite/dist/node/chunks/dep-6e2fe41e.js
new file mode 100644
index 00000000..ed407748
--- /dev/null
+++ b/frontend/node_modules/vite/dist/node/chunks/dep-6e2fe41e.js
@@ -0,0 +1,62105 @@
+'use strict';
+
+var fs$n = require('fs');
+var path$r = require('path');
+var require$$0$6 = require('url');
+var perf_hooks = require('perf_hooks');
+var require$$0$2 = require('tty');
+var require$$2 = require('os');
+var esbuild = require('esbuild');
+var require$$0$3 = require('events');
+var require$$5 = require('assert');
+var resolve$4 = require('resolve');
+var require$$0$4 = require('util');
+var require$$0$5 = require('stream');
+var require$$3 = require('net');
+var require$$1$2 = require('http');
+var require$$2$1 = require('child_process');
+var require$$0$7 = require('module');
+var require$$1$1 = require('crypto');
+var require$$0$8 = require('buffer');
+var qs = require('querystring');
+var zlib$1 = require('zlib');
+var require$$1$3 = require('https');
+var require$$4 = require('tls');
+var require$$1 = require('worker_threads');
+var readline = require('readline');
+
+function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e["default"] : e; }
+
+function _interopNamespace(e) {
+ if (e && e.__esModule) return e;
+ var n = Object.create(null);
+ if (e) {
+ for (var k in e) {
+ n[k] = e[k];
+ }
+ }
+ n["default"] = e;
+ return n;
+}
+
+var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs$n);
+var fs__namespace = /*#__PURE__*/_interopNamespace(fs$n);
+var path__default = /*#__PURE__*/_interopDefaultLegacy(path$r);
+var require$$0__default$5 = /*#__PURE__*/_interopDefaultLegacy(require$$0$6);
+var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0$2);
+var require$$2__default = /*#__PURE__*/_interopDefaultLegacy(require$$2);
+var require$$0__default$1 = /*#__PURE__*/_interopDefaultLegacy(require$$0$3);
+var require$$5__default = /*#__PURE__*/_interopDefaultLegacy(require$$5);
+var resolve__default = /*#__PURE__*/_interopDefaultLegacy(resolve$4);
+var require$$0__default$2 = /*#__PURE__*/_interopDefaultLegacy(require$$0$4);
+var require$$0__default$3 = /*#__PURE__*/_interopDefaultLegacy(require$$0$5);
+var require$$3__default = /*#__PURE__*/_interopDefaultLegacy(require$$3);
+var require$$1__default$1 = /*#__PURE__*/_interopDefaultLegacy(require$$1$2);
+var require$$2__default$1 = /*#__PURE__*/_interopDefaultLegacy(require$$2$1);
+var require$$0__default$4 = /*#__PURE__*/_interopDefaultLegacy(require$$0$7);
+var require$$1__default$2 = /*#__PURE__*/_interopDefaultLegacy(require$$1$1);
+var require$$0__default$6 = /*#__PURE__*/_interopDefaultLegacy(require$$0$8);
+var qs__namespace = /*#__PURE__*/_interopNamespace(qs);
+var zlib__default = /*#__PURE__*/_interopDefaultLegacy(zlib$1);
+var require$$1__default$3 = /*#__PURE__*/_interopDefaultLegacy(require$$1$3);
+var require$$4__default = /*#__PURE__*/_interopDefaultLegacy(require$$4);
+var require$$1__default = /*#__PURE__*/_interopDefaultLegacy(require$$1);
+var readline__default = /*#__PURE__*/_interopDefaultLegacy(readline);
+
+var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+function getDefaultExportFromCjs (x) {
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
+}
+
+function getAugmentedNamespace(n) {
+ if (n.__esModule) return n;
+ var a = Object.defineProperty({}, '__esModule', {value: true});
+ Object.keys(n).forEach(function (k) {
+ var d = Object.getOwnPropertyDescriptor(n, k);
+ Object.defineProperty(a, k, d.get ? d : {
+ enumerable: true,
+ get: function () {
+ return n[k];
+ }
+ });
+ });
+ return a;
+}
+
+var picocolors = {exports: {}};
+
+let tty = require$$0__default;
+
+let isColorSupported =
+ !("NO_COLOR" in process.env || process.argv.includes("--no-color")) &&
+ ("FORCE_COLOR" in process.env ||
+ process.argv.includes("--color") ||
+ process.platform === "win32" ||
+ (tty.isatty(1) && process.env.TERM !== "dumb") ||
+ "CI" in process.env);
+
+let formatter =
+ (open, close, replace = open) =>
+ input => {
+ let string = "" + input;
+ let index = string.indexOf(close, open.length);
+ return ~index
+ ? open + replaceClose(string, close, replace, index) + close
+ : open + string + close
+ };
+
+let replaceClose = (string, close, replace, index) => {
+ let start = string.substring(0, index) + replace;
+ let end = string.substring(index + close.length);
+ let nextIndex = end.indexOf(close);
+ return ~nextIndex ? start + replaceClose(end, close, replace, nextIndex) : start + end
+};
+
+let createColors = (enabled = isColorSupported) => ({
+ isColorSupported: enabled,
+ reset: enabled ? s => `\x1b[0m${s}\x1b[0m` : String,
+ bold: enabled ? formatter("\x1b[1m", "\x1b[22m", "\x1b[22m\x1b[1m") : String,
+ dim: enabled ? formatter("\x1b[2m", "\x1b[22m", "\x1b[22m\x1b[2m") : String,
+ italic: enabled ? formatter("\x1b[3m", "\x1b[23m") : String,
+ underline: enabled ? formatter("\x1b[4m", "\x1b[24m") : String,
+ inverse: enabled ? formatter("\x1b[7m", "\x1b[27m") : String,
+ hidden: enabled ? formatter("\x1b[8m", "\x1b[28m") : String,
+ strikethrough: enabled ? formatter("\x1b[9m", "\x1b[29m") : String,
+ black: enabled ? formatter("\x1b[30m", "\x1b[39m") : String,
+ red: enabled ? formatter("\x1b[31m", "\x1b[39m") : String,
+ green: enabled ? formatter("\x1b[32m", "\x1b[39m") : String,
+ yellow: enabled ? formatter("\x1b[33m", "\x1b[39m") : String,
+ blue: enabled ? formatter("\x1b[34m", "\x1b[39m") : String,
+ magenta: enabled ? formatter("\x1b[35m", "\x1b[39m") : String,
+ cyan: enabled ? formatter("\x1b[36m", "\x1b[39m") : String,
+ white: enabled ? formatter("\x1b[37m", "\x1b[39m") : String,
+ gray: enabled ? formatter("\x1b[90m", "\x1b[39m") : String,
+ bgBlack: enabled ? formatter("\x1b[40m", "\x1b[49m") : String,
+ bgRed: enabled ? formatter("\x1b[41m", "\x1b[49m") : String,
+ bgGreen: enabled ? formatter("\x1b[42m", "\x1b[49m") : String,
+ bgYellow: enabled ? formatter("\x1b[43m", "\x1b[49m") : String,
+ bgBlue: enabled ? formatter("\x1b[44m", "\x1b[49m") : String,
+ bgMagenta: enabled ? formatter("\x1b[45m", "\x1b[49m") : String,
+ bgCyan: enabled ? formatter("\x1b[46m", "\x1b[49m") : String,
+ bgWhite: enabled ? formatter("\x1b[47m", "\x1b[49m") : String,
+});
+
+picocolors.exports = createColors();
+picocolors.exports.createColors = createColors;
+
+var colors$1 = picocolors.exports;
+
+var main$1 = {exports: {}};
+
+const fs$m = fs__default;
+const path$q = path__default;
+const os$2 = require$$2__default;
+
+function log (message) {
+ console.log(`[dotenv][DEBUG] ${message}`);
+}
+
+const NEWLINE = '\n';
+const RE_INI_KEY_VAL = /^\s*([\w.-]+)\s*=\s*("[^"]*"|'[^']*'|.*?)(\s+#.*)?$/;
+const RE_NEWLINES = /\\n/g;
+const NEWLINES_MATCH = /\r\n|\n|\r/;
+
+// Parses src into an Object
+function parse$o (src, options) {
+ const debug = Boolean(options && options.debug);
+ const multiline = Boolean(options && options.multiline);
+ const obj = {};
+
+ // convert Buffers before splitting into lines and processing
+ const lines = src.toString().split(NEWLINES_MATCH);
+
+ for (let idx = 0; idx < lines.length; idx++) {
+ let line = lines[idx];
+
+ // matching "KEY' and 'VAL' in 'KEY=VAL'
+ const keyValueArr = line.match(RE_INI_KEY_VAL);
+ // matched?
+ if (keyValueArr != null) {
+ const key = keyValueArr[1];
+ // default undefined or missing values to empty string
+ let val = (keyValueArr[2] || '');
+ let end = val.length - 1;
+ const isDoubleQuoted = val[0] === '"' && val[end] === '"';
+ const isSingleQuoted = val[0] === "'" && val[end] === "'";
+
+ const isMultilineDoubleQuoted = val[0] === '"' && val[end] !== '"';
+ const isMultilineSingleQuoted = val[0] === "'" && val[end] !== "'";
+
+ // if parsing line breaks and the value starts with a quote
+ if (multiline && (isMultilineDoubleQuoted || isMultilineSingleQuoted)) {
+ const quoteChar = isMultilineDoubleQuoted ? '"' : "'";
+
+ val = val.substring(1);
+
+ while (idx++ < lines.length - 1) {
+ line = lines[idx];
+ end = line.length - 1;
+ if (line[end] === quoteChar) {
+ val += NEWLINE + line.substring(0, end);
+ break
+ }
+ val += NEWLINE + line;
+ }
+ // if single or double quoted, remove quotes
+ } else if (isSingleQuoted || isDoubleQuoted) {
+ val = val.substring(1, end);
+
+ // if double quoted, expand newlines
+ if (isDoubleQuoted) {
+ val = val.replace(RE_NEWLINES, NEWLINE);
+ }
+ } else {
+ // remove surrounding whitespace
+ val = val.trim();
+ }
+
+ obj[key] = val;
+ } else if (debug) {
+ const trimmedLine = line.trim();
+
+ // ignore empty and commented lines
+ if (trimmedLine.length && trimmedLine[0] !== '#') {
+ log(`Failed to match key and value when parsing line ${idx + 1}: ${line}`);
+ }
+ }
+ }
+
+ return obj
+}
+
+function resolveHome (envPath) {
+ return envPath[0] === '~' ? path$q.join(os$2.homedir(), envPath.slice(1)) : envPath
+}
+
+// Populates process.env from .env file
+function config$1 (options) {
+ let dotenvPath = path$q.resolve(process.cwd(), '.env');
+ let encoding = 'utf8';
+ const debug = Boolean(options && options.debug);
+ const override = Boolean(options && options.override);
+ const multiline = Boolean(options && options.multiline);
+
+ if (options) {
+ if (options.path != null) {
+ dotenvPath = resolveHome(options.path);
+ }
+ if (options.encoding != null) {
+ encoding = options.encoding;
+ }
+ }
+
+ try {
+ // specifying an encoding returns a string instead of a buffer
+ const parsed = DotenvModule.parse(fs$m.readFileSync(dotenvPath, { encoding }), { debug, multiline });
+
+ Object.keys(parsed).forEach(function (key) {
+ if (!Object.prototype.hasOwnProperty.call(process.env, key)) {
+ process.env[key] = parsed[key];
+ } else {
+ if (override === true) {
+ process.env[key] = parsed[key];
+ }
+
+ if (debug) {
+ if (override === true) {
+ log(`"${key}" is already defined in \`process.env\` and WAS overwritten`);
+ } else {
+ log(`"${key}" is already defined in \`process.env\` and was NOT overwritten`);
+ }
+ }
+ }
+ });
+
+ return { parsed }
+ } catch (e) {
+ if (debug) {
+ log(`Failed to load ${dotenvPath} ${e.message}`);
+ }
+
+ return { error: e }
+ }
+}
+
+const DotenvModule = {
+ config: config$1,
+ parse: parse$o
+};
+
+main$1.exports.config = DotenvModule.config;
+main$1.exports.parse = DotenvModule.parse;
+main$1.exports = DotenvModule;
+
+var dotenv = main$1.exports;
+
+var dotenvExpand = function (config) {
+ // if ignoring process.env, use a blank object
+ var environment = config.ignoreProcessEnv ? {} : process.env;
+
+ var interpolate = function (envValue) {
+ var matches = envValue.match(/(.?\${?(?:[a-zA-Z0-9_]+)?}?)/g) || [];
+
+ return matches.reduce(function (newEnv, match) {
+ var parts = /(.?)\${?([a-zA-Z0-9_]+)?}?/g.exec(match);
+ var prefix = parts[1];
+
+ var value, replacePart;
+
+ if (prefix === '\\') {
+ replacePart = parts[0];
+ value = replacePart.replace('\\$', '$');
+ } else {
+ var key = parts[2];
+ replacePart = parts[0].substring(prefix.length);
+ // process.env value 'wins' over .env file's value
+ value = environment.hasOwnProperty(key) ? environment[key] : (config.parsed[key] || '');
+
+ // Resolve recursive interpolations
+ value = interpolate(value);
+ }
+
+ return newEnv.replace(replacePart, value)
+ }, envValue)
+ };
+
+ for (var configKey in config.parsed) {
+ var value = environment.hasOwnProperty(configKey) ? environment[configKey] : config.parsed[configKey];
+
+ config.parsed[configKey] = interpolate(value);
+ }
+
+ for (var processKey in config.parsed) {
+ environment[processKey] = config.parsed[processKey];
+ }
+
+ return config
+};
+
+var main = dotenvExpand;
+
+var utils$p = {};
+
+const path$p = path__default;
+const WIN_SLASH$1 = '\\\\/';
+const WIN_NO_SLASH$1 = `[^${WIN_SLASH$1}]`;
+
+/**
+ * Posix glob regex
+ */
+
+const DOT_LITERAL$1 = '\\.';
+const PLUS_LITERAL$1 = '\\+';
+const QMARK_LITERAL$1 = '\\?';
+const SLASH_LITERAL$1 = '\\/';
+const ONE_CHAR$1 = '(?=.)';
+const QMARK$1 = '[^/]';
+const END_ANCHOR$1 = `(?:${SLASH_LITERAL$1}|$)`;
+const START_ANCHOR$1 = `(?:^|${SLASH_LITERAL$1})`;
+const DOTS_SLASH$1 = `${DOT_LITERAL$1}{1,2}${END_ANCHOR$1}`;
+const NO_DOT$1 = `(?!${DOT_LITERAL$1})`;
+const NO_DOTS$1 = `(?!${START_ANCHOR$1}${DOTS_SLASH$1})`;
+const NO_DOT_SLASH$1 = `(?!${DOT_LITERAL$1}{0,1}${END_ANCHOR$1})`;
+const NO_DOTS_SLASH$1 = `(?!${DOTS_SLASH$1})`;
+const QMARK_NO_DOT$1 = `[^.${SLASH_LITERAL$1}]`;
+const STAR$2 = `${QMARK$1}*?`;
+
+const POSIX_CHARS$1 = {
+ DOT_LITERAL: DOT_LITERAL$1,
+ PLUS_LITERAL: PLUS_LITERAL$1,
+ QMARK_LITERAL: QMARK_LITERAL$1,
+ SLASH_LITERAL: SLASH_LITERAL$1,
+ ONE_CHAR: ONE_CHAR$1,
+ QMARK: QMARK$1,
+ END_ANCHOR: END_ANCHOR$1,
+ DOTS_SLASH: DOTS_SLASH$1,
+ NO_DOT: NO_DOT$1,
+ NO_DOTS: NO_DOTS$1,
+ NO_DOT_SLASH: NO_DOT_SLASH$1,
+ NO_DOTS_SLASH: NO_DOTS_SLASH$1,
+ QMARK_NO_DOT: QMARK_NO_DOT$1,
+ STAR: STAR$2,
+ START_ANCHOR: START_ANCHOR$1
+};
+
+/**
+ * Windows glob regex
+ */
+
+const WINDOWS_CHARS$1 = {
+ ...POSIX_CHARS$1,
+
+ SLASH_LITERAL: `[${WIN_SLASH$1}]`,
+ QMARK: WIN_NO_SLASH$1,
+ STAR: `${WIN_NO_SLASH$1}*?`,
+ DOTS_SLASH: `${DOT_LITERAL$1}{1,2}(?:[${WIN_SLASH$1}]|$)`,
+ NO_DOT: `(?!${DOT_LITERAL$1})`,
+ NO_DOTS: `(?!(?:^|[${WIN_SLASH$1}])${DOT_LITERAL$1}{1,2}(?:[${WIN_SLASH$1}]|$))`,
+ NO_DOT_SLASH: `(?!${DOT_LITERAL$1}{0,1}(?:[${WIN_SLASH$1}]|$))`,
+ NO_DOTS_SLASH: `(?!${DOT_LITERAL$1}{1,2}(?:[${WIN_SLASH$1}]|$))`,
+ QMARK_NO_DOT: `[^.${WIN_SLASH$1}]`,
+ START_ANCHOR: `(?:^|[${WIN_SLASH$1}])`,
+ END_ANCHOR: `(?:[${WIN_SLASH$1}]|$)`
+};
+
+/**
+ * POSIX Bracket Regex
+ */
+
+const POSIX_REGEX_SOURCE$3 = {
+ alnum: 'a-zA-Z0-9',
+ alpha: 'a-zA-Z',
+ ascii: '\\x00-\\x7F',
+ blank: ' \\t',
+ cntrl: '\\x00-\\x1F\\x7F',
+ digit: '0-9',
+ graph: '\\x21-\\x7E',
+ lower: 'a-z',
+ print: '\\x20-\\x7E ',
+ punct: '\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~',
+ space: ' \\t\\r\\n\\v\\f',
+ upper: 'A-Z',
+ word: 'A-Za-z0-9_',
+ xdigit: 'A-Fa-f0-9'
+};
+
+var constants$9 = {
+ MAX_LENGTH: 1024 * 64,
+ POSIX_REGEX_SOURCE: POSIX_REGEX_SOURCE$3,
+
+ // regular expressions
+ REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g,
+ REGEX_NON_SPECIAL_CHARS: /^[^@![\].,$*+?^{}()|\\/]+/,
+ REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/,
+ REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g,
+ REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g,
+ REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g,
+
+ // Replace globs with equivalent patterns to reduce parsing time.
+ REPLACEMENTS: {
+ '***': '*',
+ '**/**': '**',
+ '**/**/**': '**'
+ },
+
+ // Digits
+ CHAR_0: 48, /* 0 */
+ CHAR_9: 57, /* 9 */
+
+ // Alphabet chars.
+ CHAR_UPPERCASE_A: 65, /* A */
+ CHAR_LOWERCASE_A: 97, /* a */
+ CHAR_UPPERCASE_Z: 90, /* Z */
+ CHAR_LOWERCASE_Z: 122, /* z */
+
+ CHAR_LEFT_PARENTHESES: 40, /* ( */
+ CHAR_RIGHT_PARENTHESES: 41, /* ) */
+
+ CHAR_ASTERISK: 42, /* * */
+
+ // Non-alphabetic chars.
+ CHAR_AMPERSAND: 38, /* & */
+ CHAR_AT: 64, /* @ */
+ CHAR_BACKWARD_SLASH: 92, /* \ */
+ CHAR_CARRIAGE_RETURN: 13, /* \r */
+ CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */
+ CHAR_COLON: 58, /* : */
+ CHAR_COMMA: 44, /* , */
+ CHAR_DOT: 46, /* . */
+ CHAR_DOUBLE_QUOTE: 34, /* " */
+ CHAR_EQUAL: 61, /* = */
+ CHAR_EXCLAMATION_MARK: 33, /* ! */
+ CHAR_FORM_FEED: 12, /* \f */
+ CHAR_FORWARD_SLASH: 47, /* / */
+ CHAR_GRAVE_ACCENT: 96, /* ` */
+ CHAR_HASH: 35, /* # */
+ CHAR_HYPHEN_MINUS: 45, /* - */
+ CHAR_LEFT_ANGLE_BRACKET: 60, /* < */
+ CHAR_LEFT_CURLY_BRACE: 123, /* { */
+ CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */
+ CHAR_LINE_FEED: 10, /* \n */
+ CHAR_NO_BREAK_SPACE: 160, /* \u00A0 */
+ CHAR_PERCENT: 37, /* % */
+ CHAR_PLUS: 43, /* + */
+ CHAR_QUESTION_MARK: 63, /* ? */
+ CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */
+ CHAR_RIGHT_CURLY_BRACE: 125, /* } */
+ CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */
+ CHAR_SEMICOLON: 59, /* ; */
+ CHAR_SINGLE_QUOTE: 39, /* ' */
+ CHAR_SPACE: 32, /* */
+ CHAR_TAB: 9, /* \t */
+ CHAR_UNDERSCORE: 95, /* _ */
+ CHAR_VERTICAL_LINE: 124, /* | */
+ CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \uFEFF */
+
+ SEP: path$p.sep,
+
+ /**
+ * Create EXTGLOB_CHARS
+ */
+
+ extglobChars(chars) {
+ return {
+ '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` },
+ '?': { type: 'qmark', open: '(?:', close: ')?' },
+ '+': { type: 'plus', open: '(?:', close: ')+' },
+ '*': { type: 'star', open: '(?:', close: ')*' },
+ '@': { type: 'at', open: '(?:', close: ')' }
+ };
+ },
+
+ /**
+ * Create GLOB_CHARS
+ */
+
+ globChars(win32) {
+ return win32 === true ? WINDOWS_CHARS$1 : POSIX_CHARS$1;
+ }
+};
+
+(function (exports) {
+
+const path = path__default;
+const win32 = process.platform === 'win32';
+const {
+ REGEX_BACKSLASH,
+ REGEX_REMOVE_BACKSLASH,
+ REGEX_SPECIAL_CHARS,
+ REGEX_SPECIAL_CHARS_GLOBAL
+} = constants$9;
+
+exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);
+exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);
+exports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str);
+exports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\$1');
+exports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/');
+
+exports.removeBackslashes = str => {
+ return str.replace(REGEX_REMOVE_BACKSLASH, match => {
+ return match === '\\' ? '' : match;
+ });
+};
+
+exports.supportsLookbehinds = () => {
+ const segs = process.version.slice(1).split('.').map(Number);
+ if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) {
+ return true;
+ }
+ return false;
+};
+
+exports.isWindows = options => {
+ if (options && typeof options.windows === 'boolean') {
+ return options.windows;
+ }
+ return win32 === true || path.sep === '\\';
+};
+
+exports.escapeLast = (input, char, lastIdx) => {
+ const idx = input.lastIndexOf(char, lastIdx);
+ if (idx === -1) return input;
+ if (input[idx - 1] === '\\') return exports.escapeLast(input, char, idx - 1);
+ return `${input.slice(0, idx)}\\${input.slice(idx)}`;
+};
+
+exports.removePrefix = (input, state = {}) => {
+ let output = input;
+ if (output.startsWith('./')) {
+ output = output.slice(2);
+ state.prefix = './';
+ }
+ return output;
+};
+
+exports.wrapOutput = (input, state = {}, options = {}) => {
+ const prepend = options.contains ? '' : '^';
+ const append = options.contains ? '' : '$';
+
+ let output = `${prepend}(?:${input})${append}`;
+ if (state.negated === true) {
+ output = `(?:^(?!${output}).*$)`;
+ }
+ return output;
+};
+}(utils$p));
+
+const utils$o = utils$p;
+const {
+ CHAR_ASTERISK: CHAR_ASTERISK$1, /* * */
+ CHAR_AT: CHAR_AT$1, /* @ */
+ CHAR_BACKWARD_SLASH: CHAR_BACKWARD_SLASH$1, /* \ */
+ CHAR_COMMA: CHAR_COMMA$2, /* , */
+ CHAR_DOT: CHAR_DOT$2, /* . */
+ CHAR_EXCLAMATION_MARK: CHAR_EXCLAMATION_MARK$1, /* ! */
+ CHAR_FORWARD_SLASH: CHAR_FORWARD_SLASH$1, /* / */
+ CHAR_LEFT_CURLY_BRACE: CHAR_LEFT_CURLY_BRACE$2, /* { */
+ CHAR_LEFT_PARENTHESES: CHAR_LEFT_PARENTHESES$2, /* ( */
+ CHAR_LEFT_SQUARE_BRACKET: CHAR_LEFT_SQUARE_BRACKET$2, /* [ */
+ CHAR_PLUS: CHAR_PLUS$1, /* + */
+ CHAR_QUESTION_MARK: CHAR_QUESTION_MARK$1, /* ? */
+ CHAR_RIGHT_CURLY_BRACE: CHAR_RIGHT_CURLY_BRACE$2, /* } */
+ CHAR_RIGHT_PARENTHESES: CHAR_RIGHT_PARENTHESES$2, /* ) */
+ CHAR_RIGHT_SQUARE_BRACKET: CHAR_RIGHT_SQUARE_BRACKET$2 /* ] */
+} = constants$9;
+
+const isPathSeparator$1 = code => {
+ return code === CHAR_FORWARD_SLASH$1 || code === CHAR_BACKWARD_SLASH$1;
+};
+
+const depth$1 = token => {
+ if (token.isPrefix !== true) {
+ token.depth = token.isGlobstar ? Infinity : 1;
+ }
+};
+
+/**
+ * Quickly scans a glob pattern and returns an object with a handful of
+ * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),
+ * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not
+ * with `!(`) and `negatedExtglob` (true if the path starts with `!(`).
+ *
+ * ```js
+ * const pm = require('picomatch');
+ * console.log(pm.scan('foo/bar/*.js'));
+ * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }
+ * ```
+ * @param {String} `str`
+ * @param {Object} `options`
+ * @return {Object} Returns an object with tokens and regex source string.
+ * @api public
+ */
+
+const scan$3 = (input, options) => {
+ const opts = options || {};
+
+ const length = input.length - 1;
+ const scanToEnd = opts.parts === true || opts.scanToEnd === true;
+ const slashes = [];
+ const tokens = [];
+ const parts = [];
+
+ let str = input;
+ let index = -1;
+ let start = 0;
+ let lastIndex = 0;
+ let isBrace = false;
+ let isBracket = false;
+ let isGlob = false;
+ let isExtglob = false;
+ let isGlobstar = false;
+ let braceEscaped = false;
+ let backslashes = false;
+ let negated = false;
+ let negatedExtglob = false;
+ let finished = false;
+ let braces = 0;
+ let prev;
+ let code;
+ let token = { value: '', depth: 0, isGlob: false };
+
+ const eos = () => index >= length;
+ const peek = () => str.charCodeAt(index + 1);
+ const advance = () => {
+ prev = code;
+ return str.charCodeAt(++index);
+ };
+
+ while (index < length) {
+ code = advance();
+ let next;
+
+ if (code === CHAR_BACKWARD_SLASH$1) {
+ backslashes = token.backslashes = true;
+ code = advance();
+
+ if (code === CHAR_LEFT_CURLY_BRACE$2) {
+ braceEscaped = true;
+ }
+ continue;
+ }
+
+ if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE$2) {
+ braces++;
+
+ while (eos() !== true && (code = advance())) {
+ if (code === CHAR_BACKWARD_SLASH$1) {
+ backslashes = token.backslashes = true;
+ advance();
+ continue;
+ }
+
+ if (code === CHAR_LEFT_CURLY_BRACE$2) {
+ braces++;
+ continue;
+ }
+
+ if (braceEscaped !== true && code === CHAR_DOT$2 && (code = advance()) === CHAR_DOT$2) {
+ isBrace = token.isBrace = true;
+ isGlob = token.isGlob = true;
+ finished = true;
+
+ if (scanToEnd === true) {
+ continue;
+ }
+
+ break;
+ }
+
+ if (braceEscaped !== true && code === CHAR_COMMA$2) {
+ isBrace = token.isBrace = true;
+ isGlob = token.isGlob = true;
+ finished = true;
+
+ if (scanToEnd === true) {
+ continue;
+ }
+
+ break;
+ }
+
+ if (code === CHAR_RIGHT_CURLY_BRACE$2) {
+ braces--;
+
+ if (braces === 0) {
+ braceEscaped = false;
+ isBrace = token.isBrace = true;
+ finished = true;
+ break;
+ }
+ }
+ }
+
+ if (scanToEnd === true) {
+ continue;
+ }
+
+ break;
+ }
+
+ if (code === CHAR_FORWARD_SLASH$1) {
+ slashes.push(index);
+ tokens.push(token);
+ token = { value: '', depth: 0, isGlob: false };
+
+ if (finished === true) continue;
+ if (prev === CHAR_DOT$2 && index === (start + 1)) {
+ start += 2;
+ continue;
+ }
+
+ lastIndex = index + 1;
+ continue;
+ }
+
+ if (opts.noext !== true) {
+ const isExtglobChar = code === CHAR_PLUS$1
+ || code === CHAR_AT$1
+ || code === CHAR_ASTERISK$1
+ || code === CHAR_QUESTION_MARK$1
+ || code === CHAR_EXCLAMATION_MARK$1;
+
+ if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES$2) {
+ isGlob = token.isGlob = true;
+ isExtglob = token.isExtglob = true;
+ finished = true;
+ if (code === CHAR_EXCLAMATION_MARK$1 && index === start) {
+ negatedExtglob = true;
+ }
+
+ if (scanToEnd === true) {
+ while (eos() !== true && (code = advance())) {
+ if (code === CHAR_BACKWARD_SLASH$1) {
+ backslashes = token.backslashes = true;
+ code = advance();
+ continue;
+ }
+
+ if (code === CHAR_RIGHT_PARENTHESES$2) {
+ isGlob = token.isGlob = true;
+ finished = true;
+ break;
+ }
+ }
+ continue;
+ }
+ break;
+ }
+ }
+
+ if (code === CHAR_ASTERISK$1) {
+ if (prev === CHAR_ASTERISK$1) isGlobstar = token.isGlobstar = true;
+ isGlob = token.isGlob = true;
+ finished = true;
+
+ if (scanToEnd === true) {
+ continue;
+ }
+ break;
+ }
+
+ if (code === CHAR_QUESTION_MARK$1) {
+ isGlob = token.isGlob = true;
+ finished = true;
+
+ if (scanToEnd === true) {
+ continue;
+ }
+ break;
+ }
+
+ if (code === CHAR_LEFT_SQUARE_BRACKET$2) {
+ while (eos() !== true && (next = advance())) {
+ if (next === CHAR_BACKWARD_SLASH$1) {
+ backslashes = token.backslashes = true;
+ advance();
+ continue;
+ }
+
+ if (next === CHAR_RIGHT_SQUARE_BRACKET$2) {
+ isBracket = token.isBracket = true;
+ isGlob = token.isGlob = true;
+ finished = true;
+ break;
+ }
+ }
+
+ if (scanToEnd === true) {
+ continue;
+ }
+
+ break;
+ }
+
+ if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK$1 && index === start) {
+ negated = token.negated = true;
+ start++;
+ continue;
+ }
+
+ if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES$2) {
+ isGlob = token.isGlob = true;
+
+ if (scanToEnd === true) {
+ while (eos() !== true && (code = advance())) {
+ if (code === CHAR_LEFT_PARENTHESES$2) {
+ backslashes = token.backslashes = true;
+ code = advance();
+ continue;
+ }
+
+ if (code === CHAR_RIGHT_PARENTHESES$2) {
+ finished = true;
+ break;
+ }
+ }
+ continue;
+ }
+ break;
+ }
+
+ if (isGlob === true) {
+ finished = true;
+
+ if (scanToEnd === true) {
+ continue;
+ }
+
+ break;
+ }
+ }
+
+ if (opts.noext === true) {
+ isExtglob = false;
+ isGlob = false;
+ }
+
+ let base = str;
+ let prefix = '';
+ let glob = '';
+
+ if (start > 0) {
+ prefix = str.slice(0, start);
+ str = str.slice(start);
+ lastIndex -= start;
+ }
+
+ if (base && isGlob === true && lastIndex > 0) {
+ base = str.slice(0, lastIndex);
+ glob = str.slice(lastIndex);
+ } else if (isGlob === true) {
+ base = '';
+ glob = str;
+ } else {
+ base = str;
+ }
+
+ if (base && base !== '' && base !== '/' && base !== str) {
+ if (isPathSeparator$1(base.charCodeAt(base.length - 1))) {
+ base = base.slice(0, -1);
+ }
+ }
+
+ if (opts.unescape === true) {
+ if (glob) glob = utils$o.removeBackslashes(glob);
+
+ if (base && backslashes === true) {
+ base = utils$o.removeBackslashes(base);
+ }
+ }
+
+ const state = {
+ prefix,
+ input,
+ start,
+ base,
+ glob,
+ isBrace,
+ isBracket,
+ isGlob,
+ isExtglob,
+ isGlobstar,
+ negated,
+ negatedExtglob
+ };
+
+ if (opts.tokens === true) {
+ state.maxDepth = 0;
+ if (!isPathSeparator$1(code)) {
+ tokens.push(token);
+ }
+ state.tokens = tokens;
+ }
+
+ if (opts.parts === true || opts.tokens === true) {
+ let prevIndex;
+
+ for (let idx = 0; idx < slashes.length; idx++) {
+ const n = prevIndex ? prevIndex + 1 : start;
+ const i = slashes[idx];
+ const value = input.slice(n, i);
+ if (opts.tokens) {
+ if (idx === 0 && start !== 0) {
+ tokens[idx].isPrefix = true;
+ tokens[idx].value = prefix;
+ } else {
+ tokens[idx].value = value;
+ }
+ depth$1(tokens[idx]);
+ state.maxDepth += tokens[idx].depth;
+ }
+ if (idx !== 0 || value !== '') {
+ parts.push(value);
+ }
+ prevIndex = i;
+ }
+
+ if (prevIndex && prevIndex + 1 < input.length) {
+ const value = input.slice(prevIndex + 1);
+ parts.push(value);
+
+ if (opts.tokens) {
+ tokens[tokens.length - 1].value = value;
+ depth$1(tokens[tokens.length - 1]);
+ state.maxDepth += tokens[tokens.length - 1].depth;
+ }
+ }
+
+ state.slashes = slashes;
+ state.parts = parts;
+ }
+
+ return state;
+};
+
+var scan_1$1 = scan$3;
+
+const constants$8 = constants$9;
+const utils$n = utils$p;
+
+/**
+ * Constants
+ */
+
+const {
+ MAX_LENGTH: MAX_LENGTH$2,
+ POSIX_REGEX_SOURCE: POSIX_REGEX_SOURCE$2,
+ REGEX_NON_SPECIAL_CHARS: REGEX_NON_SPECIAL_CHARS$1,
+ REGEX_SPECIAL_CHARS_BACKREF: REGEX_SPECIAL_CHARS_BACKREF$1,
+ REPLACEMENTS: REPLACEMENTS$1
+} = constants$8;
+
+/**
+ * Helpers
+ */
+
+const expandRange$1 = (args, options) => {
+ if (typeof options.expandRange === 'function') {
+ return options.expandRange(...args, options);
+ }
+
+ args.sort();
+ const value = `[${args.join('-')}]`;
+
+ return value;
+};
+
+/**
+ * Create the message for a syntax error
+ */
+
+const syntaxError$2 = (type, char) => {
+ return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`;
+};
+
+/**
+ * Parse the given input string.
+ * @param {String} input
+ * @param {Object} options
+ * @return {Object}
+ */
+
+const parse$n = (input, options) => {
+ if (typeof input !== 'string') {
+ throw new TypeError('Expected a string');
+ }
+
+ input = REPLACEMENTS$1[input] || input;
+
+ const opts = { ...options };
+ const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH$2, opts.maxLength) : MAX_LENGTH$2;
+
+ let len = input.length;
+ if (len > max) {
+ throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);
+ }
+
+ const bos = { type: 'bos', value: '', output: opts.prepend || '' };
+ const tokens = [bos];
+
+ const capture = opts.capture ? '' : '?:';
+ const win32 = utils$n.isWindows(options);
+
+ // create constants based on platform, for windows or posix
+ const PLATFORM_CHARS = constants$8.globChars(win32);
+ const EXTGLOB_CHARS = constants$8.extglobChars(PLATFORM_CHARS);
+
+ const {
+ DOT_LITERAL,
+ PLUS_LITERAL,
+ SLASH_LITERAL,
+ ONE_CHAR,
+ DOTS_SLASH,
+ NO_DOT,
+ NO_DOT_SLASH,
+ NO_DOTS_SLASH,
+ QMARK,
+ QMARK_NO_DOT,
+ STAR,
+ START_ANCHOR
+ } = PLATFORM_CHARS;
+
+ const globstar = opts => {
+ return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;
+ };
+
+ const nodot = opts.dot ? '' : NO_DOT;
+ const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT;
+ let star = opts.bash === true ? globstar(opts) : STAR;
+
+ if (opts.capture) {
+ star = `(${star})`;
+ }
+
+ // minimatch options support
+ if (typeof opts.noext === 'boolean') {
+ opts.noextglob = opts.noext;
+ }
+
+ const state = {
+ input,
+ index: -1,
+ start: 0,
+ dot: opts.dot === true,
+ consumed: '',
+ output: '',
+ prefix: '',
+ backtrack: false,
+ negated: false,
+ brackets: 0,
+ braces: 0,
+ parens: 0,
+ quotes: 0,
+ globstar: false,
+ tokens
+ };
+
+ input = utils$n.removePrefix(input, state);
+ len = input.length;
+
+ const extglobs = [];
+ const braces = [];
+ const stack = [];
+ let prev = bos;
+ let value;
+
+ /**
+ * Tokenizing helpers
+ */
+
+ const eos = () => state.index === len - 1;
+ const peek = state.peek = (n = 1) => input[state.index + n];
+ const advance = state.advance = () => input[++state.index] || '';
+ const remaining = () => input.slice(state.index + 1);
+ const consume = (value = '', num = 0) => {
+ state.consumed += value;
+ state.index += num;
+ };
+
+ const append = token => {
+ state.output += token.output != null ? token.output : token.value;
+ consume(token.value);
+ };
+
+ const negate = () => {
+ let count = 1;
+
+ while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) {
+ advance();
+ state.start++;
+ count++;
+ }
+
+ if (count % 2 === 0) {
+ return false;
+ }
+
+ state.negated = true;
+ state.start++;
+ return true;
+ };
+
+ const increment = type => {
+ state[type]++;
+ stack.push(type);
+ };
+
+ const decrement = type => {
+ state[type]--;
+ stack.pop();
+ };
+
+ /**
+ * Push tokens onto the tokens array. This helper speeds up
+ * tokenizing by 1) helping us avoid backtracking as much as possible,
+ * and 2) helping us avoid creating extra tokens when consecutive
+ * characters are plain text. This improves performance and simplifies
+ * lookbehinds.
+ */
+
+ const push = tok => {
+ if (prev.type === 'globstar') {
+ const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace');
+ const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'));
+
+ if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) {
+ state.output = state.output.slice(0, -prev.output.length);
+ prev.type = 'star';
+ prev.value = '*';
+ prev.output = star;
+ state.output += prev.output;
+ }
+ }
+
+ if (extglobs.length && tok.type !== 'paren') {
+ extglobs[extglobs.length - 1].inner += tok.value;
+ }
+
+ if (tok.value || tok.output) append(tok);
+ if (prev && prev.type === 'text' && tok.type === 'text') {
+ prev.value += tok.value;
+ prev.output = (prev.output || '') + tok.value;
+ return;
+ }
+
+ tok.prev = prev;
+ tokens.push(tok);
+ prev = tok;
+ };
+
+ const extglobOpen = (type, value) => {
+ const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' };
+
+ token.prev = prev;
+ token.parens = state.parens;
+ token.output = state.output;
+ const output = (opts.capture ? '(' : '') + token.open;
+
+ increment('parens');
+ push({ type, value, output: state.output ? '' : ONE_CHAR });
+ push({ type: 'paren', extglob: true, value: advance(), output });
+ extglobs.push(token);
+ };
+
+ const extglobClose = token => {
+ let output = token.close + (opts.capture ? ')' : '');
+ let rest;
+
+ if (token.type === 'negate') {
+ let extglobStar = star;
+
+ if (token.inner && token.inner.length > 1 && token.inner.includes('/')) {
+ extglobStar = globstar(opts);
+ }
+
+ if (extglobStar !== star || eos() || /^\)+$/.test(remaining())) {
+ output = token.close = `)$))${extglobStar}`;
+ }
+
+ if (token.inner.includes('*') && (rest = remaining()) && /^\.[^\\/.]+$/.test(rest)) {
+ // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis.
+ // In this case, we need to parse the string and use it in the output of the original pattern.
+ // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`.
+ //
+ // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`.
+ const expression = parse$n(rest, { ...options, fastpaths: false }).output;
+
+ output = token.close = `)${expression})${extglobStar})`;
+ }
+
+ if (token.prev.type === 'bos') {
+ state.negatedExtglob = true;
+ }
+ }
+
+ push({ type: 'paren', extglob: true, value, output });
+ decrement('parens');
+ };
+
+ /**
+ * Fast paths
+ */
+
+ if (opts.fastpaths !== false && !/(^[*!]|[/()[\]{}"])/.test(input)) {
+ let backslashes = false;
+
+ let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF$1, (m, esc, chars, first, rest, index) => {
+ if (first === '\\') {
+ backslashes = true;
+ return m;
+ }
+
+ if (first === '?') {
+ if (esc) {
+ return esc + first + (rest ? QMARK.repeat(rest.length) : '');
+ }
+ if (index === 0) {
+ return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : '');
+ }
+ return QMARK.repeat(chars.length);
+ }
+
+ if (first === '.') {
+ return DOT_LITERAL.repeat(chars.length);
+ }
+
+ if (first === '*') {
+ if (esc) {
+ return esc + first + (rest ? star : '');
+ }
+ return star;
+ }
+ return esc ? m : `\\${m}`;
+ });
+
+ if (backslashes === true) {
+ if (opts.unescape === true) {
+ output = output.replace(/\\/g, '');
+ } else {
+ output = output.replace(/\\+/g, m => {
+ return m.length % 2 === 0 ? '\\\\' : (m ? '\\' : '');
+ });
+ }
+ }
+
+ if (output === input && opts.contains === true) {
+ state.output = input;
+ return state;
+ }
+
+ state.output = utils$n.wrapOutput(output, state, options);
+ return state;
+ }
+
+ /**
+ * Tokenize input until we reach end-of-string
+ */
+
+ while (!eos()) {
+ value = advance();
+
+ if (value === '\u0000') {
+ continue;
+ }
+
+ /**
+ * Escaped characters
+ */
+
+ if (value === '\\') {
+ const next = peek();
+
+ if (next === '/' && opts.bash !== true) {
+ continue;
+ }
+
+ if (next === '.' || next === ';') {
+ continue;
+ }
+
+ if (!next) {
+ value += '\\';
+ push({ type: 'text', value });
+ continue;
+ }
+
+ // collapse slashes to reduce potential for exploits
+ const match = /^\\+/.exec(remaining());
+ let slashes = 0;
+
+ if (match && match[0].length > 2) {
+ slashes = match[0].length;
+ state.index += slashes;
+ if (slashes % 2 !== 0) {
+ value += '\\';
+ }
+ }
+
+ if (opts.unescape === true) {
+ value = advance();
+ } else {
+ value += advance();
+ }
+
+ if (state.brackets === 0) {
+ push({ type: 'text', value });
+ continue;
+ }
+ }
+
+ /**
+ * If we're inside a regex character class, continue
+ * until we reach the closing bracket.
+ */
+
+ if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) {
+ if (opts.posix !== false && value === ':') {
+ const inner = prev.value.slice(1);
+ if (inner.includes('[')) {
+ prev.posix = true;
+
+ if (inner.includes(':')) {
+ const idx = prev.value.lastIndexOf('[');
+ const pre = prev.value.slice(0, idx);
+ const rest = prev.value.slice(idx + 2);
+ const posix = POSIX_REGEX_SOURCE$2[rest];
+ if (posix) {
+ prev.value = pre + posix;
+ state.backtrack = true;
+ advance();
+
+ if (!bos.output && tokens.indexOf(prev) === 1) {
+ bos.output = ONE_CHAR;
+ }
+ continue;
+ }
+ }
+ }
+ }
+
+ if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) {
+ value = `\\${value}`;
+ }
+
+ if (value === ']' && (prev.value === '[' || prev.value === '[^')) {
+ value = `\\${value}`;
+ }
+
+ if (opts.posix === true && value === '!' && prev.value === '[') {
+ value = '^';
+ }
+
+ prev.value += value;
+ append({ value });
+ continue;
+ }
+
+ /**
+ * If we're inside a quoted string, continue
+ * until we reach the closing double quote.
+ */
+
+ if (state.quotes === 1 && value !== '"') {
+ value = utils$n.escapeRegex(value);
+ prev.value += value;
+ append({ value });
+ continue;
+ }
+
+ /**
+ * Double quotes
+ */
+
+ if (value === '"') {
+ state.quotes = state.quotes === 1 ? 0 : 1;
+ if (opts.keepQuotes === true) {
+ push({ type: 'text', value });
+ }
+ continue;
+ }
+
+ /**
+ * Parentheses
+ */
+
+ if (value === '(') {
+ increment('parens');
+ push({ type: 'paren', value });
+ continue;
+ }
+
+ if (value === ')') {
+ if (state.parens === 0 && opts.strictBrackets === true) {
+ throw new SyntaxError(syntaxError$2('opening', '('));
+ }
+
+ const extglob = extglobs[extglobs.length - 1];
+ if (extglob && state.parens === extglob.parens + 1) {
+ extglobClose(extglobs.pop());
+ continue;
+ }
+
+ push({ type: 'paren', value, output: state.parens ? ')' : '\\)' });
+ decrement('parens');
+ continue;
+ }
+
+ /**
+ * Square brackets
+ */
+
+ if (value === '[') {
+ if (opts.nobracket === true || !remaining().includes(']')) {
+ if (opts.nobracket !== true && opts.strictBrackets === true) {
+ throw new SyntaxError(syntaxError$2('closing', ']'));
+ }
+
+ value = `\\${value}`;
+ } else {
+ increment('brackets');
+ }
+
+ push({ type: 'bracket', value });
+ continue;
+ }
+
+ if (value === ']') {
+ if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) {
+ push({ type: 'text', value, output: `\\${value}` });
+ continue;
+ }
+
+ if (state.brackets === 0) {
+ if (opts.strictBrackets === true) {
+ throw new SyntaxError(syntaxError$2('opening', '['));
+ }
+
+ push({ type: 'text', value, output: `\\${value}` });
+ continue;
+ }
+
+ decrement('brackets');
+
+ const prevValue = prev.value.slice(1);
+ if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) {
+ value = `/${value}`;
+ }
+
+ prev.value += value;
+ append({ value });
+
+ // when literal brackets are explicitly disabled
+ // assume we should match with a regex character class
+ if (opts.literalBrackets === false || utils$n.hasRegexChars(prevValue)) {
+ continue;
+ }
+
+ const escaped = utils$n.escapeRegex(prev.value);
+ state.output = state.output.slice(0, -prev.value.length);
+
+ // when literal brackets are explicitly enabled
+ // assume we should escape the brackets to match literal characters
+ if (opts.literalBrackets === true) {
+ state.output += escaped;
+ prev.value = escaped;
+ continue;
+ }
+
+ // when the user specifies nothing, try to match both
+ prev.value = `(${capture}${escaped}|${prev.value})`;
+ state.output += prev.value;
+ continue;
+ }
+
+ /**
+ * Braces
+ */
+
+ if (value === '{' && opts.nobrace !== true) {
+ increment('braces');
+
+ const open = {
+ type: 'brace',
+ value,
+ output: '(',
+ outputIndex: state.output.length,
+ tokensIndex: state.tokens.length
+ };
+
+ braces.push(open);
+ push(open);
+ continue;
+ }
+
+ if (value === '}') {
+ const brace = braces[braces.length - 1];
+
+ if (opts.nobrace === true || !brace) {
+ push({ type: 'text', value, output: value });
+ continue;
+ }
+
+ let output = ')';
+
+ if (brace.dots === true) {
+ const arr = tokens.slice();
+ const range = [];
+
+ for (let i = arr.length - 1; i >= 0; i--) {
+ tokens.pop();
+ if (arr[i].type === 'brace') {
+ break;
+ }
+ if (arr[i].type !== 'dots') {
+ range.unshift(arr[i].value);
+ }
+ }
+
+ output = expandRange$1(range, opts);
+ state.backtrack = true;
+ }
+
+ if (brace.comma !== true && brace.dots !== true) {
+ const out = state.output.slice(0, brace.outputIndex);
+ const toks = state.tokens.slice(brace.tokensIndex);
+ brace.value = brace.output = '\\{';
+ value = output = '\\}';
+ state.output = out;
+ for (const t of toks) {
+ state.output += (t.output || t.value);
+ }
+ }
+
+ push({ type: 'brace', value, output });
+ decrement('braces');
+ braces.pop();
+ continue;
+ }
+
+ /**
+ * Pipes
+ */
+
+ if (value === '|') {
+ if (extglobs.length > 0) {
+ extglobs[extglobs.length - 1].conditions++;
+ }
+ push({ type: 'text', value });
+ continue;
+ }
+
+ /**
+ * Commas
+ */
+
+ if (value === ',') {
+ let output = value;
+
+ const brace = braces[braces.length - 1];
+ if (brace && stack[stack.length - 1] === 'braces') {
+ brace.comma = true;
+ output = '|';
+ }
+
+ push({ type: 'comma', value, output });
+ continue;
+ }
+
+ /**
+ * Slashes
+ */
+
+ if (value === '/') {
+ // if the beginning of the glob is "./", advance the start
+ // to the current index, and don't add the "./" characters
+ // to the state. This greatly simplifies lookbehinds when
+ // checking for BOS characters like "!" and "." (not "./")
+ if (prev.type === 'dot' && state.index === state.start + 1) {
+ state.start = state.index + 1;
+ state.consumed = '';
+ state.output = '';
+ tokens.pop();
+ prev = bos; // reset "prev" to the first token
+ continue;
+ }
+
+ push({ type: 'slash', value, output: SLASH_LITERAL });
+ continue;
+ }
+
+ /**
+ * Dots
+ */
+
+ if (value === '.') {
+ if (state.braces > 0 && prev.type === 'dot') {
+ if (prev.value === '.') prev.output = DOT_LITERAL;
+ const brace = braces[braces.length - 1];
+ prev.type = 'dots';
+ prev.output += value;
+ prev.value += value;
+ brace.dots = true;
+ continue;
+ }
+
+ if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') {
+ push({ type: 'text', value, output: DOT_LITERAL });
+ continue;
+ }
+
+ push({ type: 'dot', value, output: DOT_LITERAL });
+ continue;
+ }
+
+ /**
+ * Question marks
+ */
+
+ if (value === '?') {
+ const isGroup = prev && prev.value === '(';
+ if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {
+ extglobOpen('qmark', value);
+ continue;
+ }
+
+ if (prev && prev.type === 'paren') {
+ const next = peek();
+ let output = value;
+
+ if (next === '<' && !utils$n.supportsLookbehinds()) {
+ throw new Error('Node.js v10 or higher is required for regex lookbehinds');
+ }
+
+ if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\w+>)/.test(remaining()))) {
+ output = `\\${value}`;
+ }
+
+ push({ type: 'text', value, output });
+ continue;
+ }
+
+ if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) {
+ push({ type: 'qmark', value, output: QMARK_NO_DOT });
+ continue;
+ }
+
+ push({ type: 'qmark', value, output: QMARK });
+ continue;
+ }
+
+ /**
+ * Exclamation
+ */
+
+ if (value === '!') {
+ if (opts.noextglob !== true && peek() === '(') {
+ if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) {
+ extglobOpen('negate', value);
+ continue;
+ }
+ }
+
+ if (opts.nonegate !== true && state.index === 0) {
+ negate();
+ continue;
+ }
+ }
+
+ /**
+ * Plus
+ */
+
+ if (value === '+') {
+ if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {
+ extglobOpen('plus', value);
+ continue;
+ }
+
+ if ((prev && prev.value === '(') || opts.regex === false) {
+ push({ type: 'plus', value, output: PLUS_LITERAL });
+ continue;
+ }
+
+ if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) {
+ push({ type: 'plus', value });
+ continue;
+ }
+
+ push({ type: 'plus', value: PLUS_LITERAL });
+ continue;
+ }
+
+ /**
+ * Plain text
+ */
+
+ if (value === '@') {
+ if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {
+ push({ type: 'at', extglob: true, value, output: '' });
+ continue;
+ }
+
+ push({ type: 'text', value });
+ continue;
+ }
+
+ /**
+ * Plain text
+ */
+
+ if (value !== '*') {
+ if (value === '$' || value === '^') {
+ value = `\\${value}`;
+ }
+
+ const match = REGEX_NON_SPECIAL_CHARS$1.exec(remaining());
+ if (match) {
+ value += match[0];
+ state.index += match[0].length;
+ }
+
+ push({ type: 'text', value });
+ continue;
+ }
+
+ /**
+ * Stars
+ */
+
+ if (prev && (prev.type === 'globstar' || prev.star === true)) {
+ prev.type = 'star';
+ prev.star = true;
+ prev.value += value;
+ prev.output = star;
+ state.backtrack = true;
+ state.globstar = true;
+ consume(value);
+ continue;
+ }
+
+ let rest = remaining();
+ if (opts.noextglob !== true && /^\([^?]/.test(rest)) {
+ extglobOpen('star', value);
+ continue;
+ }
+
+ if (prev.type === 'star') {
+ if (opts.noglobstar === true) {
+ consume(value);
+ continue;
+ }
+
+ const prior = prev.prev;
+ const before = prior.prev;
+ const isStart = prior.type === 'slash' || prior.type === 'bos';
+ const afterStar = before && (before.type === 'star' || before.type === 'globstar');
+
+ if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) {
+ push({ type: 'star', value, output: '' });
+ continue;
+ }
+
+ const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace');
+ const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren');
+ if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) {
+ push({ type: 'star', value, output: '' });
+ continue;
+ }
+
+ // strip consecutive `/**/`
+ while (rest.slice(0, 3) === '/**') {
+ const after = input[state.index + 4];
+ if (after && after !== '/') {
+ break;
+ }
+ rest = rest.slice(3);
+ consume('/**', 3);
+ }
+
+ if (prior.type === 'bos' && eos()) {
+ prev.type = 'globstar';
+ prev.value += value;
+ prev.output = globstar(opts);
+ state.output = prev.output;
+ state.globstar = true;
+ consume(value);
+ continue;
+ }
+
+ if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) {
+ state.output = state.output.slice(0, -(prior.output + prev.output).length);
+ prior.output = `(?:${prior.output}`;
+
+ prev.type = 'globstar';
+ prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)');
+ prev.value += value;
+ state.globstar = true;
+ state.output += prior.output + prev.output;
+ consume(value);
+ continue;
+ }
+
+ if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') {
+ const end = rest[1] !== void 0 ? '|$' : '';
+
+ state.output = state.output.slice(0, -(prior.output + prev.output).length);
+ prior.output = `(?:${prior.output}`;
+
+ prev.type = 'globstar';
+ prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`;
+ prev.value += value;
+
+ state.output += prior.output + prev.output;
+ state.globstar = true;
+
+ consume(value + advance());
+
+ push({ type: 'slash', value: '/', output: '' });
+ continue;
+ }
+
+ if (prior.type === 'bos' && rest[0] === '/') {
+ prev.type = 'globstar';
+ prev.value += value;
+ prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`;
+ state.output = prev.output;
+ state.globstar = true;
+ consume(value + advance());
+ push({ type: 'slash', value: '/', output: '' });
+ continue;
+ }
+
+ // remove single star from output
+ state.output = state.output.slice(0, -prev.output.length);
+
+ // reset previous token to globstar
+ prev.type = 'globstar';
+ prev.output = globstar(opts);
+ prev.value += value;
+
+ // reset output with globstar
+ state.output += prev.output;
+ state.globstar = true;
+ consume(value);
+ continue;
+ }
+
+ const token = { type: 'star', value, output: star };
+
+ if (opts.bash === true) {
+ token.output = '.*?';
+ if (prev.type === 'bos' || prev.type === 'slash') {
+ token.output = nodot + token.output;
+ }
+ push(token);
+ continue;
+ }
+
+ if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) {
+ token.output = value;
+ push(token);
+ continue;
+ }
+
+ if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') {
+ if (prev.type === 'dot') {
+ state.output += NO_DOT_SLASH;
+ prev.output += NO_DOT_SLASH;
+
+ } else if (opts.dot === true) {
+ state.output += NO_DOTS_SLASH;
+ prev.output += NO_DOTS_SLASH;
+
+ } else {
+ state.output += nodot;
+ prev.output += nodot;
+ }
+
+ if (peek() !== '*') {
+ state.output += ONE_CHAR;
+ prev.output += ONE_CHAR;
+ }
+ }
+
+ push(token);
+ }
+
+ while (state.brackets > 0) {
+ if (opts.strictBrackets === true) throw new SyntaxError(syntaxError$2('closing', ']'));
+ state.output = utils$n.escapeLast(state.output, '[');
+ decrement('brackets');
+ }
+
+ while (state.parens > 0) {
+ if (opts.strictBrackets === true) throw new SyntaxError(syntaxError$2('closing', ')'));
+ state.output = utils$n.escapeLast(state.output, '(');
+ decrement('parens');
+ }
+
+ while (state.braces > 0) {
+ if (opts.strictBrackets === true) throw new SyntaxError(syntaxError$2('closing', '}'));
+ state.output = utils$n.escapeLast(state.output, '{');
+ decrement('braces');
+ }
+
+ if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) {
+ push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` });
+ }
+
+ // rebuild the output if we had to backtrack at any point
+ if (state.backtrack === true) {
+ state.output = '';
+
+ for (const token of state.tokens) {
+ state.output += token.output != null ? token.output : token.value;
+
+ if (token.suffix) {
+ state.output += token.suffix;
+ }
+ }
+ }
+
+ return state;
+};
+
+/**
+ * Fast paths for creating regular expressions for common glob patterns.
+ * This can significantly speed up processing and has very little downside
+ * impact when none of the fast paths match.
+ */
+
+parse$n.fastpaths = (input, options) => {
+ const opts = { ...options };
+ const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH$2, opts.maxLength) : MAX_LENGTH$2;
+ const len = input.length;
+ if (len > max) {
+ throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);
+ }
+
+ input = REPLACEMENTS$1[input] || input;
+ const win32 = utils$n.isWindows(options);
+
+ // create constants based on platform, for windows or posix
+ const {
+ DOT_LITERAL,
+ SLASH_LITERAL,
+ ONE_CHAR,
+ DOTS_SLASH,
+ NO_DOT,
+ NO_DOTS,
+ NO_DOTS_SLASH,
+ STAR,
+ START_ANCHOR
+ } = constants$8.globChars(win32);
+
+ const nodot = opts.dot ? NO_DOTS : NO_DOT;
+ const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT;
+ const capture = opts.capture ? '' : '?:';
+ const state = { negated: false, prefix: '' };
+ let star = opts.bash === true ? '.*?' : STAR;
+
+ if (opts.capture) {
+ star = `(${star})`;
+ }
+
+ const globstar = opts => {
+ if (opts.noglobstar === true) return star;
+ return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;
+ };
+
+ const create = str => {
+ switch (str) {
+ case '*':
+ return `${nodot}${ONE_CHAR}${star}`;
+
+ case '.*':
+ return `${DOT_LITERAL}${ONE_CHAR}${star}`;
+
+ case '*.*':
+ return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;
+
+ case '*/*':
+ return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;
+
+ case '**':
+ return nodot + globstar(opts);
+
+ case '**/*':
+ return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;
+
+ case '**/*.*':
+ return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;
+
+ case '**/.*':
+ return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;
+
+ default: {
+ const match = /^(.*?)\.(\w+)$/.exec(str);
+ if (!match) return;
+
+ const source = create(match[1]);
+ if (!source) return;
+
+ return source + DOT_LITERAL + match[2];
+ }
+ }
+ };
+
+ const output = utils$n.removePrefix(input, state);
+ let source = create(output);
+
+ if (source && opts.strictSlashes !== true) {
+ source += `${SLASH_LITERAL}?`;
+ }
+
+ return source;
+};
+
+var parse_1$3 = parse$n;
+
+const path$o = path__default;
+const scan$2 = scan_1$1;
+const parse$m = parse_1$3;
+const utils$m = utils$p;
+const constants$7 = constants$9;
+const isObject$5 = val => val && typeof val === 'object' && !Array.isArray(val);
+
+/**
+ * Creates a matcher function from one or more glob patterns. The
+ * returned function takes a string to match as its first argument,
+ * and returns true if the string is a match. The returned matcher
+ * function also takes a boolean as the second argument that, when true,
+ * returns an object with additional information.
+ *
+ * ```js
+ * const picomatch = require('picomatch');
+ * // picomatch(glob[, options]);
+ *
+ * const isMatch = picomatch('*.!(*a)');
+ * console.log(isMatch('a.a')); //=> false
+ * console.log(isMatch('a.b')); //=> true
+ * ```
+ * @name picomatch
+ * @param {String|Array} `globs` One or more glob patterns.
+ * @param {Object=} `options`
+ * @return {Function=} Returns a matcher function.
+ * @api public
+ */
+
+const picomatch$7 = (glob, options, returnState = false) => {
+ if (Array.isArray(glob)) {
+ const fns = glob.map(input => picomatch$7(input, options, returnState));
+ const arrayMatcher = str => {
+ for (const isMatch of fns) {
+ const state = isMatch(str);
+ if (state) return state;
+ }
+ return false;
+ };
+ return arrayMatcher;
+ }
+
+ const isState = isObject$5(glob) && glob.tokens && glob.input;
+
+ if (glob === '' || (typeof glob !== 'string' && !isState)) {
+ throw new TypeError('Expected pattern to be a non-empty string');
+ }
+
+ const opts = options || {};
+ const posix = utils$m.isWindows(options);
+ const regex = isState
+ ? picomatch$7.compileRe(glob, options)
+ : picomatch$7.makeRe(glob, options, false, true);
+
+ const state = regex.state;
+ delete regex.state;
+
+ let isIgnored = () => false;
+ if (opts.ignore) {
+ const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null };
+ isIgnored = picomatch$7(opts.ignore, ignoreOpts, returnState);
+ }
+
+ const matcher = (input, returnObject = false) => {
+ const { isMatch, match, output } = picomatch$7.test(input, regex, options, { glob, posix });
+ const result = { glob, state, regex, posix, input, output, match, isMatch };
+
+ if (typeof opts.onResult === 'function') {
+ opts.onResult(result);
+ }
+
+ if (isMatch === false) {
+ result.isMatch = false;
+ return returnObject ? result : false;
+ }
+
+ if (isIgnored(input)) {
+ if (typeof opts.onIgnore === 'function') {
+ opts.onIgnore(result);
+ }
+ result.isMatch = false;
+ return returnObject ? result : false;
+ }
+
+ if (typeof opts.onMatch === 'function') {
+ opts.onMatch(result);
+ }
+ return returnObject ? result : true;
+ };
+
+ if (returnState) {
+ matcher.state = state;
+ }
+
+ return matcher;
+};
+
+/**
+ * Test `input` with the given `regex`. This is used by the main
+ * `picomatch()` function to test the input string.
+ *
+ * ```js
+ * const picomatch = require('picomatch');
+ * // picomatch.test(input, regex[, options]);
+ *
+ * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/));
+ * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }
+ * ```
+ * @param {String} `input` String to test.
+ * @param {RegExp} `regex`
+ * @return {Object} Returns an object with matching info.
+ * @api public
+ */
+
+picomatch$7.test = (input, regex, options, { glob, posix } = {}) => {
+ if (typeof input !== 'string') {
+ throw new TypeError('Expected input to be a string');
+ }
+
+ if (input === '') {
+ return { isMatch: false, output: '' };
+ }
+
+ const opts = options || {};
+ const format = opts.format || (posix ? utils$m.toPosixSlashes : null);
+ let match = input === glob;
+ let output = (match && format) ? format(input) : input;
+
+ if (match === false) {
+ output = format ? format(input) : input;
+ match = output === glob;
+ }
+
+ if (match === false || opts.capture === true) {
+ if (opts.matchBase === true || opts.basename === true) {
+ match = picomatch$7.matchBase(input, regex, options, posix);
+ } else {
+ match = regex.exec(output);
+ }
+ }
+
+ return { isMatch: Boolean(match), match, output };
+};
+
+/**
+ * Match the basename of a filepath.
+ *
+ * ```js
+ * const picomatch = require('picomatch');
+ * // picomatch.matchBase(input, glob[, options]);
+ * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true
+ * ```
+ * @param {String} `input` String to test.
+ * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe).
+ * @return {Boolean}
+ * @api public
+ */
+
+picomatch$7.matchBase = (input, glob, options, posix = utils$m.isWindows(options)) => {
+ const regex = glob instanceof RegExp ? glob : picomatch$7.makeRe(glob, options);
+ return regex.test(path$o.basename(input));
+};
+
+/**
+ * Returns true if **any** of the given glob `patterns` match the specified `string`.
+ *
+ * ```js
+ * const picomatch = require('picomatch');
+ * // picomatch.isMatch(string, patterns[, options]);
+ *
+ * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true
+ * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false
+ * ```
+ * @param {String|Array} str The string to test.
+ * @param {String|Array} patterns One or more glob patterns to use for matching.
+ * @param {Object} [options] See available [options](#options).
+ * @return {Boolean} Returns true if any patterns match `str`
+ * @api public
+ */
+
+picomatch$7.isMatch = (str, patterns, options) => picomatch$7(patterns, options)(str);
+
+/**
+ * Parse a glob pattern to create the source string for a regular
+ * expression.
+ *
+ * ```js
+ * const picomatch = require('picomatch');
+ * const result = picomatch.parse(pattern[, options]);
+ * ```
+ * @param {String} `pattern`
+ * @param {Object} `options`
+ * @return {Object} Returns an object with useful properties and output to be used as a regex source string.
+ * @api public
+ */
+
+picomatch$7.parse = (pattern, options) => {
+ if (Array.isArray(pattern)) return pattern.map(p => picomatch$7.parse(p, options));
+ return parse$m(pattern, { ...options, fastpaths: false });
+};
+
+/**
+ * Scan a glob pattern to separate the pattern into segments.
+ *
+ * ```js
+ * const picomatch = require('picomatch');
+ * // picomatch.scan(input[, options]);
+ *
+ * const result = picomatch.scan('!./foo/*.js');
+ * console.log(result);
+ * { prefix: '!./',
+ * input: '!./foo/*.js',
+ * start: 3,
+ * base: 'foo',
+ * glob: '*.js',
+ * isBrace: false,
+ * isBracket: false,
+ * isGlob: true,
+ * isExtglob: false,
+ * isGlobstar: false,
+ * negated: true }
+ * ```
+ * @param {String} `input` Glob pattern to scan.
+ * @param {Object} `options`
+ * @return {Object} Returns an object with
+ * @api public
+ */
+
+picomatch$7.scan = (input, options) => scan$2(input, options);
+
+/**
+ * Compile a regular expression from the `state` object returned by the
+ * [parse()](#parse) method.
+ *
+ * @param {Object} `state`
+ * @param {Object} `options`
+ * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser.
+ * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.
+ * @return {RegExp}
+ * @api public
+ */
+
+picomatch$7.compileRe = (state, options, returnOutput = false, returnState = false) => {
+ if (returnOutput === true) {
+ return state.output;
+ }
+
+ const opts = options || {};
+ const prepend = opts.contains ? '' : '^';
+ const append = opts.contains ? '' : '$';
+
+ let source = `${prepend}(?:${state.output})${append}`;
+ if (state && state.negated === true) {
+ source = `^(?!${source}).*$`;
+ }
+
+ const regex = picomatch$7.toRegex(source, options);
+ if (returnState === true) {
+ regex.state = state;
+ }
+
+ return regex;
+};
+
+/**
+ * Create a regular expression from a parsed glob pattern.
+ *
+ * ```js
+ * const picomatch = require('picomatch');
+ * const state = picomatch.parse('*.js');
+ * // picomatch.compileRe(state[, options]);
+ *
+ * console.log(picomatch.compileRe(state));
+ * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/
+ * ```
+ * @param {String} `state` The object returned from the `.parse` method.
+ * @param {Object} `options`
+ * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.
+ * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression.
+ * @return {RegExp} Returns a regex created from the given pattern.
+ * @api public
+ */
+
+picomatch$7.makeRe = (input, options = {}, returnOutput = false, returnState = false) => {
+ if (!input || typeof input !== 'string') {
+ throw new TypeError('Expected a non-empty string');
+ }
+
+ let parsed = { negated: false, fastpaths: true };
+
+ if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) {
+ parsed.output = parse$m.fastpaths(input, options);
+ }
+
+ if (!parsed.output) {
+ parsed = parse$m(input, options);
+ }
+
+ return picomatch$7.compileRe(parsed, options, returnOutput, returnState);
+};
+
+/**
+ * Create a regular expression from the given regex source string.
+ *
+ * ```js
+ * const picomatch = require('picomatch');
+ * // picomatch.toRegex(source[, options]);
+ *
+ * const { output } = picomatch.parse('*.js');
+ * console.log(picomatch.toRegex(output));
+ * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/
+ * ```
+ * @param {String} `source` Regular expression source string.
+ * @param {Object} `options`
+ * @return {RegExp}
+ * @api public
+ */
+
+picomatch$7.toRegex = (source, options) => {
+ try {
+ const opts = options || {};
+ return new RegExp(source, opts.flags || (opts.nocase ? 'i' : ''));
+ } catch (err) {
+ if (options && options.debug === true) throw err;
+ return /$^/;
+ }
+};
+
+/**
+ * Picomatch constants.
+ * @return {Object}
+ */
+
+picomatch$7.constants = constants$7;
+
+/**
+ * Expose "picomatch"
+ */
+
+var picomatch_1$1 = picomatch$7;
+
+var picomatch$6 = picomatch_1$1;
+
+// Helper since Typescript can't detect readonly arrays with Array.isArray
+function isArray$3(arg) {
+ return Array.isArray(arg);
+}
+function ensureArray$1(thing) {
+ if (isArray$3(thing))
+ return thing;
+ if (thing == null)
+ return [];
+ return [thing];
+}
+
+const normalizePath$5 = function normalizePath(filename) {
+ return filename.split(path$r.win32.sep).join(path$r.posix.sep);
+};
+
+function getMatcherString$1(id, resolutionBase) {
+ if (resolutionBase === false || path$r.isAbsolute(id) || id.startsWith('*')) {
+ return normalizePath$5(id);
+ }
+ // resolve('') is valid and will default to process.cwd()
+ const basePath = normalizePath$5(path$r.resolve(resolutionBase || ''))
+ // escape all possible (posix + win) path characters that might interfere with regex
+ .replace(/[-^$*+?.()|[\]{}]/g, '\\$&');
+ // Note that we use posix.join because:
+ // 1. the basePath has been normalized to use /
+ // 2. the incoming glob (id) matcher, also uses /
+ // otherwise Node will force backslash (\) on windows
+ return path$r.posix.join(basePath, normalizePath$5(id));
+}
+const createFilter$1 = function createFilter(include, exclude, options) {
+ const resolutionBase = options && options.resolve;
+ const getMatcher = (id) => id instanceof RegExp
+ ? id
+ : {
+ test: (what) => {
+ // this refactor is a tad overly verbose but makes for easy debugging
+ const pattern = getMatcherString$1(id, resolutionBase);
+ const fn = picomatch$6(pattern, { dot: true });
+ const result = fn(what);
+ return result;
+ }
+ };
+ const includeMatchers = ensureArray$1(include).map(getMatcher);
+ const excludeMatchers = ensureArray$1(exclude).map(getMatcher);
+ return function result(id) {
+ if (typeof id !== 'string')
+ return false;
+ if (/\0/.test(id))
+ return false;
+ const pathId = normalizePath$5(id);
+ for (let i = 0; i < excludeMatchers.length; ++i) {
+ const matcher = excludeMatchers[i];
+ if (matcher.test(pathId))
+ return false;
+ }
+ for (let i = 0; i < includeMatchers.length; ++i) {
+ const matcher = includeMatchers[i];
+ if (matcher.test(pathId))
+ return true;
+ }
+ return !includeMatchers.length;
+ };
+};
+
+const reservedWords$2 = 'break case class catch const continue debugger default delete do else export extends finally for function if import in instanceof let new return super switch this throw try typeof var void while with yield enum await implements package protected static interface private public';
+const builtins$2 = 'arguments Infinity NaN undefined null true false eval uneval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Symbol Error EvalError InternalError RangeError ReferenceError SyntaxError TypeError URIError Number Math Date String RegExp Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array Map Set WeakMap WeakSet SIMD ArrayBuffer DataView JSON Promise Generator GeneratorFunction Reflect Proxy Intl';
+const forbiddenIdentifiers$1 = new Set(`${reservedWords$2} ${builtins$2}`.split(' '));
+forbiddenIdentifiers$1.add('');
+const makeLegalIdentifier$1 = function makeLegalIdentifier(str) {
+ let identifier = str
+ .replace(/-(\w)/g, (_, letter) => letter.toUpperCase())
+ .replace(/[^$_a-zA-Z0-9]/g, '_');
+ if (/\d/.test(identifier[0]) || forbiddenIdentifiers$1.has(identifier)) {
+ identifier = `_${identifier}`;
+ }
+ return identifier || '_';
+};
+
+function stringify$8(obj) {
+ return (JSON.stringify(obj) || 'undefined').replace(/[\u2028\u2029]/g, (char) => `\\u${`000${char.charCodeAt(0).toString(16)}`.slice(-4)}`);
+}
+function serializeArray(arr, indent, baseIndent) {
+ let output = '[';
+ const separator = indent ? `\n${baseIndent}${indent}` : '';
+ for (let i = 0; i < arr.length; i++) {
+ const key = arr[i];
+ output += `${i > 0 ? ',' : ''}${separator}${serialize(key, indent, baseIndent + indent)}`;
+ }
+ return `${output}${indent ? `\n${baseIndent}` : ''}]`;
+}
+function serializeObject(obj, indent, baseIndent) {
+ let output = '{';
+ const separator = indent ? `\n${baseIndent}${indent}` : '';
+ const entries = Object.entries(obj);
+ for (let i = 0; i < entries.length; i++) {
+ const [key, value] = entries[i];
+ const stringKey = makeLegalIdentifier$1(key) === key ? key : stringify$8(key);
+ output += `${i > 0 ? ',' : ''}${separator}${stringKey}:${indent ? ' ' : ''}${serialize(value, indent, baseIndent + indent)}`;
+ }
+ return `${output}${indent ? `\n${baseIndent}` : ''}}`;
+}
+function serialize(obj, indent, baseIndent) {
+ if (typeof obj === 'object' && obj !== null) {
+ if (Array.isArray(obj))
+ return serializeArray(obj, indent, baseIndent);
+ if (obj instanceof Date)
+ return `new Date(${obj.getTime()})`;
+ if (obj instanceof RegExp)
+ return obj.toString();
+ return serializeObject(obj, indent, baseIndent);
+ }
+ if (typeof obj === 'number') {
+ if (obj === Infinity)
+ return 'Infinity';
+ if (obj === -Infinity)
+ return '-Infinity';
+ if (obj === 0)
+ return 1 / obj === Infinity ? '0' : '-0';
+ if (obj !== obj)
+ return 'NaN'; // eslint-disable-line no-self-compare
+ }
+ if (typeof obj === 'symbol') {
+ const key = Symbol.keyFor(obj);
+ if (key !== undefined)
+ return `Symbol.for(${stringify$8(key)})`;
+ }
+ if (typeof obj === 'bigint')
+ return `${obj}n`;
+ return stringify$8(obj);
+}
+const dataToEsm = function dataToEsm(data, options = {}) {
+ const t = options.compact ? '' : 'indent' in options ? options.indent : '\t';
+ const _ = options.compact ? '' : ' ';
+ const n = options.compact ? '' : '\n';
+ const declarationType = options.preferConst ? 'const' : 'var';
+ if (options.namedExports === false ||
+ typeof data !== 'object' ||
+ Array.isArray(data) ||
+ data instanceof Date ||
+ data instanceof RegExp ||
+ data === null) {
+ const code = serialize(data, options.compact ? null : t, '');
+ const magic = _ || (/^[{[\-\/]/.test(code) ? '' : ' '); // eslint-disable-line no-useless-escape
+ return `export default${magic}${code};`;
+ }
+ let namedExportCode = '';
+ const defaultExportRows = [];
+ for (const [key, value] of Object.entries(data)) {
+ if (key === makeLegalIdentifier$1(key)) {
+ if (options.objectShorthand)
+ defaultExportRows.push(key);
+ else
+ defaultExportRows.push(`${key}:${_}${key}`);
+ namedExportCode += `export ${declarationType} ${key}${_}=${_}${serialize(value, options.compact ? null : t, '')};${n}`;
+ }
+ else {
+ defaultExportRows.push(`${stringify$8(key)}:${_}${serialize(value, options.compact ? null : t, '')}`);
+ }
+ }
+ return `${namedExportCode}export default${_}{${n}${t}${defaultExportRows.join(`,${n}${t}`)}${n}};${n}`;
+};
+
+function matches(pattern, importee) {
+ if (pattern instanceof RegExp) {
+ return pattern.test(importee);
+ }
+ if (importee.length < pattern.length) {
+ return false;
+ }
+ if (importee === pattern) {
+ return true;
+ }
+ // eslint-disable-next-line prefer-template
+ return importee.startsWith(pattern + '/');
+}
+function getEntries({ entries, customResolver }) {
+ if (!entries) {
+ return [];
+ }
+ const resolverFunctionFromOptions = resolveCustomResolver(customResolver);
+ if (Array.isArray(entries)) {
+ return entries.map((entry) => {
+ return {
+ find: entry.find,
+ replacement: entry.replacement,
+ resolverFunction: resolveCustomResolver(entry.customResolver) || resolverFunctionFromOptions
+ };
+ });
+ }
+ return Object.entries(entries).map(([key, value]) => {
+ return { find: key, replacement: value, resolverFunction: resolverFunctionFromOptions };
+ });
+}
+function resolveCustomResolver(customResolver) {
+ if (customResolver) {
+ if (typeof customResolver === 'function') {
+ return customResolver;
+ }
+ if (typeof customResolver.resolveId === 'function') {
+ return customResolver.resolveId;
+ }
+ }
+ return null;
+}
+function alias$1(options = {}) {
+ const entries = getEntries(options);
+ if (entries.length === 0) {
+ return {
+ name: 'alias',
+ resolveId: () => null
+ };
+ }
+ return {
+ name: 'alias',
+ async buildStart(inputOptions) {
+ await Promise.all([...(Array.isArray(options.entries) ? options.entries : []), options].map(({ customResolver }) => customResolver &&
+ typeof customResolver === 'object' &&
+ typeof customResolver.buildStart === 'function' &&
+ customResolver.buildStart.call(this, inputOptions)));
+ },
+ resolveId(importee, importer, resolveOptions) {
+ if (!importer) {
+ return null;
+ }
+ // First match is supposed to be the correct one
+ const matchedEntry = entries.find((entry) => matches(entry.find, importee));
+ if (!matchedEntry) {
+ return null;
+ }
+ const updatedId = importee.replace(matchedEntry.find, matchedEntry.replacement);
+ if (matchedEntry.resolverFunction) {
+ return matchedEntry.resolverFunction.call(this, updatedId, importer, resolveOptions);
+ }
+ return this.resolve(updatedId, importer, Object.assign({ skipSelf: true }, resolveOptions)).then((resolved) => resolved || { id: updatedId });
+ }
+ };
+}
+
+var utils$l = {};
+
+const path$n = path__default;
+const WIN_SLASH = '\\\\/';
+const WIN_NO_SLASH = `[^${WIN_SLASH}]`;
+
+/**
+ * Posix glob regex
+ */
+
+const DOT_LITERAL = '\\.';
+const PLUS_LITERAL = '\\+';
+const QMARK_LITERAL = '\\?';
+const SLASH_LITERAL = '\\/';
+const ONE_CHAR = '(?=.)';
+const QMARK = '[^/]';
+const END_ANCHOR = `(?:${SLASH_LITERAL}|$)`;
+const START_ANCHOR = `(?:^|${SLASH_LITERAL})`;
+const DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`;
+const NO_DOT = `(?!${DOT_LITERAL})`;
+const NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`;
+const NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`;
+const NO_DOTS_SLASH = `(?!${DOTS_SLASH})`;
+const QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`;
+const STAR$1 = `${QMARK}*?`;
+
+const POSIX_CHARS = {
+ DOT_LITERAL,
+ PLUS_LITERAL,
+ QMARK_LITERAL,
+ SLASH_LITERAL,
+ ONE_CHAR,
+ QMARK,
+ END_ANCHOR,
+ DOTS_SLASH,
+ NO_DOT,
+ NO_DOTS,
+ NO_DOT_SLASH,
+ NO_DOTS_SLASH,
+ QMARK_NO_DOT,
+ STAR: STAR$1,
+ START_ANCHOR
+};
+
+/**
+ * Windows glob regex
+ */
+
+const WINDOWS_CHARS = {
+ ...POSIX_CHARS,
+
+ SLASH_LITERAL: `[${WIN_SLASH}]`,
+ QMARK: WIN_NO_SLASH,
+ STAR: `${WIN_NO_SLASH}*?`,
+ DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`,
+ NO_DOT: `(?!${DOT_LITERAL})`,
+ NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,
+ NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`,
+ NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,
+ QMARK_NO_DOT: `[^.${WIN_SLASH}]`,
+ START_ANCHOR: `(?:^|[${WIN_SLASH}])`,
+ END_ANCHOR: `(?:[${WIN_SLASH}]|$)`
+};
+
+/**
+ * POSIX Bracket Regex
+ */
+
+const POSIX_REGEX_SOURCE$1 = {
+ alnum: 'a-zA-Z0-9',
+ alpha: 'a-zA-Z',
+ ascii: '\\x00-\\x7F',
+ blank: ' \\t',
+ cntrl: '\\x00-\\x1F\\x7F',
+ digit: '0-9',
+ graph: '\\x21-\\x7E',
+ lower: 'a-z',
+ print: '\\x20-\\x7E ',
+ punct: '\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~',
+ space: ' \\t\\r\\n\\v\\f',
+ upper: 'A-Z',
+ word: 'A-Za-z0-9_',
+ xdigit: 'A-Fa-f0-9'
+};
+
+var constants$6 = {
+ MAX_LENGTH: 1024 * 64,
+ POSIX_REGEX_SOURCE: POSIX_REGEX_SOURCE$1,
+
+ // regular expressions
+ REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g,
+ REGEX_NON_SPECIAL_CHARS: /^[^@![\].,$*+?^{}()|\\/]+/,
+ REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/,
+ REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g,
+ REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g,
+ REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g,
+
+ // Replace globs with equivalent patterns to reduce parsing time.
+ REPLACEMENTS: {
+ '***': '*',
+ '**/**': '**',
+ '**/**/**': '**'
+ },
+
+ // Digits
+ CHAR_0: 48, /* 0 */
+ CHAR_9: 57, /* 9 */
+
+ // Alphabet chars.
+ CHAR_UPPERCASE_A: 65, /* A */
+ CHAR_LOWERCASE_A: 97, /* a */
+ CHAR_UPPERCASE_Z: 90, /* Z */
+ CHAR_LOWERCASE_Z: 122, /* z */
+
+ CHAR_LEFT_PARENTHESES: 40, /* ( */
+ CHAR_RIGHT_PARENTHESES: 41, /* ) */
+
+ CHAR_ASTERISK: 42, /* * */
+
+ // Non-alphabetic chars.
+ CHAR_AMPERSAND: 38, /* & */
+ CHAR_AT: 64, /* @ */
+ CHAR_BACKWARD_SLASH: 92, /* \ */
+ CHAR_CARRIAGE_RETURN: 13, /* \r */
+ CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */
+ CHAR_COLON: 58, /* : */
+ CHAR_COMMA: 44, /* , */
+ CHAR_DOT: 46, /* . */
+ CHAR_DOUBLE_QUOTE: 34, /* " */
+ CHAR_EQUAL: 61, /* = */
+ CHAR_EXCLAMATION_MARK: 33, /* ! */
+ CHAR_FORM_FEED: 12, /* \f */
+ CHAR_FORWARD_SLASH: 47, /* / */
+ CHAR_GRAVE_ACCENT: 96, /* ` */
+ CHAR_HASH: 35, /* # */
+ CHAR_HYPHEN_MINUS: 45, /* - */
+ CHAR_LEFT_ANGLE_BRACKET: 60, /* < */
+ CHAR_LEFT_CURLY_BRACE: 123, /* { */
+ CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */
+ CHAR_LINE_FEED: 10, /* \n */
+ CHAR_NO_BREAK_SPACE: 160, /* \u00A0 */
+ CHAR_PERCENT: 37, /* % */
+ CHAR_PLUS: 43, /* + */
+ CHAR_QUESTION_MARK: 63, /* ? */
+ CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */
+ CHAR_RIGHT_CURLY_BRACE: 125, /* } */
+ CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */
+ CHAR_SEMICOLON: 59, /* ; */
+ CHAR_SINGLE_QUOTE: 39, /* ' */
+ CHAR_SPACE: 32, /* */
+ CHAR_TAB: 9, /* \t */
+ CHAR_UNDERSCORE: 95, /* _ */
+ CHAR_VERTICAL_LINE: 124, /* | */
+ CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \uFEFF */
+
+ SEP: path$n.sep,
+
+ /**
+ * Create EXTGLOB_CHARS
+ */
+
+ extglobChars(chars) {
+ return {
+ '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` },
+ '?': { type: 'qmark', open: '(?:', close: ')?' },
+ '+': { type: 'plus', open: '(?:', close: ')+' },
+ '*': { type: 'star', open: '(?:', close: ')*' },
+ '@': { type: 'at', open: '(?:', close: ')' }
+ };
+ },
+
+ /**
+ * Create GLOB_CHARS
+ */
+
+ globChars(win32) {
+ return win32 === true ? WINDOWS_CHARS : POSIX_CHARS;
+ }
+};
+
+(function (exports) {
+
+const path = path__default;
+const win32 = process.platform === 'win32';
+const {
+ REGEX_BACKSLASH,
+ REGEX_REMOVE_BACKSLASH,
+ REGEX_SPECIAL_CHARS,
+ REGEX_SPECIAL_CHARS_GLOBAL
+} = constants$6;
+
+exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);
+exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);
+exports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str);
+exports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\$1');
+exports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/');
+
+exports.removeBackslashes = str => {
+ return str.replace(REGEX_REMOVE_BACKSLASH, match => {
+ return match === '\\' ? '' : match;
+ });
+};
+
+exports.supportsLookbehinds = () => {
+ const segs = process.version.slice(1).split('.').map(Number);
+ if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) {
+ return true;
+ }
+ return false;
+};
+
+exports.isWindows = options => {
+ if (options && typeof options.windows === 'boolean') {
+ return options.windows;
+ }
+ return win32 === true || path.sep === '\\';
+};
+
+exports.escapeLast = (input, char, lastIdx) => {
+ const idx = input.lastIndexOf(char, lastIdx);
+ if (idx === -1) return input;
+ if (input[idx - 1] === '\\') return exports.escapeLast(input, char, idx - 1);
+ return `${input.slice(0, idx)}\\${input.slice(idx)}`;
+};
+
+exports.removePrefix = (input, state = {}) => {
+ let output = input;
+ if (output.startsWith('./')) {
+ output = output.slice(2);
+ state.prefix = './';
+ }
+ return output;
+};
+
+exports.wrapOutput = (input, state = {}, options = {}) => {
+ const prepend = options.contains ? '' : '^';
+ const append = options.contains ? '' : '$';
+
+ let output = `${prepend}(?:${input})${append}`;
+ if (state.negated === true) {
+ output = `(?:^(?!${output}).*$)`;
+ }
+ return output;
+};
+}(utils$l));
+
+const utils$k = utils$l;
+const {
+ CHAR_ASTERISK, /* * */
+ CHAR_AT, /* @ */
+ CHAR_BACKWARD_SLASH, /* \ */
+ CHAR_COMMA: CHAR_COMMA$1, /* , */
+ CHAR_DOT: CHAR_DOT$1, /* . */
+ CHAR_EXCLAMATION_MARK, /* ! */
+ CHAR_FORWARD_SLASH, /* / */
+ CHAR_LEFT_CURLY_BRACE: CHAR_LEFT_CURLY_BRACE$1, /* { */
+ CHAR_LEFT_PARENTHESES: CHAR_LEFT_PARENTHESES$1, /* ( */
+ CHAR_LEFT_SQUARE_BRACKET: CHAR_LEFT_SQUARE_BRACKET$1, /* [ */
+ CHAR_PLUS, /* + */
+ CHAR_QUESTION_MARK, /* ? */
+ CHAR_RIGHT_CURLY_BRACE: CHAR_RIGHT_CURLY_BRACE$1, /* } */
+ CHAR_RIGHT_PARENTHESES: CHAR_RIGHT_PARENTHESES$1, /* ) */
+ CHAR_RIGHT_SQUARE_BRACKET: CHAR_RIGHT_SQUARE_BRACKET$1 /* ] */
+} = constants$6;
+
+const isPathSeparator = code => {
+ return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;
+};
+
+const depth = token => {
+ if (token.isPrefix !== true) {
+ token.depth = token.isGlobstar ? Infinity : 1;
+ }
+};
+
+/**
+ * Quickly scans a glob pattern and returns an object with a handful of
+ * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),
+ * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not
+ * with `!(`) and `negatedExtglob` (true if the path starts with `!(`).
+ *
+ * ```js
+ * const pm = require('picomatch');
+ * console.log(pm.scan('foo/bar/*.js'));
+ * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }
+ * ```
+ * @param {String} `str`
+ * @param {Object} `options`
+ * @return {Object} Returns an object with tokens and regex source string.
+ * @api public
+ */
+
+const scan$1 = (input, options) => {
+ const opts = options || {};
+
+ const length = input.length - 1;
+ const scanToEnd = opts.parts === true || opts.scanToEnd === true;
+ const slashes = [];
+ const tokens = [];
+ const parts = [];
+
+ let str = input;
+ let index = -1;
+ let start = 0;
+ let lastIndex = 0;
+ let isBrace = false;
+ let isBracket = false;
+ let isGlob = false;
+ let isExtglob = false;
+ let isGlobstar = false;
+ let braceEscaped = false;
+ let backslashes = false;
+ let negated = false;
+ let negatedExtglob = false;
+ let finished = false;
+ let braces = 0;
+ let prev;
+ let code;
+ let token = { value: '', depth: 0, isGlob: false };
+
+ const eos = () => index >= length;
+ const peek = () => str.charCodeAt(index + 1);
+ const advance = () => {
+ prev = code;
+ return str.charCodeAt(++index);
+ };
+
+ while (index < length) {
+ code = advance();
+ let next;
+
+ if (code === CHAR_BACKWARD_SLASH) {
+ backslashes = token.backslashes = true;
+ code = advance();
+
+ if (code === CHAR_LEFT_CURLY_BRACE$1) {
+ braceEscaped = true;
+ }
+ continue;
+ }
+
+ if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE$1) {
+ braces++;
+
+ while (eos() !== true && (code = advance())) {
+ if (code === CHAR_BACKWARD_SLASH) {
+ backslashes = token.backslashes = true;
+ advance();
+ continue;
+ }
+
+ if (code === CHAR_LEFT_CURLY_BRACE$1) {
+ braces++;
+ continue;
+ }
+
+ if (braceEscaped !== true && code === CHAR_DOT$1 && (code = advance()) === CHAR_DOT$1) {
+ isBrace = token.isBrace = true;
+ isGlob = token.isGlob = true;
+ finished = true;
+
+ if (scanToEnd === true) {
+ continue;
+ }
+
+ break;
+ }
+
+ if (braceEscaped !== true && code === CHAR_COMMA$1) {
+ isBrace = token.isBrace = true;
+ isGlob = token.isGlob = true;
+ finished = true;
+
+ if (scanToEnd === true) {
+ continue;
+ }
+
+ break;
+ }
+
+ if (code === CHAR_RIGHT_CURLY_BRACE$1) {
+ braces--;
+
+ if (braces === 0) {
+ braceEscaped = false;
+ isBrace = token.isBrace = true;
+ finished = true;
+ break;
+ }
+ }
+ }
+
+ if (scanToEnd === true) {
+ continue;
+ }
+
+ break;
+ }
+
+ if (code === CHAR_FORWARD_SLASH) {
+ slashes.push(index);
+ tokens.push(token);
+ token = { value: '', depth: 0, isGlob: false };
+
+ if (finished === true) continue;
+ if (prev === CHAR_DOT$1 && index === (start + 1)) {
+ start += 2;
+ continue;
+ }
+
+ lastIndex = index + 1;
+ continue;
+ }
+
+ if (opts.noext !== true) {
+ const isExtglobChar = code === CHAR_PLUS
+ || code === CHAR_AT
+ || code === CHAR_ASTERISK
+ || code === CHAR_QUESTION_MARK
+ || code === CHAR_EXCLAMATION_MARK;
+
+ if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES$1) {
+ isGlob = token.isGlob = true;
+ isExtglob = token.isExtglob = true;
+ finished = true;
+ if (code === CHAR_EXCLAMATION_MARK && index === start) {
+ negatedExtglob = true;
+ }
+
+ if (scanToEnd === true) {
+ while (eos() !== true && (code = advance())) {
+ if (code === CHAR_BACKWARD_SLASH) {
+ backslashes = token.backslashes = true;
+ code = advance();
+ continue;
+ }
+
+ if (code === CHAR_RIGHT_PARENTHESES$1) {
+ isGlob = token.isGlob = true;
+ finished = true;
+ break;
+ }
+ }
+ continue;
+ }
+ break;
+ }
+ }
+
+ if (code === CHAR_ASTERISK) {
+ if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;
+ isGlob = token.isGlob = true;
+ finished = true;
+
+ if (scanToEnd === true) {
+ continue;
+ }
+ break;
+ }
+
+ if (code === CHAR_QUESTION_MARK) {
+ isGlob = token.isGlob = true;
+ finished = true;
+
+ if (scanToEnd === true) {
+ continue;
+ }
+ break;
+ }
+
+ if (code === CHAR_LEFT_SQUARE_BRACKET$1) {
+ while (eos() !== true && (next = advance())) {
+ if (next === CHAR_BACKWARD_SLASH) {
+ backslashes = token.backslashes = true;
+ advance();
+ continue;
+ }
+
+ if (next === CHAR_RIGHT_SQUARE_BRACKET$1) {
+ isBracket = token.isBracket = true;
+ isGlob = token.isGlob = true;
+ finished = true;
+ break;
+ }
+ }
+
+ if (scanToEnd === true) {
+ continue;
+ }
+
+ break;
+ }
+
+ if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {
+ negated = token.negated = true;
+ start++;
+ continue;
+ }
+
+ if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES$1) {
+ isGlob = token.isGlob = true;
+
+ if (scanToEnd === true) {
+ while (eos() !== true && (code = advance())) {
+ if (code === CHAR_LEFT_PARENTHESES$1) {
+ backslashes = token.backslashes = true;
+ code = advance();
+ continue;
+ }
+
+ if (code === CHAR_RIGHT_PARENTHESES$1) {
+ finished = true;
+ break;
+ }
+ }
+ continue;
+ }
+ break;
+ }
+
+ if (isGlob === true) {
+ finished = true;
+
+ if (scanToEnd === true) {
+ continue;
+ }
+
+ break;
+ }
+ }
+
+ if (opts.noext === true) {
+ isExtglob = false;
+ isGlob = false;
+ }
+
+ let base = str;
+ let prefix = '';
+ let glob = '';
+
+ if (start > 0) {
+ prefix = str.slice(0, start);
+ str = str.slice(start);
+ lastIndex -= start;
+ }
+
+ if (base && isGlob === true && lastIndex > 0) {
+ base = str.slice(0, lastIndex);
+ glob = str.slice(lastIndex);
+ } else if (isGlob === true) {
+ base = '';
+ glob = str;
+ } else {
+ base = str;
+ }
+
+ if (base && base !== '' && base !== '/' && base !== str) {
+ if (isPathSeparator(base.charCodeAt(base.length - 1))) {
+ base = base.slice(0, -1);
+ }
+ }
+
+ if (opts.unescape === true) {
+ if (glob) glob = utils$k.removeBackslashes(glob);
+
+ if (base && backslashes === true) {
+ base = utils$k.removeBackslashes(base);
+ }
+ }
+
+ const state = {
+ prefix,
+ input,
+ start,
+ base,
+ glob,
+ isBrace,
+ isBracket,
+ isGlob,
+ isExtglob,
+ isGlobstar,
+ negated,
+ negatedExtglob
+ };
+
+ if (opts.tokens === true) {
+ state.maxDepth = 0;
+ if (!isPathSeparator(code)) {
+ tokens.push(token);
+ }
+ state.tokens = tokens;
+ }
+
+ if (opts.parts === true || opts.tokens === true) {
+ let prevIndex;
+
+ for (let idx = 0; idx < slashes.length; idx++) {
+ const n = prevIndex ? prevIndex + 1 : start;
+ const i = slashes[idx];
+ const value = input.slice(n, i);
+ if (opts.tokens) {
+ if (idx === 0 && start !== 0) {
+ tokens[idx].isPrefix = true;
+ tokens[idx].value = prefix;
+ } else {
+ tokens[idx].value = value;
+ }
+ depth(tokens[idx]);
+ state.maxDepth += tokens[idx].depth;
+ }
+ if (idx !== 0 || value !== '') {
+ parts.push(value);
+ }
+ prevIndex = i;
+ }
+
+ if (prevIndex && prevIndex + 1 < input.length) {
+ const value = input.slice(prevIndex + 1);
+ parts.push(value);
+
+ if (opts.tokens) {
+ tokens[tokens.length - 1].value = value;
+ depth(tokens[tokens.length - 1]);
+ state.maxDepth += tokens[tokens.length - 1].depth;
+ }
+ }
+
+ state.slashes = slashes;
+ state.parts = parts;
+ }
+
+ return state;
+};
+
+var scan_1 = scan$1;
+
+const constants$5 = constants$6;
+const utils$j = utils$l;
+
+/**
+ * Constants
+ */
+
+const {
+ MAX_LENGTH: MAX_LENGTH$1,
+ POSIX_REGEX_SOURCE,
+ REGEX_NON_SPECIAL_CHARS,
+ REGEX_SPECIAL_CHARS_BACKREF,
+ REPLACEMENTS
+} = constants$5;
+
+/**
+ * Helpers
+ */
+
+const expandRange = (args, options) => {
+ if (typeof options.expandRange === 'function') {
+ return options.expandRange(...args, options);
+ }
+
+ args.sort();
+ const value = `[${args.join('-')}]`;
+
+ return value;
+};
+
+/**
+ * Create the message for a syntax error
+ */
+
+const syntaxError$1 = (type, char) => {
+ return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`;
+};
+
+/**
+ * Parse the given input string.
+ * @param {String} input
+ * @param {Object} options
+ * @return {Object}
+ */
+
+const parse$l = (input, options) => {
+ if (typeof input !== 'string') {
+ throw new TypeError('Expected a string');
+ }
+
+ input = REPLACEMENTS[input] || input;
+
+ const opts = { ...options };
+ const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH$1, opts.maxLength) : MAX_LENGTH$1;
+
+ let len = input.length;
+ if (len > max) {
+ throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);
+ }
+
+ const bos = { type: 'bos', value: '', output: opts.prepend || '' };
+ const tokens = [bos];
+
+ const capture = opts.capture ? '' : '?:';
+ const win32 = utils$j.isWindows(options);
+
+ // create constants based on platform, for windows or posix
+ const PLATFORM_CHARS = constants$5.globChars(win32);
+ const EXTGLOB_CHARS = constants$5.extglobChars(PLATFORM_CHARS);
+
+ const {
+ DOT_LITERAL,
+ PLUS_LITERAL,
+ SLASH_LITERAL,
+ ONE_CHAR,
+ DOTS_SLASH,
+ NO_DOT,
+ NO_DOT_SLASH,
+ NO_DOTS_SLASH,
+ QMARK,
+ QMARK_NO_DOT,
+ STAR,
+ START_ANCHOR
+ } = PLATFORM_CHARS;
+
+ const globstar = opts => {
+ return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;
+ };
+
+ const nodot = opts.dot ? '' : NO_DOT;
+ const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT;
+ let star = opts.bash === true ? globstar(opts) : STAR;
+
+ if (opts.capture) {
+ star = `(${star})`;
+ }
+
+ // minimatch options support
+ if (typeof opts.noext === 'boolean') {
+ opts.noextglob = opts.noext;
+ }
+
+ const state = {
+ input,
+ index: -1,
+ start: 0,
+ dot: opts.dot === true,
+ consumed: '',
+ output: '',
+ prefix: '',
+ backtrack: false,
+ negated: false,
+ brackets: 0,
+ braces: 0,
+ parens: 0,
+ quotes: 0,
+ globstar: false,
+ tokens
+ };
+
+ input = utils$j.removePrefix(input, state);
+ len = input.length;
+
+ const extglobs = [];
+ const braces = [];
+ const stack = [];
+ let prev = bos;
+ let value;
+
+ /**
+ * Tokenizing helpers
+ */
+
+ const eos = () => state.index === len - 1;
+ const peek = state.peek = (n = 1) => input[state.index + n];
+ const advance = state.advance = () => input[++state.index] || '';
+ const remaining = () => input.slice(state.index + 1);
+ const consume = (value = '', num = 0) => {
+ state.consumed += value;
+ state.index += num;
+ };
+
+ const append = token => {
+ state.output += token.output != null ? token.output : token.value;
+ consume(token.value);
+ };
+
+ const negate = () => {
+ let count = 1;
+
+ while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) {
+ advance();
+ state.start++;
+ count++;
+ }
+
+ if (count % 2 === 0) {
+ return false;
+ }
+
+ state.negated = true;
+ state.start++;
+ return true;
+ };
+
+ const increment = type => {
+ state[type]++;
+ stack.push(type);
+ };
+
+ const decrement = type => {
+ state[type]--;
+ stack.pop();
+ };
+
+ /**
+ * Push tokens onto the tokens array. This helper speeds up
+ * tokenizing by 1) helping us avoid backtracking as much as possible,
+ * and 2) helping us avoid creating extra tokens when consecutive
+ * characters are plain text. This improves performance and simplifies
+ * lookbehinds.
+ */
+
+ const push = tok => {
+ if (prev.type === 'globstar') {
+ const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace');
+ const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'));
+
+ if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) {
+ state.output = state.output.slice(0, -prev.output.length);
+ prev.type = 'star';
+ prev.value = '*';
+ prev.output = star;
+ state.output += prev.output;
+ }
+ }
+
+ if (extglobs.length && tok.type !== 'paren') {
+ extglobs[extglobs.length - 1].inner += tok.value;
+ }
+
+ if (tok.value || tok.output) append(tok);
+ if (prev && prev.type === 'text' && tok.type === 'text') {
+ prev.value += tok.value;
+ prev.output = (prev.output || '') + tok.value;
+ return;
+ }
+
+ tok.prev = prev;
+ tokens.push(tok);
+ prev = tok;
+ };
+
+ const extglobOpen = (type, value) => {
+ const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' };
+
+ token.prev = prev;
+ token.parens = state.parens;
+ token.output = state.output;
+ const output = (opts.capture ? '(' : '') + token.open;
+
+ increment('parens');
+ push({ type, value, output: state.output ? '' : ONE_CHAR });
+ push({ type: 'paren', extglob: true, value: advance(), output });
+ extglobs.push(token);
+ };
+
+ const extglobClose = token => {
+ let output = token.close + (opts.capture ? ')' : '');
+ let rest;
+
+ if (token.type === 'negate') {
+ let extglobStar = star;
+
+ if (token.inner && token.inner.length > 1 && token.inner.includes('/')) {
+ extglobStar = globstar(opts);
+ }
+
+ if (extglobStar !== star || eos() || /^\)+$/.test(remaining())) {
+ output = token.close = `)$))${extglobStar}`;
+ }
+
+ if (token.inner.includes('*') && (rest = remaining()) && /^\.[^\\/.]+$/.test(rest)) {
+ output = token.close = `)${rest})${extglobStar})`;
+ }
+
+ if (token.prev.type === 'bos') {
+ state.negatedExtglob = true;
+ }
+ }
+
+ push({ type: 'paren', extglob: true, value, output });
+ decrement('parens');
+ };
+
+ /**
+ * Fast paths
+ */
+
+ if (opts.fastpaths !== false && !/(^[*!]|[/()[\]{}"])/.test(input)) {
+ let backslashes = false;
+
+ let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => {
+ if (first === '\\') {
+ backslashes = true;
+ return m;
+ }
+
+ if (first === '?') {
+ if (esc) {
+ return esc + first + (rest ? QMARK.repeat(rest.length) : '');
+ }
+ if (index === 0) {
+ return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : '');
+ }
+ return QMARK.repeat(chars.length);
+ }
+
+ if (first === '.') {
+ return DOT_LITERAL.repeat(chars.length);
+ }
+
+ if (first === '*') {
+ if (esc) {
+ return esc + first + (rest ? star : '');
+ }
+ return star;
+ }
+ return esc ? m : `\\${m}`;
+ });
+
+ if (backslashes === true) {
+ if (opts.unescape === true) {
+ output = output.replace(/\\/g, '');
+ } else {
+ output = output.replace(/\\+/g, m => {
+ return m.length % 2 === 0 ? '\\\\' : (m ? '\\' : '');
+ });
+ }
+ }
+
+ if (output === input && opts.contains === true) {
+ state.output = input;
+ return state;
+ }
+
+ state.output = utils$j.wrapOutput(output, state, options);
+ return state;
+ }
+
+ /**
+ * Tokenize input until we reach end-of-string
+ */
+
+ while (!eos()) {
+ value = advance();
+
+ if (value === '\u0000') {
+ continue;
+ }
+
+ /**
+ * Escaped characters
+ */
+
+ if (value === '\\') {
+ const next = peek();
+
+ if (next === '/' && opts.bash !== true) {
+ continue;
+ }
+
+ if (next === '.' || next === ';') {
+ continue;
+ }
+
+ if (!next) {
+ value += '\\';
+ push({ type: 'text', value });
+ continue;
+ }
+
+ // collapse slashes to reduce potential for exploits
+ const match = /^\\+/.exec(remaining());
+ let slashes = 0;
+
+ if (match && match[0].length > 2) {
+ slashes = match[0].length;
+ state.index += slashes;
+ if (slashes % 2 !== 0) {
+ value += '\\';
+ }
+ }
+
+ if (opts.unescape === true) {
+ value = advance();
+ } else {
+ value += advance();
+ }
+
+ if (state.brackets === 0) {
+ push({ type: 'text', value });
+ continue;
+ }
+ }
+
+ /**
+ * If we're inside a regex character class, continue
+ * until we reach the closing bracket.
+ */
+
+ if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) {
+ if (opts.posix !== false && value === ':') {
+ const inner = prev.value.slice(1);
+ if (inner.includes('[')) {
+ prev.posix = true;
+
+ if (inner.includes(':')) {
+ const idx = prev.value.lastIndexOf('[');
+ const pre = prev.value.slice(0, idx);
+ const rest = prev.value.slice(idx + 2);
+ const posix = POSIX_REGEX_SOURCE[rest];
+ if (posix) {
+ prev.value = pre + posix;
+ state.backtrack = true;
+ advance();
+
+ if (!bos.output && tokens.indexOf(prev) === 1) {
+ bos.output = ONE_CHAR;
+ }
+ continue;
+ }
+ }
+ }
+ }
+
+ if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) {
+ value = `\\${value}`;
+ }
+
+ if (value === ']' && (prev.value === '[' || prev.value === '[^')) {
+ value = `\\${value}`;
+ }
+
+ if (opts.posix === true && value === '!' && prev.value === '[') {
+ value = '^';
+ }
+
+ prev.value += value;
+ append({ value });
+ continue;
+ }
+
+ /**
+ * If we're inside a quoted string, continue
+ * until we reach the closing double quote.
+ */
+
+ if (state.quotes === 1 && value !== '"') {
+ value = utils$j.escapeRegex(value);
+ prev.value += value;
+ append({ value });
+ continue;
+ }
+
+ /**
+ * Double quotes
+ */
+
+ if (value === '"') {
+ state.quotes = state.quotes === 1 ? 0 : 1;
+ if (opts.keepQuotes === true) {
+ push({ type: 'text', value });
+ }
+ continue;
+ }
+
+ /**
+ * Parentheses
+ */
+
+ if (value === '(') {
+ increment('parens');
+ push({ type: 'paren', value });
+ continue;
+ }
+
+ if (value === ')') {
+ if (state.parens === 0 && opts.strictBrackets === true) {
+ throw new SyntaxError(syntaxError$1('opening', '('));
+ }
+
+ const extglob = extglobs[extglobs.length - 1];
+ if (extglob && state.parens === extglob.parens + 1) {
+ extglobClose(extglobs.pop());
+ continue;
+ }
+
+ push({ type: 'paren', value, output: state.parens ? ')' : '\\)' });
+ decrement('parens');
+ continue;
+ }
+
+ /**
+ * Square brackets
+ */
+
+ if (value === '[') {
+ if (opts.nobracket === true || !remaining().includes(']')) {
+ if (opts.nobracket !== true && opts.strictBrackets === true) {
+ throw new SyntaxError(syntaxError$1('closing', ']'));
+ }
+
+ value = `\\${value}`;
+ } else {
+ increment('brackets');
+ }
+
+ push({ type: 'bracket', value });
+ continue;
+ }
+
+ if (value === ']') {
+ if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) {
+ push({ type: 'text', value, output: `\\${value}` });
+ continue;
+ }
+
+ if (state.brackets === 0) {
+ if (opts.strictBrackets === true) {
+ throw new SyntaxError(syntaxError$1('opening', '['));
+ }
+
+ push({ type: 'text', value, output: `\\${value}` });
+ continue;
+ }
+
+ decrement('brackets');
+
+ const prevValue = prev.value.slice(1);
+ if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) {
+ value = `/${value}`;
+ }
+
+ prev.value += value;
+ append({ value });
+
+ // when literal brackets are explicitly disabled
+ // assume we should match with a regex character class
+ if (opts.literalBrackets === false || utils$j.hasRegexChars(prevValue)) {
+ continue;
+ }
+
+ const escaped = utils$j.escapeRegex(prev.value);
+ state.output = state.output.slice(0, -prev.value.length);
+
+ // when literal brackets are explicitly enabled
+ // assume we should escape the brackets to match literal characters
+ if (opts.literalBrackets === true) {
+ state.output += escaped;
+ prev.value = escaped;
+ continue;
+ }
+
+ // when the user specifies nothing, try to match both
+ prev.value = `(${capture}${escaped}|${prev.value})`;
+ state.output += prev.value;
+ continue;
+ }
+
+ /**
+ * Braces
+ */
+
+ if (value === '{' && opts.nobrace !== true) {
+ increment('braces');
+
+ const open = {
+ type: 'brace',
+ value,
+ output: '(',
+ outputIndex: state.output.length,
+ tokensIndex: state.tokens.length
+ };
+
+ braces.push(open);
+ push(open);
+ continue;
+ }
+
+ if (value === '}') {
+ const brace = braces[braces.length - 1];
+
+ if (opts.nobrace === true || !brace) {
+ push({ type: 'text', value, output: value });
+ continue;
+ }
+
+ let output = ')';
+
+ if (brace.dots === true) {
+ const arr = tokens.slice();
+ const range = [];
+
+ for (let i = arr.length - 1; i >= 0; i--) {
+ tokens.pop();
+ if (arr[i].type === 'brace') {
+ break;
+ }
+ if (arr[i].type !== 'dots') {
+ range.unshift(arr[i].value);
+ }
+ }
+
+ output = expandRange(range, opts);
+ state.backtrack = true;
+ }
+
+ if (brace.comma !== true && brace.dots !== true) {
+ const out = state.output.slice(0, brace.outputIndex);
+ const toks = state.tokens.slice(brace.tokensIndex);
+ brace.value = brace.output = '\\{';
+ value = output = '\\}';
+ state.output = out;
+ for (const t of toks) {
+ state.output += (t.output || t.value);
+ }
+ }
+
+ push({ type: 'brace', value, output });
+ decrement('braces');
+ braces.pop();
+ continue;
+ }
+
+ /**
+ * Pipes
+ */
+
+ if (value === '|') {
+ if (extglobs.length > 0) {
+ extglobs[extglobs.length - 1].conditions++;
+ }
+ push({ type: 'text', value });
+ continue;
+ }
+
+ /**
+ * Commas
+ */
+
+ if (value === ',') {
+ let output = value;
+
+ const brace = braces[braces.length - 1];
+ if (brace && stack[stack.length - 1] === 'braces') {
+ brace.comma = true;
+ output = '|';
+ }
+
+ push({ type: 'comma', value, output });
+ continue;
+ }
+
+ /**
+ * Slashes
+ */
+
+ if (value === '/') {
+ // if the beginning of the glob is "./", advance the start
+ // to the current index, and don't add the "./" characters
+ // to the state. This greatly simplifies lookbehinds when
+ // checking for BOS characters like "!" and "." (not "./")
+ if (prev.type === 'dot' && state.index === state.start + 1) {
+ state.start = state.index + 1;
+ state.consumed = '';
+ state.output = '';
+ tokens.pop();
+ prev = bos; // reset "prev" to the first token
+ continue;
+ }
+
+ push({ type: 'slash', value, output: SLASH_LITERAL });
+ continue;
+ }
+
+ /**
+ * Dots
+ */
+
+ if (value === '.') {
+ if (state.braces > 0 && prev.type === 'dot') {
+ if (prev.value === '.') prev.output = DOT_LITERAL;
+ const brace = braces[braces.length - 1];
+ prev.type = 'dots';
+ prev.output += value;
+ prev.value += value;
+ brace.dots = true;
+ continue;
+ }
+
+ if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') {
+ push({ type: 'text', value, output: DOT_LITERAL });
+ continue;
+ }
+
+ push({ type: 'dot', value, output: DOT_LITERAL });
+ continue;
+ }
+
+ /**
+ * Question marks
+ */
+
+ if (value === '?') {
+ const isGroup = prev && prev.value === '(';
+ if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {
+ extglobOpen('qmark', value);
+ continue;
+ }
+
+ if (prev && prev.type === 'paren') {
+ const next = peek();
+ let output = value;
+
+ if (next === '<' && !utils$j.supportsLookbehinds()) {
+ throw new Error('Node.js v10 or higher is required for regex lookbehinds');
+ }
+
+ if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\w+>)/.test(remaining()))) {
+ output = `\\${value}`;
+ }
+
+ push({ type: 'text', value, output });
+ continue;
+ }
+
+ if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) {
+ push({ type: 'qmark', value, output: QMARK_NO_DOT });
+ continue;
+ }
+
+ push({ type: 'qmark', value, output: QMARK });
+ continue;
+ }
+
+ /**
+ * Exclamation
+ */
+
+ if (value === '!') {
+ if (opts.noextglob !== true && peek() === '(') {
+ if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) {
+ extglobOpen('negate', value);
+ continue;
+ }
+ }
+
+ if (opts.nonegate !== true && state.index === 0) {
+ negate();
+ continue;
+ }
+ }
+
+ /**
+ * Plus
+ */
+
+ if (value === '+') {
+ if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {
+ extglobOpen('plus', value);
+ continue;
+ }
+
+ if ((prev && prev.value === '(') || opts.regex === false) {
+ push({ type: 'plus', value, output: PLUS_LITERAL });
+ continue;
+ }
+
+ if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) {
+ push({ type: 'plus', value });
+ continue;
+ }
+
+ push({ type: 'plus', value: PLUS_LITERAL });
+ continue;
+ }
+
+ /**
+ * Plain text
+ */
+
+ if (value === '@') {
+ if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {
+ push({ type: 'at', extglob: true, value, output: '' });
+ continue;
+ }
+
+ push({ type: 'text', value });
+ continue;
+ }
+
+ /**
+ * Plain text
+ */
+
+ if (value !== '*') {
+ if (value === '$' || value === '^') {
+ value = `\\${value}`;
+ }
+
+ const match = REGEX_NON_SPECIAL_CHARS.exec(remaining());
+ if (match) {
+ value += match[0];
+ state.index += match[0].length;
+ }
+
+ push({ type: 'text', value });
+ continue;
+ }
+
+ /**
+ * Stars
+ */
+
+ if (prev && (prev.type === 'globstar' || prev.star === true)) {
+ prev.type = 'star';
+ prev.star = true;
+ prev.value += value;
+ prev.output = star;
+ state.backtrack = true;
+ state.globstar = true;
+ consume(value);
+ continue;
+ }
+
+ let rest = remaining();
+ if (opts.noextglob !== true && /^\([^?]/.test(rest)) {
+ extglobOpen('star', value);
+ continue;
+ }
+
+ if (prev.type === 'star') {
+ if (opts.noglobstar === true) {
+ consume(value);
+ continue;
+ }
+
+ const prior = prev.prev;
+ const before = prior.prev;
+ const isStart = prior.type === 'slash' || prior.type === 'bos';
+ const afterStar = before && (before.type === 'star' || before.type === 'globstar');
+
+ if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) {
+ push({ type: 'star', value, output: '' });
+ continue;
+ }
+
+ const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace');
+ const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren');
+ if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) {
+ push({ type: 'star', value, output: '' });
+ continue;
+ }
+
+ // strip consecutive `/**/`
+ while (rest.slice(0, 3) === '/**') {
+ const after = input[state.index + 4];
+ if (after && after !== '/') {
+ break;
+ }
+ rest = rest.slice(3);
+ consume('/**', 3);
+ }
+
+ if (prior.type === 'bos' && eos()) {
+ prev.type = 'globstar';
+ prev.value += value;
+ prev.output = globstar(opts);
+ state.output = prev.output;
+ state.globstar = true;
+ consume(value);
+ continue;
+ }
+
+ if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) {
+ state.output = state.output.slice(0, -(prior.output + prev.output).length);
+ prior.output = `(?:${prior.output}`;
+
+ prev.type = 'globstar';
+ prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)');
+ prev.value += value;
+ state.globstar = true;
+ state.output += prior.output + prev.output;
+ consume(value);
+ continue;
+ }
+
+ if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') {
+ const end = rest[1] !== void 0 ? '|$' : '';
+
+ state.output = state.output.slice(0, -(prior.output + prev.output).length);
+ prior.output = `(?:${prior.output}`;
+
+ prev.type = 'globstar';
+ prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`;
+ prev.value += value;
+
+ state.output += prior.output + prev.output;
+ state.globstar = true;
+
+ consume(value + advance());
+
+ push({ type: 'slash', value: '/', output: '' });
+ continue;
+ }
+
+ if (prior.type === 'bos' && rest[0] === '/') {
+ prev.type = 'globstar';
+ prev.value += value;
+ prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`;
+ state.output = prev.output;
+ state.globstar = true;
+ consume(value + advance());
+ push({ type: 'slash', value: '/', output: '' });
+ continue;
+ }
+
+ // remove single star from output
+ state.output = state.output.slice(0, -prev.output.length);
+
+ // reset previous token to globstar
+ prev.type = 'globstar';
+ prev.output = globstar(opts);
+ prev.value += value;
+
+ // reset output with globstar
+ state.output += prev.output;
+ state.globstar = true;
+ consume(value);
+ continue;
+ }
+
+ const token = { type: 'star', value, output: star };
+
+ if (opts.bash === true) {
+ token.output = '.*?';
+ if (prev.type === 'bos' || prev.type === 'slash') {
+ token.output = nodot + token.output;
+ }
+ push(token);
+ continue;
+ }
+
+ if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) {
+ token.output = value;
+ push(token);
+ continue;
+ }
+
+ if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') {
+ if (prev.type === 'dot') {
+ state.output += NO_DOT_SLASH;
+ prev.output += NO_DOT_SLASH;
+
+ } else if (opts.dot === true) {
+ state.output += NO_DOTS_SLASH;
+ prev.output += NO_DOTS_SLASH;
+
+ } else {
+ state.output += nodot;
+ prev.output += nodot;
+ }
+
+ if (peek() !== '*') {
+ state.output += ONE_CHAR;
+ prev.output += ONE_CHAR;
+ }
+ }
+
+ push(token);
+ }
+
+ while (state.brackets > 0) {
+ if (opts.strictBrackets === true) throw new SyntaxError(syntaxError$1('closing', ']'));
+ state.output = utils$j.escapeLast(state.output, '[');
+ decrement('brackets');
+ }
+
+ while (state.parens > 0) {
+ if (opts.strictBrackets === true) throw new SyntaxError(syntaxError$1('closing', ')'));
+ state.output = utils$j.escapeLast(state.output, '(');
+ decrement('parens');
+ }
+
+ while (state.braces > 0) {
+ if (opts.strictBrackets === true) throw new SyntaxError(syntaxError$1('closing', '}'));
+ state.output = utils$j.escapeLast(state.output, '{');
+ decrement('braces');
+ }
+
+ if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) {
+ push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` });
+ }
+
+ // rebuild the output if we had to backtrack at any point
+ if (state.backtrack === true) {
+ state.output = '';
+
+ for (const token of state.tokens) {
+ state.output += token.output != null ? token.output : token.value;
+
+ if (token.suffix) {
+ state.output += token.suffix;
+ }
+ }
+ }
+
+ return state;
+};
+
+/**
+ * Fast paths for creating regular expressions for common glob patterns.
+ * This can significantly speed up processing and has very little downside
+ * impact when none of the fast paths match.
+ */
+
+parse$l.fastpaths = (input, options) => {
+ const opts = { ...options };
+ const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH$1, opts.maxLength) : MAX_LENGTH$1;
+ const len = input.length;
+ if (len > max) {
+ throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);
+ }
+
+ input = REPLACEMENTS[input] || input;
+ const win32 = utils$j.isWindows(options);
+
+ // create constants based on platform, for windows or posix
+ const {
+ DOT_LITERAL,
+ SLASH_LITERAL,
+ ONE_CHAR,
+ DOTS_SLASH,
+ NO_DOT,
+ NO_DOTS,
+ NO_DOTS_SLASH,
+ STAR,
+ START_ANCHOR
+ } = constants$5.globChars(win32);
+
+ const nodot = opts.dot ? NO_DOTS : NO_DOT;
+ const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT;
+ const capture = opts.capture ? '' : '?:';
+ const state = { negated: false, prefix: '' };
+ let star = opts.bash === true ? '.*?' : STAR;
+
+ if (opts.capture) {
+ star = `(${star})`;
+ }
+
+ const globstar = opts => {
+ if (opts.noglobstar === true) return star;
+ return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;
+ };
+
+ const create = str => {
+ switch (str) {
+ case '*':
+ return `${nodot}${ONE_CHAR}${star}`;
+
+ case '.*':
+ return `${DOT_LITERAL}${ONE_CHAR}${star}`;
+
+ case '*.*':
+ return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;
+
+ case '*/*':
+ return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;
+
+ case '**':
+ return nodot + globstar(opts);
+
+ case '**/*':
+ return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;
+
+ case '**/*.*':
+ return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;
+
+ case '**/.*':
+ return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;
+
+ default: {
+ const match = /^(.*?)\.(\w+)$/.exec(str);
+ if (!match) return;
+
+ const source = create(match[1]);
+ if (!source) return;
+
+ return source + DOT_LITERAL + match[2];
+ }
+ }
+ };
+
+ const output = utils$j.removePrefix(input, state);
+ let source = create(output);
+
+ if (source && opts.strictSlashes !== true) {
+ source += `${SLASH_LITERAL}?`;
+ }
+
+ return source;
+};
+
+var parse_1$2 = parse$l;
+
+const path$m = path__default;
+const scan = scan_1;
+const parse$k = parse_1$2;
+const utils$i = utils$l;
+const constants$4 = constants$6;
+const isObject$4 = val => val && typeof val === 'object' && !Array.isArray(val);
+
+/**
+ * Creates a matcher function from one or more glob patterns. The
+ * returned function takes a string to match as its first argument,
+ * and returns true if the string is a match. The returned matcher
+ * function also takes a boolean as the second argument that, when true,
+ * returns an object with additional information.
+ *
+ * ```js
+ * const picomatch = require('picomatch');
+ * // picomatch(glob[, options]);
+ *
+ * const isMatch = picomatch('*.!(*a)');
+ * console.log(isMatch('a.a')); //=> false
+ * console.log(isMatch('a.b')); //=> true
+ * ```
+ * @name picomatch
+ * @param {String|Array} `globs` One or more glob patterns.
+ * @param {Object=} `options`
+ * @return {Function=} Returns a matcher function.
+ * @api public
+ */
+
+const picomatch$5 = (glob, options, returnState = false) => {
+ if (Array.isArray(glob)) {
+ const fns = glob.map(input => picomatch$5(input, options, returnState));
+ const arrayMatcher = str => {
+ for (const isMatch of fns) {
+ const state = isMatch(str);
+ if (state) return state;
+ }
+ return false;
+ };
+ return arrayMatcher;
+ }
+
+ const isState = isObject$4(glob) && glob.tokens && glob.input;
+
+ if (glob === '' || (typeof glob !== 'string' && !isState)) {
+ throw new TypeError('Expected pattern to be a non-empty string');
+ }
+
+ const opts = options || {};
+ const posix = utils$i.isWindows(options);
+ const regex = isState
+ ? picomatch$5.compileRe(glob, options)
+ : picomatch$5.makeRe(glob, options, false, true);
+
+ const state = regex.state;
+ delete regex.state;
+
+ let isIgnored = () => false;
+ if (opts.ignore) {
+ const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null };
+ isIgnored = picomatch$5(opts.ignore, ignoreOpts, returnState);
+ }
+
+ const matcher = (input, returnObject = false) => {
+ const { isMatch, match, output } = picomatch$5.test(input, regex, options, { glob, posix });
+ const result = { glob, state, regex, posix, input, output, match, isMatch };
+
+ if (typeof opts.onResult === 'function') {
+ opts.onResult(result);
+ }
+
+ if (isMatch === false) {
+ result.isMatch = false;
+ return returnObject ? result : false;
+ }
+
+ if (isIgnored(input)) {
+ if (typeof opts.onIgnore === 'function') {
+ opts.onIgnore(result);
+ }
+ result.isMatch = false;
+ return returnObject ? result : false;
+ }
+
+ if (typeof opts.onMatch === 'function') {
+ opts.onMatch(result);
+ }
+ return returnObject ? result : true;
+ };
+
+ if (returnState) {
+ matcher.state = state;
+ }
+
+ return matcher;
+};
+
+/**
+ * Test `input` with the given `regex`. This is used by the main
+ * `picomatch()` function to test the input string.
+ *
+ * ```js
+ * const picomatch = require('picomatch');
+ * // picomatch.test(input, regex[, options]);
+ *
+ * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/));
+ * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }
+ * ```
+ * @param {String} `input` String to test.
+ * @param {RegExp} `regex`
+ * @return {Object} Returns an object with matching info.
+ * @api public
+ */
+
+picomatch$5.test = (input, regex, options, { glob, posix } = {}) => {
+ if (typeof input !== 'string') {
+ throw new TypeError('Expected input to be a string');
+ }
+
+ if (input === '') {
+ return { isMatch: false, output: '' };
+ }
+
+ const opts = options || {};
+ const format = opts.format || (posix ? utils$i.toPosixSlashes : null);
+ let match = input === glob;
+ let output = (match && format) ? format(input) : input;
+
+ if (match === false) {
+ output = format ? format(input) : input;
+ match = output === glob;
+ }
+
+ if (match === false || opts.capture === true) {
+ if (opts.matchBase === true || opts.basename === true) {
+ match = picomatch$5.matchBase(input, regex, options, posix);
+ } else {
+ match = regex.exec(output);
+ }
+ }
+
+ return { isMatch: Boolean(match), match, output };
+};
+
+/**
+ * Match the basename of a filepath.
+ *
+ * ```js
+ * const picomatch = require('picomatch');
+ * // picomatch.matchBase(input, glob[, options]);
+ * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true
+ * ```
+ * @param {String} `input` String to test.
+ * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe).
+ * @return {Boolean}
+ * @api public
+ */
+
+picomatch$5.matchBase = (input, glob, options, posix = utils$i.isWindows(options)) => {
+ const regex = glob instanceof RegExp ? glob : picomatch$5.makeRe(glob, options);
+ return regex.test(path$m.basename(input));
+};
+
+/**
+ * Returns true if **any** of the given glob `patterns` match the specified `string`.
+ *
+ * ```js
+ * const picomatch = require('picomatch');
+ * // picomatch.isMatch(string, patterns[, options]);
+ *
+ * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true
+ * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false
+ * ```
+ * @param {String|Array} str The string to test.
+ * @param {String|Array} patterns One or more glob patterns to use for matching.
+ * @param {Object} [options] See available [options](#options).
+ * @return {Boolean} Returns true if any patterns match `str`
+ * @api public
+ */
+
+picomatch$5.isMatch = (str, patterns, options) => picomatch$5(patterns, options)(str);
+
+/**
+ * Parse a glob pattern to create the source string for a regular
+ * expression.
+ *
+ * ```js
+ * const picomatch = require('picomatch');
+ * const result = picomatch.parse(pattern[, options]);
+ * ```
+ * @param {String} `pattern`
+ * @param {Object} `options`
+ * @return {Object} Returns an object with useful properties and output to be used as a regex source string.
+ * @api public
+ */
+
+picomatch$5.parse = (pattern, options) => {
+ if (Array.isArray(pattern)) return pattern.map(p => picomatch$5.parse(p, options));
+ return parse$k(pattern, { ...options, fastpaths: false });
+};
+
+/**
+ * Scan a glob pattern to separate the pattern into segments.
+ *
+ * ```js
+ * const picomatch = require('picomatch');
+ * // picomatch.scan(input[, options]);
+ *
+ * const result = picomatch.scan('!./foo/*.js');
+ * console.log(result);
+ * { prefix: '!./',
+ * input: '!./foo/*.js',
+ * start: 3,
+ * base: 'foo',
+ * glob: '*.js',
+ * isBrace: false,
+ * isBracket: false,
+ * isGlob: true,
+ * isExtglob: false,
+ * isGlobstar: false,
+ * negated: true }
+ * ```
+ * @param {String} `input` Glob pattern to scan.
+ * @param {Object} `options`
+ * @return {Object} Returns an object with
+ * @api public
+ */
+
+picomatch$5.scan = (input, options) => scan(input, options);
+
+/**
+ * Compile a regular expression from the `state` object returned by the
+ * [parse()](#parse) method.
+ *
+ * @param {Object} `state`
+ * @param {Object} `options`
+ * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser.
+ * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.
+ * @return {RegExp}
+ * @api public
+ */
+
+picomatch$5.compileRe = (state, options, returnOutput = false, returnState = false) => {
+ if (returnOutput === true) {
+ return state.output;
+ }
+
+ const opts = options || {};
+ const prepend = opts.contains ? '' : '^';
+ const append = opts.contains ? '' : '$';
+
+ let source = `${prepend}(?:${state.output})${append}`;
+ if (state && state.negated === true) {
+ source = `^(?!${source}).*$`;
+ }
+
+ const regex = picomatch$5.toRegex(source, options);
+ if (returnState === true) {
+ regex.state = state;
+ }
+
+ return regex;
+};
+
+/**
+ * Create a regular expression from a parsed glob pattern.
+ *
+ * ```js
+ * const picomatch = require('picomatch');
+ * const state = picomatch.parse('*.js');
+ * // picomatch.compileRe(state[, options]);
+ *
+ * console.log(picomatch.compileRe(state));
+ * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/
+ * ```
+ * @param {String} `state` The object returned from the `.parse` method.
+ * @param {Object} `options`
+ * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.
+ * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression.
+ * @return {RegExp} Returns a regex created from the given pattern.
+ * @api public
+ */
+
+picomatch$5.makeRe = (input, options = {}, returnOutput = false, returnState = false) => {
+ if (!input || typeof input !== 'string') {
+ throw new TypeError('Expected a non-empty string');
+ }
+
+ let parsed = { negated: false, fastpaths: true };
+
+ if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) {
+ parsed.output = parse$k.fastpaths(input, options);
+ }
+
+ if (!parsed.output) {
+ parsed = parse$k(input, options);
+ }
+
+ return picomatch$5.compileRe(parsed, options, returnOutput, returnState);
+};
+
+/**
+ * Create a regular expression from the given regex source string.
+ *
+ * ```js
+ * const picomatch = require('picomatch');
+ * // picomatch.toRegex(source[, options]);
+ *
+ * const { output } = picomatch.parse('*.js');
+ * console.log(picomatch.toRegex(output));
+ * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/
+ * ```
+ * @param {String} `source` Regular expression source string.
+ * @param {Object} `options`
+ * @return {RegExp}
+ * @api public
+ */
+
+picomatch$5.toRegex = (source, options) => {
+ try {
+ const opts = options || {};
+ return new RegExp(source, opts.flags || (opts.nocase ? 'i' : ''));
+ } catch (err) {
+ if (options && options.debug === true) throw err;
+ return /$^/;
+ }
+};
+
+/**
+ * Picomatch constants.
+ * @return {Object}
+ */
+
+picomatch$5.constants = constants$4;
+
+/**
+ * Expose "picomatch"
+ */
+
+var picomatch_1 = picomatch$5;
+
+var picomatch$4 = picomatch_1;
+
+function walk$3(ast, { enter, leave }) {
+ return visit$1(ast, null, enter, leave);
+}
+
+let should_skip = false;
+let should_remove = false;
+let replacement = null;
+const context = {
+ skip: () => should_skip = true,
+ remove: () => should_remove = true,
+ replace: (node) => replacement = node
+};
+
+function replace(parent, prop, index, node) {
+ if (parent) {
+ if (index !== null) {
+ parent[prop][index] = node;
+ } else {
+ parent[prop] = node;
+ }
+ }
+}
+
+function remove(parent, prop, index) {
+ if (parent) {
+ if (index !== null) {
+ parent[prop].splice(index, 1);
+ } else {
+ delete parent[prop];
+ }
+ }
+}
+
+function visit$1(
+ node,
+ parent,
+ enter,
+ leave,
+ prop,
+ index
+) {
+ if (node) {
+ if (enter) {
+ const _should_skip = should_skip;
+ const _should_remove = should_remove;
+ const _replacement = replacement;
+ should_skip = false;
+ should_remove = false;
+ replacement = null;
+
+ enter.call(context, node, parent, prop, index);
+
+ if (replacement) {
+ node = replacement;
+ replace(parent, prop, index, node);
+ }
+
+ if (should_remove) {
+ remove(parent, prop, index);
+ }
+
+ const skipped = should_skip;
+ const removed = should_remove;
+
+ should_skip = _should_skip;
+ should_remove = _should_remove;
+ replacement = _replacement;
+
+ if (skipped) return node;
+ if (removed) return null;
+ }
+
+ for (const key in node) {
+ const value = (node )[key];
+
+ if (typeof value !== 'object') {
+ continue;
+ }
+
+ else if (Array.isArray(value)) {
+ for (let j = 0, k = 0; j < value.length; j += 1, k += 1) {
+ if (value[j] !== null && typeof value[j].type === 'string') {
+ if (!visit$1(value[j], node, enter, leave, key, k)) {
+ // removed
+ j--;
+ }
+ }
+ }
+ }
+
+ else if (value !== null && typeof value.type === 'string') {
+ visit$1(value, node, enter, leave, key, null);
+ }
+ }
+
+ if (leave) {
+ const _replacement = replacement;
+ const _should_remove = should_remove;
+ replacement = null;
+ should_remove = false;
+
+ leave.call(context, node, parent, prop, index);
+
+ if (replacement) {
+ node = replacement;
+ replace(parent, prop, index, node);
+ }
+
+ if (should_remove) {
+ remove(parent, prop, index);
+ }
+
+ const removed = should_remove;
+
+ replacement = _replacement;
+ should_remove = _should_remove;
+
+ if (removed) return null;
+ }
+ }
+
+ return node;
+}
+
+const extractors = {
+ ArrayPattern(names, param) {
+ for (const element of param.elements) {
+ if (element)
+ extractors[element.type](names, element);
+ }
+ },
+ AssignmentPattern(names, param) {
+ extractors[param.left.type](names, param.left);
+ },
+ Identifier(names, param) {
+ names.push(param.name);
+ },
+ MemberExpression() { },
+ ObjectPattern(names, param) {
+ for (const prop of param.properties) {
+ // @ts-ignore Typescript reports that this is not a valid type
+ if (prop.type === 'RestElement') {
+ extractors.RestElement(names, prop);
+ }
+ else {
+ extractors[prop.value.type](names, prop.value);
+ }
+ }
+ },
+ RestElement(names, param) {
+ extractors[param.argument.type](names, param.argument);
+ }
+};
+const extractAssignedNames = function extractAssignedNames(param) {
+ const names = [];
+ extractors[param.type](names, param);
+ return names;
+};
+
+const blockDeclarations = {
+ const: true,
+ let: true
+};
+class Scope$1 {
+ constructor(options = {}) {
+ this.parent = options.parent;
+ this.isBlockScope = !!options.block;
+ this.declarations = Object.create(null);
+ if (options.params) {
+ options.params.forEach((param) => {
+ extractAssignedNames(param).forEach((name) => {
+ this.declarations[name] = true;
+ });
+ });
+ }
+ }
+ addDeclaration(node, isBlockDeclaration, isVar) {
+ if (!isBlockDeclaration && this.isBlockScope) {
+ // it's a `var` or function node, and this
+ // is a block scope, so we need to go up
+ this.parent.addDeclaration(node, isBlockDeclaration, isVar);
+ }
+ else if (node.id) {
+ extractAssignedNames(node.id).forEach((name) => {
+ this.declarations[name] = true;
+ });
+ }
+ }
+ contains(name) {
+ return this.declarations[name] || (this.parent ? this.parent.contains(name) : false);
+ }
+}
+const attachScopes = function attachScopes(ast, propertyName = 'scope') {
+ let scope = new Scope$1();
+ walk$3(ast, {
+ enter(n, parent) {
+ const node = n;
+ // function foo () {...}
+ // class Foo {...}
+ if (/(Function|Class)Declaration/.test(node.type)) {
+ scope.addDeclaration(node, false, false);
+ }
+ // var foo = 1
+ if (node.type === 'VariableDeclaration') {
+ const { kind } = node;
+ const isBlockDeclaration = blockDeclarations[kind];
+ // don't add const/let declarations in the body of a for loop #113
+ const parentType = parent ? parent.type : '';
+ if (!(isBlockDeclaration && /ForOfStatement/.test(parentType))) {
+ node.declarations.forEach((declaration) => {
+ scope.addDeclaration(declaration, isBlockDeclaration, true);
+ });
+ }
+ }
+ let newScope;
+ // create new function scope
+ if (/Function/.test(node.type)) {
+ const func = node;
+ newScope = new Scope$1({
+ parent: scope,
+ block: false,
+ params: func.params
+ });
+ // named function expressions - the name is considered
+ // part of the function's scope
+ if (func.type === 'FunctionExpression' && func.id) {
+ newScope.addDeclaration(func, false, false);
+ }
+ }
+ // create new block scope
+ if (node.type === 'BlockStatement' && !/Function/.test(parent.type)) {
+ newScope = new Scope$1({
+ parent: scope,
+ block: true
+ });
+ }
+ // catch clause has its own block scope
+ if (node.type === 'CatchClause') {
+ newScope = new Scope$1({
+ parent: scope,
+ params: node.param ? [node.param] : [],
+ block: true
+ });
+ }
+ if (newScope) {
+ Object.defineProperty(node, propertyName, {
+ value: newScope,
+ configurable: true
+ });
+ scope = newScope;
+ }
+ },
+ leave(n) {
+ const node = n;
+ if (node[propertyName])
+ scope = scope.parent;
+ }
+ });
+ return scope;
+};
+
+// Helper since Typescript can't detect readonly arrays with Array.isArray
+function isArray$2(arg) {
+ return Array.isArray(arg);
+}
+function ensureArray(thing) {
+ if (isArray$2(thing))
+ return thing;
+ if (thing == null)
+ return [];
+ return [thing];
+}
+
+function getMatcherString(id, resolutionBase) {
+ if (resolutionBase === false) {
+ return id;
+ }
+ // resolve('') is valid and will default to process.cwd()
+ const basePath = path$r.resolve(resolutionBase || '')
+ .split(path$r.sep)
+ .join('/')
+ // escape all possible (posix + win) path characters that might interfere with regex
+ .replace(/[-^$*+?.()|[\]{}]/g, '\\$&');
+ // Note that we use posix.join because:
+ // 1. the basePath has been normalized to use /
+ // 2. the incoming glob (id) matcher, also uses /
+ // otherwise Node will force backslash (\) on windows
+ return path$r.posix.join(basePath, id);
+}
+const createFilter = function createFilter(include, exclude, options) {
+ const resolutionBase = options && options.resolve;
+ const getMatcher = (id) => id instanceof RegExp
+ ? id
+ : {
+ test: (what) => {
+ // this refactor is a tad overly verbose but makes for easy debugging
+ const pattern = getMatcherString(id, resolutionBase);
+ const fn = picomatch$4(pattern, { dot: true });
+ const result = fn(what);
+ return result;
+ }
+ };
+ const includeMatchers = ensureArray(include).map(getMatcher);
+ const excludeMatchers = ensureArray(exclude).map(getMatcher);
+ return function result(id) {
+ if (typeof id !== 'string')
+ return false;
+ if (/\0/.test(id))
+ return false;
+ const pathId = id.split(path$r.sep).join('/');
+ for (let i = 0; i < excludeMatchers.length; ++i) {
+ const matcher = excludeMatchers[i];
+ if (matcher.test(pathId))
+ return false;
+ }
+ for (let i = 0; i < includeMatchers.length; ++i) {
+ const matcher = includeMatchers[i];
+ if (matcher.test(pathId))
+ return true;
+ }
+ return !includeMatchers.length;
+ };
+};
+
+const reservedWords$1 = 'break case class catch const continue debugger default delete do else export extends finally for function if import in instanceof let new return super switch this throw try typeof var void while with yield enum await implements package protected static interface private public';
+const builtins$1 = 'arguments Infinity NaN undefined null true false eval uneval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Symbol Error EvalError InternalError RangeError ReferenceError SyntaxError TypeError URIError Number Math Date String RegExp Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array Map Set WeakMap WeakSet SIMD ArrayBuffer DataView JSON Promise Generator GeneratorFunction Reflect Proxy Intl';
+const forbiddenIdentifiers = new Set(`${reservedWords$1} ${builtins$1}`.split(' '));
+forbiddenIdentifiers.add('');
+const makeLegalIdentifier = function makeLegalIdentifier(str) {
+ let identifier = str
+ .replace(/-(\w)/g, (_, letter) => letter.toUpperCase())
+ .replace(/[^$_a-zA-Z0-9]/g, '_');
+ if (/\d/.test(identifier[0]) || forbiddenIdentifiers.has(identifier)) {
+ identifier = `_${identifier}`;
+ }
+ return identifier || '_';
+};
+
+var path$l = path__default;
+
+var commondir = function (basedir, relfiles) {
+ if (relfiles) {
+ var files = relfiles.map(function (r) {
+ return path$l.resolve(basedir, r);
+ });
+ }
+ else {
+ var files = basedir;
+ }
+
+ var res = files.slice(1).reduce(function (ps, file) {
+ if (!file.match(/^([A-Za-z]:)?\/|\\/)) {
+ throw new Error('relative path without a basedir');
+ }
+
+ var xs = file.split(/\/+|\\+/);
+ for (
+ var i = 0;
+ ps[i] === xs[i] && i < Math.min(ps.length, xs.length);
+ i++
+ );
+ return ps.slice(0, i);
+ }, files[0].split(/\/+|\\+/));
+
+ // Windows correctly handles paths with forward-slashes
+ return res.length > 1 ? res.join('/') : '/'
+};
+
+var old$1 = {};
+
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var pathModule = path__default;
+var isWindows$4 = process.platform === 'win32';
+var fs$l = fs__default;
+
+// JavaScript implementation of realpath, ported from node pre-v6
+
+var DEBUG$1 = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG);
+
+function rethrow() {
+ // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and
+ // is fairly slow to generate.
+ var callback;
+ if (DEBUG$1) {
+ var backtrace = new Error;
+ callback = debugCallback;
+ } else
+ callback = missingCallback;
+
+ return callback;
+
+ function debugCallback(err) {
+ if (err) {
+ backtrace.message = err.message;
+ err = backtrace;
+ missingCallback(err);
+ }
+ }
+
+ function missingCallback(err) {
+ if (err) {
+ if (process.throwDeprecation)
+ throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs
+ else if (!process.noDeprecation) {
+ var msg = 'fs: missing callback ' + (err.stack || err.message);
+ if (process.traceDeprecation)
+ console.trace(msg);
+ else
+ console.error(msg);
+ }
+ }
+ }
+}
+
+function maybeCallback(cb) {
+ return typeof cb === 'function' ? cb : rethrow();
+}
+
+// Regexp that finds the next partion of a (partial) path
+// result is [base_with_slash, base], e.g. ['somedir/', 'somedir']
+if (isWindows$4) {
+ var nextPartRe = /(.*?)(?:[\/\\]+|$)/g;
+} else {
+ var nextPartRe = /(.*?)(?:[\/]+|$)/g;
+}
+
+// Regex to find the device root, including trailing slash. E.g. 'c:\\'.
+if (isWindows$4) {
+ var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/;
+} else {
+ var splitRootRe = /^[\/]*/;
+}
+
+old$1.realpathSync = function realpathSync(p, cache) {
+ // make p is absolute
+ p = pathModule.resolve(p);
+
+ if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
+ return cache[p];
+ }
+
+ var original = p,
+ seenLinks = {},
+ knownHard = {};
+
+ // current character position in p
+ var pos;
+ // the partial path so far, including a trailing slash if any
+ var current;
+ // the partial path without a trailing slash (except when pointing at a root)
+ var base;
+ // the partial path scanned in the previous round, with slash
+ var previous;
+
+ start();
+
+ function start() {
+ // Skip over roots
+ var m = splitRootRe.exec(p);
+ pos = m[0].length;
+ current = m[0];
+ base = m[0];
+ previous = '';
+
+ // On windows, check that the root exists. On unix there is no need.
+ if (isWindows$4 && !knownHard[base]) {
+ fs$l.lstatSync(base);
+ knownHard[base] = true;
+ }
+ }
+
+ // walk down the path, swapping out linked pathparts for their real
+ // values
+ // NB: p.length changes.
+ while (pos < p.length) {
+ // find the next part
+ nextPartRe.lastIndex = pos;
+ var result = nextPartRe.exec(p);
+ previous = current;
+ current += result[0];
+ base = previous + result[1];
+ pos = nextPartRe.lastIndex;
+
+ // continue if not a symlink
+ if (knownHard[base] || (cache && cache[base] === base)) {
+ continue;
+ }
+
+ var resolvedLink;
+ if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
+ // some known symbolic link. no need to stat again.
+ resolvedLink = cache[base];
+ } else {
+ var stat = fs$l.lstatSync(base);
+ if (!stat.isSymbolicLink()) {
+ knownHard[base] = true;
+ if (cache) cache[base] = base;
+ continue;
+ }
+
+ // read the link if it wasn't read before
+ // dev/ino always return 0 on windows, so skip the check.
+ var linkTarget = null;
+ if (!isWindows$4) {
+ var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
+ if (seenLinks.hasOwnProperty(id)) {
+ linkTarget = seenLinks[id];
+ }
+ }
+ if (linkTarget === null) {
+ fs$l.statSync(base);
+ linkTarget = fs$l.readlinkSync(base);
+ }
+ resolvedLink = pathModule.resolve(previous, linkTarget);
+ // track this, if given a cache.
+ if (cache) cache[base] = resolvedLink;
+ if (!isWindows$4) seenLinks[id] = linkTarget;
+ }
+
+ // resolve the link, then start over
+ p = pathModule.resolve(resolvedLink, p.slice(pos));
+ start();
+ }
+
+ if (cache) cache[original] = p;
+
+ return p;
+};
+
+
+old$1.realpath = function realpath(p, cache, cb) {
+ if (typeof cb !== 'function') {
+ cb = maybeCallback(cache);
+ cache = null;
+ }
+
+ // make p is absolute
+ p = pathModule.resolve(p);
+
+ if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
+ return process.nextTick(cb.bind(null, null, cache[p]));
+ }
+
+ var original = p,
+ seenLinks = {},
+ knownHard = {};
+
+ // current character position in p
+ var pos;
+ // the partial path so far, including a trailing slash if any
+ var current;
+ // the partial path without a trailing slash (except when pointing at a root)
+ var base;
+ // the partial path scanned in the previous round, with slash
+ var previous;
+
+ start();
+
+ function start() {
+ // Skip over roots
+ var m = splitRootRe.exec(p);
+ pos = m[0].length;
+ current = m[0];
+ base = m[0];
+ previous = '';
+
+ // On windows, check that the root exists. On unix there is no need.
+ if (isWindows$4 && !knownHard[base]) {
+ fs$l.lstat(base, function(err) {
+ if (err) return cb(err);
+ knownHard[base] = true;
+ LOOP();
+ });
+ } else {
+ process.nextTick(LOOP);
+ }
+ }
+
+ // walk down the path, swapping out linked pathparts for their real
+ // values
+ function LOOP() {
+ // stop if scanned past end of path
+ if (pos >= p.length) {
+ if (cache) cache[original] = p;
+ return cb(null, p);
+ }
+
+ // find the next part
+ nextPartRe.lastIndex = pos;
+ var result = nextPartRe.exec(p);
+ previous = current;
+ current += result[0];
+ base = previous + result[1];
+ pos = nextPartRe.lastIndex;
+
+ // continue if not a symlink
+ if (knownHard[base] || (cache && cache[base] === base)) {
+ return process.nextTick(LOOP);
+ }
+
+ if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
+ // known symbolic link. no need to stat again.
+ return gotResolvedLink(cache[base]);
+ }
+
+ return fs$l.lstat(base, gotStat);
+ }
+
+ function gotStat(err, stat) {
+ if (err) return cb(err);
+
+ // if not a symlink, skip to the next path part
+ if (!stat.isSymbolicLink()) {
+ knownHard[base] = true;
+ if (cache) cache[base] = base;
+ return process.nextTick(LOOP);
+ }
+
+ // stat & read the link if not read before
+ // call gotTarget as soon as the link target is known
+ // dev/ino always return 0 on windows, so skip the check.
+ if (!isWindows$4) {
+ var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
+ if (seenLinks.hasOwnProperty(id)) {
+ return gotTarget(null, seenLinks[id], base);
+ }
+ }
+ fs$l.stat(base, function(err) {
+ if (err) return cb(err);
+
+ fs$l.readlink(base, function(err, target) {
+ if (!isWindows$4) seenLinks[id] = target;
+ gotTarget(err, target);
+ });
+ });
+ }
+
+ function gotTarget(err, target, base) {
+ if (err) return cb(err);
+
+ var resolvedLink = pathModule.resolve(previous, target);
+ if (cache) cache[base] = resolvedLink;
+ gotResolvedLink(resolvedLink);
+ }
+
+ function gotResolvedLink(resolvedLink) {
+ // resolve the link, then start over
+ p = pathModule.resolve(resolvedLink, p.slice(pos));
+ start();
+ }
+};
+
+var fs_realpath = realpath$2;
+realpath$2.realpath = realpath$2;
+realpath$2.sync = realpathSync;
+realpath$2.realpathSync = realpathSync;
+realpath$2.monkeypatch = monkeypatch;
+realpath$2.unmonkeypatch = unmonkeypatch;
+
+var fs$k = fs__default;
+var origRealpath = fs$k.realpath;
+var origRealpathSync = fs$k.realpathSync;
+
+var version$1 = process.version;
+var ok = /^v[0-5]\./.test(version$1);
+var old = old$1;
+
+function newError (er) {
+ return er && er.syscall === 'realpath' && (
+ er.code === 'ELOOP' ||
+ er.code === 'ENOMEM' ||
+ er.code === 'ENAMETOOLONG'
+ )
+}
+
+function realpath$2 (p, cache, cb) {
+ if (ok) {
+ return origRealpath(p, cache, cb)
+ }
+
+ if (typeof cache === 'function') {
+ cb = cache;
+ cache = null;
+ }
+ origRealpath(p, cache, function (er, result) {
+ if (newError(er)) {
+ old.realpath(p, cache, cb);
+ } else {
+ cb(er, result);
+ }
+ });
+}
+
+function realpathSync (p, cache) {
+ if (ok) {
+ return origRealpathSync(p, cache)
+ }
+
+ try {
+ return origRealpathSync(p, cache)
+ } catch (er) {
+ if (newError(er)) {
+ return old.realpathSync(p, cache)
+ } else {
+ throw er
+ }
+ }
+}
+
+function monkeypatch () {
+ fs$k.realpath = realpath$2;
+ fs$k.realpathSync = realpathSync;
+}
+
+function unmonkeypatch () {
+ fs$k.realpath = origRealpath;
+ fs$k.realpathSync = origRealpathSync;
+}
+
+var concatMap$1 = function (xs, fn) {
+ var res = [];
+ for (var i = 0; i < xs.length; i++) {
+ var x = fn(xs[i], i);
+ if (isArray$1(x)) res.push.apply(res, x);
+ else res.push(x);
+ }
+ return res;
+};
+
+var isArray$1 = Array.isArray || function (xs) {
+ return Object.prototype.toString.call(xs) === '[object Array]';
+};
+
+var balancedMatch = balanced$1;
+function balanced$1(a, b, str) {
+ if (a instanceof RegExp) a = maybeMatch(a, str);
+ if (b instanceof RegExp) b = maybeMatch(b, str);
+
+ var r = range$1(a, b, str);
+
+ return r && {
+ start: r[0],
+ end: r[1],
+ pre: str.slice(0, r[0]),
+ body: str.slice(r[0] + a.length, r[1]),
+ post: str.slice(r[1] + b.length)
+ };
+}
+
+function maybeMatch(reg, str) {
+ var m = str.match(reg);
+ return m ? m[0] : null;
+}
+
+balanced$1.range = range$1;
+function range$1(a, b, str) {
+ var begs, beg, left, right, result;
+ var ai = str.indexOf(a);
+ var bi = str.indexOf(b, ai + 1);
+ var i = ai;
+
+ if (ai >= 0 && bi > 0) {
+ if(a===b) {
+ return [ai, bi];
+ }
+ begs = [];
+ left = str.length;
+
+ while (i >= 0 && !result) {
+ if (i == ai) {
+ begs.push(i);
+ ai = str.indexOf(a, i + 1);
+ } else if (begs.length == 1) {
+ result = [ begs.pop(), bi ];
+ } else {
+ beg = begs.pop();
+ if (beg < left) {
+ left = beg;
+ right = bi;
+ }
+
+ bi = str.indexOf(b, i + 1);
+ }
+
+ i = ai < bi && ai >= 0 ? ai : bi;
+ }
+
+ if (begs.length) {
+ result = [ left, right ];
+ }
+ }
+
+ return result;
+}
+
+var concatMap = concatMap$1;
+var balanced = balancedMatch;
+
+var braceExpansion = expandTop;
+
+var escSlash = '\0SLASH'+Math.random()+'\0';
+var escOpen = '\0OPEN'+Math.random()+'\0';
+var escClose = '\0CLOSE'+Math.random()+'\0';
+var escComma = '\0COMMA'+Math.random()+'\0';
+var escPeriod = '\0PERIOD'+Math.random()+'\0';
+
+function numeric(str) {
+ return parseInt(str, 10) == str
+ ? parseInt(str, 10)
+ : str.charCodeAt(0);
+}
+
+function escapeBraces(str) {
+ return str.split('\\\\').join(escSlash)
+ .split('\\{').join(escOpen)
+ .split('\\}').join(escClose)
+ .split('\\,').join(escComma)
+ .split('\\.').join(escPeriod);
+}
+
+function unescapeBraces(str) {
+ return str.split(escSlash).join('\\')
+ .split(escOpen).join('{')
+ .split(escClose).join('}')
+ .split(escComma).join(',')
+ .split(escPeriod).join('.');
+}
+
+
+// Basically just str.split(","), but handling cases
+// where we have nested braced sections, which should be
+// treated as individual members, like {a,{b,c},d}
+function parseCommaParts(str) {
+ if (!str)
+ return [''];
+
+ var parts = [];
+ var m = balanced('{', '}', str);
+
+ if (!m)
+ return str.split(',');
+
+ var pre = m.pre;
+ var body = m.body;
+ var post = m.post;
+ var p = pre.split(',');
+
+ p[p.length-1] += '{' + body + '}';
+ var postParts = parseCommaParts(post);
+ if (post.length) {
+ p[p.length-1] += postParts.shift();
+ p.push.apply(p, postParts);
+ }
+
+ parts.push.apply(parts, p);
+
+ return parts;
+}
+
+function expandTop(str) {
+ if (!str)
+ return [];
+
+ // I don't know why Bash 4.3 does this, but it does.
+ // Anything starting with {} will have the first two bytes preserved
+ // but *only* at the top level, so {},a}b will not expand to anything,
+ // but a{},b}c will be expanded to [a}c,abc].
+ // One could argue that this is a bug in Bash, but since the goal of
+ // this module is to match Bash's rules, we escape a leading {}
+ if (str.substr(0, 2) === '{}') {
+ str = '\\{\\}' + str.substr(2);
+ }
+
+ return expand$3(escapeBraces(str), true).map(unescapeBraces);
+}
+
+function embrace(str) {
+ return '{' + str + '}';
+}
+function isPadded(el) {
+ return /^-?0\d/.test(el);
+}
+
+function lte(i, y) {
+ return i <= y;
+}
+function gte(i, y) {
+ return i >= y;
+}
+
+function expand$3(str, isTop) {
+ var expansions = [];
+
+ var m = balanced('{', '}', str);
+ if (!m || /\$$/.test(m.pre)) return [str];
+
+ var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
+ var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
+ var isSequence = isNumericSequence || isAlphaSequence;
+ var isOptions = m.body.indexOf(',') >= 0;
+ if (!isSequence && !isOptions) {
+ // {a},b}
+ if (m.post.match(/,.*\}/)) {
+ str = m.pre + '{' + m.body + escClose + m.post;
+ return expand$3(str);
+ }
+ return [str];
+ }
+
+ var n;
+ if (isSequence) {
+ n = m.body.split(/\.\./);
+ } else {
+ n = parseCommaParts(m.body);
+ if (n.length === 1) {
+ // x{{a,b}}y ==> x{a}y x{b}y
+ n = expand$3(n[0], false).map(embrace);
+ if (n.length === 1) {
+ var post = m.post.length
+ ? expand$3(m.post, false)
+ : [''];
+ return post.map(function(p) {
+ return m.pre + n[0] + p;
+ });
+ }
+ }
+ }
+
+ // at this point, n is the parts, and we know it's not a comma set
+ // with a single entry.
+
+ // no need to expand pre, since it is guaranteed to be free of brace-sets
+ var pre = m.pre;
+ var post = m.post.length
+ ? expand$3(m.post, false)
+ : [''];
+
+ var N;
+
+ if (isSequence) {
+ var x = numeric(n[0]);
+ var y = numeric(n[1]);
+ var width = Math.max(n[0].length, n[1].length);
+ var incr = n.length == 3
+ ? Math.abs(numeric(n[2]))
+ : 1;
+ var test = lte;
+ var reverse = y < x;
+ if (reverse) {
+ incr *= -1;
+ test = gte;
+ }
+ var pad = n.some(isPadded);
+
+ N = [];
+
+ for (var i = x; test(i, y); i += incr) {
+ var c;
+ if (isAlphaSequence) {
+ c = String.fromCharCode(i);
+ if (c === '\\')
+ c = '';
+ } else {
+ c = String(i);
+ if (pad) {
+ var need = width - c.length;
+ if (need > 0) {
+ var z = new Array(need + 1).join('0');
+ if (i < 0)
+ c = '-' + z + c.slice(1);
+ else
+ c = z + c;
+ }
+ }
+ }
+ N.push(c);
+ }
+ } else {
+ N = concatMap(n, function(el) { return expand$3(el, false) });
+ }
+
+ for (var j = 0; j < N.length; j++) {
+ for (var k = 0; k < post.length; k++) {
+ var expansion = pre + N[j] + post[k];
+ if (!isTop || isSequence || expansion)
+ expansions.push(expansion);
+ }
+ }
+
+ return expansions;
+}
+
+var minimatch_1 = minimatch$3;
+minimatch$3.Minimatch = Minimatch$1;
+
+var path$k = { sep: '/' };
+try {
+ path$k = require('path');
+} catch (er) {}
+
+var GLOBSTAR$2 = minimatch$3.GLOBSTAR = Minimatch$1.GLOBSTAR = {};
+var expand$2 = braceExpansion;
+
+var plTypes = {
+ '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
+ '?': { open: '(?:', close: ')?' },
+ '+': { open: '(?:', close: ')+' },
+ '*': { open: '(?:', close: ')*' },
+ '@': { open: '(?:', close: ')' }
+};
+
+// any single thing other than /
+// don't need to escape / when using new RegExp()
+var qmark = '[^/]';
+
+// * => any number of characters
+var star = qmark + '*?';
+
+// ** when dots are allowed. Anything goes, except .. and .
+// not (^ or / followed by one or two dots followed by $ or /),
+// followed by anything, any number of times.
+var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?';
+
+// not a ^ or / followed by a dot,
+// followed by anything, any number of times.
+var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?';
+
+// characters that need to be escaped in RegExp.
+var reSpecials = charSet('().*{}+?[]^$\\!');
+
+// "abc" -> { a:true, b:true, c:true }
+function charSet (s) {
+ return s.split('').reduce(function (set, c) {
+ set[c] = true;
+ return set
+ }, {})
+}
+
+// normalizes slashes.
+var slashSplit = /\/+/;
+
+minimatch$3.filter = filter$1;
+function filter$1 (pattern, options) {
+ options = options || {};
+ return function (p, i, list) {
+ return minimatch$3(p, pattern, options)
+ }
+}
+
+function ext (a, b) {
+ a = a || {};
+ b = b || {};
+ var t = {};
+ Object.keys(b).forEach(function (k) {
+ t[k] = b[k];
+ });
+ Object.keys(a).forEach(function (k) {
+ t[k] = a[k];
+ });
+ return t
+}
+
+minimatch$3.defaults = function (def) {
+ if (!def || !Object.keys(def).length) return minimatch$3
+
+ var orig = minimatch$3;
+
+ var m = function minimatch (p, pattern, options) {
+ return orig.minimatch(p, pattern, ext(def, options))
+ };
+
+ m.Minimatch = function Minimatch (pattern, options) {
+ return new orig.Minimatch(pattern, ext(def, options))
+ };
+
+ return m
+};
+
+Minimatch$1.defaults = function (def) {
+ if (!def || !Object.keys(def).length) return Minimatch$1
+ return minimatch$3.defaults(def).Minimatch
+};
+
+function minimatch$3 (p, pattern, options) {
+ if (typeof pattern !== 'string') {
+ throw new TypeError('glob pattern string required')
+ }
+
+ if (!options) options = {};
+
+ // shortcut: comments match nothing.
+ if (!options.nocomment && pattern.charAt(0) === '#') {
+ return false
+ }
+
+ // "" only matches ""
+ if (pattern.trim() === '') return p === ''
+
+ return new Minimatch$1(pattern, options).match(p)
+}
+
+function Minimatch$1 (pattern, options) {
+ if (!(this instanceof Minimatch$1)) {
+ return new Minimatch$1(pattern, options)
+ }
+
+ if (typeof pattern !== 'string') {
+ throw new TypeError('glob pattern string required')
+ }
+
+ if (!options) options = {};
+ pattern = pattern.trim();
+
+ // windows support: need to use /, not \
+ if (path$k.sep !== '/') {
+ pattern = pattern.split(path$k.sep).join('/');
+ }
+
+ this.options = options;
+ this.set = [];
+ this.pattern = pattern;
+ this.regexp = null;
+ this.negate = false;
+ this.comment = false;
+ this.empty = false;
+
+ // make the set of regexps etc.
+ this.make();
+}
+
+Minimatch$1.prototype.debug = function () {};
+
+Minimatch$1.prototype.make = make;
+function make () {
+ // don't do it more than once.
+ if (this._made) return
+
+ var pattern = this.pattern;
+ var options = this.options;
+
+ // empty patterns and comments match nothing.
+ if (!options.nocomment && pattern.charAt(0) === '#') {
+ this.comment = true;
+ return
+ }
+ if (!pattern) {
+ this.empty = true;
+ return
+ }
+
+ // step 1: figure out negation, etc.
+ this.parseNegate();
+
+ // step 2: expand braces
+ var set = this.globSet = this.braceExpand();
+
+ if (options.debug) this.debug = console.error;
+
+ this.debug(this.pattern, set);
+
+ // step 3: now we have a set, so turn each one into a series of path-portion
+ // matching patterns.
+ // These will be regexps, except in the case of "**", which is
+ // set to the GLOBSTAR object for globstar behavior,
+ // and will not contain any / characters
+ set = this.globParts = set.map(function (s) {
+ return s.split(slashSplit)
+ });
+
+ this.debug(this.pattern, set);
+
+ // glob --> regexps
+ set = set.map(function (s, si, set) {
+ return s.map(this.parse, this)
+ }, this);
+
+ this.debug(this.pattern, set);
+
+ // filter out everything that didn't compile properly.
+ set = set.filter(function (s) {
+ return s.indexOf(false) === -1
+ });
+
+ this.debug(this.pattern, set);
+
+ this.set = set;
+}
+
+Minimatch$1.prototype.parseNegate = parseNegate;
+function parseNegate () {
+ var pattern = this.pattern;
+ var negate = false;
+ var options = this.options;
+ var negateOffset = 0;
+
+ if (options.nonegate) return
+
+ for (var i = 0, l = pattern.length
+ ; i < l && pattern.charAt(i) === '!'
+ ; i++) {
+ negate = !negate;
+ negateOffset++;
+ }
+
+ if (negateOffset) this.pattern = pattern.substr(negateOffset);
+ this.negate = negate;
+}
+
+// Brace expansion:
+// a{b,c}d -> abd acd
+// a{b,}c -> abc ac
+// a{0..3}d -> a0d a1d a2d a3d
+// a{b,c{d,e}f}g -> abg acdfg acefg
+// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
+//
+// Invalid sets are not expanded.
+// a{2..}b -> a{2..}b
+// a{b}c -> a{b}c
+minimatch$3.braceExpand = function (pattern, options) {
+ return braceExpand(pattern, options)
+};
+
+Minimatch$1.prototype.braceExpand = braceExpand;
+
+function braceExpand (pattern, options) {
+ if (!options) {
+ if (this instanceof Minimatch$1) {
+ options = this.options;
+ } else {
+ options = {};
+ }
+ }
+
+ pattern = typeof pattern === 'undefined'
+ ? this.pattern : pattern;
+
+ if (typeof pattern === 'undefined') {
+ throw new TypeError('undefined pattern')
+ }
+
+ if (options.nobrace ||
+ !pattern.match(/\{.*\}/)) {
+ // shortcut. no need to expand.
+ return [pattern]
+ }
+
+ return expand$2(pattern)
+}
+
+// parse a component of the expanded set.
+// At this point, no pattern may contain "/" in it
+// so we're going to return a 2d array, where each entry is the full
+// pattern, split on '/', and then turned into a regular expression.
+// A regexp is made at the end which joins each array with an
+// escaped /, and another full one which joins each regexp with |.
+//
+// Following the lead of Bash 4.1, note that "**" only has special meaning
+// when it is the *only* thing in a path portion. Otherwise, any series
+// of * is equivalent to a single *. Globstar behavior is enabled by
+// default, and can be disabled by setting options.noglobstar.
+Minimatch$1.prototype.parse = parse$j;
+var SUBPARSE = {};
+function parse$j (pattern, isSub) {
+ if (pattern.length > 1024 * 64) {
+ throw new TypeError('pattern is too long')
+ }
+
+ var options = this.options;
+
+ // shortcuts
+ if (!options.noglobstar && pattern === '**') return GLOBSTAR$2
+ if (pattern === '') return ''
+
+ var re = '';
+ var hasMagic = !!options.nocase;
+ var escaping = false;
+ // ? => one single character
+ var patternListStack = [];
+ var negativeLists = [];
+ var stateChar;
+ var inClass = false;
+ var reClassStart = -1;
+ var classStart = -1;
+ // . and .. never match anything that doesn't start with .,
+ // even when options.dot is set.
+ var patternStart = pattern.charAt(0) === '.' ? '' // anything
+ // not (start or / followed by . or .. followed by / or end)
+ : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
+ : '(?!\\.)';
+ var self = this;
+
+ function clearStateChar () {
+ if (stateChar) {
+ // we had some state-tracking character
+ // that wasn't consumed by this pass.
+ switch (stateChar) {
+ case '*':
+ re += star;
+ hasMagic = true;
+ break
+ case '?':
+ re += qmark;
+ hasMagic = true;
+ break
+ default:
+ re += '\\' + stateChar;
+ break
+ }
+ self.debug('clearStateChar %j %j', stateChar, re);
+ stateChar = false;
+ }
+ }
+
+ for (var i = 0, len = pattern.length, c
+ ; (i < len) && (c = pattern.charAt(i))
+ ; i++) {
+ this.debug('%s\t%s %s %j', pattern, i, re, c);
+
+ // skip over any that are escaped.
+ if (escaping && reSpecials[c]) {
+ re += '\\' + c;
+ escaping = false;
+ continue
+ }
+
+ switch (c) {
+ case '/':
+ // completely not allowed, even escaped.
+ // Should already be path-split by now.
+ return false
+
+ case '\\':
+ clearStateChar();
+ escaping = true;
+ continue
+
+ // the various stateChar values
+ // for the "extglob" stuff.
+ case '?':
+ case '*':
+ case '+':
+ case '@':
+ case '!':
+ this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c);
+
+ // all of those are literals inside a class, except that
+ // the glob [!a] means [^a] in regexp
+ if (inClass) {
+ this.debug(' in class');
+ if (c === '!' && i === classStart + 1) c = '^';
+ re += c;
+ continue
+ }
+
+ // if we already have a stateChar, then it means
+ // that there was something like ** or +? in there.
+ // Handle the stateChar, then proceed with this one.
+ self.debug('call clearStateChar %j', stateChar);
+ clearStateChar();
+ stateChar = c;
+ // if extglob is disabled, then +(asdf|foo) isn't a thing.
+ // just clear the statechar *now*, rather than even diving into
+ // the patternList stuff.
+ if (options.noext) clearStateChar();
+ continue
+
+ case '(':
+ if (inClass) {
+ re += '(';
+ continue
+ }
+
+ if (!stateChar) {
+ re += '\\(';
+ continue
+ }
+
+ patternListStack.push({
+ type: stateChar,
+ start: i - 1,
+ reStart: re.length,
+ open: plTypes[stateChar].open,
+ close: plTypes[stateChar].close
+ });
+ // negation is (?:(?!js)[^/]*)
+ re += stateChar === '!' ? '(?:(?!(?:' : '(?:';
+ this.debug('plType %j %j', stateChar, re);
+ stateChar = false;
+ continue
+
+ case ')':
+ if (inClass || !patternListStack.length) {
+ re += '\\)';
+ continue
+ }
+
+ clearStateChar();
+ hasMagic = true;
+ var pl = patternListStack.pop();
+ // negation is (?:(?!js)[^/]*)
+ // The others are (?:)
+ re += pl.close;
+ if (pl.type === '!') {
+ negativeLists.push(pl);
+ }
+ pl.reEnd = re.length;
+ continue
+
+ case '|':
+ if (inClass || !patternListStack.length || escaping) {
+ re += '\\|';
+ escaping = false;
+ continue
+ }
+
+ clearStateChar();
+ re += '|';
+ continue
+
+ // these are mostly the same in regexp and glob
+ case '[':
+ // swallow any state-tracking char before the [
+ clearStateChar();
+
+ if (inClass) {
+ re += '\\' + c;
+ continue
+ }
+
+ inClass = true;
+ classStart = i;
+ reClassStart = re.length;
+ re += c;
+ continue
+
+ case ']':
+ // a right bracket shall lose its special
+ // meaning and represent itself in
+ // a bracket expression if it occurs
+ // first in the list. -- POSIX.2 2.8.3.2
+ if (i === classStart + 1 || !inClass) {
+ re += '\\' + c;
+ escaping = false;
+ continue
+ }
+
+ // handle the case where we left a class open.
+ // "[z-a]" is valid, equivalent to "\[z-a\]"
+ if (inClass) {
+ // split where the last [ was, make sure we don't have
+ // an invalid re. if so, re-walk the contents of the
+ // would-be class to re-translate any characters that
+ // were passed through as-is
+ // TODO: It would probably be faster to determine this
+ // without a try/catch and a new RegExp, but it's tricky
+ // to do safely. For now, this is safe and works.
+ var cs = pattern.substring(classStart + 1, i);
+ try {
+ } catch (er) {
+ // not a valid class!
+ var sp = this.parse(cs, SUBPARSE);
+ re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]';
+ hasMagic = hasMagic || sp[1];
+ inClass = false;
+ continue
+ }
+ }
+
+ // finish up the class.
+ hasMagic = true;
+ inClass = false;
+ re += c;
+ continue
+
+ default:
+ // swallow any state char that wasn't consumed
+ clearStateChar();
+
+ if (escaping) {
+ // no need
+ escaping = false;
+ } else if (reSpecials[c]
+ && !(c === '^' && inClass)) {
+ re += '\\';
+ }
+
+ re += c;
+
+ } // switch
+ } // for
+
+ // handle the case where we left a class open.
+ // "[abc" is valid, equivalent to "\[abc"
+ if (inClass) {
+ // split where the last [ was, and escape it
+ // this is a huge pita. We now have to re-walk
+ // the contents of the would-be class to re-translate
+ // any characters that were passed through as-is
+ cs = pattern.substr(classStart + 1);
+ sp = this.parse(cs, SUBPARSE);
+ re = re.substr(0, reClassStart) + '\\[' + sp[0];
+ hasMagic = hasMagic || sp[1];
+ }
+
+ // handle the case where we had a +( thing at the *end*
+ // of the pattern.
+ // each pattern list stack adds 3 chars, and we need to go through
+ // and escape any | chars that were passed through as-is for the regexp.
+ // Go through and escape them, taking care not to double-escape any
+ // | chars that were already escaped.
+ for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
+ var tail = re.slice(pl.reStart + pl.open.length);
+ this.debug('setting tail', re, pl);
+ // maybe some even number of \, then maybe 1 \, followed by a |
+ tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
+ if (!$2) {
+ // the | isn't already escaped, so escape it.
+ $2 = '\\';
+ }
+
+ // need to escape all those slashes *again*, without escaping the
+ // one that we need for escaping the | character. As it works out,
+ // escaping an even number of slashes can be done by simply repeating
+ // it exactly after itself. That's why this trick works.
+ //
+ // I am sorry that you have to see this.
+ return $1 + $1 + $2 + '|'
+ });
+
+ this.debug('tail=%j\n %s', tail, tail, pl, re);
+ var t = pl.type === '*' ? star
+ : pl.type === '?' ? qmark
+ : '\\' + pl.type;
+
+ hasMagic = true;
+ re = re.slice(0, pl.reStart) + t + '\\(' + tail;
+ }
+
+ // handle trailing things that only matter at the very end.
+ clearStateChar();
+ if (escaping) {
+ // trailing \\
+ re += '\\\\';
+ }
+
+ // only need to apply the nodot start if the re starts with
+ // something that could conceivably capture a dot
+ var addPatternStart = false;
+ switch (re.charAt(0)) {
+ case '.':
+ case '[':
+ case '(': addPatternStart = true;
+ }
+
+ // Hack to work around lack of negative lookbehind in JS
+ // A pattern like: *.!(x).!(y|z) needs to ensure that a name
+ // like 'a.xyz.yz' doesn't match. So, the first negative
+ // lookahead, has to look ALL the way ahead, to the end of
+ // the pattern.
+ for (var n = negativeLists.length - 1; n > -1; n--) {
+ var nl = negativeLists[n];
+
+ var nlBefore = re.slice(0, nl.reStart);
+ var nlFirst = re.slice(nl.reStart, nl.reEnd - 8);
+ var nlLast = re.slice(nl.reEnd - 8, nl.reEnd);
+ var nlAfter = re.slice(nl.reEnd);
+
+ nlLast += nlAfter;
+
+ // Handle nested stuff like *(*.js|!(*.json)), where open parens
+ // mean that we should *not* include the ) in the bit that is considered
+ // "after" the negated section.
+ var openParensBefore = nlBefore.split('(').length - 1;
+ var cleanAfter = nlAfter;
+ for (i = 0; i < openParensBefore; i++) {
+ cleanAfter = cleanAfter.replace(/\)[+*?]?/, '');
+ }
+ nlAfter = cleanAfter;
+
+ var dollar = '';
+ if (nlAfter === '' && isSub !== SUBPARSE) {
+ dollar = '$';
+ }
+ var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast;
+ re = newRe;
+ }
+
+ // if the re is not "" at this point, then we need to make sure
+ // it doesn't match against an empty path part.
+ // Otherwise a/* will match a/, which it should not.
+ if (re !== '' && hasMagic) {
+ re = '(?=.)' + re;
+ }
+
+ if (addPatternStart) {
+ re = patternStart + re;
+ }
+
+ // parsing just a piece of a larger pattern.
+ if (isSub === SUBPARSE) {
+ return [re, hasMagic]
+ }
+
+ // skip the regexp for non-magical patterns
+ // unescape anything in it, though, so that it'll be
+ // an exact match against a file etc.
+ if (!hasMagic) {
+ return globUnescape(pattern)
+ }
+
+ var flags = options.nocase ? 'i' : '';
+ try {
+ var regExp = new RegExp('^' + re + '$', flags);
+ } catch (er) {
+ // If it was an invalid regular expression, then it can't match
+ // anything. This trick looks for a character after the end of
+ // the string, which is of course impossible, except in multi-line
+ // mode, but it's not a /m regex.
+ return new RegExp('$.')
+ }
+
+ regExp._glob = pattern;
+ regExp._src = re;
+
+ return regExp
+}
+
+minimatch$3.makeRe = function (pattern, options) {
+ return new Minimatch$1(pattern, options || {}).makeRe()
+};
+
+Minimatch$1.prototype.makeRe = makeRe$1;
+function makeRe$1 () {
+ if (this.regexp || this.regexp === false) return this.regexp
+
+ // at this point, this.set is a 2d array of partial
+ // pattern strings, or "**".
+ //
+ // It's better to use .match(). This function shouldn't
+ // be used, really, but it's pretty convenient sometimes,
+ // when you just want to work with a regex.
+ var set = this.set;
+
+ if (!set.length) {
+ this.regexp = false;
+ return this.regexp
+ }
+ var options = this.options;
+
+ var twoStar = options.noglobstar ? star
+ : options.dot ? twoStarDot
+ : twoStarNoDot;
+ var flags = options.nocase ? 'i' : '';
+
+ var re = set.map(function (pattern) {
+ return pattern.map(function (p) {
+ return (p === GLOBSTAR$2) ? twoStar
+ : (typeof p === 'string') ? regExpEscape(p)
+ : p._src
+ }).join('\\\/')
+ }).join('|');
+
+ // must match entire pattern
+ // ending in a * or ** will make it less strict.
+ re = '^(?:' + re + ')$';
+
+ // can match anything, as long as it's not this.
+ if (this.negate) re = '^(?!' + re + ').*$';
+
+ try {
+ this.regexp = new RegExp(re, flags);
+ } catch (ex) {
+ this.regexp = false;
+ }
+ return this.regexp
+}
+
+minimatch$3.match = function (list, pattern, options) {
+ options = options || {};
+ var mm = new Minimatch$1(pattern, options);
+ list = list.filter(function (f) {
+ return mm.match(f)
+ });
+ if (mm.options.nonull && !list.length) {
+ list.push(pattern);
+ }
+ return list
+};
+
+Minimatch$1.prototype.match = match;
+function match (f, partial) {
+ this.debug('match', f, this.pattern);
+ // short-circuit in the case of busted things.
+ // comments, etc.
+ if (this.comment) return false
+ if (this.empty) return f === ''
+
+ if (f === '/' && partial) return true
+
+ var options = this.options;
+
+ // windows: need to use /, not \
+ if (path$k.sep !== '/') {
+ f = f.split(path$k.sep).join('/');
+ }
+
+ // treat the test path as a set of pathparts.
+ f = f.split(slashSplit);
+ this.debug(this.pattern, 'split', f);
+
+ // just ONE of the pattern sets in this.set needs to match
+ // in order for it to be valid. If negating, then just one
+ // match means that we have failed.
+ // Either way, return on the first hit.
+
+ var set = this.set;
+ this.debug(this.pattern, 'set', set);
+
+ // Find the basename of the path by looking for the last non-empty segment
+ var filename;
+ var i;
+ for (i = f.length - 1; i >= 0; i--) {
+ filename = f[i];
+ if (filename) break
+ }
+
+ for (i = 0; i < set.length; i++) {
+ var pattern = set[i];
+ var file = f;
+ if (options.matchBase && pattern.length === 1) {
+ file = [filename];
+ }
+ var hit = this.matchOne(file, pattern, partial);
+ if (hit) {
+ if (options.flipNegate) return true
+ return !this.negate
+ }
+ }
+
+ // didn't get any hits. this is success if it's a negative
+ // pattern, failure otherwise.
+ if (options.flipNegate) return false
+ return this.negate
+}
+
+// set partial to true to test if, for example,
+// "/a/b" matches the start of "/*/b/*/d"
+// Partial means, if you run out of file before you run
+// out of pattern, then that's fine, as long as all
+// the parts match.
+Minimatch$1.prototype.matchOne = function (file, pattern, partial) {
+ var options = this.options;
+
+ this.debug('matchOne',
+ { 'this': this, file: file, pattern: pattern });
+
+ this.debug('matchOne', file.length, pattern.length);
+
+ for (var fi = 0,
+ pi = 0,
+ fl = file.length,
+ pl = pattern.length
+ ; (fi < fl) && (pi < pl)
+ ; fi++, pi++) {
+ this.debug('matchOne loop');
+ var p = pattern[pi];
+ var f = file[fi];
+
+ this.debug(pattern, p, f);
+
+ // should be impossible.
+ // some invalid regexp stuff in the set.
+ if (p === false) return false
+
+ if (p === GLOBSTAR$2) {
+ this.debug('GLOBSTAR', [pattern, p, f]);
+
+ // "**"
+ // a/**/b/**/c would match the following:
+ // a/b/x/y/z/c
+ // a/x/y/z/b/c
+ // a/b/x/b/x/c
+ // a/b/c
+ // To do this, take the rest of the pattern after
+ // the **, and see if it would match the file remainder.
+ // If so, return success.
+ // If not, the ** "swallows" a segment, and try again.
+ // This is recursively awful.
+ //
+ // a/**/b/**/c matching a/b/x/y/z/c
+ // - a matches a
+ // - doublestar
+ // - matchOne(b/x/y/z/c, b/**/c)
+ // - b matches b
+ // - doublestar
+ // - matchOne(x/y/z/c, c) -> no
+ // - matchOne(y/z/c, c) -> no
+ // - matchOne(z/c, c) -> no
+ // - matchOne(c, c) yes, hit
+ var fr = fi;
+ var pr = pi + 1;
+ if (pr === pl) {
+ this.debug('** at the end');
+ // a ** at the end will just swallow the rest.
+ // We have found a match.
+ // however, it will not swallow /.x, unless
+ // options.dot is set.
+ // . and .. are *never* matched by **, for explosively
+ // exponential reasons.
+ for (; fi < fl; fi++) {
+ if (file[fi] === '.' || file[fi] === '..' ||
+ (!options.dot && file[fi].charAt(0) === '.')) return false
+ }
+ return true
+ }
+
+ // ok, let's see if we can swallow whatever we can.
+ while (fr < fl) {
+ var swallowee = file[fr];
+
+ this.debug('\nglobstar while', file, fr, pattern, pr, swallowee);
+
+ // XXX remove this slice. Just pass the start index.
+ if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
+ this.debug('globstar found match!', fr, fl, swallowee);
+ // found a match.
+ return true
+ } else {
+ // can't swallow "." or ".." ever.
+ // can only swallow ".foo" when explicitly asked.
+ if (swallowee === '.' || swallowee === '..' ||
+ (!options.dot && swallowee.charAt(0) === '.')) {
+ this.debug('dot detected!', file, fr, pattern, pr);
+ break
+ }
+
+ // ** swallows a segment, and continue.
+ this.debug('globstar swallow a segment, and continue');
+ fr++;
+ }
+ }
+
+ // no match was found.
+ // However, in partial mode, we can't say this is necessarily over.
+ // If there's more *pattern* left, then
+ if (partial) {
+ // ran out of file
+ this.debug('\n>>> no match, partial?', file, fr, pattern, pr);
+ if (fr === fl) return true
+ }
+ return false
+ }
+
+ // something other than **
+ // non-magic patterns just have to match exactly
+ // patterns with magic have been turned into regexps.
+ var hit;
+ if (typeof p === 'string') {
+ if (options.nocase) {
+ hit = f.toLowerCase() === p.toLowerCase();
+ } else {
+ hit = f === p;
+ }
+ this.debug('string match', p, f, hit);
+ } else {
+ hit = f.match(p);
+ this.debug('pattern match', p, f, hit);
+ }
+
+ if (!hit) return false
+ }
+
+ // Note: ending in / means that we'll get a final ""
+ // at the end of the pattern. This can only match a
+ // corresponding "" at the end of the file.
+ // If the file ends in /, then it can only match a
+ // a pattern that ends in /, unless the pattern just
+ // doesn't have any more for it. But, a/b/ should *not*
+ // match "a/b/*", even though "" matches against the
+ // [^/]*? pattern, except in partial mode, where it might
+ // simply not be reached yet.
+ // However, a/b/ should still satisfy a/*
+
+ // now either we fell off the end of the pattern, or we're done.
+ if (fi === fl && pi === pl) {
+ // ran out of pattern and filename at the same time.
+ // an exact hit!
+ return true
+ } else if (fi === fl) {
+ // ran out of file, but still had pattern left.
+ // this is ok if we're doing the match as part of
+ // a glob fs traversal.
+ return partial
+ } else if (pi === pl) {
+ // ran out of pattern, still have file left.
+ // this is only acceptable if we're on the very last
+ // empty segment of a file with a trailing slash.
+ // a/* should match a/b/
+ var emptyFileEnd = (fi === fl - 1) && (file[fi] === '');
+ return emptyFileEnd
+ }
+
+ // should be unreachable.
+ throw new Error('wtf?')
+};
+
+// replace stuff like \* with *
+function globUnescape (s) {
+ return s.replace(/\\(.)/g, '$1')
+}
+
+function regExpEscape (s) {
+ return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
+}
+
+var inherits$1 = {exports: {}};
+
+var inherits_browser = {exports: {}};
+
+if (typeof Object.create === 'function') {
+ // implementation from standard node.js 'util' module
+ inherits_browser.exports = function inherits(ctor, superCtor) {
+ if (superCtor) {
+ ctor.super_ = superCtor;
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ }
+ };
+} else {
+ // old school shim for old browsers
+ inherits_browser.exports = function inherits(ctor, superCtor) {
+ if (superCtor) {
+ ctor.super_ = superCtor;
+ var TempCtor = function () {};
+ TempCtor.prototype = superCtor.prototype;
+ ctor.prototype = new TempCtor();
+ ctor.prototype.constructor = ctor;
+ }
+ };
+}
+
+try {
+ var util$4 = require('util');
+ /* istanbul ignore next */
+ if (typeof util$4.inherits !== 'function') throw '';
+ inherits$1.exports = util$4.inherits;
+} catch (e) {
+ /* istanbul ignore next */
+ inherits$1.exports = inherits_browser.exports;
+}
+
+var pathIsAbsolute = {exports: {}};
+
+function posix(path) {
+ return path.charAt(0) === '/';
+}
+
+function win32(path) {
+ // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56
+ var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/;
+ var result = splitDeviceRe.exec(path);
+ var device = result[1] || '';
+ var isUnc = Boolean(device && device.charAt(1) !== ':');
+
+ // UNC paths are always absolute
+ return Boolean(result[2] || isUnc);
+}
+
+pathIsAbsolute.exports = process.platform === 'win32' ? win32 : posix;
+pathIsAbsolute.exports.posix = posix;
+pathIsAbsolute.exports.win32 = win32;
+
+var common$e = {};
+
+common$e.setopts = setopts$2;
+common$e.ownProp = ownProp$2;
+common$e.makeAbs = makeAbs;
+common$e.finish = finish;
+common$e.mark = mark;
+common$e.isIgnored = isIgnored$2;
+common$e.childrenIgnored = childrenIgnored$2;
+
+function ownProp$2 (obj, field) {
+ return Object.prototype.hasOwnProperty.call(obj, field)
+}
+
+var fs$j = fs__default;
+var path$j = path__default;
+var minimatch$2 = minimatch_1;
+var isAbsolute$2 = pathIsAbsolute.exports;
+var Minimatch = minimatch$2.Minimatch;
+
+function alphasort (a, b) {
+ return a.localeCompare(b, 'en')
+}
+
+function setupIgnores (self, options) {
+ self.ignore = options.ignore || [];
+
+ if (!Array.isArray(self.ignore))
+ self.ignore = [self.ignore];
+
+ if (self.ignore.length) {
+ self.ignore = self.ignore.map(ignoreMap);
+ }
+}
+
+// ignore patterns are always in dot:true mode.
+function ignoreMap (pattern) {
+ var gmatcher = null;
+ if (pattern.slice(-3) === '/**') {
+ var gpattern = pattern.replace(/(\/\*\*)+$/, '');
+ gmatcher = new Minimatch(gpattern, { dot: true });
+ }
+
+ return {
+ matcher: new Minimatch(pattern, { dot: true }),
+ gmatcher: gmatcher
+ }
+}
+
+function setopts$2 (self, pattern, options) {
+ if (!options)
+ options = {};
+
+ // base-matching: just use globstar for that.
+ if (options.matchBase && -1 === pattern.indexOf("/")) {
+ if (options.noglobstar) {
+ throw new Error("base matching requires globstar")
+ }
+ pattern = "**/" + pattern;
+ }
+
+ self.silent = !!options.silent;
+ self.pattern = pattern;
+ self.strict = options.strict !== false;
+ self.realpath = !!options.realpath;
+ self.realpathCache = options.realpathCache || Object.create(null);
+ self.follow = !!options.follow;
+ self.dot = !!options.dot;
+ self.mark = !!options.mark;
+ self.nodir = !!options.nodir;
+ if (self.nodir)
+ self.mark = true;
+ self.sync = !!options.sync;
+ self.nounique = !!options.nounique;
+ self.nonull = !!options.nonull;
+ self.nosort = !!options.nosort;
+ self.nocase = !!options.nocase;
+ self.stat = !!options.stat;
+ self.noprocess = !!options.noprocess;
+ self.absolute = !!options.absolute;
+ self.fs = options.fs || fs$j;
+
+ self.maxLength = options.maxLength || Infinity;
+ self.cache = options.cache || Object.create(null);
+ self.statCache = options.statCache || Object.create(null);
+ self.symlinks = options.symlinks || Object.create(null);
+
+ setupIgnores(self, options);
+
+ self.changedCwd = false;
+ var cwd = process.cwd();
+ if (!ownProp$2(options, "cwd"))
+ self.cwd = cwd;
+ else {
+ self.cwd = path$j.resolve(options.cwd);
+ self.changedCwd = self.cwd !== cwd;
+ }
+
+ self.root = options.root || path$j.resolve(self.cwd, "/");
+ self.root = path$j.resolve(self.root);
+ if (process.platform === "win32")
+ self.root = self.root.replace(/\\/g, "/");
+
+ // TODO: is an absolute `cwd` supposed to be resolved against `root`?
+ // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')
+ self.cwdAbs = isAbsolute$2(self.cwd) ? self.cwd : makeAbs(self, self.cwd);
+ if (process.platform === "win32")
+ self.cwdAbs = self.cwdAbs.replace(/\\/g, "/");
+ self.nomount = !!options.nomount;
+
+ // disable comments and negation in Minimatch.
+ // Note that they are not supported in Glob itself anyway.
+ options.nonegate = true;
+ options.nocomment = true;
+
+ self.minimatch = new Minimatch(pattern, options);
+ self.options = self.minimatch.options;
+}
+
+function finish (self) {
+ var nou = self.nounique;
+ var all = nou ? [] : Object.create(null);
+
+ for (var i = 0, l = self.matches.length; i < l; i ++) {
+ var matches = self.matches[i];
+ if (!matches || Object.keys(matches).length === 0) {
+ if (self.nonull) {
+ // do like the shell, and spit out the literal glob
+ var literal = self.minimatch.globSet[i];
+ if (nou)
+ all.push(literal);
+ else
+ all[literal] = true;
+ }
+ } else {
+ // had matches
+ var m = Object.keys(matches);
+ if (nou)
+ all.push.apply(all, m);
+ else
+ m.forEach(function (m) {
+ all[m] = true;
+ });
+ }
+ }
+
+ if (!nou)
+ all = Object.keys(all);
+
+ if (!self.nosort)
+ all = all.sort(alphasort);
+
+ // at *some* point we statted all of these
+ if (self.mark) {
+ for (var i = 0; i < all.length; i++) {
+ all[i] = self._mark(all[i]);
+ }
+ if (self.nodir) {
+ all = all.filter(function (e) {
+ var notDir = !(/\/$/.test(e));
+ var c = self.cache[e] || self.cache[makeAbs(self, e)];
+ if (notDir && c)
+ notDir = c !== 'DIR' && !Array.isArray(c);
+ return notDir
+ });
+ }
+ }
+
+ if (self.ignore.length)
+ all = all.filter(function(m) {
+ return !isIgnored$2(self, m)
+ });
+
+ self.found = all;
+}
+
+function mark (self, p) {
+ var abs = makeAbs(self, p);
+ var c = self.cache[abs];
+ var m = p;
+ if (c) {
+ var isDir = c === 'DIR' || Array.isArray(c);
+ var slash = p.slice(-1) === '/';
+
+ if (isDir && !slash)
+ m += '/';
+ else if (!isDir && slash)
+ m = m.slice(0, -1);
+
+ if (m !== p) {
+ var mabs = makeAbs(self, m);
+ self.statCache[mabs] = self.statCache[abs];
+ self.cache[mabs] = self.cache[abs];
+ }
+ }
+
+ return m
+}
+
+// lotta situps...
+function makeAbs (self, f) {
+ var abs = f;
+ if (f.charAt(0) === '/') {
+ abs = path$j.join(self.root, f);
+ } else if (isAbsolute$2(f) || f === '') {
+ abs = f;
+ } else if (self.changedCwd) {
+ abs = path$j.resolve(self.cwd, f);
+ } else {
+ abs = path$j.resolve(f);
+ }
+
+ if (process.platform === 'win32')
+ abs = abs.replace(/\\/g, '/');
+
+ return abs
+}
+
+
+// Return true, if pattern ends with globstar '**', for the accompanying parent directory.
+// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents
+function isIgnored$2 (self, path) {
+ if (!self.ignore.length)
+ return false
+
+ return self.ignore.some(function(item) {
+ return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))
+ })
+}
+
+function childrenIgnored$2 (self, path) {
+ if (!self.ignore.length)
+ return false
+
+ return self.ignore.some(function(item) {
+ return !!(item.gmatcher && item.gmatcher.match(path))
+ })
+}
+
+var sync$b = globSync$1;
+globSync$1.GlobSync = GlobSync$1;
+
+var rp$1 = fs_realpath;
+var minimatch$1 = minimatch_1;
+var path$i = path__default;
+var assert$2 = require$$5__default;
+var isAbsolute$1 = pathIsAbsolute.exports;
+var common$d = common$e;
+var setopts$1 = common$d.setopts;
+var ownProp$1 = common$d.ownProp;
+var childrenIgnored$1 = common$d.childrenIgnored;
+var isIgnored$1 = common$d.isIgnored;
+
+function globSync$1 (pattern, options) {
+ if (typeof options === 'function' || arguments.length === 3)
+ throw new TypeError('callback provided to sync glob\n'+
+ 'See: https://github.com/isaacs/node-glob/issues/167')
+
+ return new GlobSync$1(pattern, options).found
+}
+
+function GlobSync$1 (pattern, options) {
+ if (!pattern)
+ throw new Error('must provide pattern')
+
+ if (typeof options === 'function' || arguments.length === 3)
+ throw new TypeError('callback provided to sync glob\n'+
+ 'See: https://github.com/isaacs/node-glob/issues/167')
+
+ if (!(this instanceof GlobSync$1))
+ return new GlobSync$1(pattern, options)
+
+ setopts$1(this, pattern, options);
+
+ if (this.noprocess)
+ return this
+
+ var n = this.minimatch.set.length;
+ this.matches = new Array(n);
+ for (var i = 0; i < n; i ++) {
+ this._process(this.minimatch.set[i], i, false);
+ }
+ this._finish();
+}
+
+GlobSync$1.prototype._finish = function () {
+ assert$2(this instanceof GlobSync$1);
+ if (this.realpath) {
+ var self = this;
+ this.matches.forEach(function (matchset, index) {
+ var set = self.matches[index] = Object.create(null);
+ for (var p in matchset) {
+ try {
+ p = self._makeAbs(p);
+ var real = rp$1.realpathSync(p, self.realpathCache);
+ set[real] = true;
+ } catch (er) {
+ if (er.syscall === 'stat')
+ set[self._makeAbs(p)] = true;
+ else
+ throw er
+ }
+ }
+ });
+ }
+ common$d.finish(this);
+};
+
+
+GlobSync$1.prototype._process = function (pattern, index, inGlobStar) {
+ assert$2(this instanceof GlobSync$1);
+
+ // Get the first [n] parts of pattern that are all strings.
+ var n = 0;
+ while (typeof pattern[n] === 'string') {
+ n ++;
+ }
+ // now n is the index of the first one that is *not* a string.
+
+ // See if there's anything else
+ var prefix;
+ switch (n) {
+ // if not, then this is rather simple
+ case pattern.length:
+ this._processSimple(pattern.join('/'), index);
+ return
+
+ case 0:
+ // pattern *starts* with some non-trivial item.
+ // going to readdir(cwd), but not include the prefix in matches.
+ prefix = null;
+ break
+
+ default:
+ // pattern has some string bits in the front.
+ // whatever it starts with, whether that's 'absolute' like /foo/bar,
+ // or 'relative' like '../baz'
+ prefix = pattern.slice(0, n).join('/');
+ break
+ }
+
+ var remain = pattern.slice(n);
+
+ // get the list of entries.
+ var read;
+ if (prefix === null)
+ read = '.';
+ else if (isAbsolute$1(prefix) || isAbsolute$1(pattern.join('/'))) {
+ if (!prefix || !isAbsolute$1(prefix))
+ prefix = '/' + prefix;
+ read = prefix;
+ } else
+ read = prefix;
+
+ var abs = this._makeAbs(read);
+
+ //if ignored, skip processing
+ if (childrenIgnored$1(this, read))
+ return
+
+ var isGlobStar = remain[0] === minimatch$1.GLOBSTAR;
+ if (isGlobStar)
+ this._processGlobStar(prefix, read, abs, remain, index, inGlobStar);
+ else
+ this._processReaddir(prefix, read, abs, remain, index, inGlobStar);
+};
+
+
+GlobSync$1.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {
+ var entries = this._readdir(abs, inGlobStar);
+
+ // if the abs isn't a dir, then nothing can match!
+ if (!entries)
+ return
+
+ // It will only match dot entries if it starts with a dot, or if
+ // dot is set. Stuff like @(.foo|.bar) isn't allowed.
+ var pn = remain[0];
+ var negate = !!this.minimatch.negate;
+ var rawGlob = pn._glob;
+ var dotOk = this.dot || rawGlob.charAt(0) === '.';
+
+ var matchedEntries = [];
+ for (var i = 0; i < entries.length; i++) {
+ var e = entries[i];
+ if (e.charAt(0) !== '.' || dotOk) {
+ var m;
+ if (negate && !prefix) {
+ m = !e.match(pn);
+ } else {
+ m = e.match(pn);
+ }
+ if (m)
+ matchedEntries.push(e);
+ }
+ }
+
+ var len = matchedEntries.length;
+ // If there are no matched entries, then nothing matches.
+ if (len === 0)
+ return
+
+ // if this is the last remaining pattern bit, then no need for
+ // an additional stat *unless* the user has specified mark or
+ // stat explicitly. We know they exist, since readdir returned
+ // them.
+
+ if (remain.length === 1 && !this.mark && !this.stat) {
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null);
+
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i];
+ if (prefix) {
+ if (prefix.slice(-1) !== '/')
+ e = prefix + '/' + e;
+ else
+ e = prefix + e;
+ }
+
+ if (e.charAt(0) === '/' && !this.nomount) {
+ e = path$i.join(this.root, e);
+ }
+ this._emitMatch(index, e);
+ }
+ // This was the last one, and no stats were needed
+ return
+ }
+
+ // now test all matched entries as stand-ins for that part
+ // of the pattern.
+ remain.shift();
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i];
+ var newPattern;
+ if (prefix)
+ newPattern = [prefix, e];
+ else
+ newPattern = [e];
+ this._process(newPattern.concat(remain), index, inGlobStar);
+ }
+};
+
+
+GlobSync$1.prototype._emitMatch = function (index, e) {
+ if (isIgnored$1(this, e))
+ return
+
+ var abs = this._makeAbs(e);
+
+ if (this.mark)
+ e = this._mark(e);
+
+ if (this.absolute) {
+ e = abs;
+ }
+
+ if (this.matches[index][e])
+ return
+
+ if (this.nodir) {
+ var c = this.cache[abs];
+ if (c === 'DIR' || Array.isArray(c))
+ return
+ }
+
+ this.matches[index][e] = true;
+
+ if (this.stat)
+ this._stat(e);
+};
+
+
+GlobSync$1.prototype._readdirInGlobStar = function (abs) {
+ // follow all symlinked directories forever
+ // just proceed as if this is a non-globstar situation
+ if (this.follow)
+ return this._readdir(abs, false)
+
+ var entries;
+ var lstat;
+ try {
+ lstat = this.fs.lstatSync(abs);
+ } catch (er) {
+ if (er.code === 'ENOENT') {
+ // lstat failed, doesn't exist
+ return null
+ }
+ }
+
+ var isSym = lstat && lstat.isSymbolicLink();
+ this.symlinks[abs] = isSym;
+
+ // If it's not a symlink or a dir, then it's definitely a regular file.
+ // don't bother doing a readdir in that case.
+ if (!isSym && lstat && !lstat.isDirectory())
+ this.cache[abs] = 'FILE';
+ else
+ entries = this._readdir(abs, false);
+
+ return entries
+};
+
+GlobSync$1.prototype._readdir = function (abs, inGlobStar) {
+
+ if (inGlobStar && !ownProp$1(this.symlinks, abs))
+ return this._readdirInGlobStar(abs)
+
+ if (ownProp$1(this.cache, abs)) {
+ var c = this.cache[abs];
+ if (!c || c === 'FILE')
+ return null
+
+ if (Array.isArray(c))
+ return c
+ }
+
+ try {
+ return this._readdirEntries(abs, this.fs.readdirSync(abs))
+ } catch (er) {
+ this._readdirError(abs, er);
+ return null
+ }
+};
+
+GlobSync$1.prototype._readdirEntries = function (abs, entries) {
+ // if we haven't asked to stat everything, then just
+ // assume that everything in there exists, so we can avoid
+ // having to stat it a second time.
+ if (!this.mark && !this.stat) {
+ for (var i = 0; i < entries.length; i ++) {
+ var e = entries[i];
+ if (abs === '/')
+ e = abs + e;
+ else
+ e = abs + '/' + e;
+ this.cache[e] = true;
+ }
+ }
+
+ this.cache[abs] = entries;
+
+ // mark and cache dir-ness
+ return entries
+};
+
+GlobSync$1.prototype._readdirError = function (f, er) {
+ // handle errors, and cache the information
+ switch (er.code) {
+ case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
+ case 'ENOTDIR': // totally normal. means it *does* exist.
+ var abs = this._makeAbs(f);
+ this.cache[abs] = 'FILE';
+ if (abs === this.cwdAbs) {
+ var error = new Error(er.code + ' invalid cwd ' + this.cwd);
+ error.path = this.cwd;
+ error.code = er.code;
+ throw error
+ }
+ break
+
+ case 'ENOENT': // not terribly unusual
+ case 'ELOOP':
+ case 'ENAMETOOLONG':
+ case 'UNKNOWN':
+ this.cache[this._makeAbs(f)] = false;
+ break
+
+ default: // some unusual error. Treat as failure.
+ this.cache[this._makeAbs(f)] = false;
+ if (this.strict)
+ throw er
+ if (!this.silent)
+ console.error('glob error', er);
+ break
+ }
+};
+
+GlobSync$1.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {
+
+ var entries = this._readdir(abs, inGlobStar);
+
+ // no entries means not a dir, so it can never have matches
+ // foo.txt/** doesn't match foo.txt
+ if (!entries)
+ return
+
+ // test without the globstar, and with every child both below
+ // and replacing the globstar.
+ var remainWithoutGlobStar = remain.slice(1);
+ var gspref = prefix ? [ prefix ] : [];
+ var noGlobStar = gspref.concat(remainWithoutGlobStar);
+
+ // the noGlobStar pattern exits the inGlobStar state
+ this._process(noGlobStar, index, false);
+
+ var len = entries.length;
+ var isSym = this.symlinks[abs];
+
+ // If it's a symlink, and we're in a globstar, then stop
+ if (isSym && inGlobStar)
+ return
+
+ for (var i = 0; i < len; i++) {
+ var e = entries[i];
+ if (e.charAt(0) === '.' && !this.dot)
+ continue
+
+ // these two cases enter the inGlobStar state
+ var instead = gspref.concat(entries[i], remainWithoutGlobStar);
+ this._process(instead, index, true);
+
+ var below = gspref.concat(entries[i], remain);
+ this._process(below, index, true);
+ }
+};
+
+GlobSync$1.prototype._processSimple = function (prefix, index) {
+ // XXX review this. Shouldn't it be doing the mounting etc
+ // before doing stat? kinda weird?
+ var exists = this._stat(prefix);
+
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null);
+
+ // If it doesn't exist, then just mark the lack of results
+ if (!exists)
+ return
+
+ if (prefix && isAbsolute$1(prefix) && !this.nomount) {
+ var trail = /[\/\\]$/.test(prefix);
+ if (prefix.charAt(0) === '/') {
+ prefix = path$i.join(this.root, prefix);
+ } else {
+ prefix = path$i.resolve(this.root, prefix);
+ if (trail)
+ prefix += '/';
+ }
+ }
+
+ if (process.platform === 'win32')
+ prefix = prefix.replace(/\\/g, '/');
+
+ // Mark this as a match
+ this._emitMatch(index, prefix);
+};
+
+// Returns either 'DIR', 'FILE', or false
+GlobSync$1.prototype._stat = function (f) {
+ var abs = this._makeAbs(f);
+ var needDir = f.slice(-1) === '/';
+
+ if (f.length > this.maxLength)
+ return false
+
+ if (!this.stat && ownProp$1(this.cache, abs)) {
+ var c = this.cache[abs];
+
+ if (Array.isArray(c))
+ c = 'DIR';
+
+ // It exists, but maybe not how we need it
+ if (!needDir || c === 'DIR')
+ return c
+
+ if (needDir && c === 'FILE')
+ return false
+
+ // otherwise we have to stat, because maybe c=true
+ // if we know it exists, but not what it is.
+ }
+ var stat = this.statCache[abs];
+ if (!stat) {
+ var lstat;
+ try {
+ lstat = this.fs.lstatSync(abs);
+ } catch (er) {
+ if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
+ this.statCache[abs] = false;
+ return false
+ }
+ }
+
+ if (lstat && lstat.isSymbolicLink()) {
+ try {
+ stat = this.fs.statSync(abs);
+ } catch (er) {
+ stat = lstat;
+ }
+ } else {
+ stat = lstat;
+ }
+ }
+
+ this.statCache[abs] = stat;
+
+ var c = true;
+ if (stat)
+ c = stat.isDirectory() ? 'DIR' : 'FILE';
+
+ this.cache[abs] = this.cache[abs] || c;
+
+ if (needDir && c === 'FILE')
+ return false
+
+ return c
+};
+
+GlobSync$1.prototype._mark = function (p) {
+ return common$d.mark(this, p)
+};
+
+GlobSync$1.prototype._makeAbs = function (f) {
+ return common$d.makeAbs(this, f)
+};
+
+// Returns a wrapper function that returns a wrapped callback
+// The wrapper function should do some stuff, and return a
+// presumably different callback function.
+// This makes sure that own properties are retained, so that
+// decorations and such are not lost along the way.
+var wrappy_1 = wrappy$2;
+function wrappy$2 (fn, cb) {
+ if (fn && cb) return wrappy$2(fn)(cb)
+
+ if (typeof fn !== 'function')
+ throw new TypeError('need wrapper function')
+
+ Object.keys(fn).forEach(function (k) {
+ wrapper[k] = fn[k];
+ });
+
+ return wrapper
+
+ function wrapper() {
+ var args = new Array(arguments.length);
+ for (var i = 0; i < args.length; i++) {
+ args[i] = arguments[i];
+ }
+ var ret = fn.apply(this, args);
+ var cb = args[args.length-1];
+ if (typeof ret === 'function' && ret !== cb) {
+ Object.keys(cb).forEach(function (k) {
+ ret[k] = cb[k];
+ });
+ }
+ return ret
+ }
+}
+
+var once$3 = {exports: {}};
+
+var wrappy$1 = wrappy_1;
+once$3.exports = wrappy$1(once$2);
+once$3.exports.strict = wrappy$1(onceStrict);
+
+once$2.proto = once$2(function () {
+ Object.defineProperty(Function.prototype, 'once', {
+ value: function () {
+ return once$2(this)
+ },
+ configurable: true
+ });
+
+ Object.defineProperty(Function.prototype, 'onceStrict', {
+ value: function () {
+ return onceStrict(this)
+ },
+ configurable: true
+ });
+});
+
+function once$2 (fn) {
+ var f = function () {
+ if (f.called) return f.value
+ f.called = true;
+ return f.value = fn.apply(this, arguments)
+ };
+ f.called = false;
+ return f
+}
+
+function onceStrict (fn) {
+ var f = function () {
+ if (f.called)
+ throw new Error(f.onceError)
+ f.called = true;
+ return f.value = fn.apply(this, arguments)
+ };
+ var name = fn.name || 'Function wrapped with `once`';
+ f.onceError = name + " shouldn't be called more than once";
+ f.called = false;
+ return f
+}
+
+var wrappy = wrappy_1;
+var reqs = Object.create(null);
+var once$1 = once$3.exports;
+
+var inflight_1 = wrappy(inflight$1);
+
+function inflight$1 (key, cb) {
+ if (reqs[key]) {
+ reqs[key].push(cb);
+ return null
+ } else {
+ reqs[key] = [cb];
+ return makeres(key)
+ }
+}
+
+function makeres (key) {
+ return once$1(function RES () {
+ var cbs = reqs[key];
+ var len = cbs.length;
+ var args = slice$1(arguments);
+
+ // XXX It's somewhat ambiguous whether a new callback added in this
+ // pass should be queued for later execution if something in the
+ // list of callbacks throws, or if it should just be discarded.
+ // However, it's such an edge case that it hardly matters, and either
+ // choice is likely as surprising as the other.
+ // As it happens, we do go ahead and schedule it for later execution.
+ try {
+ for (var i = 0; i < len; i++) {
+ cbs[i].apply(null, args);
+ }
+ } finally {
+ if (cbs.length > len) {
+ // added more in the interim.
+ // de-zalgo, just in case, but don't call again.
+ cbs.splice(0, len);
+ process.nextTick(function () {
+ RES.apply(null, args);
+ });
+ } else {
+ delete reqs[key];
+ }
+ }
+ })
+}
+
+function slice$1 (args) {
+ var length = args.length;
+ var array = [];
+
+ for (var i = 0; i < length; i++) array[i] = args[i];
+ return array
+}
+
+// Approach:
+//
+// 1. Get the minimatch set
+// 2. For each pattern in the set, PROCESS(pattern, false)
+// 3. Store matches per-set, then uniq them
+//
+// PROCESS(pattern, inGlobStar)
+// Get the first [n] items from pattern that are all strings
+// Join these together. This is PREFIX.
+// If there is no more remaining, then stat(PREFIX) and
+// add to matches if it succeeds. END.
+//
+// If inGlobStar and PREFIX is symlink and points to dir
+// set ENTRIES = []
+// else readdir(PREFIX) as ENTRIES
+// If fail, END
+//
+// with ENTRIES
+// If pattern[n] is GLOBSTAR
+// // handle the case where the globstar match is empty
+// // by pruning it out, and testing the resulting pattern
+// PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
+// // handle other cases.
+// for ENTRY in ENTRIES (not dotfiles)
+// // attach globstar + tail onto the entry
+// // Mark that this entry is a globstar match
+// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
+//
+// else // not globstar
+// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
+// Test ENTRY against pattern[n]
+// If fails, continue
+// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
+//
+// Caveat:
+// Cache all stats and readdirs results to minimize syscall. Since all
+// we ever care about is existence and directory-ness, we can just keep
+// `true` for files, and [children,...] for directories, or `false` for
+// things that don't exist.
+
+var glob_1 = glob;
+
+var rp = fs_realpath;
+var minimatch = minimatch_1;
+var inherits = inherits$1.exports;
+var EE = require$$0__default$1.EventEmitter;
+var path$h = path__default;
+var assert$1 = require$$5__default;
+var isAbsolute = pathIsAbsolute.exports;
+var globSync = sync$b;
+var common$c = common$e;
+var setopts = common$c.setopts;
+var ownProp = common$c.ownProp;
+var inflight = inflight_1;
+var childrenIgnored = common$c.childrenIgnored;
+var isIgnored = common$c.isIgnored;
+
+var once = once$3.exports;
+
+function glob (pattern, options, cb) {
+ if (typeof options === 'function') cb = options, options = {};
+ if (!options) options = {};
+
+ if (options.sync) {
+ if (cb)
+ throw new TypeError('callback provided to sync glob')
+ return globSync(pattern, options)
+ }
+
+ return new Glob(pattern, options, cb)
+}
+
+glob.sync = globSync;
+var GlobSync = glob.GlobSync = globSync.GlobSync;
+
+// old api surface
+glob.glob = glob;
+
+function extend (origin, add) {
+ if (add === null || typeof add !== 'object') {
+ return origin
+ }
+
+ var keys = Object.keys(add);
+ var i = keys.length;
+ while (i--) {
+ origin[keys[i]] = add[keys[i]];
+ }
+ return origin
+}
+
+glob.hasMagic = function (pattern, options_) {
+ var options = extend({}, options_);
+ options.noprocess = true;
+
+ var g = new Glob(pattern, options);
+ var set = g.minimatch.set;
+
+ if (!pattern)
+ return false
+
+ if (set.length > 1)
+ return true
+
+ for (var j = 0; j < set[0].length; j++) {
+ if (typeof set[0][j] !== 'string')
+ return true
+ }
+
+ return false
+};
+
+glob.Glob = Glob;
+inherits(Glob, EE);
+function Glob (pattern, options, cb) {
+ if (typeof options === 'function') {
+ cb = options;
+ options = null;
+ }
+
+ if (options && options.sync) {
+ if (cb)
+ throw new TypeError('callback provided to sync glob')
+ return new GlobSync(pattern, options)
+ }
+
+ if (!(this instanceof Glob))
+ return new Glob(pattern, options, cb)
+
+ setopts(this, pattern, options);
+ this._didRealPath = false;
+
+ // process each pattern in the minimatch set
+ var n = this.minimatch.set.length;
+
+ // The matches are stored as {: true,...} so that
+ // duplicates are automagically pruned.
+ // Later, we do an Object.keys() on these.
+ // Keep them as a list so we can fill in when nonull is set.
+ this.matches = new Array(n);
+
+ if (typeof cb === 'function') {
+ cb = once(cb);
+ this.on('error', cb);
+ this.on('end', function (matches) {
+ cb(null, matches);
+ });
+ }
+
+ var self = this;
+ this._processing = 0;
+
+ this._emitQueue = [];
+ this._processQueue = [];
+ this.paused = false;
+
+ if (this.noprocess)
+ return this
+
+ if (n === 0)
+ return done()
+
+ var sync = true;
+ for (var i = 0; i < n; i ++) {
+ this._process(this.minimatch.set[i], i, false, done);
+ }
+ sync = false;
+
+ function done () {
+ --self._processing;
+ if (self._processing <= 0) {
+ if (sync) {
+ process.nextTick(function () {
+ self._finish();
+ });
+ } else {
+ self._finish();
+ }
+ }
+ }
+}
+
+Glob.prototype._finish = function () {
+ assert$1(this instanceof Glob);
+ if (this.aborted)
+ return
+
+ if (this.realpath && !this._didRealpath)
+ return this._realpath()
+
+ common$c.finish(this);
+ this.emit('end', this.found);
+};
+
+Glob.prototype._realpath = function () {
+ if (this._didRealpath)
+ return
+
+ this._didRealpath = true;
+
+ var n = this.matches.length;
+ if (n === 0)
+ return this._finish()
+
+ var self = this;
+ for (var i = 0; i < this.matches.length; i++)
+ this._realpathSet(i, next);
+
+ function next () {
+ if (--n === 0)
+ self._finish();
+ }
+};
+
+Glob.prototype._realpathSet = function (index, cb) {
+ var matchset = this.matches[index];
+ if (!matchset)
+ return cb()
+
+ var found = Object.keys(matchset);
+ var self = this;
+ var n = found.length;
+
+ if (n === 0)
+ return cb()
+
+ var set = this.matches[index] = Object.create(null);
+ found.forEach(function (p, i) {
+ // If there's a problem with the stat, then it means that
+ // one or more of the links in the realpath couldn't be
+ // resolved. just return the abs value in that case.
+ p = self._makeAbs(p);
+ rp.realpath(p, self.realpathCache, function (er, real) {
+ if (!er)
+ set[real] = true;
+ else if (er.syscall === 'stat')
+ set[p] = true;
+ else
+ self.emit('error', er); // srsly wtf right here
+
+ if (--n === 0) {
+ self.matches[index] = set;
+ cb();
+ }
+ });
+ });
+};
+
+Glob.prototype._mark = function (p) {
+ return common$c.mark(this, p)
+};
+
+Glob.prototype._makeAbs = function (f) {
+ return common$c.makeAbs(this, f)
+};
+
+Glob.prototype.abort = function () {
+ this.aborted = true;
+ this.emit('abort');
+};
+
+Glob.prototype.pause = function () {
+ if (!this.paused) {
+ this.paused = true;
+ this.emit('pause');
+ }
+};
+
+Glob.prototype.resume = function () {
+ if (this.paused) {
+ this.emit('resume');
+ this.paused = false;
+ if (this._emitQueue.length) {
+ var eq = this._emitQueue.slice(0);
+ this._emitQueue.length = 0;
+ for (var i = 0; i < eq.length; i ++) {
+ var e = eq[i];
+ this._emitMatch(e[0], e[1]);
+ }
+ }
+ if (this._processQueue.length) {
+ var pq = this._processQueue.slice(0);
+ this._processQueue.length = 0;
+ for (var i = 0; i < pq.length; i ++) {
+ var p = pq[i];
+ this._processing--;
+ this._process(p[0], p[1], p[2], p[3]);
+ }
+ }
+ }
+};
+
+Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
+ assert$1(this instanceof Glob);
+ assert$1(typeof cb === 'function');
+
+ if (this.aborted)
+ return
+
+ this._processing++;
+ if (this.paused) {
+ this._processQueue.push([pattern, index, inGlobStar, cb]);
+ return
+ }
+
+ //console.error('PROCESS %d', this._processing, pattern)
+
+ // Get the first [n] parts of pattern that are all strings.
+ var n = 0;
+ while (typeof pattern[n] === 'string') {
+ n ++;
+ }
+ // now n is the index of the first one that is *not* a string.
+
+ // see if there's anything else
+ var prefix;
+ switch (n) {
+ // if not, then this is rather simple
+ case pattern.length:
+ this._processSimple(pattern.join('/'), index, cb);
+ return
+
+ case 0:
+ // pattern *starts* with some non-trivial item.
+ // going to readdir(cwd), but not include the prefix in matches.
+ prefix = null;
+ break
+
+ default:
+ // pattern has some string bits in the front.
+ // whatever it starts with, whether that's 'absolute' like /foo/bar,
+ // or 'relative' like '../baz'
+ prefix = pattern.slice(0, n).join('/');
+ break
+ }
+
+ var remain = pattern.slice(n);
+
+ // get the list of entries.
+ var read;
+ if (prefix === null)
+ read = '.';
+ else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {
+ if (!prefix || !isAbsolute(prefix))
+ prefix = '/' + prefix;
+ read = prefix;
+ } else
+ read = prefix;
+
+ var abs = this._makeAbs(read);
+
+ //if ignored, skip _processing
+ if (childrenIgnored(this, read))
+ return cb()
+
+ var isGlobStar = remain[0] === minimatch.GLOBSTAR;
+ if (isGlobStar)
+ this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb);
+ else
+ this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb);
+};
+
+Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
+ var self = this;
+ this._readdir(abs, inGlobStar, function (er, entries) {
+ return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
+ });
+};
+
+Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
+
+ // if the abs isn't a dir, then nothing can match!
+ if (!entries)
+ return cb()
+
+ // It will only match dot entries if it starts with a dot, or if
+ // dot is set. Stuff like @(.foo|.bar) isn't allowed.
+ var pn = remain[0];
+ var negate = !!this.minimatch.negate;
+ var rawGlob = pn._glob;
+ var dotOk = this.dot || rawGlob.charAt(0) === '.';
+
+ var matchedEntries = [];
+ for (var i = 0; i < entries.length; i++) {
+ var e = entries[i];
+ if (e.charAt(0) !== '.' || dotOk) {
+ var m;
+ if (negate && !prefix) {
+ m = !e.match(pn);
+ } else {
+ m = e.match(pn);
+ }
+ if (m)
+ matchedEntries.push(e);
+ }
+ }
+
+ //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)
+
+ var len = matchedEntries.length;
+ // If there are no matched entries, then nothing matches.
+ if (len === 0)
+ return cb()
+
+ // if this is the last remaining pattern bit, then no need for
+ // an additional stat *unless* the user has specified mark or
+ // stat explicitly. We know they exist, since readdir returned
+ // them.
+
+ if (remain.length === 1 && !this.mark && !this.stat) {
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null);
+
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i];
+ if (prefix) {
+ if (prefix !== '/')
+ e = prefix + '/' + e;
+ else
+ e = prefix + e;
+ }
+
+ if (e.charAt(0) === '/' && !this.nomount) {
+ e = path$h.join(this.root, e);
+ }
+ this._emitMatch(index, e);
+ }
+ // This was the last one, and no stats were needed
+ return cb()
+ }
+
+ // now test all matched entries as stand-ins for that part
+ // of the pattern.
+ remain.shift();
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i];
+ if (prefix) {
+ if (prefix !== '/')
+ e = prefix + '/' + e;
+ else
+ e = prefix + e;
+ }
+ this._process([e].concat(remain), index, inGlobStar, cb);
+ }
+ cb();
+};
+
+Glob.prototype._emitMatch = function (index, e) {
+ if (this.aborted)
+ return
+
+ if (isIgnored(this, e))
+ return
+
+ if (this.paused) {
+ this._emitQueue.push([index, e]);
+ return
+ }
+
+ var abs = isAbsolute(e) ? e : this._makeAbs(e);
+
+ if (this.mark)
+ e = this._mark(e);
+
+ if (this.absolute)
+ e = abs;
+
+ if (this.matches[index][e])
+ return
+
+ if (this.nodir) {
+ var c = this.cache[abs];
+ if (c === 'DIR' || Array.isArray(c))
+ return
+ }
+
+ this.matches[index][e] = true;
+
+ var st = this.statCache[abs];
+ if (st)
+ this.emit('stat', e, st);
+
+ this.emit('match', e);
+};
+
+Glob.prototype._readdirInGlobStar = function (abs, cb) {
+ if (this.aborted)
+ return
+
+ // follow all symlinked directories forever
+ // just proceed as if this is a non-globstar situation
+ if (this.follow)
+ return this._readdir(abs, false, cb)
+
+ var lstatkey = 'lstat\0' + abs;
+ var self = this;
+ var lstatcb = inflight(lstatkey, lstatcb_);
+
+ if (lstatcb)
+ self.fs.lstat(abs, lstatcb);
+
+ function lstatcb_ (er, lstat) {
+ if (er && er.code === 'ENOENT')
+ return cb()
+
+ var isSym = lstat && lstat.isSymbolicLink();
+ self.symlinks[abs] = isSym;
+
+ // If it's not a symlink or a dir, then it's definitely a regular file.
+ // don't bother doing a readdir in that case.
+ if (!isSym && lstat && !lstat.isDirectory()) {
+ self.cache[abs] = 'FILE';
+ cb();
+ } else
+ self._readdir(abs, false, cb);
+ }
+};
+
+Glob.prototype._readdir = function (abs, inGlobStar, cb) {
+ if (this.aborted)
+ return
+
+ cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb);
+ if (!cb)
+ return
+
+ //console.error('RD %j %j', +inGlobStar, abs)
+ if (inGlobStar && !ownProp(this.symlinks, abs))
+ return this._readdirInGlobStar(abs, cb)
+
+ if (ownProp(this.cache, abs)) {
+ var c = this.cache[abs];
+ if (!c || c === 'FILE')
+ return cb()
+
+ if (Array.isArray(c))
+ return cb(null, c)
+ }
+
+ var self = this;
+ self.fs.readdir(abs, readdirCb(this, abs, cb));
+};
+
+function readdirCb (self, abs, cb) {
+ return function (er, entries) {
+ if (er)
+ self._readdirError(abs, er, cb);
+ else
+ self._readdirEntries(abs, entries, cb);
+ }
+}
+
+Glob.prototype._readdirEntries = function (abs, entries, cb) {
+ if (this.aborted)
+ return
+
+ // if we haven't asked to stat everything, then just
+ // assume that everything in there exists, so we can avoid
+ // having to stat it a second time.
+ if (!this.mark && !this.stat) {
+ for (var i = 0; i < entries.length; i ++) {
+ var e = entries[i];
+ if (abs === '/')
+ e = abs + e;
+ else
+ e = abs + '/' + e;
+ this.cache[e] = true;
+ }
+ }
+
+ this.cache[abs] = entries;
+ return cb(null, entries)
+};
+
+Glob.prototype._readdirError = function (f, er, cb) {
+ if (this.aborted)
+ return
+
+ // handle errors, and cache the information
+ switch (er.code) {
+ case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
+ case 'ENOTDIR': // totally normal. means it *does* exist.
+ var abs = this._makeAbs(f);
+ this.cache[abs] = 'FILE';
+ if (abs === this.cwdAbs) {
+ var error = new Error(er.code + ' invalid cwd ' + this.cwd);
+ error.path = this.cwd;
+ error.code = er.code;
+ this.emit('error', error);
+ this.abort();
+ }
+ break
+
+ case 'ENOENT': // not terribly unusual
+ case 'ELOOP':
+ case 'ENAMETOOLONG':
+ case 'UNKNOWN':
+ this.cache[this._makeAbs(f)] = false;
+ break
+
+ default: // some unusual error. Treat as failure.
+ this.cache[this._makeAbs(f)] = false;
+ if (this.strict) {
+ this.emit('error', er);
+ // If the error is handled, then we abort
+ // if not, we threw out of here
+ this.abort();
+ }
+ if (!this.silent)
+ console.error('glob error', er);
+ break
+ }
+
+ return cb()
+};
+
+Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
+ var self = this;
+ this._readdir(abs, inGlobStar, function (er, entries) {
+ self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb);
+ });
+};
+
+
+Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
+ //console.error('pgs2', prefix, remain[0], entries)
+
+ // no entries means not a dir, so it can never have matches
+ // foo.txt/** doesn't match foo.txt
+ if (!entries)
+ return cb()
+
+ // test without the globstar, and with every child both below
+ // and replacing the globstar.
+ var remainWithoutGlobStar = remain.slice(1);
+ var gspref = prefix ? [ prefix ] : [];
+ var noGlobStar = gspref.concat(remainWithoutGlobStar);
+
+ // the noGlobStar pattern exits the inGlobStar state
+ this._process(noGlobStar, index, false, cb);
+
+ var isSym = this.symlinks[abs];
+ var len = entries.length;
+
+ // If it's a symlink, and we're in a globstar, then stop
+ if (isSym && inGlobStar)
+ return cb()
+
+ for (var i = 0; i < len; i++) {
+ var e = entries[i];
+ if (e.charAt(0) === '.' && !this.dot)
+ continue
+
+ // these two cases enter the inGlobStar state
+ var instead = gspref.concat(entries[i], remainWithoutGlobStar);
+ this._process(instead, index, true, cb);
+
+ var below = gspref.concat(entries[i], remain);
+ this._process(below, index, true, cb);
+ }
+
+ cb();
+};
+
+Glob.prototype._processSimple = function (prefix, index, cb) {
+ // XXX review this. Shouldn't it be doing the mounting etc
+ // before doing stat? kinda weird?
+ var self = this;
+ this._stat(prefix, function (er, exists) {
+ self._processSimple2(prefix, index, er, exists, cb);
+ });
+};
+Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {
+
+ //console.error('ps2', prefix, exists)
+
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null);
+
+ // If it doesn't exist, then just mark the lack of results
+ if (!exists)
+ return cb()
+
+ if (prefix && isAbsolute(prefix) && !this.nomount) {
+ var trail = /[\/\\]$/.test(prefix);
+ if (prefix.charAt(0) === '/') {
+ prefix = path$h.join(this.root, prefix);
+ } else {
+ prefix = path$h.resolve(this.root, prefix);
+ if (trail)
+ prefix += '/';
+ }
+ }
+
+ if (process.platform === 'win32')
+ prefix = prefix.replace(/\\/g, '/');
+
+ // Mark this as a match
+ this._emitMatch(index, prefix);
+ cb();
+};
+
+// Returns either 'DIR', 'FILE', or false
+Glob.prototype._stat = function (f, cb) {
+ var abs = this._makeAbs(f);
+ var needDir = f.slice(-1) === '/';
+
+ if (f.length > this.maxLength)
+ return cb()
+
+ if (!this.stat && ownProp(this.cache, abs)) {
+ var c = this.cache[abs];
+
+ if (Array.isArray(c))
+ c = 'DIR';
+
+ // It exists, but maybe not how we need it
+ if (!needDir || c === 'DIR')
+ return cb(null, c)
+
+ if (needDir && c === 'FILE')
+ return cb()
+
+ // otherwise we have to stat, because maybe c=true
+ // if we know it exists, but not what it is.
+ }
+ var stat = this.statCache[abs];
+ if (stat !== undefined) {
+ if (stat === false)
+ return cb(null, stat)
+ else {
+ var type = stat.isDirectory() ? 'DIR' : 'FILE';
+ if (needDir && type === 'FILE')
+ return cb()
+ else
+ return cb(null, type, stat)
+ }
+ }
+
+ var self = this;
+ var statcb = inflight('stat\0' + abs, lstatcb_);
+ if (statcb)
+ self.fs.lstat(abs, statcb);
+
+ function lstatcb_ (er, lstat) {
+ if (lstat && lstat.isSymbolicLink()) {
+ // If it's a symlink, then treat it as the target, unless
+ // the target does not exist, then treat it as a file.
+ return self.fs.stat(abs, function (er, stat) {
+ if (er)
+ self._stat2(f, abs, null, lstat, cb);
+ else
+ self._stat2(f, abs, er, stat, cb);
+ })
+ } else {
+ self._stat2(f, abs, er, lstat, cb);
+ }
+ }
+};
+
+Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
+ if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
+ this.statCache[abs] = false;
+ return cb()
+ }
+
+ var needDir = f.slice(-1) === '/';
+ this.statCache[abs] = stat;
+
+ if (abs.slice(-1) === '/' && stat && !stat.isDirectory())
+ return cb(null, false, stat)
+
+ var c = true;
+ if (stat)
+ c = stat.isDirectory() ? 'DIR' : 'FILE';
+ this.cache[abs] = this.cache[abs] || c;
+
+ if (needDir && c === 'FILE')
+ return cb()
+
+ return cb(null, c, stat)
+};
+
+// @ts-check
+/** @typedef { import('estree').BaseNode} BaseNode */
+
+/** @typedef {{
+ skip: () => void;
+ remove: () => void;
+ replace: (node: BaseNode) => void;
+}} WalkerContext */
+
+class WalkerBase {
+ constructor() {
+ /** @type {boolean} */
+ this.should_skip = false;
+
+ /** @type {boolean} */
+ this.should_remove = false;
+
+ /** @type {BaseNode | null} */
+ this.replacement = null;
+
+ /** @type {WalkerContext} */
+ this.context = {
+ skip: () => (this.should_skip = true),
+ remove: () => (this.should_remove = true),
+ replace: (node) => (this.replacement = node)
+ };
+ }
+
+ /**
+ *
+ * @param {any} parent
+ * @param {string} prop
+ * @param {number} index
+ * @param {BaseNode} node
+ */
+ replace(parent, prop, index, node) {
+ if (parent) {
+ if (index !== null) {
+ parent[prop][index] = node;
+ } else {
+ parent[prop] = node;
+ }
+ }
+ }
+
+ /**
+ *
+ * @param {any} parent
+ * @param {string} prop
+ * @param {number} index
+ */
+ remove(parent, prop, index) {
+ if (parent) {
+ if (index !== null) {
+ parent[prop].splice(index, 1);
+ } else {
+ delete parent[prop];
+ }
+ }
+ }
+}
+
+// @ts-check
+
+/** @typedef { import('estree').BaseNode} BaseNode */
+/** @typedef { import('./walker.js').WalkerContext} WalkerContext */
+
+/** @typedef {(
+ * this: WalkerContext,
+ * node: BaseNode,
+ * parent: BaseNode,
+ * key: string,
+ * index: number
+ * ) => void} SyncHandler */
+
+class SyncWalker extends WalkerBase {
+ /**
+ *
+ * @param {SyncHandler} enter
+ * @param {SyncHandler} leave
+ */
+ constructor(enter, leave) {
+ super();
+
+ /** @type {SyncHandler} */
+ this.enter = enter;
+
+ /** @type {SyncHandler} */
+ this.leave = leave;
+ }
+
+ /**
+ *
+ * @param {BaseNode} node
+ * @param {BaseNode} parent
+ * @param {string} [prop]
+ * @param {number} [index]
+ * @returns {BaseNode}
+ */
+ visit(node, parent, prop, index) {
+ if (node) {
+ if (this.enter) {
+ const _should_skip = this.should_skip;
+ const _should_remove = this.should_remove;
+ const _replacement = this.replacement;
+ this.should_skip = false;
+ this.should_remove = false;
+ this.replacement = null;
+
+ this.enter.call(this.context, node, parent, prop, index);
+
+ if (this.replacement) {
+ node = this.replacement;
+ this.replace(parent, prop, index, node);
+ }
+
+ if (this.should_remove) {
+ this.remove(parent, prop, index);
+ }
+
+ const skipped = this.should_skip;
+ const removed = this.should_remove;
+
+ this.should_skip = _should_skip;
+ this.should_remove = _should_remove;
+ this.replacement = _replacement;
+
+ if (skipped) return node;
+ if (removed) return null;
+ }
+
+ for (const key in node) {
+ const value = node[key];
+
+ if (typeof value !== "object") {
+ continue;
+ } else if (Array.isArray(value)) {
+ for (let i = 0; i < value.length; i += 1) {
+ if (value[i] !== null && typeof value[i].type === 'string') {
+ if (!this.visit(value[i], node, key, i)) {
+ // removed
+ i--;
+ }
+ }
+ }
+ } else if (value !== null && typeof value.type === "string") {
+ this.visit(value, node, key, null);
+ }
+ }
+
+ if (this.leave) {
+ const _replacement = this.replacement;
+ const _should_remove = this.should_remove;
+ this.replacement = null;
+ this.should_remove = false;
+
+ this.leave.call(this.context, node, parent, prop, index);
+
+ if (this.replacement) {
+ node = this.replacement;
+ this.replace(parent, prop, index, node);
+ }
+
+ if (this.should_remove) {
+ this.remove(parent, prop, index);
+ }
+
+ const removed = this.should_remove;
+
+ this.replacement = _replacement;
+ this.should_remove = _should_remove;
+
+ if (removed) return null;
+ }
+ }
+
+ return node;
+ }
+}
+
+// @ts-check
+
+/** @typedef { import('estree').BaseNode} BaseNode */
+/** @typedef { import('./sync.js').SyncHandler} SyncHandler */
+/** @typedef { import('./async.js').AsyncHandler} AsyncHandler */
+
+/**
+ *
+ * @param {BaseNode} ast
+ * @param {{
+ * enter?: SyncHandler
+ * leave?: SyncHandler
+ * }} walker
+ * @returns {BaseNode}
+ */
+function walk$2(ast, { enter, leave }) {
+ const instance = new SyncWalker(enter, leave);
+ return instance.visit(ast, null);
+}
+
+var charToInteger$1 = {};
+var chars$2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+for (var i$2 = 0; i$2 < chars$2.length; i$2++) {
+ charToInteger$1[chars$2.charCodeAt(i$2)] = i$2;
+}
+function encode$1(decoded) {
+ var sourceFileIndex = 0; // second field
+ var sourceCodeLine = 0; // third field
+ var sourceCodeColumn = 0; // fourth field
+ var nameIndex = 0; // fifth field
+ var mappings = '';
+ for (var i = 0; i < decoded.length; i++) {
+ var line = decoded[i];
+ if (i > 0)
+ mappings += ';';
+ if (line.length === 0)
+ continue;
+ var generatedCodeColumn = 0; // first field
+ var lineMappings = [];
+ for (var _i = 0, line_1 = line; _i < line_1.length; _i++) {
+ var segment = line_1[_i];
+ var segmentMappings = encodeInteger$1(segment[0] - generatedCodeColumn);
+ generatedCodeColumn = segment[0];
+ if (segment.length > 1) {
+ segmentMappings +=
+ encodeInteger$1(segment[1] - sourceFileIndex) +
+ encodeInteger$1(segment[2] - sourceCodeLine) +
+ encodeInteger$1(segment[3] - sourceCodeColumn);
+ sourceFileIndex = segment[1];
+ sourceCodeLine = segment[2];
+ sourceCodeColumn = segment[3];
+ }
+ if (segment.length === 5) {
+ segmentMappings += encodeInteger$1(segment[4] - nameIndex);
+ nameIndex = segment[4];
+ }
+ lineMappings.push(segmentMappings);
+ }
+ mappings += lineMappings.join(',');
+ }
+ return mappings;
+}
+function encodeInteger$1(num) {
+ var result = '';
+ num = num < 0 ? (-num << 1) | 1 : num << 1;
+ do {
+ var clamped = num & 31;
+ num >>>= 5;
+ if (num > 0) {
+ clamped |= 32;
+ }
+ result += chars$2[clamped];
+ } while (num > 0);
+ return result;
+}
+
+var BitSet$1 = function BitSet(arg) {
+ this.bits = arg instanceof BitSet ? arg.bits.slice() : [];
+};
+
+BitSet$1.prototype.add = function add (n) {
+ this.bits[n >> 5] |= 1 << (n & 31);
+};
+
+BitSet$1.prototype.has = function has (n) {
+ return !!(this.bits[n >> 5] & (1 << (n & 31)));
+};
+
+var Chunk$1 = function Chunk(start, end, content) {
+ this.start = start;
+ this.end = end;
+ this.original = content;
+
+ this.intro = '';
+ this.outro = '';
+
+ this.content = content;
+ this.storeName = false;
+ this.edited = false;
+
+ // we make these non-enumerable, for sanity while debugging
+ Object.defineProperties(this, {
+ previous: { writable: true, value: null },
+ next: { writable: true, value: null }
+ });
+};
+
+Chunk$1.prototype.appendLeft = function appendLeft (content) {
+ this.outro += content;
+};
+
+Chunk$1.prototype.appendRight = function appendRight (content) {
+ this.intro = this.intro + content;
+};
+
+Chunk$1.prototype.clone = function clone () {
+ var chunk = new Chunk$1(this.start, this.end, this.original);
+
+ chunk.intro = this.intro;
+ chunk.outro = this.outro;
+ chunk.content = this.content;
+ chunk.storeName = this.storeName;
+ chunk.edited = this.edited;
+
+ return chunk;
+};
+
+Chunk$1.prototype.contains = function contains (index) {
+ return this.start < index && index < this.end;
+};
+
+Chunk$1.prototype.eachNext = function eachNext (fn) {
+ var chunk = this;
+ while (chunk) {
+ fn(chunk);
+ chunk = chunk.next;
+ }
+};
+
+Chunk$1.prototype.eachPrevious = function eachPrevious (fn) {
+ var chunk = this;
+ while (chunk) {
+ fn(chunk);
+ chunk = chunk.previous;
+ }
+};
+
+Chunk$1.prototype.edit = function edit (content, storeName, contentOnly) {
+ this.content = content;
+ if (!contentOnly) {
+ this.intro = '';
+ this.outro = '';
+ }
+ this.storeName = storeName;
+
+ this.edited = true;
+
+ return this;
+};
+
+Chunk$1.prototype.prependLeft = function prependLeft (content) {
+ this.outro = content + this.outro;
+};
+
+Chunk$1.prototype.prependRight = function prependRight (content) {
+ this.intro = content + this.intro;
+};
+
+Chunk$1.prototype.split = function split (index) {
+ var sliceIndex = index - this.start;
+
+ var originalBefore = this.original.slice(0, sliceIndex);
+ var originalAfter = this.original.slice(sliceIndex);
+
+ this.original = originalBefore;
+
+ var newChunk = new Chunk$1(index, this.end, originalAfter);
+ newChunk.outro = this.outro;
+ this.outro = '';
+
+ this.end = index;
+
+ if (this.edited) {
+ // TODO is this block necessary?...
+ newChunk.edit('', false);
+ this.content = '';
+ } else {
+ this.content = originalBefore;
+ }
+
+ newChunk.next = this.next;
+ if (newChunk.next) { newChunk.next.previous = newChunk; }
+ newChunk.previous = this;
+ this.next = newChunk;
+
+ return newChunk;
+};
+
+Chunk$1.prototype.toString = function toString () {
+ return this.intro + this.content + this.outro;
+};
+
+Chunk$1.prototype.trimEnd = function trimEnd (rx) {
+ this.outro = this.outro.replace(rx, '');
+ if (this.outro.length) { return true; }
+
+ var trimmed = this.content.replace(rx, '');
+
+ if (trimmed.length) {
+ if (trimmed !== this.content) {
+ this.split(this.start + trimmed.length).edit('', undefined, true);
+ }
+ return true;
+
+ } else {
+ this.edit('', undefined, true);
+
+ this.intro = this.intro.replace(rx, '');
+ if (this.intro.length) { return true; }
+ }
+};
+
+Chunk$1.prototype.trimStart = function trimStart (rx) {
+ this.intro = this.intro.replace(rx, '');
+ if (this.intro.length) { return true; }
+
+ var trimmed = this.content.replace(rx, '');
+
+ if (trimmed.length) {
+ if (trimmed !== this.content) {
+ this.split(this.end - trimmed.length);
+ this.edit('', undefined, true);
+ }
+ return true;
+
+ } else {
+ this.edit('', undefined, true);
+
+ this.outro = this.outro.replace(rx, '');
+ if (this.outro.length) { return true; }
+ }
+};
+
+var btoa$2 = function () {
+ throw new Error('Unsupported environment: `window.btoa` or `Buffer` should be supported.');
+};
+if (typeof window !== 'undefined' && typeof window.btoa === 'function') {
+ btoa$2 = function (str) { return window.btoa(unescape(encodeURIComponent(str))); };
+} else if (typeof Buffer === 'function') {
+ btoa$2 = function (str) { return Buffer.from(str, 'utf-8').toString('base64'); };
+}
+
+var SourceMap$2 = function SourceMap(properties) {
+ this.version = 3;
+ this.file = properties.file;
+ this.sources = properties.sources;
+ this.sourcesContent = properties.sourcesContent;
+ this.names = properties.names;
+ this.mappings = encode$1(properties.mappings);
+};
+
+SourceMap$2.prototype.toString = function toString () {
+ return JSON.stringify(this);
+};
+
+SourceMap$2.prototype.toUrl = function toUrl () {
+ return 'data:application/json;charset=utf-8;base64,' + btoa$2(this.toString());
+};
+
+function guessIndent$1(code) {
+ var lines = code.split('\n');
+
+ var tabbed = lines.filter(function (line) { return /^\t+/.test(line); });
+ var spaced = lines.filter(function (line) { return /^ {2,}/.test(line); });
+
+ if (tabbed.length === 0 && spaced.length === 0) {
+ return null;
+ }
+
+ // More lines tabbed than spaced? Assume tabs, and
+ // default to tabs in the case of a tie (or nothing
+ // to go on)
+ if (tabbed.length >= spaced.length) {
+ return '\t';
+ }
+
+ // Otherwise, we need to guess the multiple
+ var min = spaced.reduce(function (previous, current) {
+ var numSpaces = /^ +/.exec(current)[0].length;
+ return Math.min(numSpaces, previous);
+ }, Infinity);
+
+ return new Array(min + 1).join(' ');
+}
+
+function getRelativePath$1(from, to) {
+ var fromParts = from.split(/[/\\]/);
+ var toParts = to.split(/[/\\]/);
+
+ fromParts.pop(); // get dirname
+
+ while (fromParts[0] === toParts[0]) {
+ fromParts.shift();
+ toParts.shift();
+ }
+
+ if (fromParts.length) {
+ var i = fromParts.length;
+ while (i--) { fromParts[i] = '..'; }
+ }
+
+ return fromParts.concat(toParts).join('/');
+}
+
+var toString$3 = Object.prototype.toString;
+
+function isObject$3(thing) {
+ return toString$3.call(thing) === '[object Object]';
+}
+
+function getLocator$1(source) {
+ var originalLines = source.split('\n');
+ var lineOffsets = [];
+
+ for (var i = 0, pos = 0; i < originalLines.length; i++) {
+ lineOffsets.push(pos);
+ pos += originalLines[i].length + 1;
+ }
+
+ return function locate(index) {
+ var i = 0;
+ var j = lineOffsets.length;
+ while (i < j) {
+ var m = (i + j) >> 1;
+ if (index < lineOffsets[m]) {
+ j = m;
+ } else {
+ i = m + 1;
+ }
+ }
+ var line = i - 1;
+ var column = index - lineOffsets[line];
+ return { line: line, column: column };
+ };
+}
+
+var Mappings$1 = function Mappings(hires) {
+ this.hires = hires;
+ this.generatedCodeLine = 0;
+ this.generatedCodeColumn = 0;
+ this.raw = [];
+ this.rawSegments = this.raw[this.generatedCodeLine] = [];
+ this.pending = null;
+};
+
+Mappings$1.prototype.addEdit = function addEdit (sourceIndex, content, loc, nameIndex) {
+ if (content.length) {
+ var segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];
+ if (nameIndex >= 0) {
+ segment.push(nameIndex);
+ }
+ this.rawSegments.push(segment);
+ } else if (this.pending) {
+ this.rawSegments.push(this.pending);
+ }
+
+ this.advance(content);
+ this.pending = null;
+};
+
+Mappings$1.prototype.addUneditedChunk = function addUneditedChunk (sourceIndex, chunk, original, loc, sourcemapLocations) {
+ var originalCharIndex = chunk.start;
+ var first = true;
+
+ while (originalCharIndex < chunk.end) {
+ if (this.hires || first || sourcemapLocations.has(originalCharIndex)) {
+ this.rawSegments.push([this.generatedCodeColumn, sourceIndex, loc.line, loc.column]);
+ }
+
+ if (original[originalCharIndex] === '\n') {
+ loc.line += 1;
+ loc.column = 0;
+ this.generatedCodeLine += 1;
+ this.raw[this.generatedCodeLine] = this.rawSegments = [];
+ this.generatedCodeColumn = 0;
+ first = true;
+ } else {
+ loc.column += 1;
+ this.generatedCodeColumn += 1;
+ first = false;
+ }
+
+ originalCharIndex += 1;
+ }
+
+ this.pending = null;
+};
+
+Mappings$1.prototype.advance = function advance (str) {
+ if (!str) { return; }
+
+ var lines = str.split('\n');
+
+ if (lines.length > 1) {
+ for (var i = 0; i < lines.length - 1; i++) {
+ this.generatedCodeLine++;
+ this.raw[this.generatedCodeLine] = this.rawSegments = [];
+ }
+ this.generatedCodeColumn = 0;
+ }
+
+ this.generatedCodeColumn += lines[lines.length - 1].length;
+};
+
+var n$1 = '\n';
+
+var warned$2 = {
+ insertLeft: false,
+ insertRight: false,
+ storeName: false
+};
+
+var MagicString$1 = function MagicString(string, options) {
+ if ( options === void 0 ) options = {};
+
+ var chunk = new Chunk$1(0, string.length, string);
+
+ Object.defineProperties(this, {
+ original: { writable: true, value: string },
+ outro: { writable: true, value: '' },
+ intro: { writable: true, value: '' },
+ firstChunk: { writable: true, value: chunk },
+ lastChunk: { writable: true, value: chunk },
+ lastSearchedChunk: { writable: true, value: chunk },
+ byStart: { writable: true, value: {} },
+ byEnd: { writable: true, value: {} },
+ filename: { writable: true, value: options.filename },
+ indentExclusionRanges: { writable: true, value: options.indentExclusionRanges },
+ sourcemapLocations: { writable: true, value: new BitSet$1() },
+ storedNames: { writable: true, value: {} },
+ indentStr: { writable: true, value: guessIndent$1(string) }
+ });
+
+ this.byStart[0] = chunk;
+ this.byEnd[string.length] = chunk;
+};
+
+MagicString$1.prototype.addSourcemapLocation = function addSourcemapLocation (char) {
+ this.sourcemapLocations.add(char);
+};
+
+MagicString$1.prototype.append = function append (content) {
+ if (typeof content !== 'string') { throw new TypeError('outro content must be a string'); }
+
+ this.outro += content;
+ return this;
+};
+
+MagicString$1.prototype.appendLeft = function appendLeft (index, content) {
+ if (typeof content !== 'string') { throw new TypeError('inserted content must be a string'); }
+
+ this._split(index);
+
+ var chunk = this.byEnd[index];
+
+ if (chunk) {
+ chunk.appendLeft(content);
+ } else {
+ this.intro += content;
+ }
+ return this;
+};
+
+MagicString$1.prototype.appendRight = function appendRight (index, content) {
+ if (typeof content !== 'string') { throw new TypeError('inserted content must be a string'); }
+
+ this._split(index);
+
+ var chunk = this.byStart[index];
+
+ if (chunk) {
+ chunk.appendRight(content);
+ } else {
+ this.outro += content;
+ }
+ return this;
+};
+
+MagicString$1.prototype.clone = function clone () {
+ var cloned = new MagicString$1(this.original, { filename: this.filename });
+
+ var originalChunk = this.firstChunk;
+ var clonedChunk = (cloned.firstChunk = cloned.lastSearchedChunk = originalChunk.clone());
+
+ while (originalChunk) {
+ cloned.byStart[clonedChunk.start] = clonedChunk;
+ cloned.byEnd[clonedChunk.end] = clonedChunk;
+
+ var nextOriginalChunk = originalChunk.next;
+ var nextClonedChunk = nextOriginalChunk && nextOriginalChunk.clone();
+
+ if (nextClonedChunk) {
+ clonedChunk.next = nextClonedChunk;
+ nextClonedChunk.previous = clonedChunk;
+
+ clonedChunk = nextClonedChunk;
+ }
+
+ originalChunk = nextOriginalChunk;
+ }
+
+ cloned.lastChunk = clonedChunk;
+
+ if (this.indentExclusionRanges) {
+ cloned.indentExclusionRanges = this.indentExclusionRanges.slice();
+ }
+
+ cloned.sourcemapLocations = new BitSet$1(this.sourcemapLocations);
+
+ cloned.intro = this.intro;
+ cloned.outro = this.outro;
+
+ return cloned;
+};
+
+MagicString$1.prototype.generateDecodedMap = function generateDecodedMap (options) {
+ var this$1$1 = this;
+
+ options = options || {};
+
+ var sourceIndex = 0;
+ var names = Object.keys(this.storedNames);
+ var mappings = new Mappings$1(options.hires);
+
+ var locate = getLocator$1(this.original);
+
+ if (this.intro) {
+ mappings.advance(this.intro);
+ }
+
+ this.firstChunk.eachNext(function (chunk) {
+ var loc = locate(chunk.start);
+
+ if (chunk.intro.length) { mappings.advance(chunk.intro); }
+
+ if (chunk.edited) {
+ mappings.addEdit(
+ sourceIndex,
+ chunk.content,
+ loc,
+ chunk.storeName ? names.indexOf(chunk.original) : -1
+ );
+ } else {
+ mappings.addUneditedChunk(sourceIndex, chunk, this$1$1.original, loc, this$1$1.sourcemapLocations);
+ }
+
+ if (chunk.outro.length) { mappings.advance(chunk.outro); }
+ });
+
+ return {
+ file: options.file ? options.file.split(/[/\\]/).pop() : null,
+ sources: [options.source ? getRelativePath$1(options.file || '', options.source) : null],
+ sourcesContent: options.includeContent ? [this.original] : [null],
+ names: names,
+ mappings: mappings.raw
+ };
+};
+
+MagicString$1.prototype.generateMap = function generateMap (options) {
+ return new SourceMap$2(this.generateDecodedMap(options));
+};
+
+MagicString$1.prototype.getIndentString = function getIndentString () {
+ return this.indentStr === null ? '\t' : this.indentStr;
+};
+
+MagicString$1.prototype.indent = function indent (indentStr, options) {
+ var pattern = /^[^\r\n]/gm;
+
+ if (isObject$3(indentStr)) {
+ options = indentStr;
+ indentStr = undefined;
+ }
+
+ indentStr = indentStr !== undefined ? indentStr : this.indentStr || '\t';
+
+ if (indentStr === '') { return this; } // noop
+
+ options = options || {};
+
+ // Process exclusion ranges
+ var isExcluded = {};
+
+ if (options.exclude) {
+ var exclusions =
+ typeof options.exclude[0] === 'number' ? [options.exclude] : options.exclude;
+ exclusions.forEach(function (exclusion) {
+ for (var i = exclusion[0]; i < exclusion[1]; i += 1) {
+ isExcluded[i] = true;
+ }
+ });
+ }
+
+ var shouldIndentNextCharacter = options.indentStart !== false;
+ var replacer = function (match) {
+ if (shouldIndentNextCharacter) { return ("" + indentStr + match); }
+ shouldIndentNextCharacter = true;
+ return match;
+ };
+
+ this.intro = this.intro.replace(pattern, replacer);
+
+ var charIndex = 0;
+ var chunk = this.firstChunk;
+
+ while (chunk) {
+ var end = chunk.end;
+
+ if (chunk.edited) {
+ if (!isExcluded[charIndex]) {
+ chunk.content = chunk.content.replace(pattern, replacer);
+
+ if (chunk.content.length) {
+ shouldIndentNextCharacter = chunk.content[chunk.content.length - 1] === '\n';
+ }
+ }
+ } else {
+ charIndex = chunk.start;
+
+ while (charIndex < end) {
+ if (!isExcluded[charIndex]) {
+ var char = this.original[charIndex];
+
+ if (char === '\n') {
+ shouldIndentNextCharacter = true;
+ } else if (char !== '\r' && shouldIndentNextCharacter) {
+ shouldIndentNextCharacter = false;
+
+ if (charIndex === chunk.start) {
+ chunk.prependRight(indentStr);
+ } else {
+ this._splitChunk(chunk, charIndex);
+ chunk = chunk.next;
+ chunk.prependRight(indentStr);
+ }
+ }
+ }
+
+ charIndex += 1;
+ }
+ }
+
+ charIndex = chunk.end;
+ chunk = chunk.next;
+ }
+
+ this.outro = this.outro.replace(pattern, replacer);
+
+ return this;
+};
+
+MagicString$1.prototype.insert = function insert () {
+ throw new Error('magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)');
+};
+
+MagicString$1.prototype.insertLeft = function insertLeft (index, content) {
+ if (!warned$2.insertLeft) {
+ console.warn('magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead'); // eslint-disable-line no-console
+ warned$2.insertLeft = true;
+ }
+
+ return this.appendLeft(index, content);
+};
+
+MagicString$1.prototype.insertRight = function insertRight (index, content) {
+ if (!warned$2.insertRight) {
+ console.warn('magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead'); // eslint-disable-line no-console
+ warned$2.insertRight = true;
+ }
+
+ return this.prependRight(index, content);
+};
+
+MagicString$1.prototype.move = function move (start, end, index) {
+ if (index >= start && index <= end) { throw new Error('Cannot move a selection inside itself'); }
+
+ this._split(start);
+ this._split(end);
+ this._split(index);
+
+ var first = this.byStart[start];
+ var last = this.byEnd[end];
+
+ var oldLeft = first.previous;
+ var oldRight = last.next;
+
+ var newRight = this.byStart[index];
+ if (!newRight && last === this.lastChunk) { return this; }
+ var newLeft = newRight ? newRight.previous : this.lastChunk;
+
+ if (oldLeft) { oldLeft.next = oldRight; }
+ if (oldRight) { oldRight.previous = oldLeft; }
+
+ if (newLeft) { newLeft.next = first; }
+ if (newRight) { newRight.previous = last; }
+
+ if (!first.previous) { this.firstChunk = last.next; }
+ if (!last.next) {
+ this.lastChunk = first.previous;
+ this.lastChunk.next = null;
+ }
+
+ first.previous = newLeft;
+ last.next = newRight || null;
+
+ if (!newLeft) { this.firstChunk = first; }
+ if (!newRight) { this.lastChunk = last; }
+ return this;
+};
+
+MagicString$1.prototype.overwrite = function overwrite (start, end, content, options) {
+ if (typeof content !== 'string') { throw new TypeError('replacement content must be a string'); }
+
+ while (start < 0) { start += this.original.length; }
+ while (end < 0) { end += this.original.length; }
+
+ if (end > this.original.length) { throw new Error('end is out of bounds'); }
+ if (start === end)
+ { throw new Error('Cannot overwrite a zero-length range – use appendLeft or prependRight instead'); }
+
+ this._split(start);
+ this._split(end);
+
+ if (options === true) {
+ if (!warned$2.storeName) {
+ console.warn('The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string'); // eslint-disable-line no-console
+ warned$2.storeName = true;
+ }
+
+ options = { storeName: true };
+ }
+ var storeName = options !== undefined ? options.storeName : false;
+ var contentOnly = options !== undefined ? options.contentOnly : false;
+
+ if (storeName) {
+ var original = this.original.slice(start, end);
+ this.storedNames[original] = true;
+ }
+
+ var first = this.byStart[start];
+ var last = this.byEnd[end];
+
+ if (first) {
+ if (end > first.end && first.next !== this.byStart[first.end]) {
+ throw new Error('Cannot overwrite across a split point');
+ }
+
+ first.edit(content, storeName, contentOnly);
+
+ if (first !== last) {
+ var chunk = first.next;
+ while (chunk !== last) {
+ chunk.edit('', false);
+ chunk = chunk.next;
+ }
+
+ chunk.edit('', false);
+ }
+ } else {
+ // must be inserting at the end
+ var newChunk = new Chunk$1(start, end, '').edit(content, storeName);
+
+ // TODO last chunk in the array may not be the last chunk, if it's moved...
+ last.next = newChunk;
+ newChunk.previous = last;
+ }
+ return this;
+};
+
+MagicString$1.prototype.prepend = function prepend (content) {
+ if (typeof content !== 'string') { throw new TypeError('outro content must be a string'); }
+
+ this.intro = content + this.intro;
+ return this;
+};
+
+MagicString$1.prototype.prependLeft = function prependLeft (index, content) {
+ if (typeof content !== 'string') { throw new TypeError('inserted content must be a string'); }
+
+ this._split(index);
+
+ var chunk = this.byEnd[index];
+
+ if (chunk) {
+ chunk.prependLeft(content);
+ } else {
+ this.intro = content + this.intro;
+ }
+ return this;
+};
+
+MagicString$1.prototype.prependRight = function prependRight (index, content) {
+ if (typeof content !== 'string') { throw new TypeError('inserted content must be a string'); }
+
+ this._split(index);
+
+ var chunk = this.byStart[index];
+
+ if (chunk) {
+ chunk.prependRight(content);
+ } else {
+ this.outro = content + this.outro;
+ }
+ return this;
+};
+
+MagicString$1.prototype.remove = function remove (start, end) {
+ while (start < 0) { start += this.original.length; }
+ while (end < 0) { end += this.original.length; }
+
+ if (start === end) { return this; }
+
+ if (start < 0 || end > this.original.length) { throw new Error('Character is out of bounds'); }
+ if (start > end) { throw new Error('end must be greater than start'); }
+
+ this._split(start);
+ this._split(end);
+
+ var chunk = this.byStart[start];
+
+ while (chunk) {
+ chunk.intro = '';
+ chunk.outro = '';
+ chunk.edit('');
+
+ chunk = end > chunk.end ? this.byStart[chunk.end] : null;
+ }
+ return this;
+};
+
+MagicString$1.prototype.lastChar = function lastChar () {
+ if (this.outro.length)
+ { return this.outro[this.outro.length - 1]; }
+ var chunk = this.lastChunk;
+ do {
+ if (chunk.outro.length)
+ { return chunk.outro[chunk.outro.length - 1]; }
+ if (chunk.content.length)
+ { return chunk.content[chunk.content.length - 1]; }
+ if (chunk.intro.length)
+ { return chunk.intro[chunk.intro.length - 1]; }
+ } while (chunk = chunk.previous);
+ if (this.intro.length)
+ { return this.intro[this.intro.length - 1]; }
+ return '';
+};
+
+MagicString$1.prototype.lastLine = function lastLine () {
+ var lineIndex = this.outro.lastIndexOf(n$1);
+ if (lineIndex !== -1)
+ { return this.outro.substr(lineIndex + 1); }
+ var lineStr = this.outro;
+ var chunk = this.lastChunk;
+ do {
+ if (chunk.outro.length > 0) {
+ lineIndex = chunk.outro.lastIndexOf(n$1);
+ if (lineIndex !== -1)
+ { return chunk.outro.substr(lineIndex + 1) + lineStr; }
+ lineStr = chunk.outro + lineStr;
+ }
+
+ if (chunk.content.length > 0) {
+ lineIndex = chunk.content.lastIndexOf(n$1);
+ if (lineIndex !== -1)
+ { return chunk.content.substr(lineIndex + 1) + lineStr; }
+ lineStr = chunk.content + lineStr;
+ }
+
+ if (chunk.intro.length > 0) {
+ lineIndex = chunk.intro.lastIndexOf(n$1);
+ if (lineIndex !== -1)
+ { return chunk.intro.substr(lineIndex + 1) + lineStr; }
+ lineStr = chunk.intro + lineStr;
+ }
+ } while (chunk = chunk.previous);
+ lineIndex = this.intro.lastIndexOf(n$1);
+ if (lineIndex !== -1)
+ { return this.intro.substr(lineIndex + 1) + lineStr; }
+ return this.intro + lineStr;
+};
+
+MagicString$1.prototype.slice = function slice (start, end) {
+ if ( start === void 0 ) start = 0;
+ if ( end === void 0 ) end = this.original.length;
+
+ while (start < 0) { start += this.original.length; }
+ while (end < 0) { end += this.original.length; }
+
+ var result = '';
+
+ // find start chunk
+ var chunk = this.firstChunk;
+ while (chunk && (chunk.start > start || chunk.end <= start)) {
+ // found end chunk before start
+ if (chunk.start < end && chunk.end >= end) {
+ return result;
+ }
+
+ chunk = chunk.next;
+ }
+
+ if (chunk && chunk.edited && chunk.start !== start)
+ { throw new Error(("Cannot use replaced character " + start + " as slice start anchor.")); }
+
+ var startChunk = chunk;
+ while (chunk) {
+ if (chunk.intro && (startChunk !== chunk || chunk.start === start)) {
+ result += chunk.intro;
+ }
+
+ var containsEnd = chunk.start < end && chunk.end >= end;
+ if (containsEnd && chunk.edited && chunk.end !== end)
+ { throw new Error(("Cannot use replaced character " + end + " as slice end anchor.")); }
+
+ var sliceStart = startChunk === chunk ? start - chunk.start : 0;
+ var sliceEnd = containsEnd ? chunk.content.length + end - chunk.end : chunk.content.length;
+
+ result += chunk.content.slice(sliceStart, sliceEnd);
+
+ if (chunk.outro && (!containsEnd || chunk.end === end)) {
+ result += chunk.outro;
+ }
+
+ if (containsEnd) {
+ break;
+ }
+
+ chunk = chunk.next;
+ }
+
+ return result;
+};
+
+// TODO deprecate this? not really very useful
+MagicString$1.prototype.snip = function snip (start, end) {
+ var clone = this.clone();
+ clone.remove(0, start);
+ clone.remove(end, clone.original.length);
+
+ return clone;
+};
+
+MagicString$1.prototype._split = function _split (index) {
+ if (this.byStart[index] || this.byEnd[index]) { return; }
+
+ var chunk = this.lastSearchedChunk;
+ var searchForward = index > chunk.end;
+
+ while (chunk) {
+ if (chunk.contains(index)) { return this._splitChunk(chunk, index); }
+
+ chunk = searchForward ? this.byStart[chunk.end] : this.byEnd[chunk.start];
+ }
+};
+
+MagicString$1.prototype._splitChunk = function _splitChunk (chunk, index) {
+ if (chunk.edited && chunk.content.length) {
+ // zero-length edited chunks are a special case (overlapping replacements)
+ var loc = getLocator$1(this.original)(index);
+ throw new Error(
+ ("Cannot split a chunk that has already been edited (" + (loc.line) + ":" + (loc.column) + " – \"" + (chunk.original) + "\")")
+ );
+ }
+
+ var newChunk = chunk.split(index);
+
+ this.byEnd[index] = chunk;
+ this.byStart[index] = newChunk;
+ this.byEnd[newChunk.end] = newChunk;
+
+ if (chunk === this.lastChunk) { this.lastChunk = newChunk; }
+
+ this.lastSearchedChunk = chunk;
+ return true;
+};
+
+MagicString$1.prototype.toString = function toString () {
+ var str = this.intro;
+
+ var chunk = this.firstChunk;
+ while (chunk) {
+ str += chunk.toString();
+ chunk = chunk.next;
+ }
+
+ return str + this.outro;
+};
+
+MagicString$1.prototype.isEmpty = function isEmpty () {
+ var chunk = this.firstChunk;
+ do {
+ if (chunk.intro.length && chunk.intro.trim() ||
+ chunk.content.length && chunk.content.trim() ||
+ chunk.outro.length && chunk.outro.trim())
+ { return false; }
+ } while (chunk = chunk.next);
+ return true;
+};
+
+MagicString$1.prototype.length = function length () {
+ var chunk = this.firstChunk;
+ var length = 0;
+ do {
+ length += chunk.intro.length + chunk.content.length + chunk.outro.length;
+ } while (chunk = chunk.next);
+ return length;
+};
+
+MagicString$1.prototype.trimLines = function trimLines () {
+ return this.trim('[\\r\\n]');
+};
+
+MagicString$1.prototype.trim = function trim (charType) {
+ return this.trimStart(charType).trimEnd(charType);
+};
+
+MagicString$1.prototype.trimEndAborted = function trimEndAborted (charType) {
+ var rx = new RegExp((charType || '\\s') + '+$');
+
+ this.outro = this.outro.replace(rx, '');
+ if (this.outro.length) { return true; }
+
+ var chunk = this.lastChunk;
+
+ do {
+ var end = chunk.end;
+ var aborted = chunk.trimEnd(rx);
+
+ // if chunk was trimmed, we have a new lastChunk
+ if (chunk.end !== end) {
+ if (this.lastChunk === chunk) {
+ this.lastChunk = chunk.next;
+ }
+
+ this.byEnd[chunk.end] = chunk;
+ this.byStart[chunk.next.start] = chunk.next;
+ this.byEnd[chunk.next.end] = chunk.next;
+ }
+
+ if (aborted) { return true; }
+ chunk = chunk.previous;
+ } while (chunk);
+
+ return false;
+};
+
+MagicString$1.prototype.trimEnd = function trimEnd (charType) {
+ this.trimEndAborted(charType);
+ return this;
+};
+MagicString$1.prototype.trimStartAborted = function trimStartAborted (charType) {
+ var rx = new RegExp('^' + (charType || '\\s') + '+');
+
+ this.intro = this.intro.replace(rx, '');
+ if (this.intro.length) { return true; }
+
+ var chunk = this.firstChunk;
+
+ do {
+ var end = chunk.end;
+ var aborted = chunk.trimStart(rx);
+
+ if (chunk.end !== end) {
+ // special case...
+ if (chunk === this.lastChunk) { this.lastChunk = chunk.next; }
+
+ this.byEnd[chunk.end] = chunk;
+ this.byStart[chunk.next.start] = chunk.next;
+ this.byEnd[chunk.next.end] = chunk.next;
+ }
+
+ if (aborted) { return true; }
+ chunk = chunk.next;
+ } while (chunk);
+
+ return false;
+};
+
+MagicString$1.prototype.trimStart = function trimStart (charType) {
+ this.trimStartAborted(charType);
+ return this;
+};
+
+function isReference(node, parent) {
+ if (node.type === 'MemberExpression') {
+ return !node.computed && isReference(node.object, node);
+ }
+ if (node.type === 'Identifier') {
+ if (!parent)
+ return true;
+ switch (parent.type) {
+ // disregard `bar` in `foo.bar`
+ case 'MemberExpression': return parent.computed || node === parent.object;
+ // disregard the `foo` in `class {foo(){}}` but keep it in `class {[foo](){}}`
+ case 'MethodDefinition': return parent.computed;
+ // disregard the `foo` in `class {foo=bar}` but keep it in `class {[foo]=bar}` and `class {bar=foo}`
+ case 'FieldDefinition': return parent.computed || node === parent.value;
+ // disregard the `bar` in `{ bar: foo }`, but keep it in `{ [bar]: foo }`
+ case 'Property': return parent.computed || node === parent.value;
+ // disregard the `bar` in `export { foo as bar }` or
+ // the foo in `import { foo as bar }`
+ case 'ExportSpecifier':
+ case 'ImportSpecifier': return node === parent.local;
+ // disregard the `foo` in `foo: while (...) { ... break foo; ... continue foo;}`
+ case 'LabeledStatement':
+ case 'BreakStatement':
+ case 'ContinueStatement': return false;
+ default: return true;
+ }
+ }
+ return false;
+}
+
+var peerDependencies = {
+ rollup: "^2.38.3"
+};
+
+function tryParse(parse, code, id) {
+ try {
+ return parse(code, { allowReturnOutsideFunction: true });
+ } catch (err) {
+ err.message += ` in ${id}`;
+ throw err;
+ }
+}
+
+const firstpassGlobal = /\b(?:require|module|exports|global)\b/;
+
+const firstpassNoGlobal = /\b(?:require|module|exports)\b/;
+
+function hasCjsKeywords(code, ignoreGlobal) {
+ const firstpass = ignoreGlobal ? firstpassNoGlobal : firstpassGlobal;
+ return firstpass.test(code);
+}
+
+/* eslint-disable no-underscore-dangle */
+
+function analyzeTopLevelStatements(parse, code, id) {
+ const ast = tryParse(parse, code, id);
+
+ let isEsModule = false;
+ let hasDefaultExport = false;
+ let hasNamedExports = false;
+
+ for (const node of ast.body) {
+ switch (node.type) {
+ case 'ExportDefaultDeclaration':
+ isEsModule = true;
+ hasDefaultExport = true;
+ break;
+ case 'ExportNamedDeclaration':
+ isEsModule = true;
+ if (node.declaration) {
+ hasNamedExports = true;
+ } else {
+ for (const specifier of node.specifiers) {
+ if (specifier.exported.name === 'default') {
+ hasDefaultExport = true;
+ } else {
+ hasNamedExports = true;
+ }
+ }
+ }
+ break;
+ case 'ExportAllDeclaration':
+ isEsModule = true;
+ if (node.exported && node.exported.name === 'default') {
+ hasDefaultExport = true;
+ } else {
+ hasNamedExports = true;
+ }
+ break;
+ case 'ImportDeclaration':
+ isEsModule = true;
+ break;
+ }
+ }
+
+ return { isEsModule, hasDefaultExport, hasNamedExports, ast };
+}
+
+const isWrappedId = (id, suffix) => id.endsWith(suffix);
+const wrapId = (id, suffix) => `\0${id}${suffix}`;
+const unwrapId$1 = (wrappedId, suffix) => wrappedId.slice(1, -suffix.length);
+
+const PROXY_SUFFIX = '?commonjs-proxy';
+const REQUIRE_SUFFIX = '?commonjs-require';
+const EXTERNAL_SUFFIX = '?commonjs-external';
+const EXPORTS_SUFFIX = '?commonjs-exports';
+const MODULE_SUFFIX = '?commonjs-module';
+
+const DYNAMIC_REGISTER_SUFFIX = '?commonjs-dynamic-register';
+const DYNAMIC_JSON_PREFIX = '\0commonjs-dynamic-json:';
+const DYNAMIC_PACKAGES_ID = '\0commonjs-dynamic-packages';
+
+const HELPERS_ID = '\0commonjsHelpers.js';
+
+// `x['default']` is used instead of `x.default` for backward compatibility with ES3 browsers.
+// Minifiers like uglify will usually transpile it back if compatibility with ES3 is not enabled.
+// This will no longer be necessary once Rollup switches to ES6 output, likely
+// in Rollup 3
+
+const HELPERS = `
+export var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+export function getDefaultExportFromCjs (x) {
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
+}
+
+export function getDefaultExportFromNamespaceIfPresent (n) {
+ return n && Object.prototype.hasOwnProperty.call(n, 'default') ? n['default'] : n;
+}
+
+export function getDefaultExportFromNamespaceIfNotNamed (n) {
+ return n && Object.prototype.hasOwnProperty.call(n, 'default') && Object.keys(n).length === 1 ? n['default'] : n;
+}
+
+export function getAugmentedNamespace(n) {
+ if (n.__esModule) return n;
+ var a = Object.defineProperty({}, '__esModule', {value: true});
+ Object.keys(n).forEach(function (k) {
+ var d = Object.getOwnPropertyDescriptor(n, k);
+ Object.defineProperty(a, k, d.get ? d : {
+ enumerable: true,
+ get: function () {
+ return n[k];
+ }
+ });
+ });
+ return a;
+}
+`;
+
+const FAILED_REQUIRE_ERROR = `throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');`;
+
+const HELPER_NON_DYNAMIC = `
+export function commonjsRequire (path) {
+ ${FAILED_REQUIRE_ERROR}
+}
+`;
+
+const getDynamicHelpers = (ignoreDynamicRequires) => `
+export function createModule(modulePath) {
+ return {
+ path: modulePath,
+ exports: {},
+ require: function (path, base) {
+ return commonjsRequire(path, base == null ? modulePath : base);
+ }
+ };
+}
+
+export function commonjsRegister (path, loader) {
+ DYNAMIC_REQUIRE_LOADERS[path] = loader;
+}
+
+export function commonjsRegisterOrShort (path, to) {
+ var resolvedPath = commonjsResolveImpl(path, null, true);
+ if (resolvedPath !== null && DYNAMIC_REQUIRE_CACHE[resolvedPath]) {
+ DYNAMIC_REQUIRE_CACHE[path] = DYNAMIC_REQUIRE_CACHE[resolvedPath];
+ } else {
+ DYNAMIC_REQUIRE_SHORTS[path] = to;
+ }
+}
+
+var DYNAMIC_REQUIRE_LOADERS = Object.create(null);
+var DYNAMIC_REQUIRE_CACHE = Object.create(null);
+var DYNAMIC_REQUIRE_SHORTS = Object.create(null);
+var DEFAULT_PARENT_MODULE = {
+ id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []
+};
+var CHECKED_EXTENSIONS = ['', '.js', '.json'];
+
+function normalize (path) {
+ path = path.replace(/\\\\/g, '/');
+ var parts = path.split('/');
+ var slashed = parts[0] === '';
+ for (var i = 1; i < parts.length; i++) {
+ if (parts[i] === '.' || parts[i] === '') {
+ parts.splice(i--, 1);
+ }
+ }
+ for (var i = 1; i < parts.length; i++) {
+ if (parts[i] !== '..') continue;
+ if (i > 0 && parts[i - 1] !== '..' && parts[i - 1] !== '.') {
+ parts.splice(--i, 2);
+ i--;
+ }
+ }
+ path = parts.join('/');
+ if (slashed && path[0] !== '/')
+ path = '/' + path;
+ else if (path.length === 0)
+ path = '.';
+ return path;
+}
+
+function join () {
+ if (arguments.length === 0)
+ return '.';
+ var joined;
+ for (var i = 0; i < arguments.length; ++i) {
+ var arg = arguments[i];
+ if (arg.length > 0) {
+ if (joined === undefined)
+ joined = arg;
+ else
+ joined += '/' + arg;
+ }
+ }
+ if (joined === undefined)
+ return '.';
+
+ return joined;
+}
+
+function isPossibleNodeModulesPath (modulePath) {
+ var c0 = modulePath[0];
+ if (c0 === '/' || c0 === '\\\\') return false;
+ var c1 = modulePath[1], c2 = modulePath[2];
+ if ((c0 === '.' && (!c1 || c1 === '/' || c1 === '\\\\')) ||
+ (c0 === '.' && c1 === '.' && (!c2 || c2 === '/' || c2 === '\\\\'))) return false;
+ if (c1 === ':' && (c2 === '/' || c2 === '\\\\'))
+ return false;
+ return true;
+}
+
+function dirname (path) {
+ if (path.length === 0)
+ return '.';
+
+ var i = path.length - 1;
+ while (i > 0) {
+ var c = path.charCodeAt(i);
+ if ((c === 47 || c === 92) && i !== path.length - 1)
+ break;
+ i--;
+ }
+
+ if (i > 0)
+ return path.substr(0, i);
+
+ if (path.chartCodeAt(0) === 47 || path.chartCodeAt(0) === 92)
+ return path.charAt(0);
+
+ return '.';
+}
+
+export function commonjsResolveImpl (path, originalModuleDir, testCache) {
+ var shouldTryNodeModules = isPossibleNodeModulesPath(path);
+ path = normalize(path);
+ var relPath;
+ if (path[0] === '/') {
+ originalModuleDir = '/';
+ }
+ while (true) {
+ if (!shouldTryNodeModules) {
+ relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;
+ } else if (originalModuleDir) {
+ relPath = normalize(originalModuleDir + '/node_modules/' + path);
+ } else {
+ relPath = normalize(join('node_modules', path));
+ }
+
+ if (relPath.endsWith('/..')) {
+ break; // Travelled too far up, avoid infinite loop
+ }
+
+ for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {
+ var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];
+ if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {
+ return resolvedPath;
+ }
+ if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {
+ return resolvedPath;
+ }
+ if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {
+ return resolvedPath;
+ }
+ }
+ if (!shouldTryNodeModules) break;
+ var nextDir = normalize(originalModuleDir + '/..');
+ if (nextDir === originalModuleDir) break;
+ originalModuleDir = nextDir;
+ }
+ return null;
+}
+
+export function commonjsResolve (path, originalModuleDir) {
+ var resolvedPath = commonjsResolveImpl(path, originalModuleDir);
+ if (resolvedPath !== null) {
+ return resolvedPath;
+ }
+ return require.resolve(path);
+}
+
+export function commonjsRequire (path, originalModuleDir) {
+ var resolvedPath = commonjsResolveImpl(path, originalModuleDir, true);
+ if (resolvedPath !== null) {
+ var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];
+ if (cachedModule) return cachedModule.exports;
+ var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];
+ if (shortTo) {
+ cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];
+ if (cachedModule)
+ return cachedModule.exports;
+ resolvedPath = commonjsResolveImpl(shortTo, null, true);
+ }
+ var loader = DYNAMIC_REQUIRE_LOADERS[resolvedPath];
+ if (loader) {
+ DYNAMIC_REQUIRE_CACHE[resolvedPath] = cachedModule = {
+ id: resolvedPath,
+ filename: resolvedPath,
+ path: dirname(resolvedPath),
+ exports: {},
+ parent: DEFAULT_PARENT_MODULE,
+ loaded: false,
+ children: [],
+ paths: [],
+ require: function (path, base) {
+ return commonjsRequire(path, (base === undefined || base === null) ? cachedModule.path : base);
+ }
+ };
+ try {
+ loader.call(commonjsGlobal, cachedModule, cachedModule.exports);
+ } catch (error) {
+ delete DYNAMIC_REQUIRE_CACHE[resolvedPath];
+ throw error;
+ }
+ cachedModule.loaded = true;
+ return cachedModule.exports;
+ };
+ }
+ ${ignoreDynamicRequires ? 'return require(path);' : FAILED_REQUIRE_ERROR}
+}
+
+commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;
+commonjsRequire.resolve = commonjsResolve;
+`;
+
+function getHelpersModule(isDynamicRequireModulesEnabled, ignoreDynamicRequires) {
+ return `${HELPERS}${
+ isDynamicRequireModulesEnabled ? getDynamicHelpers(ignoreDynamicRequires) : HELPER_NON_DYNAMIC
+ }`;
+}
+
+/* eslint-disable import/prefer-default-export */
+
+function deconflict(scopes, globals, identifier) {
+ let i = 1;
+ let deconflicted = makeLegalIdentifier(identifier);
+ const hasConflicts = () =>
+ scopes.some((scope) => scope.contains(deconflicted)) || globals.has(deconflicted);
+
+ while (hasConflicts()) {
+ deconflicted = makeLegalIdentifier(`${identifier}_${i}`);
+ i += 1;
+ }
+
+ for (const scope of scopes) {
+ scope.declarations[deconflicted] = true;
+ }
+
+ return deconflicted;
+}
+
+function getName(id) {
+ const name = makeLegalIdentifier(path$r.basename(id, path$r.extname(id)));
+ if (name !== 'index') {
+ return name;
+ }
+ return makeLegalIdentifier(path$r.basename(path$r.dirname(id)));
+}
+
+function normalizePathSlashes(path) {
+ return path.replace(/\\/g, '/');
+}
+
+const VIRTUAL_PATH_BASE = '/$$rollup_base$$';
+const getVirtualPathForDynamicRequirePath = (path, commonDir) => {
+ const normalizedPath = normalizePathSlashes(path);
+ return normalizedPath.startsWith(commonDir)
+ ? VIRTUAL_PATH_BASE + normalizedPath.slice(commonDir.length)
+ : normalizedPath;
+};
+
+function getPackageEntryPoint(dirPath) {
+ let entryPoint = 'index.js';
+
+ try {
+ if (fs$n.existsSync(path$r.join(dirPath, 'package.json'))) {
+ entryPoint =
+ JSON.parse(fs$n.readFileSync(path$r.join(dirPath, 'package.json'), { encoding: 'utf8' })).main ||
+ entryPoint;
+ }
+ } catch (ignored) {
+ // ignored
+ }
+
+ return entryPoint;
+}
+
+function getDynamicPackagesModule(dynamicRequireModuleDirPaths, commonDir) {
+ let code = `const commonjsRegisterOrShort = require('${HELPERS_ID}?commonjsRegisterOrShort');`;
+ for (const dir of dynamicRequireModuleDirPaths) {
+ const entryPoint = getPackageEntryPoint(dir);
+
+ code += `\ncommonjsRegisterOrShort(${JSON.stringify(
+ getVirtualPathForDynamicRequirePath(dir, commonDir)
+ )}, ${JSON.stringify(getVirtualPathForDynamicRequirePath(path$r.join(dir, entryPoint), commonDir))});`;
+ }
+ return code;
+}
+
+function getDynamicPackagesEntryIntro(
+ dynamicRequireModuleDirPaths,
+ dynamicRequireModuleSet
+) {
+ let dynamicImports = Array.from(
+ dynamicRequireModuleSet,
+ (dynamicId) => `require(${JSON.stringify(wrapId(dynamicId, DYNAMIC_REGISTER_SUFFIX))});`
+ ).join('\n');
+
+ if (dynamicRequireModuleDirPaths.length) {
+ dynamicImports += `require(${JSON.stringify(
+ wrapId(DYNAMIC_PACKAGES_ID, DYNAMIC_REGISTER_SUFFIX)
+ )});`;
+ }
+
+ return dynamicImports;
+}
+
+function isDynamicModuleImport(id, dynamicRequireModuleSet) {
+ const normalizedPath = normalizePathSlashes(id);
+ return dynamicRequireModuleSet.has(normalizedPath) && !normalizedPath.endsWith('.json');
+}
+
+function isDirectory(path) {
+ try {
+ if (fs$n.statSync(path).isDirectory()) return true;
+ } catch (ignored) {
+ // Nothing to do here
+ }
+ return false;
+}
+
+function getDynamicRequirePaths(patterns) {
+ const dynamicRequireModuleSet = new Set();
+ for (const pattern of !patterns || Array.isArray(patterns) ? patterns || [] : [patterns]) {
+ const isNegated = pattern.startsWith('!');
+ const modifySet = Set.prototype[isNegated ? 'delete' : 'add'].bind(dynamicRequireModuleSet);
+ for (const path of glob_1.sync(isNegated ? pattern.substr(1) : pattern)) {
+ modifySet(normalizePathSlashes(path$r.resolve(path)));
+ if (isDirectory(path)) {
+ modifySet(normalizePathSlashes(path$r.resolve(path$r.join(path, getPackageEntryPoint(path)))));
+ }
+ }
+ }
+ const dynamicRequireModuleDirPaths = Array.from(dynamicRequireModuleSet.values()).filter((path) =>
+ isDirectory(path)
+ );
+ return { dynamicRequireModuleSet, dynamicRequireModuleDirPaths };
+}
+
+function getCommonJSMetaPromise(commonJSMetaPromises, id) {
+ let commonJSMetaPromise = commonJSMetaPromises.get(id);
+ if (commonJSMetaPromise) return commonJSMetaPromise.promise;
+
+ const promise = new Promise((resolve) => {
+ commonJSMetaPromise = {
+ resolve,
+ promise: null
+ };
+ commonJSMetaPromises.set(id, commonJSMetaPromise);
+ });
+ commonJSMetaPromise.promise = promise;
+
+ return promise;
+}
+
+function setCommonJSMetaPromise(commonJSMetaPromises, id, commonjsMeta) {
+ const commonJSMetaPromise = commonJSMetaPromises.get(id);
+ if (commonJSMetaPromise) {
+ if (commonJSMetaPromise.resolve) {
+ commonJSMetaPromise.resolve(commonjsMeta);
+ commonJSMetaPromise.resolve = null;
+ }
+ } else {
+ commonJSMetaPromises.set(id, { promise: Promise.resolve(commonjsMeta), resolve: null });
+ }
+}
+
+// e.g. id === "commonjsHelpers?commonjsRegister"
+function getSpecificHelperProxy(id) {
+ return `export {${id.split('?')[1]} as default} from "${HELPERS_ID}";`;
+}
+
+function getUnknownRequireProxy(id, requireReturnsDefault) {
+ if (requireReturnsDefault === true || id.endsWith('.json')) {
+ return `export {default} from ${JSON.stringify(id)};`;
+ }
+ const name = getName(id);
+ const exported =
+ requireReturnsDefault === 'auto'
+ ? `import {getDefaultExportFromNamespaceIfNotNamed} from "${HELPERS_ID}"; export default /*@__PURE__*/getDefaultExportFromNamespaceIfNotNamed(${name});`
+ : requireReturnsDefault === 'preferred'
+ ? `import {getDefaultExportFromNamespaceIfPresent} from "${HELPERS_ID}"; export default /*@__PURE__*/getDefaultExportFromNamespaceIfPresent(${name});`
+ : !requireReturnsDefault
+ ? `import {getAugmentedNamespace} from "${HELPERS_ID}"; export default /*@__PURE__*/getAugmentedNamespace(${name});`
+ : `export default ${name};`;
+ return `import * as ${name} from ${JSON.stringify(id)}; ${exported}`;
+}
+
+function getDynamicJsonProxy(id, commonDir) {
+ const normalizedPath = normalizePathSlashes(id.slice(DYNAMIC_JSON_PREFIX.length));
+ return `const commonjsRegister = require('${HELPERS_ID}?commonjsRegister');\ncommonjsRegister(${JSON.stringify(
+ getVirtualPathForDynamicRequirePath(normalizedPath, commonDir)
+ )}, function (module, exports) {
+ module.exports = require(${JSON.stringify(normalizedPath)});
+});`;
+}
+
+function getDynamicRequireProxy(normalizedPath, commonDir) {
+ return `const commonjsRegister = require('${HELPERS_ID}?commonjsRegister');\ncommonjsRegister(${JSON.stringify(
+ getVirtualPathForDynamicRequirePath(normalizedPath, commonDir)
+ )}, function (module, exports) {
+ ${fs$n.readFileSync(normalizedPath, { encoding: 'utf8' })}
+});`;
+}
+
+async function getStaticRequireProxy(
+ id,
+ requireReturnsDefault,
+ esModulesWithDefaultExport,
+ esModulesWithNamedExports,
+ commonJsMetaPromises
+) {
+ const name = getName(id);
+ const commonjsMeta = await getCommonJSMetaPromise(commonJsMetaPromises, id);
+ if (commonjsMeta && commonjsMeta.isCommonJS) {
+ return `export { __moduleExports as default } from ${JSON.stringify(id)};`;
+ } else if (commonjsMeta === null) {
+ return getUnknownRequireProxy(id, requireReturnsDefault);
+ } else if (!requireReturnsDefault) {
+ return `import { getAugmentedNamespace } from "${HELPERS_ID}"; import * as ${name} from ${JSON.stringify(
+ id
+ )}; export default /*@__PURE__*/getAugmentedNamespace(${name});`;
+ } else if (
+ requireReturnsDefault !== true &&
+ (requireReturnsDefault === 'namespace' ||
+ !esModulesWithDefaultExport.has(id) ||
+ (requireReturnsDefault === 'auto' && esModulesWithNamedExports.has(id)))
+ ) {
+ return `import * as ${name} from ${JSON.stringify(id)}; export default ${name};`;
+ }
+ return `export { default } from ${JSON.stringify(id)};`;
+}
+
+/* eslint-disable no-param-reassign, no-undefined */
+
+function getCandidatesForExtension(resolved, extension) {
+ return [resolved + extension, `${resolved}${path$r.sep}index${extension}`];
+}
+
+function getCandidates(resolved, extensions) {
+ return extensions.reduce(
+ (paths, extension) => paths.concat(getCandidatesForExtension(resolved, extension)),
+ [resolved]
+ );
+}
+
+function getResolveId(extensions) {
+ function resolveExtensions(importee, importer) {
+ // not our problem
+ if (importee[0] !== '.' || !importer) return undefined;
+
+ const resolved = path$r.resolve(path$r.dirname(importer), importee);
+ const candidates = getCandidates(resolved, extensions);
+
+ for (let i = 0; i < candidates.length; i += 1) {
+ try {
+ const stats = fs$n.statSync(candidates[i]);
+ if (stats.isFile()) return { id: candidates[i] };
+ } catch (err) {
+ /* noop */
+ }
+ }
+
+ return undefined;
+ }
+
+ return function resolveId(importee, rawImporter, resolveOptions) {
+ if (isWrappedId(importee, MODULE_SUFFIX) || isWrappedId(importee, EXPORTS_SUFFIX)) {
+ return importee;
+ }
+
+ const importer =
+ rawImporter && isWrappedId(rawImporter, DYNAMIC_REGISTER_SUFFIX)
+ ? unwrapId$1(rawImporter, DYNAMIC_REGISTER_SUFFIX)
+ : rawImporter;
+
+ // Except for exports, proxies are only importing resolved ids,
+ // no need to resolve again
+ if (importer && isWrappedId(importer, PROXY_SUFFIX)) {
+ return importee;
+ }
+
+ const isProxyModule = isWrappedId(importee, PROXY_SUFFIX);
+ const isRequiredModule = isWrappedId(importee, REQUIRE_SUFFIX);
+ let isModuleRegistration = false;
+
+ if (isProxyModule) {
+ importee = unwrapId$1(importee, PROXY_SUFFIX);
+ } else if (isRequiredModule) {
+ importee = unwrapId$1(importee, REQUIRE_SUFFIX);
+
+ isModuleRegistration = isWrappedId(importee, DYNAMIC_REGISTER_SUFFIX);
+ if (isModuleRegistration) {
+ importee = unwrapId$1(importee, DYNAMIC_REGISTER_SUFFIX);
+ }
+ }
+
+ if (
+ importee.startsWith(HELPERS_ID) ||
+ importee === DYNAMIC_PACKAGES_ID ||
+ importee.startsWith(DYNAMIC_JSON_PREFIX)
+ ) {
+ return importee;
+ }
+
+ if (importee.startsWith('\0')) {
+ return null;
+ }
+
+ return this.resolve(
+ importee,
+ importer,
+ Object.assign({}, resolveOptions, {
+ skipSelf: true,
+ custom: Object.assign({}, resolveOptions.custom, {
+ 'node-resolve': { isRequire: isProxyModule || isRequiredModule }
+ })
+ })
+ ).then((resolved) => {
+ if (!resolved) {
+ resolved = resolveExtensions(importee, importer);
+ }
+ if (resolved && isProxyModule) {
+ resolved.id = wrapId(resolved.id, resolved.external ? EXTERNAL_SUFFIX : PROXY_SUFFIX);
+ resolved.external = false;
+ } else if (resolved && isModuleRegistration) {
+ resolved.id = wrapId(resolved.id, DYNAMIC_REGISTER_SUFFIX);
+ } else if (!resolved && (isProxyModule || isRequiredModule)) {
+ return { id: wrapId(importee, EXTERNAL_SUFFIX), external: false };
+ }
+ return resolved;
+ });
+ };
+}
+
+function validateRollupVersion(rollupVersion, peerDependencyVersion) {
+ const [major, minor] = rollupVersion.split('.').map(Number);
+ const versionRegexp = /\^(\d+\.\d+)\.\d+/g;
+ let minMajor = Infinity;
+ let minMinor = Infinity;
+ let foundVersion;
+ // eslint-disable-next-line no-cond-assign
+ while ((foundVersion = versionRegexp.exec(peerDependencyVersion))) {
+ const [foundMajor, foundMinor] = foundVersion[1].split('.').map(Number);
+ if (foundMajor < minMajor) {
+ minMajor = foundMajor;
+ minMinor = foundMinor;
+ }
+ }
+ if (major < minMajor || (major === minMajor && minor < minMinor)) {
+ throw new Error(
+ `Insufficient Rollup version: "@rollup/plugin-commonjs" requires at least rollup@${minMajor}.${minMinor} but found rollup@${rollupVersion}.`
+ );
+ }
+}
+
+const operators = {
+ '==': (x) => equals(x.left, x.right, false),
+
+ '!=': (x) => not(operators['=='](x)),
+
+ '===': (x) => equals(x.left, x.right, true),
+
+ '!==': (x) => not(operators['==='](x)),
+
+ '!': (x) => isFalsy(x.argument),
+
+ '&&': (x) => isTruthy(x.left) && isTruthy(x.right),
+
+ '||': (x) => isTruthy(x.left) || isTruthy(x.right)
+};
+
+function not(value) {
+ return value === null ? value : !value;
+}
+
+function equals(a, b, strict) {
+ if (a.type !== b.type) return null;
+ // eslint-disable-next-line eqeqeq
+ if (a.type === 'Literal') return strict ? a.value === b.value : a.value == b.value;
+ return null;
+}
+
+function isTruthy(node) {
+ if (!node) return false;
+ if (node.type === 'Literal') return !!node.value;
+ if (node.type === 'ParenthesizedExpression') return isTruthy(node.expression);
+ if (node.operator in operators) return operators[node.operator](node);
+ return null;
+}
+
+function isFalsy(node) {
+ return not(isTruthy(node));
+}
+
+function getKeypath(node) {
+ const parts = [];
+
+ while (node.type === 'MemberExpression') {
+ if (node.computed) return null;
+
+ parts.unshift(node.property.name);
+ // eslint-disable-next-line no-param-reassign
+ node = node.object;
+ }
+
+ if (node.type !== 'Identifier') return null;
+
+ const { name } = node;
+ parts.unshift(name);
+
+ return { name, keypath: parts.join('.') };
+}
+
+const KEY_COMPILED_ESM = '__esModule';
+
+function isDefineCompiledEsm(node) {
+ const definedProperty =
+ getDefinePropertyCallName(node, 'exports') || getDefinePropertyCallName(node, 'module.exports');
+ if (definedProperty && definedProperty.key === KEY_COMPILED_ESM) {
+ return isTruthy(definedProperty.value);
+ }
+ return false;
+}
+
+function getDefinePropertyCallName(node, targetName) {
+ const {
+ callee: { object, property }
+ } = node;
+ if (!object || object.type !== 'Identifier' || object.name !== 'Object') return;
+ if (!property || property.type !== 'Identifier' || property.name !== 'defineProperty') return;
+ if (node.arguments.length !== 3) return;
+
+ const targetNames = targetName.split('.');
+ const [target, key, value] = node.arguments;
+ if (targetNames.length === 1) {
+ if (target.type !== 'Identifier' || target.name !== targetNames[0]) {
+ return;
+ }
+ }
+
+ if (targetNames.length === 2) {
+ if (
+ target.type !== 'MemberExpression' ||
+ target.object.name !== targetNames[0] ||
+ target.property.name !== targetNames[1]
+ ) {
+ return;
+ }
+ }
+
+ if (value.type !== 'ObjectExpression' || !value.properties) return;
+
+ const valueProperty = value.properties.find((p) => p.key && p.key.name === 'value');
+ if (!valueProperty || !valueProperty.value) return;
+
+ // eslint-disable-next-line consistent-return
+ return { key: key.value, value: valueProperty.value };
+}
+
+function isShorthandProperty(parent) {
+ return parent && parent.type === 'Property' && parent.shorthand;
+}
+
+function hasDefineEsmProperty(node) {
+ return node.properties.some((property) => {
+ if (
+ property.type === 'Property' &&
+ property.key.type === 'Identifier' &&
+ property.key.name === '__esModule' &&
+ isTruthy(property.value)
+ ) {
+ return true;
+ }
+ return false;
+ });
+}
+
+function wrapCode(magicString, uses, moduleName, exportsName) {
+ const args = [];
+ const passedArgs = [];
+ if (uses.module) {
+ args.push('module');
+ passedArgs.push(moduleName);
+ }
+ if (uses.exports) {
+ args.push('exports');
+ passedArgs.push(exportsName);
+ }
+ magicString
+ .trim()
+ .prepend(`(function (${args.join(', ')}) {\n`)
+ .append(`\n}(${passedArgs.join(', ')}));`);
+}
+
+function rewriteExportsAndGetExportsBlock(
+ magicString,
+ moduleName,
+ exportsName,
+ wrapped,
+ moduleExportsAssignments,
+ firstTopLevelModuleExportsAssignment,
+ exportsAssignmentsByName,
+ topLevelAssignments,
+ defineCompiledEsmExpressions,
+ deconflictedExportNames,
+ code,
+ HELPERS_NAME,
+ exportMode,
+ detectWrappedDefault,
+ defaultIsModuleExports
+) {
+ const exports = [];
+ const exportDeclarations = [];
+
+ if (exportMode === 'replace') {
+ getExportsForReplacedModuleExports(
+ magicString,
+ exports,
+ exportDeclarations,
+ moduleExportsAssignments,
+ firstTopLevelModuleExportsAssignment,
+ exportsName
+ );
+ } else {
+ exports.push(`${exportsName} as __moduleExports`);
+ if (wrapped) {
+ getExportsWhenWrapping(
+ exportDeclarations,
+ exportsName,
+ detectWrappedDefault,
+ HELPERS_NAME,
+ defaultIsModuleExports
+ );
+ } else {
+ getExports(
+ magicString,
+ exports,
+ exportDeclarations,
+ moduleExportsAssignments,
+ exportsAssignmentsByName,
+ deconflictedExportNames,
+ topLevelAssignments,
+ moduleName,
+ exportsName,
+ defineCompiledEsmExpressions,
+ HELPERS_NAME,
+ defaultIsModuleExports
+ );
+ }
+ }
+ if (exports.length) {
+ exportDeclarations.push(`export { ${exports.join(', ')} };`);
+ }
+
+ return `\n\n${exportDeclarations.join('\n')}`;
+}
+
+function getExportsForReplacedModuleExports(
+ magicString,
+ exports,
+ exportDeclarations,
+ moduleExportsAssignments,
+ firstTopLevelModuleExportsAssignment,
+ exportsName
+) {
+ for (const { left } of moduleExportsAssignments) {
+ magicString.overwrite(left.start, left.end, exportsName);
+ }
+ magicString.prependRight(firstTopLevelModuleExportsAssignment.left.start, 'var ');
+ exports.push(`${exportsName} as __moduleExports`);
+ exportDeclarations.push(`export default ${exportsName};`);
+}
+
+function getExportsWhenWrapping(
+ exportDeclarations,
+ exportsName,
+ detectWrappedDefault,
+ HELPERS_NAME,
+ defaultIsModuleExports
+) {
+ exportDeclarations.push(
+ `export default ${
+ detectWrappedDefault && defaultIsModuleExports === 'auto'
+ ? `/*@__PURE__*/${HELPERS_NAME}.getDefaultExportFromCjs(${exportsName})`
+ : defaultIsModuleExports === false
+ ? `${exportsName}.default`
+ : exportsName
+ };`
+ );
+}
+
+function getExports(
+ magicString,
+ exports,
+ exportDeclarations,
+ moduleExportsAssignments,
+ exportsAssignmentsByName,
+ deconflictedExportNames,
+ topLevelAssignments,
+ moduleName,
+ exportsName,
+ defineCompiledEsmExpressions,
+ HELPERS_NAME,
+ defaultIsModuleExports
+) {
+ let deconflictedDefaultExportName;
+ // Collect and rewrite module.exports assignments
+ for (const { left } of moduleExportsAssignments) {
+ magicString.overwrite(left.start, left.end, `${moduleName}.exports`);
+ }
+
+ // Collect and rewrite named exports
+ for (const [exportName, { nodes }] of exportsAssignmentsByName) {
+ const deconflicted = deconflictedExportNames[exportName];
+ let needsDeclaration = true;
+ for (const node of nodes) {
+ let replacement = `${deconflicted} = ${exportsName}.${exportName}`;
+ if (needsDeclaration && topLevelAssignments.has(node)) {
+ replacement = `var ${replacement}`;
+ needsDeclaration = false;
+ }
+ magicString.overwrite(node.start, node.left.end, replacement);
+ }
+ if (needsDeclaration) {
+ magicString.prepend(`var ${deconflicted};\n`);
+ }
+
+ if (exportName === 'default') {
+ deconflictedDefaultExportName = deconflicted;
+ } else {
+ exports.push(exportName === deconflicted ? exportName : `${deconflicted} as ${exportName}`);
+ }
+ }
+
+ // Collect and rewrite exports.__esModule assignments
+ let isRestorableCompiledEsm = false;
+ for (const expression of defineCompiledEsmExpressions) {
+ isRestorableCompiledEsm = true;
+ const moduleExportsExpression =
+ expression.type === 'CallExpression' ? expression.arguments[0] : expression.left.object;
+ magicString.overwrite(moduleExportsExpression.start, moduleExportsExpression.end, exportsName);
+ }
+
+ if (!isRestorableCompiledEsm || defaultIsModuleExports === true) {
+ exportDeclarations.push(`export default ${exportsName};`);
+ } else if (moduleExportsAssignments.length === 0 || defaultIsModuleExports === false) {
+ exports.push(`${deconflictedDefaultExportName || exportsName} as default`);
+ } else {
+ exportDeclarations.push(
+ `export default /*@__PURE__*/${HELPERS_NAME}.getDefaultExportFromCjs(${exportsName});`
+ );
+ }
+}
+
+function isRequireStatement(node, scope) {
+ if (!node) return false;
+ if (node.type !== 'CallExpression') return false;
+
+ // Weird case of `require()` or `module.require()` without arguments
+ if (node.arguments.length === 0) return false;
+
+ return isRequire(node.callee, scope);
+}
+
+function isRequire(node, scope) {
+ return (
+ (node.type === 'Identifier' && node.name === 'require' && !scope.contains('require')) ||
+ (node.type === 'MemberExpression' && isModuleRequire(node, scope))
+ );
+}
+
+function isModuleRequire({ object, property }, scope) {
+ return (
+ object.type === 'Identifier' &&
+ object.name === 'module' &&
+ property.type === 'Identifier' &&
+ property.name === 'require' &&
+ !scope.contains('module')
+ );
+}
+
+function isStaticRequireStatement(node, scope) {
+ if (!isRequireStatement(node, scope)) return false;
+ return !hasDynamicArguments(node);
+}
+
+function hasDynamicArguments(node) {
+ return (
+ node.arguments.length > 1 ||
+ (node.arguments[0].type !== 'Literal' &&
+ (node.arguments[0].type !== 'TemplateLiteral' || node.arguments[0].expressions.length > 0))
+ );
+}
+
+const reservedMethod = { resolve: true, cache: true, main: true };
+
+function isNodeRequirePropertyAccess(parent) {
+ return parent && parent.property && reservedMethod[parent.property.name];
+}
+
+function isIgnoredRequireStatement(requiredNode, ignoreRequire) {
+ return ignoreRequire(requiredNode.arguments[0].value);
+}
+
+function getRequireStringArg(node) {
+ return node.arguments[0].type === 'Literal'
+ ? node.arguments[0].value
+ : node.arguments[0].quasis[0].value.cooked;
+}
+
+function hasDynamicModuleForPath(source, id, dynamicRequireModuleSet) {
+ if (!/^(?:\.{0,2}[/\\]|[A-Za-z]:[/\\])/.test(source)) {
+ try {
+ const resolvedPath = normalizePathSlashes(resolve$4.sync(source, { basedir: path$r.dirname(id) }));
+ if (dynamicRequireModuleSet.has(resolvedPath)) {
+ return true;
+ }
+ } catch (ex) {
+ // Probably a node.js internal module
+ return false;
+ }
+
+ return false;
+ }
+
+ for (const attemptExt of ['', '.js', '.json']) {
+ const resolvedPath = normalizePathSlashes(path$r.resolve(path$r.dirname(id), source + attemptExt));
+ if (dynamicRequireModuleSet.has(resolvedPath)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+function getRequireHandlers() {
+ const requiredSources = [];
+ const requiredBySource = Object.create(null);
+ const requiredByNode = new Map();
+ const requireExpressionsWithUsedReturnValue = [];
+
+ function addRequireStatement(sourceId, node, scope, usesReturnValue) {
+ const required = getRequired(sourceId);
+ requiredByNode.set(node, { scope, required });
+ if (usesReturnValue) {
+ required.nodesUsingRequired.push(node);
+ requireExpressionsWithUsedReturnValue.push(node);
+ }
+ }
+
+ function getRequired(sourceId) {
+ if (!requiredBySource[sourceId]) {
+ requiredSources.push(sourceId);
+
+ requiredBySource[sourceId] = {
+ source: sourceId,
+ name: null,
+ nodesUsingRequired: []
+ };
+ }
+
+ return requiredBySource[sourceId];
+ }
+
+ function rewriteRequireExpressionsAndGetImportBlock(
+ magicString,
+ topLevelDeclarations,
+ topLevelRequireDeclarators,
+ reassignedNames,
+ helpersName,
+ dynamicRegisterSources,
+ moduleName,
+ exportsName,
+ id,
+ exportMode
+ ) {
+ setRemainingImportNamesAndRewriteRequires(
+ requireExpressionsWithUsedReturnValue,
+ requiredByNode,
+ magicString
+ );
+ const imports = [];
+ imports.push(`import * as ${helpersName} from "${HELPERS_ID}";`);
+ if (exportMode === 'module') {
+ imports.push(
+ `import { __module as ${moduleName}, exports as ${exportsName} } from ${JSON.stringify(
+ wrapId(id, MODULE_SUFFIX)
+ )}`
+ );
+ } else if (exportMode === 'exports') {
+ imports.push(
+ `import { __exports as ${exportsName} } from ${JSON.stringify(wrapId(id, EXPORTS_SUFFIX))}`
+ );
+ }
+ for (const source of dynamicRegisterSources) {
+ imports.push(`import ${JSON.stringify(wrapId(source, REQUIRE_SUFFIX))};`);
+ }
+ for (const source of requiredSources) {
+ if (!source.startsWith('\0')) {
+ imports.push(`import ${JSON.stringify(wrapId(source, REQUIRE_SUFFIX))};`);
+ }
+ const { name, nodesUsingRequired } = requiredBySource[source];
+ imports.push(
+ `import ${nodesUsingRequired.length ? `${name} from ` : ''}${JSON.stringify(
+ source.startsWith('\0') ? source : wrapId(source, PROXY_SUFFIX)
+ )};`
+ );
+ }
+ return imports.length ? `${imports.join('\n')}\n\n` : '';
+ }
+
+ return {
+ addRequireStatement,
+ requiredSources,
+ rewriteRequireExpressionsAndGetImportBlock
+ };
+}
+
+function setRemainingImportNamesAndRewriteRequires(
+ requireExpressionsWithUsedReturnValue,
+ requiredByNode,
+ magicString
+) {
+ let uid = 0;
+ for (const requireExpression of requireExpressionsWithUsedReturnValue) {
+ const { required } = requiredByNode.get(requireExpression);
+ if (!required.name) {
+ let potentialName;
+ const isUsedName = (node) => requiredByNode.get(node).scope.contains(potentialName);
+ do {
+ potentialName = `require$$${uid}`;
+ uid += 1;
+ } while (required.nodesUsingRequired.some(isUsedName));
+ required.name = potentialName;
+ }
+ magicString.overwrite(requireExpression.start, requireExpression.end, required.name);
+ }
+}
+
+/* eslint-disable no-param-reassign, no-shadow, no-underscore-dangle, no-continue */
+
+const exportsPattern = /^(?:module\.)?exports(?:\.([a-zA-Z_$][a-zA-Z_$0-9]*))?$/;
+
+const functionType = /^(?:FunctionDeclaration|FunctionExpression|ArrowFunctionExpression)$/;
+
+function transformCommonjs(
+ parse,
+ code,
+ id,
+ isEsModule,
+ ignoreGlobal,
+ ignoreRequire,
+ ignoreDynamicRequires,
+ getIgnoreTryCatchRequireStatementMode,
+ sourceMap,
+ isDynamicRequireModulesEnabled,
+ dynamicRequireModuleSet,
+ disableWrap,
+ commonDir,
+ astCache,
+ defaultIsModuleExports
+) {
+ const ast = astCache || tryParse(parse, code, id);
+ const magicString = new MagicString$1(code);
+ const uses = {
+ module: false,
+ exports: false,
+ global: false,
+ require: false
+ };
+ let usesDynamicRequire = false;
+ const virtualDynamicRequirePath =
+ isDynamicRequireModulesEnabled && getVirtualPathForDynamicRequirePath(path$r.dirname(id), commonDir);
+ let scope = attachScopes(ast, 'scope');
+ let lexicalDepth = 0;
+ let programDepth = 0;
+ let currentTryBlockEnd = null;
+ let shouldWrap = false;
+
+ const globals = new Set();
+
+ // TODO technically wrong since globals isn't populated yet, but ¯\_(ツ)_/¯
+ const HELPERS_NAME = deconflict([scope], globals, 'commonjsHelpers');
+ const dynamicRegisterSources = new Set();
+ let hasRemovedRequire = false;
+
+ const {
+ addRequireStatement,
+ requiredSources,
+ rewriteRequireExpressionsAndGetImportBlock
+ } = getRequireHandlers();
+
+ // See which names are assigned to. This is necessary to prevent
+ // illegally replacing `var foo = require('foo')` with `import foo from 'foo'`,
+ // where `foo` is later reassigned. (This happens in the wild. CommonJS, sigh)
+ const reassignedNames = new Set();
+ const topLevelDeclarations = [];
+ const topLevelRequireDeclarators = new Set();
+ const skippedNodes = new Set();
+ const moduleAccessScopes = new Set([scope]);
+ const exportsAccessScopes = new Set([scope]);
+ const moduleExportsAssignments = [];
+ let firstTopLevelModuleExportsAssignment = null;
+ const exportsAssignmentsByName = new Map();
+ const topLevelAssignments = new Set();
+ const topLevelDefineCompiledEsmExpressions = [];
+
+ walk$2(ast, {
+ enter(node, parent) {
+ if (skippedNodes.has(node)) {
+ this.skip();
+ return;
+ }
+
+ if (currentTryBlockEnd !== null && node.start > currentTryBlockEnd) {
+ currentTryBlockEnd = null;
+ }
+
+ programDepth += 1;
+ if (node.scope) ({ scope } = node);
+ if (functionType.test(node.type)) lexicalDepth += 1;
+ if (sourceMap) {
+ magicString.addSourcemapLocation(node.start);
+ magicString.addSourcemapLocation(node.end);
+ }
+
+ // eslint-disable-next-line default-case
+ switch (node.type) {
+ case 'TryStatement':
+ if (currentTryBlockEnd === null) {
+ currentTryBlockEnd = node.block.end;
+ }
+ return;
+ case 'AssignmentExpression':
+ if (node.left.type === 'MemberExpression') {
+ const flattened = getKeypath(node.left);
+ if (!flattened || scope.contains(flattened.name)) return;
+
+ const exportsPatternMatch = exportsPattern.exec(flattened.keypath);
+ if (!exportsPatternMatch || flattened.keypath === 'exports') return;
+
+ const [, exportName] = exportsPatternMatch;
+ uses[flattened.name] = true;
+
+ // we're dealing with `module.exports = ...` or `[module.]exports.foo = ...` –
+ if (flattened.keypath === 'module.exports') {
+ moduleExportsAssignments.push(node);
+ if (programDepth > 3) {
+ moduleAccessScopes.add(scope);
+ } else if (!firstTopLevelModuleExportsAssignment) {
+ firstTopLevelModuleExportsAssignment = node;
+ }
+
+ if (defaultIsModuleExports === false) {
+ shouldWrap = true;
+ } else if (defaultIsModuleExports === 'auto') {
+ if (node.right.type === 'ObjectExpression') {
+ if (hasDefineEsmProperty(node.right)) {
+ shouldWrap = true;
+ }
+ } else if (defaultIsModuleExports === false) {
+ shouldWrap = true;
+ }
+ }
+ } else if (exportName === KEY_COMPILED_ESM) {
+ if (programDepth > 3) {
+ shouldWrap = true;
+ } else {
+ topLevelDefineCompiledEsmExpressions.push(node);
+ }
+ } else {
+ const exportsAssignments = exportsAssignmentsByName.get(exportName) || {
+ nodes: [],
+ scopes: new Set()
+ };
+ exportsAssignments.nodes.push(node);
+ exportsAssignments.scopes.add(scope);
+ exportsAccessScopes.add(scope);
+ exportsAssignmentsByName.set(exportName, exportsAssignments);
+ if (programDepth <= 3) {
+ topLevelAssignments.add(node);
+ }
+ }
+
+ skippedNodes.add(node.left);
+ } else {
+ for (const name of extractAssignedNames(node.left)) {
+ reassignedNames.add(name);
+ }
+ }
+ return;
+ case 'CallExpression': {
+ if (isDefineCompiledEsm(node)) {
+ if (programDepth === 3 && parent.type === 'ExpressionStatement') {
+ // skip special handling for [module.]exports until we know we render this
+ skippedNodes.add(node.arguments[0]);
+ topLevelDefineCompiledEsmExpressions.push(node);
+ } else {
+ shouldWrap = true;
+ }
+ return;
+ }
+
+ if (
+ node.callee.object &&
+ node.callee.object.name === 'require' &&
+ node.callee.property.name === 'resolve' &&
+ hasDynamicModuleForPath(id, '/', dynamicRequireModuleSet)
+ ) {
+ const requireNode = node.callee.object;
+ magicString.appendLeft(
+ node.end - 1,
+ `,${JSON.stringify(
+ path$r.dirname(id) === '.' ? null /* default behavior */ : virtualDynamicRequirePath
+ )}`
+ );
+ magicString.overwrite(
+ requireNode.start,
+ requireNode.end,
+ `${HELPERS_NAME}.commonjsRequire`,
+ {
+ storeName: true
+ }
+ );
+ return;
+ }
+
+ if (!isStaticRequireStatement(node, scope)) return;
+ if (!isDynamicRequireModulesEnabled) {
+ skippedNodes.add(node.callee);
+ }
+ if (!isIgnoredRequireStatement(node, ignoreRequire)) {
+ skippedNodes.add(node.callee);
+ const usesReturnValue = parent.type !== 'ExpressionStatement';
+
+ let canConvertRequire = true;
+ let shouldRemoveRequireStatement = false;
+
+ if (currentTryBlockEnd !== null) {
+ ({
+ canConvertRequire,
+ shouldRemoveRequireStatement
+ } = getIgnoreTryCatchRequireStatementMode(node.arguments[0].value));
+
+ if (shouldRemoveRequireStatement) {
+ hasRemovedRequire = true;
+ }
+ }
+
+ let sourceId = getRequireStringArg(node);
+ const isDynamicRegister = isWrappedId(sourceId, DYNAMIC_REGISTER_SUFFIX);
+ if (isDynamicRegister) {
+ sourceId = unwrapId$1(sourceId, DYNAMIC_REGISTER_SUFFIX);
+ if (sourceId.endsWith('.json')) {
+ sourceId = DYNAMIC_JSON_PREFIX + sourceId;
+ }
+ dynamicRegisterSources.add(wrapId(sourceId, DYNAMIC_REGISTER_SUFFIX));
+ } else {
+ if (
+ !sourceId.endsWith('.json') &&
+ hasDynamicModuleForPath(sourceId, id, dynamicRequireModuleSet)
+ ) {
+ if (shouldRemoveRequireStatement) {
+ magicString.overwrite(node.start, node.end, `undefined`);
+ } else if (canConvertRequire) {
+ magicString.overwrite(
+ node.start,
+ node.end,
+ `${HELPERS_NAME}.commonjsRequire(${JSON.stringify(
+ getVirtualPathForDynamicRequirePath(sourceId, commonDir)
+ )}, ${JSON.stringify(
+ path$r.dirname(id) === '.' ? null /* default behavior */ : virtualDynamicRequirePath
+ )})`
+ );
+ usesDynamicRequire = true;
+ }
+ return;
+ }
+
+ if (canConvertRequire) {
+ addRequireStatement(sourceId, node, scope, usesReturnValue);
+ }
+ }
+
+ if (usesReturnValue) {
+ if (shouldRemoveRequireStatement) {
+ magicString.overwrite(node.start, node.end, `undefined`);
+ return;
+ }
+
+ if (
+ parent.type === 'VariableDeclarator' &&
+ !scope.parent &&
+ parent.id.type === 'Identifier'
+ ) {
+ // This will allow us to reuse this variable name as the imported variable if it is not reassigned
+ // and does not conflict with variables in other places where this is imported
+ topLevelRequireDeclarators.add(parent);
+ }
+ } else {
+ // This is a bare import, e.g. `require('foo');`
+
+ if (!canConvertRequire && !shouldRemoveRequireStatement) {
+ return;
+ }
+
+ magicString.remove(parent.start, parent.end);
+ }
+ }
+ return;
+ }
+ case 'ConditionalExpression':
+ case 'IfStatement':
+ // skip dead branches
+ if (isFalsy(node.test)) {
+ skippedNodes.add(node.consequent);
+ } else if (node.alternate && isTruthy(node.test)) {
+ skippedNodes.add(node.alternate);
+ }
+ return;
+ case 'Identifier': {
+ const { name } = node;
+ if (!(isReference(node, parent) && !scope.contains(name))) return;
+ switch (name) {
+ case 'require':
+ if (isNodeRequirePropertyAccess(parent)) {
+ if (hasDynamicModuleForPath(id, '/', dynamicRequireModuleSet)) {
+ if (parent.property.name === 'cache') {
+ magicString.overwrite(node.start, node.end, `${HELPERS_NAME}.commonjsRequire`, {
+ storeName: true
+ });
+ }
+ }
+
+ return;
+ }
+
+ if (isDynamicRequireModulesEnabled && isRequireStatement(parent, scope)) {
+ magicString.appendLeft(
+ parent.end - 1,
+ `,${JSON.stringify(
+ path$r.dirname(id) === '.' ? null /* default behavior */ : virtualDynamicRequirePath
+ )}`
+ );
+ }
+ if (!ignoreDynamicRequires) {
+ if (isShorthandProperty(parent)) {
+ magicString.appendRight(node.end, `: ${HELPERS_NAME}.commonjsRequire`);
+ } else {
+ magicString.overwrite(node.start, node.end, `${HELPERS_NAME}.commonjsRequire`, {
+ storeName: true
+ });
+ }
+ }
+ usesDynamicRequire = true;
+ return;
+ case 'module':
+ case 'exports':
+ shouldWrap = true;
+ uses[name] = true;
+ return;
+ case 'global':
+ uses.global = true;
+ if (!ignoreGlobal) {
+ magicString.overwrite(node.start, node.end, `${HELPERS_NAME}.commonjsGlobal`, {
+ storeName: true
+ });
+ }
+ return;
+ case 'define':
+ magicString.overwrite(node.start, node.end, 'undefined', {
+ storeName: true
+ });
+ return;
+ default:
+ globals.add(name);
+ return;
+ }
+ }
+ case 'MemberExpression':
+ if (!isDynamicRequireModulesEnabled && isModuleRequire(node, scope)) {
+ magicString.overwrite(node.start, node.end, `${HELPERS_NAME}.commonjsRequire`, {
+ storeName: true
+ });
+ skippedNodes.add(node.object);
+ skippedNodes.add(node.property);
+ }
+ return;
+ case 'ReturnStatement':
+ // if top-level return, we need to wrap it
+ if (lexicalDepth === 0) {
+ shouldWrap = true;
+ }
+ return;
+ case 'ThisExpression':
+ // rewrite top-level `this` as `commonjsHelpers.commonjsGlobal`
+ if (lexicalDepth === 0) {
+ uses.global = true;
+ if (!ignoreGlobal) {
+ magicString.overwrite(node.start, node.end, `${HELPERS_NAME}.commonjsGlobal`, {
+ storeName: true
+ });
+ }
+ }
+ return;
+ case 'UnaryExpression':
+ // rewrite `typeof module`, `typeof module.exports` and `typeof exports` (https://github.com/rollup/rollup-plugin-commonjs/issues/151)
+ if (node.operator === 'typeof') {
+ const flattened = getKeypath(node.argument);
+ if (!flattened) return;
+
+ if (scope.contains(flattened.name)) return;
+
+ if (
+ flattened.keypath === 'module.exports' ||
+ flattened.keypath === 'module' ||
+ flattened.keypath === 'exports'
+ ) {
+ magicString.overwrite(node.start, node.end, `'object'`, {
+ storeName: false
+ });
+ }
+ }
+ return;
+ case 'VariableDeclaration':
+ if (!scope.parent) {
+ topLevelDeclarations.push(node);
+ }
+ }
+ },
+
+ leave(node) {
+ programDepth -= 1;
+ if (node.scope) scope = scope.parent;
+ if (functionType.test(node.type)) lexicalDepth -= 1;
+ }
+ });
+
+ const nameBase = getName(id);
+ const exportsName = deconflict([...exportsAccessScopes], globals, nameBase);
+ const moduleName = deconflict([...moduleAccessScopes], globals, `${nameBase}Module`);
+ const deconflictedExportNames = Object.create(null);
+ for (const [exportName, { scopes }] of exportsAssignmentsByName) {
+ deconflictedExportNames[exportName] = deconflict([...scopes], globals, exportName);
+ }
+
+ // We cannot wrap ES/mixed modules
+ shouldWrap =
+ !isEsModule &&
+ !disableWrap &&
+ (shouldWrap || (uses.exports && moduleExportsAssignments.length > 0));
+ const detectWrappedDefault =
+ shouldWrap &&
+ (topLevelDefineCompiledEsmExpressions.length > 0 || code.indexOf('__esModule') >= 0);
+
+ if (
+ !(
+ requiredSources.length ||
+ dynamicRegisterSources.size ||
+ uses.module ||
+ uses.exports ||
+ uses.require ||
+ usesDynamicRequire ||
+ hasRemovedRequire ||
+ topLevelDefineCompiledEsmExpressions.length > 0
+ ) &&
+ (ignoreGlobal || !uses.global)
+ ) {
+ return { meta: { commonjs: { isCommonJS: false } } };
+ }
+
+ let leadingComment = '';
+ if (code.startsWith('/*')) {
+ const commentEnd = code.indexOf('*/', 2) + 2;
+ leadingComment = `${code.slice(0, commentEnd)}\n`;
+ magicString.remove(0, commentEnd).trim();
+ }
+
+ const exportMode = shouldWrap
+ ? uses.module
+ ? 'module'
+ : 'exports'
+ : firstTopLevelModuleExportsAssignment
+ ? exportsAssignmentsByName.size === 0 && topLevelDefineCompiledEsmExpressions.length === 0
+ ? 'replace'
+ : 'module'
+ : moduleExportsAssignments.length === 0
+ ? 'exports'
+ : 'module';
+
+ const importBlock = rewriteRequireExpressionsAndGetImportBlock(
+ magicString,
+ topLevelDeclarations,
+ topLevelRequireDeclarators,
+ reassignedNames,
+ HELPERS_NAME,
+ dynamicRegisterSources,
+ moduleName,
+ exportsName,
+ id,
+ exportMode
+ );
+
+ const exportBlock = isEsModule
+ ? ''
+ : rewriteExportsAndGetExportsBlock(
+ magicString,
+ moduleName,
+ exportsName,
+ shouldWrap,
+ moduleExportsAssignments,
+ firstTopLevelModuleExportsAssignment,
+ exportsAssignmentsByName,
+ topLevelAssignments,
+ topLevelDefineCompiledEsmExpressions,
+ deconflictedExportNames,
+ code,
+ HELPERS_NAME,
+ exportMode,
+ detectWrappedDefault,
+ defaultIsModuleExports
+ );
+
+ if (shouldWrap) {
+ wrapCode(magicString, uses, moduleName, exportsName);
+ }
+
+ magicString
+ .trim()
+ .prepend(leadingComment + importBlock)
+ .append(exportBlock);
+
+ return {
+ code: magicString.toString(),
+ map: sourceMap ? magicString.generateMap() : null,
+ syntheticNamedExports: isEsModule ? false : '__moduleExports',
+ meta: { commonjs: { isCommonJS: !isEsModule } }
+ };
+}
+
+function commonjs(options = {}) {
+ const extensions = options.extensions || ['.js'];
+ const filter = createFilter(options.include, options.exclude);
+ const {
+ ignoreGlobal,
+ ignoreDynamicRequires,
+ requireReturnsDefault: requireReturnsDefaultOption,
+ defaultIsModuleExports: defaultIsModuleExportsOption,
+ esmExternals
+ } = options;
+ const getRequireReturnsDefault =
+ typeof requireReturnsDefaultOption === 'function'
+ ? requireReturnsDefaultOption
+ : () => requireReturnsDefaultOption;
+ let esmExternalIds;
+ const isEsmExternal =
+ typeof esmExternals === 'function'
+ ? esmExternals
+ : Array.isArray(esmExternals)
+ ? ((esmExternalIds = new Set(esmExternals)), (id) => esmExternalIds.has(id))
+ : () => esmExternals;
+ const getDefaultIsModuleExports =
+ typeof defaultIsModuleExportsOption === 'function'
+ ? defaultIsModuleExportsOption
+ : () =>
+ typeof defaultIsModuleExportsOption === 'boolean' ? defaultIsModuleExportsOption : 'auto';
+
+ const { dynamicRequireModuleSet, dynamicRequireModuleDirPaths } = getDynamicRequirePaths(
+ options.dynamicRequireTargets
+ );
+ const isDynamicRequireModulesEnabled = dynamicRequireModuleSet.size > 0;
+ const commonDir = isDynamicRequireModulesEnabled
+ ? commondir(null, Array.from(dynamicRequireModuleSet).concat(process.cwd()))
+ : null;
+
+ const esModulesWithDefaultExport = new Set();
+ const esModulesWithNamedExports = new Set();
+ const commonJsMetaPromises = new Map();
+
+ const ignoreRequire =
+ typeof options.ignore === 'function'
+ ? options.ignore
+ : Array.isArray(options.ignore)
+ ? (id) => options.ignore.includes(id)
+ : () => false;
+
+ const getIgnoreTryCatchRequireStatementMode = (id) => {
+ const mode =
+ typeof options.ignoreTryCatch === 'function'
+ ? options.ignoreTryCatch(id)
+ : Array.isArray(options.ignoreTryCatch)
+ ? options.ignoreTryCatch.includes(id)
+ : typeof options.ignoreTryCatch !== 'undefined'
+ ? options.ignoreTryCatch
+ : true;
+
+ return {
+ canConvertRequire: mode !== 'remove' && mode !== true,
+ shouldRemoveRequireStatement: mode === 'remove'
+ };
+ };
+
+ const resolveId = getResolveId(extensions);
+
+ const sourceMap = options.sourceMap !== false;
+
+ function transformAndCheckExports(code, id) {
+ if (isDynamicRequireModulesEnabled && this.getModuleInfo(id).isEntry) {
+ // eslint-disable-next-line no-param-reassign
+ code =
+ getDynamicPackagesEntryIntro(dynamicRequireModuleDirPaths, dynamicRequireModuleSet) + code;
+ }
+
+ const { isEsModule, hasDefaultExport, hasNamedExports, ast } = analyzeTopLevelStatements(
+ this.parse,
+ code,
+ id
+ );
+ if (hasDefaultExport) {
+ esModulesWithDefaultExport.add(id);
+ }
+ if (hasNamedExports) {
+ esModulesWithNamedExports.add(id);
+ }
+
+ if (
+ !dynamicRequireModuleSet.has(normalizePathSlashes(id)) &&
+ (!hasCjsKeywords(code, ignoreGlobal) || (isEsModule && !options.transformMixedEsModules))
+ ) {
+ return { meta: { commonjs: { isCommonJS: false } } };
+ }
+
+ // avoid wrapping as this is a commonjsRegister call
+ const disableWrap = isWrappedId(id, DYNAMIC_REGISTER_SUFFIX);
+ if (disableWrap) {
+ // eslint-disable-next-line no-param-reassign
+ id = unwrapId$1(id, DYNAMIC_REGISTER_SUFFIX);
+ }
+
+ return transformCommonjs(
+ this.parse,
+ code,
+ id,
+ isEsModule,
+ ignoreGlobal || isEsModule,
+ ignoreRequire,
+ ignoreDynamicRequires && !isDynamicRequireModulesEnabled,
+ getIgnoreTryCatchRequireStatementMode,
+ sourceMap,
+ isDynamicRequireModulesEnabled,
+ dynamicRequireModuleSet,
+ disableWrap,
+ commonDir,
+ ast,
+ getDefaultIsModuleExports(id)
+ );
+ }
+
+ return {
+ name: 'commonjs',
+
+ buildStart() {
+ validateRollupVersion(this.meta.rollupVersion, peerDependencies.rollup);
+ if (options.namedExports != null) {
+ this.warn(
+ 'The namedExports option from "@rollup/plugin-commonjs" is deprecated. Named exports are now handled automatically.'
+ );
+ }
+ },
+
+ resolveId,
+
+ load(id) {
+ if (id === HELPERS_ID) {
+ return getHelpersModule(isDynamicRequireModulesEnabled, ignoreDynamicRequires);
+ }
+
+ if (id.startsWith(HELPERS_ID)) {
+ return getSpecificHelperProxy(id);
+ }
+
+ if (isWrappedId(id, MODULE_SUFFIX)) {
+ const actualId = unwrapId$1(id, MODULE_SUFFIX);
+ let name = getName(actualId);
+ let code;
+ if (isDynamicRequireModulesEnabled) {
+ if (['modulePath', 'commonjsRequire', 'createModule'].includes(name)) {
+ name = `${name}_`;
+ }
+ code =
+ `import {commonjsRequire, createModule} from "${HELPERS_ID}";\n` +
+ `var ${name} = createModule(${JSON.stringify(
+ getVirtualPathForDynamicRequirePath(path$r.dirname(actualId), commonDir)
+ )});\n` +
+ `export {${name} as __module}`;
+ } else {
+ code = `var ${name} = {exports: {}}; export {${name} as __module}`;
+ }
+ return {
+ code,
+ syntheticNamedExports: '__module',
+ meta: { commonjs: { isCommonJS: false } }
+ };
+ }
+
+ if (isWrappedId(id, EXPORTS_SUFFIX)) {
+ const actualId = unwrapId$1(id, EXPORTS_SUFFIX);
+ const name = getName(actualId);
+ return {
+ code: `var ${name} = {}; export {${name} as __exports}`,
+ meta: { commonjs: { isCommonJS: false } }
+ };
+ }
+
+ if (isWrappedId(id, EXTERNAL_SUFFIX)) {
+ const actualId = unwrapId$1(id, EXTERNAL_SUFFIX);
+ return getUnknownRequireProxy(
+ actualId,
+ isEsmExternal(actualId) ? getRequireReturnsDefault(actualId) : true
+ );
+ }
+
+ if (id === DYNAMIC_PACKAGES_ID) {
+ return getDynamicPackagesModule(dynamicRequireModuleDirPaths, commonDir);
+ }
+
+ if (id.startsWith(DYNAMIC_JSON_PREFIX)) {
+ return getDynamicJsonProxy(id, commonDir);
+ }
+
+ if (isDynamicModuleImport(id, dynamicRequireModuleSet)) {
+ return `export default require(${JSON.stringify(normalizePathSlashes(id))});`;
+ }
+
+ if (isWrappedId(id, DYNAMIC_REGISTER_SUFFIX)) {
+ return getDynamicRequireProxy(
+ normalizePathSlashes(unwrapId$1(id, DYNAMIC_REGISTER_SUFFIX)),
+ commonDir
+ );
+ }
+
+ if (isWrappedId(id, PROXY_SUFFIX)) {
+ const actualId = unwrapId$1(id, PROXY_SUFFIX);
+ return getStaticRequireProxy(
+ actualId,
+ getRequireReturnsDefault(actualId),
+ esModulesWithDefaultExport,
+ esModulesWithNamedExports,
+ commonJsMetaPromises
+ );
+ }
+
+ return null;
+ },
+
+ transform(code, rawId) {
+ let id = rawId;
+
+ if (isWrappedId(id, DYNAMIC_REGISTER_SUFFIX)) {
+ id = unwrapId$1(id, DYNAMIC_REGISTER_SUFFIX);
+ }
+
+ const extName = path$r.extname(id);
+ if (
+ extName !== '.cjs' &&
+ id !== DYNAMIC_PACKAGES_ID &&
+ !id.startsWith(DYNAMIC_JSON_PREFIX) &&
+ (!filter(id) || !extensions.includes(extName))
+ ) {
+ return null;
+ }
+
+ try {
+ return transformAndCheckExports.call(this, code, rawId);
+ } catch (err) {
+ return this.error(err, err.loc);
+ }
+ },
+
+ moduleParsed({ id, meta: { commonjs: commonjsMeta } }) {
+ if (commonjsMeta && commonjsMeta.isCommonJS != null) {
+ setCommonJSMetaPromise(commonJsMetaPromises, id, commonjsMeta);
+ return;
+ }
+ setCommonJSMetaPromise(commonJsMetaPromises, id, null);
+ }
+ };
+}
+
+var tasks = {};
+
+var utils$h = {};
+
+var array$1 = {};
+
+Object.defineProperty(array$1, "__esModule", { value: true });
+array$1.splitWhen = array$1.flatten = void 0;
+function flatten$1(items) {
+ return items.reduce((collection, item) => [].concat(collection, item), []);
+}
+array$1.flatten = flatten$1;
+function splitWhen(items, predicate) {
+ const result = [[]];
+ let groupIndex = 0;
+ for (const item of items) {
+ if (predicate(item)) {
+ groupIndex++;
+ result[groupIndex] = [];
+ }
+ else {
+ result[groupIndex].push(item);
+ }
+ }
+ return result;
+}
+array$1.splitWhen = splitWhen;
+
+var errno$1 = {};
+
+Object.defineProperty(errno$1, "__esModule", { value: true });
+errno$1.isEnoentCodeError = void 0;
+function isEnoentCodeError(error) {
+ return error.code === 'ENOENT';
+}
+errno$1.isEnoentCodeError = isEnoentCodeError;
+
+var fs$i = {};
+
+Object.defineProperty(fs$i, "__esModule", { value: true });
+fs$i.createDirentFromStats = void 0;
+class DirentFromStats$1 {
+ constructor(name, stats) {
+ this.name = name;
+ this.isBlockDevice = stats.isBlockDevice.bind(stats);
+ this.isCharacterDevice = stats.isCharacterDevice.bind(stats);
+ this.isDirectory = stats.isDirectory.bind(stats);
+ this.isFIFO = stats.isFIFO.bind(stats);
+ this.isFile = stats.isFile.bind(stats);
+ this.isSocket = stats.isSocket.bind(stats);
+ this.isSymbolicLink = stats.isSymbolicLink.bind(stats);
+ }
+}
+function createDirentFromStats$1(name, stats) {
+ return new DirentFromStats$1(name, stats);
+}
+fs$i.createDirentFromStats = createDirentFromStats$1;
+
+var path$g = {};
+
+Object.defineProperty(path$g, "__esModule", { value: true });
+path$g.removeLeadingDotSegment = path$g.escape = path$g.makeAbsolute = path$g.unixify = void 0;
+const path$f = path__default;
+const LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; // ./ or .\\
+const UNESCAPED_GLOB_SYMBOLS_RE = /(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g;
+/**
+ * Designed to work only with simple paths: `dir\\file`.
+ */
+function unixify(filepath) {
+ return filepath.replace(/\\/g, '/');
+}
+path$g.unixify = unixify;
+function makeAbsolute(cwd, filepath) {
+ return path$f.resolve(cwd, filepath);
+}
+path$g.makeAbsolute = makeAbsolute;
+function escape$2(pattern) {
+ return pattern.replace(UNESCAPED_GLOB_SYMBOLS_RE, '\\$2');
+}
+path$g.escape = escape$2;
+function removeLeadingDotSegment(entry) {
+ // We do not use `startsWith` because this is 10x slower than current implementation for some cases.
+ // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with
+ if (entry.charAt(0) === '.') {
+ const secondCharactery = entry.charAt(1);
+ if (secondCharactery === '/' || secondCharactery === '\\') {
+ return entry.slice(LEADING_DOT_SEGMENT_CHARACTERS_COUNT);
+ }
+ }
+ return entry;
+}
+path$g.removeLeadingDotSegment = removeLeadingDotSegment;
+
+var pattern$1 = {};
+
+/*!
+ * is-extglob
+ *
+ * Copyright (c) 2014-2016, Jon Schlinkert.
+ * Licensed under the MIT License.
+ */
+
+var isExtglob$1 = function isExtglob(str) {
+ if (typeof str !== 'string' || str === '') {
+ return false;
+ }
+
+ var match;
+ while ((match = /(\\).|([@?!+*]\(.*\))/g.exec(str))) {
+ if (match[2]) return true;
+ str = str.slice(match.index + match[0].length);
+ }
+
+ return false;
+};
+
+/*!
+ * is-glob
+ *
+ * Copyright (c) 2014-2017, Jon Schlinkert.
+ * Released under the MIT License.
+ */
+
+var isExtglob = isExtglob$1;
+var chars$1 = { '{': '}', '(': ')', '[': ']'};
+var strictCheck = function(str) {
+ if (str[0] === '!') {
+ return true;
+ }
+ var index = 0;
+ var pipeIndex = -2;
+ var closeSquareIndex = -2;
+ var closeCurlyIndex = -2;
+ var closeParenIndex = -2;
+ var backSlashIndex = -2;
+ while (index < str.length) {
+ if (str[index] === '*') {
+ return true;
+ }
+
+ if (str[index + 1] === '?' && /[\].+)]/.test(str[index])) {
+ return true;
+ }
+
+ if (closeSquareIndex !== -1 && str[index] === '[' && str[index + 1] !== ']') {
+ if (closeSquareIndex < index) {
+ closeSquareIndex = str.indexOf(']', index);
+ }
+ if (closeSquareIndex > index) {
+ if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) {
+ return true;
+ }
+ backSlashIndex = str.indexOf('\\', index);
+ if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) {
+ return true;
+ }
+ }
+ }
+
+ if (closeCurlyIndex !== -1 && str[index] === '{' && str[index + 1] !== '}') {
+ closeCurlyIndex = str.indexOf('}', index);
+ if (closeCurlyIndex > index) {
+ backSlashIndex = str.indexOf('\\', index);
+ if (backSlashIndex === -1 || backSlashIndex > closeCurlyIndex) {
+ return true;
+ }
+ }
+ }
+
+ if (closeParenIndex !== -1 && str[index] === '(' && str[index + 1] === '?' && /[:!=]/.test(str[index + 2]) && str[index + 3] !== ')') {
+ closeParenIndex = str.indexOf(')', index);
+ if (closeParenIndex > index) {
+ backSlashIndex = str.indexOf('\\', index);
+ if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) {
+ return true;
+ }
+ }
+ }
+
+ if (pipeIndex !== -1 && str[index] === '(' && str[index + 1] !== '|') {
+ if (pipeIndex < index) {
+ pipeIndex = str.indexOf('|', index);
+ }
+ if (pipeIndex !== -1 && str[pipeIndex + 1] !== ')') {
+ closeParenIndex = str.indexOf(')', pipeIndex);
+ if (closeParenIndex > pipeIndex) {
+ backSlashIndex = str.indexOf('\\', pipeIndex);
+ if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) {
+ return true;
+ }
+ }
+ }
+ }
+
+ if (str[index] === '\\') {
+ var open = str[index + 1];
+ index += 2;
+ var close = chars$1[open];
+
+ if (close) {
+ var n = str.indexOf(close, index);
+ if (n !== -1) {
+ index = n + 1;
+ }
+ }
+
+ if (str[index] === '!') {
+ return true;
+ }
+ } else {
+ index++;
+ }
+ }
+ return false;
+};
+
+var relaxedCheck = function(str) {
+ if (str[0] === '!') {
+ return true;
+ }
+ var index = 0;
+ while (index < str.length) {
+ if (/[*?{}()[\]]/.test(str[index])) {
+ return true;
+ }
+
+ if (str[index] === '\\') {
+ var open = str[index + 1];
+ index += 2;
+ var close = chars$1[open];
+
+ if (close) {
+ var n = str.indexOf(close, index);
+ if (n !== -1) {
+ index = n + 1;
+ }
+ }
+
+ if (str[index] === '!') {
+ return true;
+ }
+ } else {
+ index++;
+ }
+ }
+ return false;
+};
+
+var isGlob$2 = function isGlob(str, options) {
+ if (typeof str !== 'string' || str === '') {
+ return false;
+ }
+
+ if (isExtglob(str)) {
+ return true;
+ }
+
+ var check = strictCheck;
+
+ // optionally relax check
+ if (options && options.strict === false) {
+ check = relaxedCheck;
+ }
+
+ return check(str);
+};
+
+var isGlob$1 = isGlob$2;
+var pathPosixDirname = path__default.posix.dirname;
+var isWin32 = require$$2__default.platform() === 'win32';
+
+var slash$1 = '/';
+var backslash = /\\/g;
+var enclosure = /[\{\[].*[\}\]]$/;
+var globby = /(^|[^\\])([\{\[]|\([^\)]+$)/;
+var escaped = /\\([\!\*\?\|\[\]\(\)\{\}])/g;
+
+/**
+ * @param {string} str
+ * @param {Object} opts
+ * @param {boolean} [opts.flipBackslashes=true]
+ * @returns {string}
+ */
+var globParent$2 = function globParent(str, opts) {
+ var options = Object.assign({ flipBackslashes: true }, opts);
+
+ // flip windows path separators
+ if (options.flipBackslashes && isWin32 && str.indexOf(slash$1) < 0) {
+ str = str.replace(backslash, slash$1);
+ }
+
+ // special case for strings ending in enclosure containing path separator
+ if (enclosure.test(str)) {
+ str += slash$1;
+ }
+
+ // preserves full path in case of trailing path separator
+ str += 'a';
+
+ // remove path parts that are globby
+ do {
+ str = pathPosixDirname(str);
+ } while (isGlob$1(str) || globby.test(str));
+
+ // remove escape chars and return result
+ return str.replace(escaped, '$1');
+};
+
+var utils$g = {};
+
+(function (exports) {
+
+exports.isInteger = num => {
+ if (typeof num === 'number') {
+ return Number.isInteger(num);
+ }
+ if (typeof num === 'string' && num.trim() !== '') {
+ return Number.isInteger(Number(num));
+ }
+ return false;
+};
+
+/**
+ * Find a node of the given type
+ */
+
+exports.find = (node, type) => node.nodes.find(node => node.type === type);
+
+/**
+ * Find a node of the given type
+ */
+
+exports.exceedsLimit = (min, max, step = 1, limit) => {
+ if (limit === false) return false;
+ if (!exports.isInteger(min) || !exports.isInteger(max)) return false;
+ return ((Number(max) - Number(min)) / Number(step)) >= limit;
+};
+
+/**
+ * Escape the given node with '\\' before node.value
+ */
+
+exports.escapeNode = (block, n = 0, type) => {
+ let node = block.nodes[n];
+ if (!node) return;
+
+ if ((type && node.type === type) || node.type === 'open' || node.type === 'close') {
+ if (node.escaped !== true) {
+ node.value = '\\' + node.value;
+ node.escaped = true;
+ }
+ }
+};
+
+/**
+ * Returns true if the given brace node should be enclosed in literal braces
+ */
+
+exports.encloseBrace = node => {
+ if (node.type !== 'brace') return false;
+ if ((node.commas >> 0 + node.ranges >> 0) === 0) {
+ node.invalid = true;
+ return true;
+ }
+ return false;
+};
+
+/**
+ * Returns true if a brace node is invalid.
+ */
+
+exports.isInvalidBrace = block => {
+ if (block.type !== 'brace') return false;
+ if (block.invalid === true || block.dollar) return true;
+ if ((block.commas >> 0 + block.ranges >> 0) === 0) {
+ block.invalid = true;
+ return true;
+ }
+ if (block.open !== true || block.close !== true) {
+ block.invalid = true;
+ return true;
+ }
+ return false;
+};
+
+/**
+ * Returns true if a node is an open or close node
+ */
+
+exports.isOpenOrClose = node => {
+ if (node.type === 'open' || node.type === 'close') {
+ return true;
+ }
+ return node.open === true || node.close === true;
+};
+
+/**
+ * Reduce an array of text nodes.
+ */
+
+exports.reduce = nodes => nodes.reduce((acc, node) => {
+ if (node.type === 'text') acc.push(node.value);
+ if (node.type === 'range') node.type = 'text';
+ return acc;
+}, []);
+
+/**
+ * Flatten an array
+ */
+
+exports.flatten = (...args) => {
+ const result = [];
+ const flat = arr => {
+ for (let i = 0; i < arr.length; i++) {
+ let ele = arr[i];
+ Array.isArray(ele) ? flat(ele) : ele !== void 0 && result.push(ele);
+ }
+ return result;
+ };
+ flat(args);
+ return result;
+};
+}(utils$g));
+
+const utils$f = utils$g;
+
+var stringify$7 = (ast, options = {}) => {
+ let stringify = (node, parent = {}) => {
+ let invalidBlock = options.escapeInvalid && utils$f.isInvalidBrace(parent);
+ let invalidNode = node.invalid === true && options.escapeInvalid === true;
+ let output = '';
+
+ if (node.value) {
+ if ((invalidBlock || invalidNode) && utils$f.isOpenOrClose(node)) {
+ return '\\' + node.value;
+ }
+ return node.value;
+ }
+
+ if (node.value) {
+ return node.value;
+ }
+
+ if (node.nodes) {
+ for (let child of node.nodes) {
+ output += stringify(child);
+ }
+ }
+ return output;
+ };
+
+ return stringify(ast);
+};
+
+/*!
+ * is-number
+ *
+ * Copyright (c) 2014-present, Jon Schlinkert.
+ * Released under the MIT License.
+ */
+
+var isNumber$2 = function(num) {
+ if (typeof num === 'number') {
+ return num - num === 0;
+ }
+ if (typeof num === 'string' && num.trim() !== '') {
+ return Number.isFinite ? Number.isFinite(+num) : isFinite(+num);
+ }
+ return false;
+};
+
+/*!
+ * to-regex-range
+ *
+ * Copyright (c) 2015-present, Jon Schlinkert.
+ * Released under the MIT License.
+ */
+
+const isNumber$1 = isNumber$2;
+
+const toRegexRange$1 = (min, max, options) => {
+ if (isNumber$1(min) === false) {
+ throw new TypeError('toRegexRange: expected the first argument to be a number');
+ }
+
+ if (max === void 0 || min === max) {
+ return String(min);
+ }
+
+ if (isNumber$1(max) === false) {
+ throw new TypeError('toRegexRange: expected the second argument to be a number.');
+ }
+
+ let opts = { relaxZeros: true, ...options };
+ if (typeof opts.strictZeros === 'boolean') {
+ opts.relaxZeros = opts.strictZeros === false;
+ }
+
+ let relax = String(opts.relaxZeros);
+ let shorthand = String(opts.shorthand);
+ let capture = String(opts.capture);
+ let wrap = String(opts.wrap);
+ let cacheKey = min + ':' + max + '=' + relax + shorthand + capture + wrap;
+
+ if (toRegexRange$1.cache.hasOwnProperty(cacheKey)) {
+ return toRegexRange$1.cache[cacheKey].result;
+ }
+
+ let a = Math.min(min, max);
+ let b = Math.max(min, max);
+
+ if (Math.abs(a - b) === 1) {
+ let result = min + '|' + max;
+ if (opts.capture) {
+ return `(${result})`;
+ }
+ if (opts.wrap === false) {
+ return result;
+ }
+ return `(?:${result})`;
+ }
+
+ let isPadded = hasPadding(min) || hasPadding(max);
+ let state = { min, max, a, b };
+ let positives = [];
+ let negatives = [];
+
+ if (isPadded) {
+ state.isPadded = isPadded;
+ state.maxLen = String(state.max).length;
+ }
+
+ if (a < 0) {
+ let newMin = b < 0 ? Math.abs(b) : 1;
+ negatives = splitToPatterns(newMin, Math.abs(a), state, opts);
+ a = state.a = 0;
+ }
+
+ if (b >= 0) {
+ positives = splitToPatterns(a, b, state, opts);
+ }
+
+ state.negatives = negatives;
+ state.positives = positives;
+ state.result = collatePatterns(negatives, positives);
+
+ if (opts.capture === true) {
+ state.result = `(${state.result})`;
+ } else if (opts.wrap !== false && (positives.length + negatives.length) > 1) {
+ state.result = `(?:${state.result})`;
+ }
+
+ toRegexRange$1.cache[cacheKey] = state;
+ return state.result;
+};
+
+function collatePatterns(neg, pos, options) {
+ let onlyNegative = filterPatterns(neg, pos, '-', false) || [];
+ let onlyPositive = filterPatterns(pos, neg, '', false) || [];
+ let intersected = filterPatterns(neg, pos, '-?', true) || [];
+ let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive);
+ return subpatterns.join('|');
+}
+
+function splitToRanges(min, max) {
+ let nines = 1;
+ let zeros = 1;
+
+ let stop = countNines(min, nines);
+ let stops = new Set([max]);
+
+ while (min <= stop && stop <= max) {
+ stops.add(stop);
+ nines += 1;
+ stop = countNines(min, nines);
+ }
+
+ stop = countZeros(max + 1, zeros) - 1;
+
+ while (min < stop && stop <= max) {
+ stops.add(stop);
+ zeros += 1;
+ stop = countZeros(max + 1, zeros) - 1;
+ }
+
+ stops = [...stops];
+ stops.sort(compare$1);
+ return stops;
+}
+
+/**
+ * Convert a range to a regex pattern
+ * @param {Number} `start`
+ * @param {Number} `stop`
+ * @return {String}
+ */
+
+function rangeToPattern(start, stop, options) {
+ if (start === stop) {
+ return { pattern: start, count: [], digits: 0 };
+ }
+
+ let zipped = zip(start, stop);
+ let digits = zipped.length;
+ let pattern = '';
+ let count = 0;
+
+ for (let i = 0; i < digits; i++) {
+ let [startDigit, stopDigit] = zipped[i];
+
+ if (startDigit === stopDigit) {
+ pattern += startDigit;
+
+ } else if (startDigit !== '0' || stopDigit !== '9') {
+ pattern += toCharacterClass(startDigit, stopDigit);
+
+ } else {
+ count++;
+ }
+ }
+
+ if (count) {
+ pattern += options.shorthand === true ? '\\d' : '[0-9]';
+ }
+
+ return { pattern, count: [count], digits };
+}
+
+function splitToPatterns(min, max, tok, options) {
+ let ranges = splitToRanges(min, max);
+ let tokens = [];
+ let start = min;
+ let prev;
+
+ for (let i = 0; i < ranges.length; i++) {
+ let max = ranges[i];
+ let obj = rangeToPattern(String(start), String(max), options);
+ let zeros = '';
+
+ if (!tok.isPadded && prev && prev.pattern === obj.pattern) {
+ if (prev.count.length > 1) {
+ prev.count.pop();
+ }
+
+ prev.count.push(obj.count[0]);
+ prev.string = prev.pattern + toQuantifier(prev.count);
+ start = max + 1;
+ continue;
+ }
+
+ if (tok.isPadded) {
+ zeros = padZeros(max, tok, options);
+ }
+
+ obj.string = zeros + obj.pattern + toQuantifier(obj.count);
+ tokens.push(obj);
+ start = max + 1;
+ prev = obj;
+ }
+
+ return tokens;
+}
+
+function filterPatterns(arr, comparison, prefix, intersection, options) {
+ let result = [];
+
+ for (let ele of arr) {
+ let { string } = ele;
+
+ // only push if _both_ are negative...
+ if (!intersection && !contains(comparison, 'string', string)) {
+ result.push(prefix + string);
+ }
+
+ // or _both_ are positive
+ if (intersection && contains(comparison, 'string', string)) {
+ result.push(prefix + string);
+ }
+ }
+ return result;
+}
+
+/**
+ * Zip strings
+ */
+
+function zip(a, b) {
+ let arr = [];
+ for (let i = 0; i < a.length; i++) arr.push([a[i], b[i]]);
+ return arr;
+}
+
+function compare$1(a, b) {
+ return a > b ? 1 : b > a ? -1 : 0;
+}
+
+function contains(arr, key, val) {
+ return arr.some(ele => ele[key] === val);
+}
+
+function countNines(min, len) {
+ return Number(String(min).slice(0, -len) + '9'.repeat(len));
+}
+
+function countZeros(integer, zeros) {
+ return integer - (integer % Math.pow(10, zeros));
+}
+
+function toQuantifier(digits) {
+ let [start = 0, stop = ''] = digits;
+ if (stop || start > 1) {
+ return `{${start + (stop ? ',' + stop : '')}}`;
+ }
+ return '';
+}
+
+function toCharacterClass(a, b, options) {
+ return `[${a}${(b - a === 1) ? '' : '-'}${b}]`;
+}
+
+function hasPadding(str) {
+ return /^-?(0+)\d/.test(str);
+}
+
+function padZeros(value, tok, options) {
+ if (!tok.isPadded) {
+ return value;
+ }
+
+ let diff = Math.abs(tok.maxLen - String(value).length);
+ let relax = options.relaxZeros !== false;
+
+ switch (diff) {
+ case 0:
+ return '';
+ case 1:
+ return relax ? '0?' : '0';
+ case 2:
+ return relax ? '0{0,2}' : '00';
+ default: {
+ return relax ? `0{0,${diff}}` : `0{${diff}}`;
+ }
+ }
+}
+
+/**
+ * Cache
+ */
+
+toRegexRange$1.cache = {};
+toRegexRange$1.clearCache = () => (toRegexRange$1.cache = {});
+
+/**
+ * Expose `toRegexRange`
+ */
+
+var toRegexRange_1 = toRegexRange$1;
+
+/*!
+ * fill-range
+ *
+ * Copyright (c) 2014-present, Jon Schlinkert.
+ * Licensed under the MIT License.
+ */
+
+const util$3 = require$$0__default$2;
+const toRegexRange = toRegexRange_1;
+
+const isObject$2 = val => val !== null && typeof val === 'object' && !Array.isArray(val);
+
+const transform$1 = toNumber => {
+ return value => toNumber === true ? Number(value) : String(value);
+};
+
+const isValidValue = value => {
+ return typeof value === 'number' || (typeof value === 'string' && value !== '');
+};
+
+const isNumber = num => Number.isInteger(+num);
+
+const zeros = input => {
+ let value = `${input}`;
+ let index = -1;
+ if (value[0] === '-') value = value.slice(1);
+ if (value === '0') return false;
+ while (value[++index] === '0');
+ return index > 0;
+};
+
+const stringify$6 = (start, end, options) => {
+ if (typeof start === 'string' || typeof end === 'string') {
+ return true;
+ }
+ return options.stringify === true;
+};
+
+const pad$1 = (input, maxLength, toNumber) => {
+ if (maxLength > 0) {
+ let dash = input[0] === '-' ? '-' : '';
+ if (dash) input = input.slice(1);
+ input = (dash + input.padStart(dash ? maxLength - 1 : maxLength, '0'));
+ }
+ if (toNumber === false) {
+ return String(input);
+ }
+ return input;
+};
+
+const toMaxLen = (input, maxLength) => {
+ let negative = input[0] === '-' ? '-' : '';
+ if (negative) {
+ input = input.slice(1);
+ maxLength--;
+ }
+ while (input.length < maxLength) input = '0' + input;
+ return negative ? ('-' + input) : input;
+};
+
+const toSequence = (parts, options) => {
+ parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
+ parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
+
+ let prefix = options.capture ? '' : '?:';
+ let positives = '';
+ let negatives = '';
+ let result;
+
+ if (parts.positives.length) {
+ positives = parts.positives.join('|');
+ }
+
+ if (parts.negatives.length) {
+ negatives = `-(${prefix}${parts.negatives.join('|')})`;
+ }
+
+ if (positives && negatives) {
+ result = `${positives}|${negatives}`;
+ } else {
+ result = positives || negatives;
+ }
+
+ if (options.wrap) {
+ return `(${prefix}${result})`;
+ }
+
+ return result;
+};
+
+const toRange = (a, b, isNumbers, options) => {
+ if (isNumbers) {
+ return toRegexRange(a, b, { wrap: false, ...options });
+ }
+
+ let start = String.fromCharCode(a);
+ if (a === b) return start;
+
+ let stop = String.fromCharCode(b);
+ return `[${start}-${stop}]`;
+};
+
+const toRegex = (start, end, options) => {
+ if (Array.isArray(start)) {
+ let wrap = options.wrap === true;
+ let prefix = options.capture ? '' : '?:';
+ return wrap ? `(${prefix}${start.join('|')})` : start.join('|');
+ }
+ return toRegexRange(start, end, options);
+};
+
+const rangeError = (...args) => {
+ return new RangeError('Invalid range arguments: ' + util$3.inspect(...args));
+};
+
+const invalidRange = (start, end, options) => {
+ if (options.strictRanges === true) throw rangeError([start, end]);
+ return [];
+};
+
+const invalidStep = (step, options) => {
+ if (options.strictRanges === true) {
+ throw new TypeError(`Expected step "${step}" to be a number`);
+ }
+ return [];
+};
+
+const fillNumbers = (start, end, step = 1, options = {}) => {
+ let a = Number(start);
+ let b = Number(end);
+
+ if (!Number.isInteger(a) || !Number.isInteger(b)) {
+ if (options.strictRanges === true) throw rangeError([start, end]);
+ return [];
+ }
+
+ // fix negative zero
+ if (a === 0) a = 0;
+ if (b === 0) b = 0;
+
+ let descending = a > b;
+ let startString = String(start);
+ let endString = String(end);
+ let stepString = String(step);
+ step = Math.max(Math.abs(step), 1);
+
+ let padded = zeros(startString) || zeros(endString) || zeros(stepString);
+ let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0;
+ let toNumber = padded === false && stringify$6(start, end, options) === false;
+ let format = options.transform || transform$1(toNumber);
+
+ if (options.toRegex && step === 1) {
+ return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options);
+ }
+
+ let parts = { negatives: [], positives: [] };
+ let push = num => parts[num < 0 ? 'negatives' : 'positives'].push(Math.abs(num));
+ let range = [];
+ let index = 0;
+
+ while (descending ? a >= b : a <= b) {
+ if (options.toRegex === true && step > 1) {
+ push(a);
+ } else {
+ range.push(pad$1(format(a, index), maxLen, toNumber));
+ }
+ a = descending ? a - step : a + step;
+ index++;
+ }
+
+ if (options.toRegex === true) {
+ return step > 1
+ ? toSequence(parts, options)
+ : toRegex(range, null, { wrap: false, ...options });
+ }
+
+ return range;
+};
+
+const fillLetters = (start, end, step = 1, options = {}) => {
+ if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) {
+ return invalidRange(start, end, options);
+ }
+
+
+ let format = options.transform || (val => String.fromCharCode(val));
+ let a = `${start}`.charCodeAt(0);
+ let b = `${end}`.charCodeAt(0);
+
+ let descending = a > b;
+ let min = Math.min(a, b);
+ let max = Math.max(a, b);
+
+ if (options.toRegex && step === 1) {
+ return toRange(min, max, false, options);
+ }
+
+ let range = [];
+ let index = 0;
+
+ while (descending ? a >= b : a <= b) {
+ range.push(format(a, index));
+ a = descending ? a - step : a + step;
+ index++;
+ }
+
+ if (options.toRegex === true) {
+ return toRegex(range, null, { wrap: false, options });
+ }
+
+ return range;
+};
+
+const fill$2 = (start, end, step, options = {}) => {
+ if (end == null && isValidValue(start)) {
+ return [start];
+ }
+
+ if (!isValidValue(start) || !isValidValue(end)) {
+ return invalidRange(start, end, options);
+ }
+
+ if (typeof step === 'function') {
+ return fill$2(start, end, 1, { transform: step });
+ }
+
+ if (isObject$2(step)) {
+ return fill$2(start, end, 0, step);
+ }
+
+ let opts = { ...options };
+ if (opts.capture === true) opts.wrap = true;
+ step = step || opts.step || 1;
+
+ if (!isNumber(step)) {
+ if (step != null && !isObject$2(step)) return invalidStep(step, opts);
+ return fill$2(start, end, 1, step);
+ }
+
+ if (isNumber(start) && isNumber(end)) {
+ return fillNumbers(start, end, step, opts);
+ }
+
+ return fillLetters(start, end, Math.max(Math.abs(step), 1), opts);
+};
+
+var fillRange = fill$2;
+
+const fill$1 = fillRange;
+const utils$e = utils$g;
+
+const compile$1 = (ast, options = {}) => {
+ let walk = (node, parent = {}) => {
+ let invalidBlock = utils$e.isInvalidBrace(parent);
+ let invalidNode = node.invalid === true && options.escapeInvalid === true;
+ let invalid = invalidBlock === true || invalidNode === true;
+ let prefix = options.escapeInvalid === true ? '\\' : '';
+ let output = '';
+
+ if (node.isOpen === true) {
+ return prefix + node.value;
+ }
+ if (node.isClose === true) {
+ return prefix + node.value;
+ }
+
+ if (node.type === 'open') {
+ return invalid ? (prefix + node.value) : '(';
+ }
+
+ if (node.type === 'close') {
+ return invalid ? (prefix + node.value) : ')';
+ }
+
+ if (node.type === 'comma') {
+ return node.prev.type === 'comma' ? '' : (invalid ? node.value : '|');
+ }
+
+ if (node.value) {
+ return node.value;
+ }
+
+ if (node.nodes && node.ranges > 0) {
+ let args = utils$e.reduce(node.nodes);
+ let range = fill$1(...args, { ...options, wrap: false, toRegex: true });
+
+ if (range.length !== 0) {
+ return args.length > 1 && range.length > 1 ? `(${range})` : range;
+ }
+ }
+
+ if (node.nodes) {
+ for (let child of node.nodes) {
+ output += walk(child, node);
+ }
+ }
+ return output;
+ };
+
+ return walk(ast);
+};
+
+var compile_1 = compile$1;
+
+const fill = fillRange;
+const stringify$5 = stringify$7;
+const utils$d = utils$g;
+
+const append$1 = (queue = '', stash = '', enclose = false) => {
+ let result = [];
+
+ queue = [].concat(queue);
+ stash = [].concat(stash);
+
+ if (!stash.length) return queue;
+ if (!queue.length) {
+ return enclose ? utils$d.flatten(stash).map(ele => `{${ele}}`) : stash;
+ }
+
+ for (let item of queue) {
+ if (Array.isArray(item)) {
+ for (let value of item) {
+ result.push(append$1(value, stash, enclose));
+ }
+ } else {
+ for (let ele of stash) {
+ if (enclose === true && typeof ele === 'string') ele = `{${ele}}`;
+ result.push(Array.isArray(ele) ? append$1(item, ele, enclose) : (item + ele));
+ }
+ }
+ }
+ return utils$d.flatten(result);
+};
+
+const expand$1 = (ast, options = {}) => {
+ let rangeLimit = options.rangeLimit === void 0 ? 1000 : options.rangeLimit;
+
+ let walk = (node, parent = {}) => {
+ node.queue = [];
+
+ let p = parent;
+ let q = parent.queue;
+
+ while (p.type !== 'brace' && p.type !== 'root' && p.parent) {
+ p = p.parent;
+ q = p.queue;
+ }
+
+ if (node.invalid || node.dollar) {
+ q.push(append$1(q.pop(), stringify$5(node, options)));
+ return;
+ }
+
+ if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) {
+ q.push(append$1(q.pop(), ['{}']));
+ return;
+ }
+
+ if (node.nodes && node.ranges > 0) {
+ let args = utils$d.reduce(node.nodes);
+
+ if (utils$d.exceedsLimit(...args, options.step, rangeLimit)) {
+ throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.');
+ }
+
+ let range = fill(...args, options);
+ if (range.length === 0) {
+ range = stringify$5(node, options);
+ }
+
+ q.push(append$1(q.pop(), range));
+ node.nodes = [];
+ return;
+ }
+
+ let enclose = utils$d.encloseBrace(node);
+ let queue = node.queue;
+ let block = node;
+
+ while (block.type !== 'brace' && block.type !== 'root' && block.parent) {
+ block = block.parent;
+ queue = block.queue;
+ }
+
+ for (let i = 0; i < node.nodes.length; i++) {
+ let child = node.nodes[i];
+
+ if (child.type === 'comma' && node.type === 'brace') {
+ if (i === 1) queue.push('');
+ queue.push('');
+ continue;
+ }
+
+ if (child.type === 'close') {
+ q.push(append$1(q.pop(), queue, enclose));
+ continue;
+ }
+
+ if (child.value && child.type !== 'open') {
+ queue.push(append$1(queue.pop(), child.value));
+ continue;
+ }
+
+ if (child.nodes) {
+ walk(child, node);
+ }
+ }
+
+ return queue;
+ };
+
+ return utils$d.flatten(walk(ast));
+};
+
+var expand_1 = expand$1;
+
+var constants$3 = {
+ MAX_LENGTH: 1024 * 64,
+
+ // Digits
+ CHAR_0: '0', /* 0 */
+ CHAR_9: '9', /* 9 */
+
+ // Alphabet chars.
+ CHAR_UPPERCASE_A: 'A', /* A */
+ CHAR_LOWERCASE_A: 'a', /* a */
+ CHAR_UPPERCASE_Z: 'Z', /* Z */
+ CHAR_LOWERCASE_Z: 'z', /* z */
+
+ CHAR_LEFT_PARENTHESES: '(', /* ( */
+ CHAR_RIGHT_PARENTHESES: ')', /* ) */
+
+ CHAR_ASTERISK: '*', /* * */
+
+ // Non-alphabetic chars.
+ CHAR_AMPERSAND: '&', /* & */
+ CHAR_AT: '@', /* @ */
+ CHAR_BACKSLASH: '\\', /* \ */
+ CHAR_BACKTICK: '`', /* ` */
+ CHAR_CARRIAGE_RETURN: '\r', /* \r */
+ CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */
+ CHAR_COLON: ':', /* : */
+ CHAR_COMMA: ',', /* , */
+ CHAR_DOLLAR: '$', /* . */
+ CHAR_DOT: '.', /* . */
+ CHAR_DOUBLE_QUOTE: '"', /* " */
+ CHAR_EQUAL: '=', /* = */
+ CHAR_EXCLAMATION_MARK: '!', /* ! */
+ CHAR_FORM_FEED: '\f', /* \f */
+ CHAR_FORWARD_SLASH: '/', /* / */
+ CHAR_HASH: '#', /* # */
+ CHAR_HYPHEN_MINUS: '-', /* - */
+ CHAR_LEFT_ANGLE_BRACKET: '<', /* < */
+ CHAR_LEFT_CURLY_BRACE: '{', /* { */
+ CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */
+ CHAR_LINE_FEED: '\n', /* \n */
+ CHAR_NO_BREAK_SPACE: '\u00A0', /* \u00A0 */
+ CHAR_PERCENT: '%', /* % */
+ CHAR_PLUS: '+', /* + */
+ CHAR_QUESTION_MARK: '?', /* ? */
+ CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */
+ CHAR_RIGHT_CURLY_BRACE: '}', /* } */
+ CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */
+ CHAR_SEMICOLON: ';', /* ; */
+ CHAR_SINGLE_QUOTE: '\'', /* ' */
+ CHAR_SPACE: ' ', /* */
+ CHAR_TAB: '\t', /* \t */
+ CHAR_UNDERSCORE: '_', /* _ */
+ CHAR_VERTICAL_LINE: '|', /* | */
+ CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\uFEFF' /* \uFEFF */
+};
+
+const stringify$4 = stringify$7;
+
+/**
+ * Constants
+ */
+
+const {
+ MAX_LENGTH,
+ CHAR_BACKSLASH, /* \ */
+ CHAR_BACKTICK, /* ` */
+ CHAR_COMMA, /* , */
+ CHAR_DOT, /* . */
+ CHAR_LEFT_PARENTHESES, /* ( */
+ CHAR_RIGHT_PARENTHESES, /* ) */
+ CHAR_LEFT_CURLY_BRACE, /* { */
+ CHAR_RIGHT_CURLY_BRACE, /* } */
+ CHAR_LEFT_SQUARE_BRACKET, /* [ */
+ CHAR_RIGHT_SQUARE_BRACKET, /* ] */
+ CHAR_DOUBLE_QUOTE, /* " */
+ CHAR_SINGLE_QUOTE, /* ' */
+ CHAR_NO_BREAK_SPACE,
+ CHAR_ZERO_WIDTH_NOBREAK_SPACE
+} = constants$3;
+
+/**
+ * parse
+ */
+
+const parse$i = (input, options = {}) => {
+ if (typeof input !== 'string') {
+ throw new TypeError('Expected a string');
+ }
+
+ let opts = options || {};
+ let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;
+ if (input.length > max) {
+ throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`);
+ }
+
+ let ast = { type: 'root', input, nodes: [] };
+ let stack = [ast];
+ let block = ast;
+ let prev = ast;
+ let brackets = 0;
+ let length = input.length;
+ let index = 0;
+ let depth = 0;
+ let value;
+
+ /**
+ * Helpers
+ */
+
+ const advance = () => input[index++];
+ const push = node => {
+ if (node.type === 'text' && prev.type === 'dot') {
+ prev.type = 'text';
+ }
+
+ if (prev && prev.type === 'text' && node.type === 'text') {
+ prev.value += node.value;
+ return;
+ }
+
+ block.nodes.push(node);
+ node.parent = block;
+ node.prev = prev;
+ prev = node;
+ return node;
+ };
+
+ push({ type: 'bos' });
+
+ while (index < length) {
+ block = stack[stack.length - 1];
+ value = advance();
+
+ /**
+ * Invalid chars
+ */
+
+ if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) {
+ continue;
+ }
+
+ /**
+ * Escaped chars
+ */
+
+ if (value === CHAR_BACKSLASH) {
+ push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() });
+ continue;
+ }
+
+ /**
+ * Right square bracket (literal): ']'
+ */
+
+ if (value === CHAR_RIGHT_SQUARE_BRACKET) {
+ push({ type: 'text', value: '\\' + value });
+ continue;
+ }
+
+ /**
+ * Left square bracket: '['
+ */
+
+ if (value === CHAR_LEFT_SQUARE_BRACKET) {
+ brackets++;
+ let next;
+
+ while (index < length && (next = advance())) {
+ value += next;
+
+ if (next === CHAR_LEFT_SQUARE_BRACKET) {
+ brackets++;
+ continue;
+ }
+
+ if (next === CHAR_BACKSLASH) {
+ value += advance();
+ continue;
+ }
+
+ if (next === CHAR_RIGHT_SQUARE_BRACKET) {
+ brackets--;
+
+ if (brackets === 0) {
+ break;
+ }
+ }
+ }
+
+ push({ type: 'text', value });
+ continue;
+ }
+
+ /**
+ * Parentheses
+ */
+
+ if (value === CHAR_LEFT_PARENTHESES) {
+ block = push({ type: 'paren', nodes: [] });
+ stack.push(block);
+ push({ type: 'text', value });
+ continue;
+ }
+
+ if (value === CHAR_RIGHT_PARENTHESES) {
+ if (block.type !== 'paren') {
+ push({ type: 'text', value });
+ continue;
+ }
+ block = stack.pop();
+ push({ type: 'text', value });
+ block = stack[stack.length - 1];
+ continue;
+ }
+
+ /**
+ * Quotes: '|"|`
+ */
+
+ if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) {
+ let open = value;
+ let next;
+
+ if (options.keepQuotes !== true) {
+ value = '';
+ }
+
+ while (index < length && (next = advance())) {
+ if (next === CHAR_BACKSLASH) {
+ value += next + advance();
+ continue;
+ }
+
+ if (next === open) {
+ if (options.keepQuotes === true) value += next;
+ break;
+ }
+
+ value += next;
+ }
+
+ push({ type: 'text', value });
+ continue;
+ }
+
+ /**
+ * Left curly brace: '{'
+ */
+
+ if (value === CHAR_LEFT_CURLY_BRACE) {
+ depth++;
+
+ let dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true;
+ let brace = {
+ type: 'brace',
+ open: true,
+ close: false,
+ dollar,
+ depth,
+ commas: 0,
+ ranges: 0,
+ nodes: []
+ };
+
+ block = push(brace);
+ stack.push(block);
+ push({ type: 'open', value });
+ continue;
+ }
+
+ /**
+ * Right curly brace: '}'
+ */
+
+ if (value === CHAR_RIGHT_CURLY_BRACE) {
+ if (block.type !== 'brace') {
+ push({ type: 'text', value });
+ continue;
+ }
+
+ let type = 'close';
+ block = stack.pop();
+ block.close = true;
+
+ push({ type, value });
+ depth--;
+
+ block = stack[stack.length - 1];
+ continue;
+ }
+
+ /**
+ * Comma: ','
+ */
+
+ if (value === CHAR_COMMA && depth > 0) {
+ if (block.ranges > 0) {
+ block.ranges = 0;
+ let open = block.nodes.shift();
+ block.nodes = [open, { type: 'text', value: stringify$4(block) }];
+ }
+
+ push({ type: 'comma', value });
+ block.commas++;
+ continue;
+ }
+
+ /**
+ * Dot: '.'
+ */
+
+ if (value === CHAR_DOT && depth > 0 && block.commas === 0) {
+ let siblings = block.nodes;
+
+ if (depth === 0 || siblings.length === 0) {
+ push({ type: 'text', value });
+ continue;
+ }
+
+ if (prev.type === 'dot') {
+ block.range = [];
+ prev.value += value;
+ prev.type = 'range';
+
+ if (block.nodes.length !== 3 && block.nodes.length !== 5) {
+ block.invalid = true;
+ block.ranges = 0;
+ prev.type = 'text';
+ continue;
+ }
+
+ block.ranges++;
+ block.args = [];
+ continue;
+ }
+
+ if (prev.type === 'range') {
+ siblings.pop();
+
+ let before = siblings[siblings.length - 1];
+ before.value += prev.value + value;
+ prev = before;
+ block.ranges--;
+ continue;
+ }
+
+ push({ type: 'dot', value });
+ continue;
+ }
+
+ /**
+ * Text
+ */
+
+ push({ type: 'text', value });
+ }
+
+ // Mark imbalanced braces and brackets as invalid
+ do {
+ block = stack.pop();
+
+ if (block.type !== 'root') {
+ block.nodes.forEach(node => {
+ if (!node.nodes) {
+ if (node.type === 'open') node.isOpen = true;
+ if (node.type === 'close') node.isClose = true;
+ if (!node.nodes) node.type = 'text';
+ node.invalid = true;
+ }
+ });
+
+ // get the location of the block on parent.nodes (block's siblings)
+ let parent = stack[stack.length - 1];
+ let index = parent.nodes.indexOf(block);
+ // replace the (invalid) block with it's nodes
+ parent.nodes.splice(index, 1, ...block.nodes);
+ }
+ } while (stack.length > 0);
+
+ push({ type: 'eos' });
+ return ast;
+};
+
+var parse_1$1 = parse$i;
+
+const stringify$3 = stringify$7;
+const compile = compile_1;
+const expand = expand_1;
+const parse$h = parse_1$1;
+
+/**
+ * Expand the given pattern or create a regex-compatible string.
+ *
+ * ```js
+ * const braces = require('braces');
+ * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)']
+ * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c']
+ * ```
+ * @param {String} `str`
+ * @param {Object} `options`
+ * @return {String}
+ * @api public
+ */
+
+const braces$3 = (input, options = {}) => {
+ let output = [];
+
+ if (Array.isArray(input)) {
+ for (let pattern of input) {
+ let result = braces$3.create(pattern, options);
+ if (Array.isArray(result)) {
+ output.push(...result);
+ } else {
+ output.push(result);
+ }
+ }
+ } else {
+ output = [].concat(braces$3.create(input, options));
+ }
+
+ if (options && options.expand === true && options.nodupes === true) {
+ output = [...new Set(output)];
+ }
+ return output;
+};
+
+/**
+ * Parse the given `str` with the given `options`.
+ *
+ * ```js
+ * // braces.parse(pattern, [, options]);
+ * const ast = braces.parse('a/{b,c}/d');
+ * console.log(ast);
+ * ```
+ * @param {String} pattern Brace pattern to parse
+ * @param {Object} options
+ * @return {Object} Returns an AST
+ * @api public
+ */
+
+braces$3.parse = (input, options = {}) => parse$h(input, options);
+
+/**
+ * Creates a braces string from an AST, or an AST node.
+ *
+ * ```js
+ * const braces = require('braces');
+ * let ast = braces.parse('foo/{a,b}/bar');
+ * console.log(stringify(ast.nodes[2])); //=> '{a,b}'
+ * ```
+ * @param {String} `input` Brace pattern or AST.
+ * @param {Object} `options`
+ * @return {Array} Returns an array of expanded values.
+ * @api public
+ */
+
+braces$3.stringify = (input, options = {}) => {
+ if (typeof input === 'string') {
+ return stringify$3(braces$3.parse(input, options), options);
+ }
+ return stringify$3(input, options);
+};
+
+/**
+ * Compiles a brace pattern into a regex-compatible, optimized string.
+ * This method is called by the main [braces](#braces) function by default.
+ *
+ * ```js
+ * const braces = require('braces');
+ * console.log(braces.compile('a/{b,c}/d'));
+ * //=> ['a/(b|c)/d']
+ * ```
+ * @param {String} `input` Brace pattern or AST.
+ * @param {Object} `options`
+ * @return {Array} Returns an array of expanded values.
+ * @api public
+ */
+
+braces$3.compile = (input, options = {}) => {
+ if (typeof input === 'string') {
+ input = braces$3.parse(input, options);
+ }
+ return compile(input, options);
+};
+
+/**
+ * Expands a brace pattern into an array. This method is called by the
+ * main [braces](#braces) function when `options.expand` is true. Before
+ * using this method it's recommended that you read the [performance notes](#performance))
+ * and advantages of using [.compile](#compile) instead.
+ *
+ * ```js
+ * const braces = require('braces');
+ * console.log(braces.expand('a/{b,c}/d'));
+ * //=> ['a/b/d', 'a/c/d'];
+ * ```
+ * @param {String} `pattern` Brace pattern
+ * @param {Object} `options`
+ * @return {Array} Returns an array of expanded values.
+ * @api public
+ */
+
+braces$3.expand = (input, options = {}) => {
+ if (typeof input === 'string') {
+ input = braces$3.parse(input, options);
+ }
+
+ let result = expand(input, options);
+
+ // filter out empty strings if specified
+ if (options.noempty === true) {
+ result = result.filter(Boolean);
+ }
+
+ // filter out duplicates if specified
+ if (options.nodupes === true) {
+ result = [...new Set(result)];
+ }
+
+ return result;
+};
+
+/**
+ * Processes a brace pattern and returns either an expanded array
+ * (if `options.expand` is true), a highly optimized regex-compatible string.
+ * This method is called by the main [braces](#braces) function.
+ *
+ * ```js
+ * const braces = require('braces');
+ * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}'))
+ * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)'
+ * ```
+ * @param {String} `pattern` Brace pattern
+ * @param {Object} `options`
+ * @return {Array} Returns an array of expanded values.
+ * @api public
+ */
+
+braces$3.create = (input, options = {}) => {
+ if (input === '' || input.length < 3) {
+ return [input];
+ }
+
+ return options.expand !== true
+ ? braces$3.compile(input, options)
+ : braces$3.expand(input, options);
+};
+
+/**
+ * Expose "braces"
+ */
+
+var braces_1 = braces$3;
+
+const util$2 = require$$0__default$2;
+const braces$2 = braces_1;
+const picomatch$3 = picomatch$4;
+const utils$c = utils$l;
+const isEmptyString$1 = val => val === '' || val === './';
+
+/**
+ * Returns an array of strings that match one or more glob patterns.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm(list, patterns[, options]);
+ *
+ * console.log(mm(['a.js', 'a.txt'], ['*.js']));
+ * //=> [ 'a.js' ]
+ * ```
+ * @param {String|Array} `list` List of strings to match.
+ * @param {String|Array} `patterns` One or more glob patterns to use for matching.
+ * @param {Object} `options` See available [options](#options)
+ * @return {Array} Returns an array of matches
+ * @summary false
+ * @api public
+ */
+
+const micromatch$2 = (list, patterns, options) => {
+ patterns = [].concat(patterns);
+ list = [].concat(list);
+
+ let omit = new Set();
+ let keep = new Set();
+ let items = new Set();
+ let negatives = 0;
+
+ let onResult = state => {
+ items.add(state.output);
+ if (options && options.onResult) {
+ options.onResult(state);
+ }
+ };
+
+ for (let i = 0; i < patterns.length; i++) {
+ let isMatch = picomatch$3(String(patterns[i]), { ...options, onResult }, true);
+ let negated = isMatch.state.negated || isMatch.state.negatedExtglob;
+ if (negated) negatives++;
+
+ for (let item of list) {
+ let matched = isMatch(item, true);
+
+ let match = negated ? !matched.isMatch : matched.isMatch;
+ if (!match) continue;
+
+ if (negated) {
+ omit.add(matched.output);
+ } else {
+ omit.delete(matched.output);
+ keep.add(matched.output);
+ }
+ }
+ }
+
+ let result = negatives === patterns.length ? [...items] : [...keep];
+ let matches = result.filter(item => !omit.has(item));
+
+ if (options && matches.length === 0) {
+ if (options.failglob === true) {
+ throw new Error(`No matches found for "${patterns.join(', ')}"`);
+ }
+
+ if (options.nonull === true || options.nullglob === true) {
+ return options.unescape ? patterns.map(p => p.replace(/\\/g, '')) : patterns;
+ }
+ }
+
+ return matches;
+};
+
+/**
+ * Backwards compatibility
+ */
+
+micromatch$2.match = micromatch$2;
+
+/**
+ * Returns a matcher function from the given glob `pattern` and `options`.
+ * The returned function takes a string to match as its only argument and returns
+ * true if the string is a match.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm.matcher(pattern[, options]);
+ *
+ * const isMatch = mm.matcher('*.!(*a)');
+ * console.log(isMatch('a.a')); //=> false
+ * console.log(isMatch('a.b')); //=> true
+ * ```
+ * @param {String} `pattern` Glob pattern
+ * @param {Object} `options`
+ * @return {Function} Returns a matcher function.
+ * @api public
+ */
+
+micromatch$2.matcher = (pattern, options) => picomatch$3(pattern, options);
+
+/**
+ * Returns true if **any** of the given glob `patterns` match the specified `string`.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm.isMatch(string, patterns[, options]);
+ *
+ * console.log(mm.isMatch('a.a', ['b.*', '*.a'])); //=> true
+ * console.log(mm.isMatch('a.a', 'b.*')); //=> false
+ * ```
+ * @param {String} `str` The string to test.
+ * @param {String|Array} `patterns` One or more glob patterns to use for matching.
+ * @param {Object} `[options]` See available [options](#options).
+ * @return {Boolean} Returns true if any patterns match `str`
+ * @api public
+ */
+
+micromatch$2.isMatch = (str, patterns, options) => picomatch$3(patterns, options)(str);
+
+/**
+ * Backwards compatibility
+ */
+
+micromatch$2.any = micromatch$2.isMatch;
+
+/**
+ * Returns a list of strings that _**do not match any**_ of the given `patterns`.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm.not(list, patterns[, options]);
+ *
+ * console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a'));
+ * //=> ['b.b', 'c.c']
+ * ```
+ * @param {Array} `list` Array of strings to match.
+ * @param {String|Array} `patterns` One or more glob pattern to use for matching.
+ * @param {Object} `options` See available [options](#options) for changing how matches are performed
+ * @return {Array} Returns an array of strings that **do not match** the given patterns.
+ * @api public
+ */
+
+micromatch$2.not = (list, patterns, options = {}) => {
+ patterns = [].concat(patterns).map(String);
+ let result = new Set();
+ let items = [];
+
+ let onResult = state => {
+ if (options.onResult) options.onResult(state);
+ items.push(state.output);
+ };
+
+ let matches = micromatch$2(list, patterns, { ...options, onResult });
+
+ for (let item of items) {
+ if (!matches.includes(item)) {
+ result.add(item);
+ }
+ }
+ return [...result];
+};
+
+/**
+ * Returns true if the given `string` contains the given pattern. Similar
+ * to [.isMatch](#isMatch) but the pattern can match any part of the string.
+ *
+ * ```js
+ * var mm = require('micromatch');
+ * // mm.contains(string, pattern[, options]);
+ *
+ * console.log(mm.contains('aa/bb/cc', '*b'));
+ * //=> true
+ * console.log(mm.contains('aa/bb/cc', '*d'));
+ * //=> false
+ * ```
+ * @param {String} `str` The string to match.
+ * @param {String|Array} `patterns` Glob pattern to use for matching.
+ * @param {Object} `options` See available [options](#options) for changing how matches are performed
+ * @return {Boolean} Returns true if any of the patterns matches any part of `str`.
+ * @api public
+ */
+
+micromatch$2.contains = (str, pattern, options) => {
+ if (typeof str !== 'string') {
+ throw new TypeError(`Expected a string: "${util$2.inspect(str)}"`);
+ }
+
+ if (Array.isArray(pattern)) {
+ return pattern.some(p => micromatch$2.contains(str, p, options));
+ }
+
+ if (typeof pattern === 'string') {
+ if (isEmptyString$1(str) || isEmptyString$1(pattern)) {
+ return false;
+ }
+
+ if (str.includes(pattern) || (str.startsWith('./') && str.slice(2).includes(pattern))) {
+ return true;
+ }
+ }
+
+ return micromatch$2.isMatch(str, pattern, { ...options, contains: true });
+};
+
+/**
+ * Filter the keys of the given object with the given `glob` pattern
+ * and `options`. Does not attempt to match nested keys. If you need this feature,
+ * use [glob-object][] instead.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm.matchKeys(object, patterns[, options]);
+ *
+ * const obj = { aa: 'a', ab: 'b', ac: 'c' };
+ * console.log(mm.matchKeys(obj, '*b'));
+ * //=> { ab: 'b' }
+ * ```
+ * @param {Object} `object` The object with keys to filter.
+ * @param {String|Array} `patterns` One or more glob patterns to use for matching.
+ * @param {Object} `options` See available [options](#options) for changing how matches are performed
+ * @return {Object} Returns an object with only keys that match the given patterns.
+ * @api public
+ */
+
+micromatch$2.matchKeys = (obj, patterns, options) => {
+ if (!utils$c.isObject(obj)) {
+ throw new TypeError('Expected the first argument to be an object');
+ }
+ let keys = micromatch$2(Object.keys(obj), patterns, options);
+ let res = {};
+ for (let key of keys) res[key] = obj[key];
+ return res;
+};
+
+/**
+ * Returns true if some of the strings in the given `list` match any of the given glob `patterns`.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm.some(list, patterns[, options]);
+ *
+ * console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js']));
+ * // true
+ * console.log(mm.some(['foo.js'], ['*.js', '!foo.js']));
+ * // false
+ * ```
+ * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found.
+ * @param {String|Array} `patterns` One or more glob patterns to use for matching.
+ * @param {Object} `options` See available [options](#options) for changing how matches are performed
+ * @return {Boolean} Returns true if any `patterns` matches any of the strings in `list`
+ * @api public
+ */
+
+micromatch$2.some = (list, patterns, options) => {
+ let items = [].concat(list);
+
+ for (let pattern of [].concat(patterns)) {
+ let isMatch = picomatch$3(String(pattern), options);
+ if (items.some(item => isMatch(item))) {
+ return true;
+ }
+ }
+ return false;
+};
+
+/**
+ * Returns true if every string in the given `list` matches
+ * any of the given glob `patterns`.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm.every(list, patterns[, options]);
+ *
+ * console.log(mm.every('foo.js', ['foo.js']));
+ * // true
+ * console.log(mm.every(['foo.js', 'bar.js'], ['*.js']));
+ * // true
+ * console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js']));
+ * // false
+ * console.log(mm.every(['foo.js'], ['*.js', '!foo.js']));
+ * // false
+ * ```
+ * @param {String|Array} `list` The string or array of strings to test.
+ * @param {String|Array} `patterns` One or more glob patterns to use for matching.
+ * @param {Object} `options` See available [options](#options) for changing how matches are performed
+ * @return {Boolean} Returns true if all `patterns` matches all of the strings in `list`
+ * @api public
+ */
+
+micromatch$2.every = (list, patterns, options) => {
+ let items = [].concat(list);
+
+ for (let pattern of [].concat(patterns)) {
+ let isMatch = picomatch$3(String(pattern), options);
+ if (!items.every(item => isMatch(item))) {
+ return false;
+ }
+ }
+ return true;
+};
+
+/**
+ * Returns true if **all** of the given `patterns` match
+ * the specified string.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm.all(string, patterns[, options]);
+ *
+ * console.log(mm.all('foo.js', ['foo.js']));
+ * // true
+ *
+ * console.log(mm.all('foo.js', ['*.js', '!foo.js']));
+ * // false
+ *
+ * console.log(mm.all('foo.js', ['*.js', 'foo.js']));
+ * // true
+ *
+ * console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js']));
+ * // true
+ * ```
+ * @param {String|Array} `str` The string to test.
+ * @param {String|Array} `patterns` One or more glob patterns to use for matching.
+ * @param {Object} `options` See available [options](#options) for changing how matches are performed
+ * @return {Boolean} Returns true if any patterns match `str`
+ * @api public
+ */
+
+micromatch$2.all = (str, patterns, options) => {
+ if (typeof str !== 'string') {
+ throw new TypeError(`Expected a string: "${util$2.inspect(str)}"`);
+ }
+
+ return [].concat(patterns).every(p => picomatch$3(p, options)(str));
+};
+
+/**
+ * Returns an array of matches captured by `pattern` in `string, or `null` if the pattern did not match.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm.capture(pattern, string[, options]);
+ *
+ * console.log(mm.capture('test/*.js', 'test/foo.js'));
+ * //=> ['foo']
+ * console.log(mm.capture('test/*.js', 'foo/bar.css'));
+ * //=> null
+ * ```
+ * @param {String} `glob` Glob pattern to use for matching.
+ * @param {String} `input` String to match
+ * @param {Object} `options` See available [options](#options) for changing how matches are performed
+ * @return {Array|null} Returns an array of captures if the input matches the glob pattern, otherwise `null`.
+ * @api public
+ */
+
+micromatch$2.capture = (glob, input, options) => {
+ let posix = utils$c.isWindows(options);
+ let regex = picomatch$3.makeRe(String(glob), { ...options, capture: true });
+ let match = regex.exec(posix ? utils$c.toPosixSlashes(input) : input);
+
+ if (match) {
+ return match.slice(1).map(v => v === void 0 ? '' : v);
+ }
+};
+
+/**
+ * Create a regular expression from the given glob `pattern`.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * // mm.makeRe(pattern[, options]);
+ *
+ * console.log(mm.makeRe('*.js'));
+ * //=> /^(?:(\.[\\\/])?(?!\.)(?=.)[^\/]*?\.js)$/
+ * ```
+ * @param {String} `pattern` A glob pattern to convert to regex.
+ * @param {Object} `options`
+ * @return {RegExp} Returns a regex created from the given pattern.
+ * @api public
+ */
+
+micromatch$2.makeRe = (...args) => picomatch$3.makeRe(...args);
+
+/**
+ * Scan a glob pattern to separate the pattern into segments. Used
+ * by the [split](#split) method.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * const state = mm.scan(pattern[, options]);
+ * ```
+ * @param {String} `pattern`
+ * @param {Object} `options`
+ * @return {Object} Returns an object with
+ * @api public
+ */
+
+micromatch$2.scan = (...args) => picomatch$3.scan(...args);
+
+/**
+ * Parse a glob pattern to create the source string for a regular
+ * expression.
+ *
+ * ```js
+ * const mm = require('micromatch');
+ * const state = mm(pattern[, options]);
+ * ```
+ * @param {String} `glob`
+ * @param {Object} `options`
+ * @return {Object} Returns an object with useful properties and output to be used as regex source string.
+ * @api public
+ */
+
+micromatch$2.parse = (patterns, options) => {
+ let res = [];
+ for (let pattern of [].concat(patterns || [])) {
+ for (let str of braces$2(String(pattern), options)) {
+ res.push(picomatch$3.parse(str, options));
+ }
+ }
+ return res;
+};
+
+/**
+ * Process the given brace `pattern`.
+ *
+ * ```js
+ * const { braces } = require('micromatch');
+ * console.log(braces('foo/{a,b,c}/bar'));
+ * //=> [ 'foo/(a|b|c)/bar' ]
+ *
+ * console.log(braces('foo/{a,b,c}/bar', { expand: true }));
+ * //=> [ 'foo/a/bar', 'foo/b/bar', 'foo/c/bar' ]
+ * ```
+ * @param {String} `pattern` String with brace pattern to process.
+ * @param {Object} `options` Any [options](#options) to change how expansion is performed. See the [braces][] library for all available options.
+ * @return {Array}
+ * @api public
+ */
+
+micromatch$2.braces = (pattern, options) => {
+ if (typeof pattern !== 'string') throw new TypeError('Expected a string');
+ if ((options && options.nobrace === true) || !/\{.*\}/.test(pattern)) {
+ return [pattern];
+ }
+ return braces$2(pattern, options);
+};
+
+/**
+ * Expand braces
+ */
+
+micromatch$2.braceExpand = (pattern, options) => {
+ if (typeof pattern !== 'string') throw new TypeError('Expected a string');
+ return micromatch$2.braces(pattern, { ...options, expand: true });
+};
+
+/**
+ * Expose micromatch
+ */
+
+var micromatch_1$1 = micromatch$2;
+
+Object.defineProperty(pattern$1, "__esModule", { value: true });
+pattern$1.matchAny = pattern$1.convertPatternsToRe = pattern$1.makeRe = pattern$1.getPatternParts = pattern$1.expandBraceExpansion = pattern$1.expandPatternsWithBraceExpansion = pattern$1.isAffectDepthOfReadingPattern = pattern$1.endsWithSlashGlobStar = pattern$1.hasGlobStar = pattern$1.getBaseDirectory = pattern$1.isPatternRelatedToParentDirectory = pattern$1.getPatternsOutsideCurrentDirectory = pattern$1.getPatternsInsideCurrentDirectory = pattern$1.getPositivePatterns = pattern$1.getNegativePatterns = pattern$1.isPositivePattern = pattern$1.isNegativePattern = pattern$1.convertToNegativePattern = pattern$1.convertToPositivePattern = pattern$1.isDynamicPattern = pattern$1.isStaticPattern = void 0;
+const path$e = path__default;
+const globParent$1 = globParent$2;
+const micromatch$1 = micromatch_1$1;
+const GLOBSTAR$1 = '**';
+const ESCAPE_SYMBOL = '\\';
+const COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/;
+const REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\[[^[]*]/;
+const REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\([^(]*\|[^|]*\)/;
+const GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\([^(]*\)/;
+const BRACE_EXPANSION_SEPARATORS_RE = /,|\.\./;
+function isStaticPattern(pattern, options = {}) {
+ return !isDynamicPattern(pattern, options);
+}
+pattern$1.isStaticPattern = isStaticPattern;
+function isDynamicPattern(pattern, options = {}) {
+ /**
+ * A special case with an empty string is necessary for matching patterns that start with a forward slash.
+ * An empty string cannot be a dynamic pattern.
+ * For example, the pattern `/lib/*` will be spread into parts: '', 'lib', '*'.
+ */
+ if (pattern === '') {
+ return false;
+ }
+ /**
+ * When the `caseSensitiveMatch` option is disabled, all patterns must be marked as dynamic, because we cannot check
+ * filepath directly (without read directory).
+ */
+ if (options.caseSensitiveMatch === false || pattern.includes(ESCAPE_SYMBOL)) {
+ return true;
+ }
+ if (COMMON_GLOB_SYMBOLS_RE.test(pattern) || REGEX_CHARACTER_CLASS_SYMBOLS_RE.test(pattern) || REGEX_GROUP_SYMBOLS_RE.test(pattern)) {
+ return true;
+ }
+ if (options.extglob !== false && GLOB_EXTENSION_SYMBOLS_RE.test(pattern)) {
+ return true;
+ }
+ if (options.braceExpansion !== false && hasBraceExpansion(pattern)) {
+ return true;
+ }
+ return false;
+}
+pattern$1.isDynamicPattern = isDynamicPattern;
+function hasBraceExpansion(pattern) {
+ const openingBraceIndex = pattern.indexOf('{');
+ if (openingBraceIndex === -1) {
+ return false;
+ }
+ const closingBraceIndex = pattern.indexOf('}', openingBraceIndex + 1);
+ if (closingBraceIndex === -1) {
+ return false;
+ }
+ const braceContent = pattern.slice(openingBraceIndex, closingBraceIndex);
+ return BRACE_EXPANSION_SEPARATORS_RE.test(braceContent);
+}
+function convertToPositivePattern(pattern) {
+ return isNegativePattern(pattern) ? pattern.slice(1) : pattern;
+}
+pattern$1.convertToPositivePattern = convertToPositivePattern;
+function convertToNegativePattern(pattern) {
+ return '!' + pattern;
+}
+pattern$1.convertToNegativePattern = convertToNegativePattern;
+function isNegativePattern(pattern) {
+ return pattern.startsWith('!') && pattern[1] !== '(';
+}
+pattern$1.isNegativePattern = isNegativePattern;
+function isPositivePattern(pattern) {
+ return !isNegativePattern(pattern);
+}
+pattern$1.isPositivePattern = isPositivePattern;
+function getNegativePatterns(patterns) {
+ return patterns.filter(isNegativePattern);
+}
+pattern$1.getNegativePatterns = getNegativePatterns;
+function getPositivePatterns$1(patterns) {
+ return patterns.filter(isPositivePattern);
+}
+pattern$1.getPositivePatterns = getPositivePatterns$1;
+/**
+ * Returns patterns that can be applied inside the current directory.
+ *
+ * @example
+ * // ['./*', '*', 'a/*']
+ * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*'])
+ */
+function getPatternsInsideCurrentDirectory(patterns) {
+ return patterns.filter((pattern) => !isPatternRelatedToParentDirectory(pattern));
+}
+pattern$1.getPatternsInsideCurrentDirectory = getPatternsInsideCurrentDirectory;
+/**
+ * Returns patterns to be expanded relative to (outside) the current directory.
+ *
+ * @example
+ * // ['../*', './../*']
+ * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*'])
+ */
+function getPatternsOutsideCurrentDirectory(patterns) {
+ return patterns.filter(isPatternRelatedToParentDirectory);
+}
+pattern$1.getPatternsOutsideCurrentDirectory = getPatternsOutsideCurrentDirectory;
+function isPatternRelatedToParentDirectory(pattern) {
+ return pattern.startsWith('..') || pattern.startsWith('./..');
+}
+pattern$1.isPatternRelatedToParentDirectory = isPatternRelatedToParentDirectory;
+function getBaseDirectory(pattern) {
+ return globParent$1(pattern, { flipBackslashes: false });
+}
+pattern$1.getBaseDirectory = getBaseDirectory;
+function hasGlobStar(pattern) {
+ return pattern.includes(GLOBSTAR$1);
+}
+pattern$1.hasGlobStar = hasGlobStar;
+function endsWithSlashGlobStar(pattern) {
+ return pattern.endsWith('/' + GLOBSTAR$1);
+}
+pattern$1.endsWithSlashGlobStar = endsWithSlashGlobStar;
+function isAffectDepthOfReadingPattern(pattern) {
+ const basename = path$e.basename(pattern);
+ return endsWithSlashGlobStar(pattern) || isStaticPattern(basename);
+}
+pattern$1.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern;
+function expandPatternsWithBraceExpansion(patterns) {
+ return patterns.reduce((collection, pattern) => {
+ return collection.concat(expandBraceExpansion(pattern));
+ }, []);
+}
+pattern$1.expandPatternsWithBraceExpansion = expandPatternsWithBraceExpansion;
+function expandBraceExpansion(pattern) {
+ return micromatch$1.braces(pattern, {
+ expand: true,
+ nodupes: true
+ });
+}
+pattern$1.expandBraceExpansion = expandBraceExpansion;
+function getPatternParts(pattern, options) {
+ let { parts } = micromatch$1.scan(pattern, Object.assign(Object.assign({}, options), { parts: true }));
+ /**
+ * The scan method returns an empty array in some cases.
+ * See micromatch/picomatch#58 for more details.
+ */
+ if (parts.length === 0) {
+ parts = [pattern];
+ }
+ /**
+ * The scan method does not return an empty part for the pattern with a forward slash.
+ * This is another part of micromatch/picomatch#58.
+ */
+ if (parts[0].startsWith('/')) {
+ parts[0] = parts[0].slice(1);
+ parts.unshift('');
+ }
+ return parts;
+}
+pattern$1.getPatternParts = getPatternParts;
+function makeRe(pattern, options) {
+ return micromatch$1.makeRe(pattern, options);
+}
+pattern$1.makeRe = makeRe;
+function convertPatternsToRe(patterns, options) {
+ return patterns.map((pattern) => makeRe(pattern, options));
+}
+pattern$1.convertPatternsToRe = convertPatternsToRe;
+function matchAny(entry, patternsRe) {
+ return patternsRe.some((patternRe) => patternRe.test(entry));
+}
+pattern$1.matchAny = matchAny;
+
+var stream$4 = {};
+
+/*
+ * merge2
+ * https://github.com/teambition/merge2
+ *
+ * Copyright (c) 2014-2020 Teambition
+ * Licensed under the MIT license.
+ */
+const Stream = require$$0__default$3;
+const PassThrough = Stream.PassThrough;
+const slice = Array.prototype.slice;
+
+var merge2_1 = merge2$1;
+
+function merge2$1 () {
+ const streamsQueue = [];
+ const args = slice.call(arguments);
+ let merging = false;
+ let options = args[args.length - 1];
+
+ if (options && !Array.isArray(options) && options.pipe == null) {
+ args.pop();
+ } else {
+ options = {};
+ }
+
+ const doEnd = options.end !== false;
+ const doPipeError = options.pipeError === true;
+ if (options.objectMode == null) {
+ options.objectMode = true;
+ }
+ if (options.highWaterMark == null) {
+ options.highWaterMark = 64 * 1024;
+ }
+ const mergedStream = PassThrough(options);
+
+ function addStream () {
+ for (let i = 0, len = arguments.length; i < len; i++) {
+ streamsQueue.push(pauseStreams(arguments[i], options));
+ }
+ mergeStream();
+ return this
+ }
+
+ function mergeStream () {
+ if (merging) {
+ return
+ }
+ merging = true;
+
+ let streams = streamsQueue.shift();
+ if (!streams) {
+ process.nextTick(endStream);
+ return
+ }
+ if (!Array.isArray(streams)) {
+ streams = [streams];
+ }
+
+ let pipesCount = streams.length + 1;
+
+ function next () {
+ if (--pipesCount > 0) {
+ return
+ }
+ merging = false;
+ mergeStream();
+ }
+
+ function pipe (stream) {
+ function onend () {
+ stream.removeListener('merge2UnpipeEnd', onend);
+ stream.removeListener('end', onend);
+ if (doPipeError) {
+ stream.removeListener('error', onerror);
+ }
+ next();
+ }
+ function onerror (err) {
+ mergedStream.emit('error', err);
+ }
+ // skip ended stream
+ if (stream._readableState.endEmitted) {
+ return next()
+ }
+
+ stream.on('merge2UnpipeEnd', onend);
+ stream.on('end', onend);
+
+ if (doPipeError) {
+ stream.on('error', onerror);
+ }
+
+ stream.pipe(mergedStream, { end: false });
+ // compatible for old stream
+ stream.resume();
+ }
+
+ for (let i = 0; i < streams.length; i++) {
+ pipe(streams[i]);
+ }
+
+ next();
+ }
+
+ function endStream () {
+ merging = false;
+ // emit 'queueDrain' when all streams merged.
+ mergedStream.emit('queueDrain');
+ if (doEnd) {
+ mergedStream.end();
+ }
+ }
+
+ mergedStream.setMaxListeners(0);
+ mergedStream.add = addStream;
+ mergedStream.on('unpipe', function (stream) {
+ stream.emit('merge2UnpipeEnd');
+ });
+
+ if (args.length) {
+ addStream.apply(null, args);
+ }
+ return mergedStream
+}
+
+// check and pause streams for pipe.
+function pauseStreams (streams, options) {
+ if (!Array.isArray(streams)) {
+ // Backwards-compat with old-style streams
+ if (!streams._readableState && streams.pipe) {
+ streams = streams.pipe(PassThrough(options));
+ }
+ if (!streams._readableState || !streams.pause || !streams.pipe) {
+ throw new Error('Only readable stream can be merged.')
+ }
+ streams.pause();
+ } else {
+ for (let i = 0, len = streams.length; i < len; i++) {
+ streams[i] = pauseStreams(streams[i], options);
+ }
+ }
+ return streams
+}
+
+Object.defineProperty(stream$4, "__esModule", { value: true });
+stream$4.merge = void 0;
+const merge2 = merge2_1;
+function merge$1(streams) {
+ const mergedStream = merge2(streams);
+ streams.forEach((stream) => {
+ stream.once('error', (error) => mergedStream.emit('error', error));
+ });
+ mergedStream.once('close', () => propagateCloseEventToSources(streams));
+ mergedStream.once('end', () => propagateCloseEventToSources(streams));
+ return mergedStream;
+}
+stream$4.merge = merge$1;
+function propagateCloseEventToSources(streams) {
+ streams.forEach((stream) => stream.emit('close'));
+}
+
+var string$2 = {};
+
+Object.defineProperty(string$2, "__esModule", { value: true });
+string$2.isEmpty = string$2.isString = void 0;
+function isString(input) {
+ return typeof input === 'string';
+}
+string$2.isString = isString;
+function isEmpty(input) {
+ return input === '';
+}
+string$2.isEmpty = isEmpty;
+
+Object.defineProperty(utils$h, "__esModule", { value: true });
+utils$h.string = utils$h.stream = utils$h.pattern = utils$h.path = utils$h.fs = utils$h.errno = utils$h.array = void 0;
+const array = array$1;
+utils$h.array = array;
+const errno = errno$1;
+utils$h.errno = errno;
+const fs$h = fs$i;
+utils$h.fs = fs$h;
+const path$d = path$g;
+utils$h.path = path$d;
+const pattern = pattern$1;
+utils$h.pattern = pattern;
+const stream$3 = stream$4;
+utils$h.stream = stream$3;
+const string$1 = string$2;
+utils$h.string = string$1;
+
+Object.defineProperty(tasks, "__esModule", { value: true });
+tasks.convertPatternGroupToTask = tasks.convertPatternGroupsToTasks = tasks.groupPatternsByBaseDirectory = tasks.getNegativePatternsAsPositive = tasks.getPositivePatterns = tasks.convertPatternsToTasks = tasks.generate = void 0;
+const utils$b = utils$h;
+function generate(patterns, settings) {
+ const positivePatterns = getPositivePatterns(patterns);
+ const negativePatterns = getNegativePatternsAsPositive(patterns, settings.ignore);
+ const staticPatterns = positivePatterns.filter((pattern) => utils$b.pattern.isStaticPattern(pattern, settings));
+ const dynamicPatterns = positivePatterns.filter((pattern) => utils$b.pattern.isDynamicPattern(pattern, settings));
+ const staticTasks = convertPatternsToTasks(staticPatterns, negativePatterns, /* dynamic */ false);
+ const dynamicTasks = convertPatternsToTasks(dynamicPatterns, negativePatterns, /* dynamic */ true);
+ return staticTasks.concat(dynamicTasks);
+}
+tasks.generate = generate;
+/**
+ * Returns tasks grouped by basic pattern directories.
+ *
+ * Patterns that can be found inside (`./`) and outside (`../`) the current directory are handled separately.
+ * This is necessary because directory traversal starts at the base directory and goes deeper.
+ */
+function convertPatternsToTasks(positive, negative, dynamic) {
+ const tasks = [];
+ const patternsOutsideCurrentDirectory = utils$b.pattern.getPatternsOutsideCurrentDirectory(positive);
+ const patternsInsideCurrentDirectory = utils$b.pattern.getPatternsInsideCurrentDirectory(positive);
+ const outsideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsOutsideCurrentDirectory);
+ const insideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsInsideCurrentDirectory);
+ tasks.push(...convertPatternGroupsToTasks(outsideCurrentDirectoryGroup, negative, dynamic));
+ /*
+ * For the sake of reducing future accesses to the file system, we merge all tasks within the current directory
+ * into a global task, if at least one pattern refers to the root (`.`). In this case, the global task covers the rest.
+ */
+ if ('.' in insideCurrentDirectoryGroup) {
+ tasks.push(convertPatternGroupToTask('.', patternsInsideCurrentDirectory, negative, dynamic));
+ }
+ else {
+ tasks.push(...convertPatternGroupsToTasks(insideCurrentDirectoryGroup, negative, dynamic));
+ }
+ return tasks;
+}
+tasks.convertPatternsToTasks = convertPatternsToTasks;
+function getPositivePatterns(patterns) {
+ return utils$b.pattern.getPositivePatterns(patterns);
+}
+tasks.getPositivePatterns = getPositivePatterns;
+function getNegativePatternsAsPositive(patterns, ignore) {
+ const negative = utils$b.pattern.getNegativePatterns(patterns).concat(ignore);
+ const positive = negative.map(utils$b.pattern.convertToPositivePattern);
+ return positive;
+}
+tasks.getNegativePatternsAsPositive = getNegativePatternsAsPositive;
+function groupPatternsByBaseDirectory(patterns) {
+ const group = {};
+ return patterns.reduce((collection, pattern) => {
+ const base = utils$b.pattern.getBaseDirectory(pattern);
+ if (base in collection) {
+ collection[base].push(pattern);
+ }
+ else {
+ collection[base] = [pattern];
+ }
+ return collection;
+ }, group);
+}
+tasks.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory;
+function convertPatternGroupsToTasks(positive, negative, dynamic) {
+ return Object.keys(positive).map((base) => {
+ return convertPatternGroupToTask(base, positive[base], negative, dynamic);
+ });
+}
+tasks.convertPatternGroupsToTasks = convertPatternGroupsToTasks;
+function convertPatternGroupToTask(base, positive, negative, dynamic) {
+ return {
+ dynamic,
+ positive,
+ negative,
+ base,
+ patterns: [].concat(positive, negative.map(utils$b.pattern.convertToNegativePattern))
+ };
+}
+tasks.convertPatternGroupToTask = convertPatternGroupToTask;
+
+var patterns = {};
+
+Object.defineProperty(patterns, "__esModule", { value: true });
+patterns.removeDuplicateSlashes = patterns.transform = void 0;
+/**
+ * Matches a sequence of two or more consecutive slashes, excluding the first two slashes at the beginning of the string.
+ * The latter is due to the presence of the device path at the beginning of the UNC path.
+ * @todo rewrite to negative lookbehind with the next major release.
+ */
+const DOUBLE_SLASH_RE$1 = /(?!^)\/{2,}/g;
+function transform(patterns) {
+ return patterns.map((pattern) => removeDuplicateSlashes(pattern));
+}
+patterns.transform = transform;
+/**
+ * This package only works with forward slashes as a path separator.
+ * Because of this, we cannot use the standard `path.normalize` method, because on Windows platform it will use of backslashes.
+ */
+function removeDuplicateSlashes(pattern) {
+ return pattern.replace(DOUBLE_SLASH_RE$1, '/');
+}
+patterns.removeDuplicateSlashes = removeDuplicateSlashes;
+
+var async$6 = {};
+
+var stream$2 = {};
+
+var out$3 = {};
+
+var async$5 = {};
+
+Object.defineProperty(async$5, "__esModule", { value: true });
+async$5.read = void 0;
+function read$4(path, settings, callback) {
+ settings.fs.lstat(path, (lstatError, lstat) => {
+ if (lstatError !== null) {
+ callFailureCallback$2(callback, lstatError);
+ return;
+ }
+ if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) {
+ callSuccessCallback$2(callback, lstat);
+ return;
+ }
+ settings.fs.stat(path, (statError, stat) => {
+ if (statError !== null) {
+ if (settings.throwErrorOnBrokenSymbolicLink) {
+ callFailureCallback$2(callback, statError);
+ return;
+ }
+ callSuccessCallback$2(callback, lstat);
+ return;
+ }
+ if (settings.markSymbolicLink) {
+ stat.isSymbolicLink = () => true;
+ }
+ callSuccessCallback$2(callback, stat);
+ });
+ });
+}
+async$5.read = read$4;
+function callFailureCallback$2(callback, error) {
+ callback(error);
+}
+function callSuccessCallback$2(callback, result) {
+ callback(null, result);
+}
+
+var sync$a = {};
+
+Object.defineProperty(sync$a, "__esModule", { value: true });
+sync$a.read = void 0;
+function read$3(path, settings) {
+ const lstat = settings.fs.lstatSync(path);
+ if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) {
+ return lstat;
+ }
+ try {
+ const stat = settings.fs.statSync(path);
+ if (settings.markSymbolicLink) {
+ stat.isSymbolicLink = () => true;
+ }
+ return stat;
+ }
+ catch (error) {
+ if (!settings.throwErrorOnBrokenSymbolicLink) {
+ return lstat;
+ }
+ throw error;
+ }
+}
+sync$a.read = read$3;
+
+var settings$3 = {};
+
+var fs$g = {};
+
+(function (exports) {
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0;
+const fs = fs__default;
+exports.FILE_SYSTEM_ADAPTER = {
+ lstat: fs.lstat,
+ stat: fs.stat,
+ lstatSync: fs.lstatSync,
+ statSync: fs.statSync
+};
+function createFileSystemAdapter(fsMethods) {
+ if (fsMethods === undefined) {
+ return exports.FILE_SYSTEM_ADAPTER;
+ }
+ return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods);
+}
+exports.createFileSystemAdapter = createFileSystemAdapter;
+}(fs$g));
+
+Object.defineProperty(settings$3, "__esModule", { value: true });
+const fs$f = fs$g;
+class Settings$2 {
+ constructor(_options = {}) {
+ this._options = _options;
+ this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true);
+ this.fs = fs$f.createFileSystemAdapter(this._options.fs);
+ this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false);
+ this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true);
+ }
+ _getValue(option, value) {
+ return option !== null && option !== void 0 ? option : value;
+ }
+}
+settings$3.default = Settings$2;
+
+Object.defineProperty(out$3, "__esModule", { value: true });
+out$3.statSync = out$3.stat = out$3.Settings = void 0;
+const async$4 = async$5;
+const sync$9 = sync$a;
+const settings_1$3 = settings$3;
+out$3.Settings = settings_1$3.default;
+function stat$4(path, optionsOrSettingsOrCallback, callback) {
+ if (typeof optionsOrSettingsOrCallback === 'function') {
+ async$4.read(path, getSettings$2(), optionsOrSettingsOrCallback);
+ return;
+ }
+ async$4.read(path, getSettings$2(optionsOrSettingsOrCallback), callback);
+}
+out$3.stat = stat$4;
+function statSync(path, optionsOrSettings) {
+ const settings = getSettings$2(optionsOrSettings);
+ return sync$9.read(path, settings);
+}
+out$3.statSync = statSync;
+function getSettings$2(settingsOrOptions = {}) {
+ if (settingsOrOptions instanceof settings_1$3.default) {
+ return settingsOrOptions;
+ }
+ return new settings_1$3.default(settingsOrOptions);
+}
+
+var out$2 = {};
+
+var async$3 = {};
+
+var async$2 = {};
+
+var out$1 = {};
+
+var async$1 = {};
+
+/*! queue-microtask. MIT License. Feross Aboukhadijeh */
+
+let promise;
+
+var queueMicrotask_1 = typeof queueMicrotask === 'function'
+ ? queueMicrotask.bind(typeof window !== 'undefined' ? window : commonjsGlobal)
+ // reuse resolved promise, and allocate it lazily
+ : cb => (promise || (promise = Promise.resolve()))
+ .then(cb)
+ .catch(err => setTimeout(() => { throw err }, 0));
+
+/*! run-parallel. MIT License. Feross Aboukhadijeh */
+
+var runParallel_1 = runParallel;
+
+const queueMicrotask$1 = queueMicrotask_1;
+
+function runParallel (tasks, cb) {
+ let results, pending, keys;
+ let isSync = true;
+
+ if (Array.isArray(tasks)) {
+ results = [];
+ pending = tasks.length;
+ } else {
+ keys = Object.keys(tasks);
+ results = {};
+ pending = keys.length;
+ }
+
+ function done (err) {
+ function end () {
+ if (cb) cb(err, results);
+ cb = null;
+ }
+ if (isSync) queueMicrotask$1(end);
+ else end();
+ }
+
+ function each (i, err, result) {
+ results[i] = result;
+ if (--pending === 0 || err) {
+ done(err);
+ }
+ }
+
+ if (!pending) {
+ // empty
+ done(null);
+ } else if (keys) {
+ // object
+ keys.forEach(function (key) {
+ tasks[key](function (err, result) { each(key, err, result); });
+ });
+ } else {
+ // array
+ tasks.forEach(function (task, i) {
+ task(function (err, result) { each(i, err, result); });
+ });
+ }
+
+ isSync = false;
+}
+
+var constants$2 = {};
+
+Object.defineProperty(constants$2, "__esModule", { value: true });
+constants$2.IS_SUPPORT_READDIR_WITH_FILE_TYPES = void 0;
+const NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.');
+if (NODE_PROCESS_VERSION_PARTS[0] === undefined || NODE_PROCESS_VERSION_PARTS[1] === undefined) {
+ throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);
+}
+const MAJOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[0], 10);
+const MINOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[1], 10);
+const SUPPORTED_MAJOR_VERSION = 10;
+const SUPPORTED_MINOR_VERSION = 10;
+const IS_MATCHED_BY_MAJOR = MAJOR_VERSION > SUPPORTED_MAJOR_VERSION;
+const IS_MATCHED_BY_MAJOR_AND_MINOR = MAJOR_VERSION === SUPPORTED_MAJOR_VERSION && MINOR_VERSION >= SUPPORTED_MINOR_VERSION;
+/**
+ * IS `true` for Node.js 10.10 and greater.
+ */
+constants$2.IS_SUPPORT_READDIR_WITH_FILE_TYPES = IS_MATCHED_BY_MAJOR || IS_MATCHED_BY_MAJOR_AND_MINOR;
+
+var utils$a = {};
+
+var fs$e = {};
+
+Object.defineProperty(fs$e, "__esModule", { value: true });
+fs$e.createDirentFromStats = void 0;
+class DirentFromStats {
+ constructor(name, stats) {
+ this.name = name;
+ this.isBlockDevice = stats.isBlockDevice.bind(stats);
+ this.isCharacterDevice = stats.isCharacterDevice.bind(stats);
+ this.isDirectory = stats.isDirectory.bind(stats);
+ this.isFIFO = stats.isFIFO.bind(stats);
+ this.isFile = stats.isFile.bind(stats);
+ this.isSocket = stats.isSocket.bind(stats);
+ this.isSymbolicLink = stats.isSymbolicLink.bind(stats);
+ }
+}
+function createDirentFromStats(name, stats) {
+ return new DirentFromStats(name, stats);
+}
+fs$e.createDirentFromStats = createDirentFromStats;
+
+Object.defineProperty(utils$a, "__esModule", { value: true });
+utils$a.fs = void 0;
+const fs$d = fs$e;
+utils$a.fs = fs$d;
+
+var common$b = {};
+
+Object.defineProperty(common$b, "__esModule", { value: true });
+common$b.joinPathSegments = void 0;
+function joinPathSegments$1(a, b, separator) {
+ /**
+ * The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`).
+ */
+ if (a.endsWith(separator)) {
+ return a + b;
+ }
+ return a + separator + b;
+}
+common$b.joinPathSegments = joinPathSegments$1;
+
+Object.defineProperty(async$1, "__esModule", { value: true });
+async$1.readdir = async$1.readdirWithFileTypes = async$1.read = void 0;
+const fsStat$5 = out$3;
+const rpl = runParallel_1;
+const constants_1$1 = constants$2;
+const utils$9 = utils$a;
+const common$a = common$b;
+function read$2(directory, settings, callback) {
+ if (!settings.stats && constants_1$1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) {
+ readdirWithFileTypes$1(directory, settings, callback);
+ return;
+ }
+ readdir$3(directory, settings, callback);
+}
+async$1.read = read$2;
+function readdirWithFileTypes$1(directory, settings, callback) {
+ settings.fs.readdir(directory, { withFileTypes: true }, (readdirError, dirents) => {
+ if (readdirError !== null) {
+ callFailureCallback$1(callback, readdirError);
+ return;
+ }
+ const entries = dirents.map((dirent) => ({
+ dirent,
+ name: dirent.name,
+ path: common$a.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator)
+ }));
+ if (!settings.followSymbolicLinks) {
+ callSuccessCallback$1(callback, entries);
+ return;
+ }
+ const tasks = entries.map((entry) => makeRplTaskEntry(entry, settings));
+ rpl(tasks, (rplError, rplEntries) => {
+ if (rplError !== null) {
+ callFailureCallback$1(callback, rplError);
+ return;
+ }
+ callSuccessCallback$1(callback, rplEntries);
+ });
+ });
+}
+async$1.readdirWithFileTypes = readdirWithFileTypes$1;
+function makeRplTaskEntry(entry, settings) {
+ return (done) => {
+ if (!entry.dirent.isSymbolicLink()) {
+ done(null, entry);
+ return;
+ }
+ settings.fs.stat(entry.path, (statError, stats) => {
+ if (statError !== null) {
+ if (settings.throwErrorOnBrokenSymbolicLink) {
+ done(statError);
+ return;
+ }
+ done(null, entry);
+ return;
+ }
+ entry.dirent = utils$9.fs.createDirentFromStats(entry.name, stats);
+ done(null, entry);
+ });
+ };
+}
+function readdir$3(directory, settings, callback) {
+ settings.fs.readdir(directory, (readdirError, names) => {
+ if (readdirError !== null) {
+ callFailureCallback$1(callback, readdirError);
+ return;
+ }
+ const tasks = names.map((name) => {
+ const path = common$a.joinPathSegments(directory, name, settings.pathSegmentSeparator);
+ return (done) => {
+ fsStat$5.stat(path, settings.fsStatSettings, (error, stats) => {
+ if (error !== null) {
+ done(error);
+ return;
+ }
+ const entry = {
+ name,
+ path,
+ dirent: utils$9.fs.createDirentFromStats(name, stats)
+ };
+ if (settings.stats) {
+ entry.stats = stats;
+ }
+ done(null, entry);
+ });
+ };
+ });
+ rpl(tasks, (rplError, entries) => {
+ if (rplError !== null) {
+ callFailureCallback$1(callback, rplError);
+ return;
+ }
+ callSuccessCallback$1(callback, entries);
+ });
+ });
+}
+async$1.readdir = readdir$3;
+function callFailureCallback$1(callback, error) {
+ callback(error);
+}
+function callSuccessCallback$1(callback, result) {
+ callback(null, result);
+}
+
+var sync$8 = {};
+
+Object.defineProperty(sync$8, "__esModule", { value: true });
+sync$8.readdir = sync$8.readdirWithFileTypes = sync$8.read = void 0;
+const fsStat$4 = out$3;
+const constants_1 = constants$2;
+const utils$8 = utils$a;
+const common$9 = common$b;
+function read$1(directory, settings) {
+ if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) {
+ return readdirWithFileTypes(directory, settings);
+ }
+ return readdir$2(directory, settings);
+}
+sync$8.read = read$1;
+function readdirWithFileTypes(directory, settings) {
+ const dirents = settings.fs.readdirSync(directory, { withFileTypes: true });
+ return dirents.map((dirent) => {
+ const entry = {
+ dirent,
+ name: dirent.name,
+ path: common$9.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator)
+ };
+ if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) {
+ try {
+ const stats = settings.fs.statSync(entry.path);
+ entry.dirent = utils$8.fs.createDirentFromStats(entry.name, stats);
+ }
+ catch (error) {
+ if (settings.throwErrorOnBrokenSymbolicLink) {
+ throw error;
+ }
+ }
+ }
+ return entry;
+ });
+}
+sync$8.readdirWithFileTypes = readdirWithFileTypes;
+function readdir$2(directory, settings) {
+ const names = settings.fs.readdirSync(directory);
+ return names.map((name) => {
+ const entryPath = common$9.joinPathSegments(directory, name, settings.pathSegmentSeparator);
+ const stats = fsStat$4.statSync(entryPath, settings.fsStatSettings);
+ const entry = {
+ name,
+ path: entryPath,
+ dirent: utils$8.fs.createDirentFromStats(name, stats)
+ };
+ if (settings.stats) {
+ entry.stats = stats;
+ }
+ return entry;
+ });
+}
+sync$8.readdir = readdir$2;
+
+var settings$2 = {};
+
+var fs$c = {};
+
+(function (exports) {
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0;
+const fs = fs__default;
+exports.FILE_SYSTEM_ADAPTER = {
+ lstat: fs.lstat,
+ stat: fs.stat,
+ lstatSync: fs.lstatSync,
+ statSync: fs.statSync,
+ readdir: fs.readdir,
+ readdirSync: fs.readdirSync
+};
+function createFileSystemAdapter(fsMethods) {
+ if (fsMethods === undefined) {
+ return exports.FILE_SYSTEM_ADAPTER;
+ }
+ return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods);
+}
+exports.createFileSystemAdapter = createFileSystemAdapter;
+}(fs$c));
+
+Object.defineProperty(settings$2, "__esModule", { value: true });
+const path$c = path__default;
+const fsStat$3 = out$3;
+const fs$b = fs$c;
+class Settings$1 {
+ constructor(_options = {}) {
+ this._options = _options;
+ this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false);
+ this.fs = fs$b.createFileSystemAdapter(this._options.fs);
+ this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path$c.sep);
+ this.stats = this._getValue(this._options.stats, false);
+ this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true);
+ this.fsStatSettings = new fsStat$3.Settings({
+ followSymbolicLink: this.followSymbolicLinks,
+ fs: this.fs,
+ throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink
+ });
+ }
+ _getValue(option, value) {
+ return option !== null && option !== void 0 ? option : value;
+ }
+}
+settings$2.default = Settings$1;
+
+Object.defineProperty(out$1, "__esModule", { value: true });
+out$1.Settings = out$1.scandirSync = out$1.scandir = void 0;
+const async = async$1;
+const sync$7 = sync$8;
+const settings_1$2 = settings$2;
+out$1.Settings = settings_1$2.default;
+function scandir(path, optionsOrSettingsOrCallback, callback) {
+ if (typeof optionsOrSettingsOrCallback === 'function') {
+ async.read(path, getSettings$1(), optionsOrSettingsOrCallback);
+ return;
+ }
+ async.read(path, getSettings$1(optionsOrSettingsOrCallback), callback);
+}
+out$1.scandir = scandir;
+function scandirSync(path, optionsOrSettings) {
+ const settings = getSettings$1(optionsOrSettings);
+ return sync$7.read(path, settings);
+}
+out$1.scandirSync = scandirSync;
+function getSettings$1(settingsOrOptions = {}) {
+ if (settingsOrOptions instanceof settings_1$2.default) {
+ return settingsOrOptions;
+ }
+ return new settings_1$2.default(settingsOrOptions);
+}
+
+var queue = {exports: {}};
+
+function reusify$1 (Constructor) {
+ var head = new Constructor();
+ var tail = head;
+
+ function get () {
+ var current = head;
+
+ if (current.next) {
+ head = current.next;
+ } else {
+ head = new Constructor();
+ tail = head;
+ }
+
+ current.next = null;
+
+ return current
+ }
+
+ function release (obj) {
+ tail.next = obj;
+ tail = obj;
+ }
+
+ return {
+ get: get,
+ release: release
+ }
+}
+
+var reusify_1 = reusify$1;
+
+/* eslint-disable no-var */
+
+var reusify = reusify_1;
+
+function fastqueue (context, worker, concurrency) {
+ if (typeof context === 'function') {
+ concurrency = worker;
+ worker = context;
+ context = null;
+ }
+
+ if (concurrency < 1) {
+ throw new Error('fastqueue concurrency must be greater than 1')
+ }
+
+ var cache = reusify(Task);
+ var queueHead = null;
+ var queueTail = null;
+ var _running = 0;
+ var errorHandler = null;
+
+ var self = {
+ push: push,
+ drain: noop$3,
+ saturated: noop$3,
+ pause: pause,
+ paused: false,
+ concurrency: concurrency,
+ running: running,
+ resume: resume,
+ idle: idle,
+ length: length,
+ getQueue: getQueue,
+ unshift: unshift,
+ empty: noop$3,
+ kill: kill,
+ killAndDrain: killAndDrain,
+ error: error
+ };
+
+ return self
+
+ function running () {
+ return _running
+ }
+
+ function pause () {
+ self.paused = true;
+ }
+
+ function length () {
+ var current = queueHead;
+ var counter = 0;
+
+ while (current) {
+ current = current.next;
+ counter++;
+ }
+
+ return counter
+ }
+
+ function getQueue () {
+ var current = queueHead;
+ var tasks = [];
+
+ while (current) {
+ tasks.push(current.value);
+ current = current.next;
+ }
+
+ return tasks
+ }
+
+ function resume () {
+ if (!self.paused) return
+ self.paused = false;
+ for (var i = 0; i < self.concurrency; i++) {
+ _running++;
+ release();
+ }
+ }
+
+ function idle () {
+ return _running === 0 && self.length() === 0
+ }
+
+ function push (value, done) {
+ var current = cache.get();
+
+ current.context = context;
+ current.release = release;
+ current.value = value;
+ current.callback = done || noop$3;
+ current.errorHandler = errorHandler;
+
+ if (_running === self.concurrency || self.paused) {
+ if (queueTail) {
+ queueTail.next = current;
+ queueTail = current;
+ } else {
+ queueHead = current;
+ queueTail = current;
+ self.saturated();
+ }
+ } else {
+ _running++;
+ worker.call(context, current.value, current.worked);
+ }
+ }
+
+ function unshift (value, done) {
+ var current = cache.get();
+
+ current.context = context;
+ current.release = release;
+ current.value = value;
+ current.callback = done || noop$3;
+
+ if (_running === self.concurrency || self.paused) {
+ if (queueHead) {
+ current.next = queueHead;
+ queueHead = current;
+ } else {
+ queueHead = current;
+ queueTail = current;
+ self.saturated();
+ }
+ } else {
+ _running++;
+ worker.call(context, current.value, current.worked);
+ }
+ }
+
+ function release (holder) {
+ if (holder) {
+ cache.release(holder);
+ }
+ var next = queueHead;
+ if (next) {
+ if (!self.paused) {
+ if (queueTail === queueHead) {
+ queueTail = null;
+ }
+ queueHead = next.next;
+ next.next = null;
+ worker.call(context, next.value, next.worked);
+ if (queueTail === null) {
+ self.empty();
+ }
+ } else {
+ _running--;
+ }
+ } else if (--_running === 0) {
+ self.drain();
+ }
+ }
+
+ function kill () {
+ queueHead = null;
+ queueTail = null;
+ self.drain = noop$3;
+ }
+
+ function killAndDrain () {
+ queueHead = null;
+ queueTail = null;
+ self.drain();
+ self.drain = noop$3;
+ }
+
+ function error (handler) {
+ errorHandler = handler;
+ }
+}
+
+function noop$3 () {}
+
+function Task () {
+ this.value = null;
+ this.callback = noop$3;
+ this.next = null;
+ this.release = noop$3;
+ this.context = null;
+ this.errorHandler = null;
+
+ var self = this;
+
+ this.worked = function worked (err, result) {
+ var callback = self.callback;
+ var errorHandler = self.errorHandler;
+ var val = self.value;
+ self.value = null;
+ self.callback = noop$3;
+ if (self.errorHandler) {
+ errorHandler(err, val);
+ }
+ callback.call(self.context, err, result);
+ self.release(self);
+ };
+}
+
+function queueAsPromised (context, worker, concurrency) {
+ if (typeof context === 'function') {
+ concurrency = worker;
+ worker = context;
+ context = null;
+ }
+
+ function asyncWrapper (arg, cb) {
+ worker.call(this, arg)
+ .then(function (res) {
+ cb(null, res);
+ }, cb);
+ }
+
+ var queue = fastqueue(context, asyncWrapper, concurrency);
+
+ var pushCb = queue.push;
+ var unshiftCb = queue.unshift;
+
+ queue.push = push;
+ queue.unshift = unshift;
+ queue.drained = drained;
+
+ return queue
+
+ function push (value) {
+ var p = new Promise(function (resolve, reject) {
+ pushCb(value, function (err, result) {
+ if (err) {
+ reject(err);
+ return
+ }
+ resolve(result);
+ });
+ });
+
+ // Let's fork the promise chain to
+ // make the error bubble up to the user but
+ // not lead to a unhandledRejection
+ p.catch(noop$3);
+
+ return p
+ }
+
+ function unshift (value) {
+ var p = new Promise(function (resolve, reject) {
+ unshiftCb(value, function (err, result) {
+ if (err) {
+ reject(err);
+ return
+ }
+ resolve(result);
+ });
+ });
+
+ // Let's fork the promise chain to
+ // make the error bubble up to the user but
+ // not lead to a unhandledRejection
+ p.catch(noop$3);
+
+ return p
+ }
+
+ function drained () {
+ var previousDrain = queue.drain;
+
+ var p = new Promise(function (resolve) {
+ queue.drain = function () {
+ previousDrain();
+ resolve();
+ };
+ });
+
+ return p
+ }
+}
+
+queue.exports = fastqueue;
+queue.exports.promise = queueAsPromised;
+
+var common$8 = {};
+
+Object.defineProperty(common$8, "__esModule", { value: true });
+common$8.joinPathSegments = common$8.replacePathSegmentSeparator = common$8.isAppliedFilter = common$8.isFatalError = void 0;
+function isFatalError(settings, error) {
+ if (settings.errorFilter === null) {
+ return true;
+ }
+ return !settings.errorFilter(error);
+}
+common$8.isFatalError = isFatalError;
+function isAppliedFilter(filter, value) {
+ return filter === null || filter(value);
+}
+common$8.isAppliedFilter = isAppliedFilter;
+function replacePathSegmentSeparator(filepath, separator) {
+ return filepath.split(/[/\\]/).join(separator);
+}
+common$8.replacePathSegmentSeparator = replacePathSegmentSeparator;
+function joinPathSegments(a, b, separator) {
+ if (a === '') {
+ return b;
+ }
+ /**
+ * The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`).
+ */
+ if (a.endsWith(separator)) {
+ return a + b;
+ }
+ return a + separator + b;
+}
+common$8.joinPathSegments = joinPathSegments;
+
+var reader$1 = {};
+
+Object.defineProperty(reader$1, "__esModule", { value: true });
+const common$7 = common$8;
+class Reader$1 {
+ constructor(_root, _settings) {
+ this._root = _root;
+ this._settings = _settings;
+ this._root = common$7.replacePathSegmentSeparator(_root, _settings.pathSegmentSeparator);
+ }
+}
+reader$1.default = Reader$1;
+
+Object.defineProperty(async$2, "__esModule", { value: true });
+const events_1 = require$$0__default$1;
+const fsScandir$2 = out$1;
+const fastq = queue.exports;
+const common$6 = common$8;
+const reader_1$3 = reader$1;
+class AsyncReader extends reader_1$3.default {
+ constructor(_root, _settings) {
+ super(_root, _settings);
+ this._settings = _settings;
+ this._scandir = fsScandir$2.scandir;
+ this._emitter = new events_1.EventEmitter();
+ this._queue = fastq(this._worker.bind(this), this._settings.concurrency);
+ this._isFatalError = false;
+ this._isDestroyed = false;
+ this._queue.drain = () => {
+ if (!this._isFatalError) {
+ this._emitter.emit('end');
+ }
+ };
+ }
+ read() {
+ this._isFatalError = false;
+ this._isDestroyed = false;
+ setImmediate(() => {
+ this._pushToQueue(this._root, this._settings.basePath);
+ });
+ return this._emitter;
+ }
+ get isDestroyed() {
+ return this._isDestroyed;
+ }
+ destroy() {
+ if (this._isDestroyed) {
+ throw new Error('The reader is already destroyed');
+ }
+ this._isDestroyed = true;
+ this._queue.killAndDrain();
+ }
+ onEntry(callback) {
+ this._emitter.on('entry', callback);
+ }
+ onError(callback) {
+ this._emitter.once('error', callback);
+ }
+ onEnd(callback) {
+ this._emitter.once('end', callback);
+ }
+ _pushToQueue(directory, base) {
+ const queueItem = { directory, base };
+ this._queue.push(queueItem, (error) => {
+ if (error !== null) {
+ this._handleError(error);
+ }
+ });
+ }
+ _worker(item, done) {
+ this._scandir(item.directory, this._settings.fsScandirSettings, (error, entries) => {
+ if (error !== null) {
+ done(error, undefined);
+ return;
+ }
+ for (const entry of entries) {
+ this._handleEntry(entry, item.base);
+ }
+ done(null, undefined);
+ });
+ }
+ _handleError(error) {
+ if (this._isDestroyed || !common$6.isFatalError(this._settings, error)) {
+ return;
+ }
+ this._isFatalError = true;
+ this._isDestroyed = true;
+ this._emitter.emit('error', error);
+ }
+ _handleEntry(entry, base) {
+ if (this._isDestroyed || this._isFatalError) {
+ return;
+ }
+ const fullpath = entry.path;
+ if (base !== undefined) {
+ entry.path = common$6.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator);
+ }
+ if (common$6.isAppliedFilter(this._settings.entryFilter, entry)) {
+ this._emitEntry(entry);
+ }
+ if (entry.dirent.isDirectory() && common$6.isAppliedFilter(this._settings.deepFilter, entry)) {
+ this._pushToQueue(fullpath, base === undefined ? undefined : entry.path);
+ }
+ }
+ _emitEntry(entry) {
+ this._emitter.emit('entry', entry);
+ }
+}
+async$2.default = AsyncReader;
+
+Object.defineProperty(async$3, "__esModule", { value: true });
+const async_1$3 = async$2;
+class AsyncProvider {
+ constructor(_root, _settings) {
+ this._root = _root;
+ this._settings = _settings;
+ this._reader = new async_1$3.default(this._root, this._settings);
+ this._storage = [];
+ }
+ read(callback) {
+ this._reader.onError((error) => {
+ callFailureCallback(callback, error);
+ });
+ this._reader.onEntry((entry) => {
+ this._storage.push(entry);
+ });
+ this._reader.onEnd(() => {
+ callSuccessCallback(callback, this._storage);
+ });
+ this._reader.read();
+ }
+}
+async$3.default = AsyncProvider;
+function callFailureCallback(callback, error) {
+ callback(error);
+}
+function callSuccessCallback(callback, entries) {
+ callback(null, entries);
+}
+
+var stream$1 = {};
+
+Object.defineProperty(stream$1, "__esModule", { value: true });
+const stream_1$5 = require$$0__default$3;
+const async_1$2 = async$2;
+class StreamProvider {
+ constructor(_root, _settings) {
+ this._root = _root;
+ this._settings = _settings;
+ this._reader = new async_1$2.default(this._root, this._settings);
+ this._stream = new stream_1$5.Readable({
+ objectMode: true,
+ read: () => { },
+ destroy: () => {
+ if (!this._reader.isDestroyed) {
+ this._reader.destroy();
+ }
+ }
+ });
+ }
+ read() {
+ this._reader.onError((error) => {
+ this._stream.emit('error', error);
+ });
+ this._reader.onEntry((entry) => {
+ this._stream.push(entry);
+ });
+ this._reader.onEnd(() => {
+ this._stream.push(null);
+ });
+ this._reader.read();
+ return this._stream;
+ }
+}
+stream$1.default = StreamProvider;
+
+var sync$6 = {};
+
+var sync$5 = {};
+
+Object.defineProperty(sync$5, "__esModule", { value: true });
+const fsScandir$1 = out$1;
+const common$5 = common$8;
+const reader_1$2 = reader$1;
+class SyncReader extends reader_1$2.default {
+ constructor() {
+ super(...arguments);
+ this._scandir = fsScandir$1.scandirSync;
+ this._storage = [];
+ this._queue = new Set();
+ }
+ read() {
+ this._pushToQueue(this._root, this._settings.basePath);
+ this._handleQueue();
+ return this._storage;
+ }
+ _pushToQueue(directory, base) {
+ this._queue.add({ directory, base });
+ }
+ _handleQueue() {
+ for (const item of this._queue.values()) {
+ this._handleDirectory(item.directory, item.base);
+ }
+ }
+ _handleDirectory(directory, base) {
+ try {
+ const entries = this._scandir(directory, this._settings.fsScandirSettings);
+ for (const entry of entries) {
+ this._handleEntry(entry, base);
+ }
+ }
+ catch (error) {
+ this._handleError(error);
+ }
+ }
+ _handleError(error) {
+ if (!common$5.isFatalError(this._settings, error)) {
+ return;
+ }
+ throw error;
+ }
+ _handleEntry(entry, base) {
+ const fullpath = entry.path;
+ if (base !== undefined) {
+ entry.path = common$5.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator);
+ }
+ if (common$5.isAppliedFilter(this._settings.entryFilter, entry)) {
+ this._pushToStorage(entry);
+ }
+ if (entry.dirent.isDirectory() && common$5.isAppliedFilter(this._settings.deepFilter, entry)) {
+ this._pushToQueue(fullpath, base === undefined ? undefined : entry.path);
+ }
+ }
+ _pushToStorage(entry) {
+ this._storage.push(entry);
+ }
+}
+sync$5.default = SyncReader;
+
+Object.defineProperty(sync$6, "__esModule", { value: true });
+const sync_1$3 = sync$5;
+class SyncProvider {
+ constructor(_root, _settings) {
+ this._root = _root;
+ this._settings = _settings;
+ this._reader = new sync_1$3.default(this._root, this._settings);
+ }
+ read() {
+ return this._reader.read();
+ }
+}
+sync$6.default = SyncProvider;
+
+var settings$1 = {};
+
+Object.defineProperty(settings$1, "__esModule", { value: true });
+const path$b = path__default;
+const fsScandir = out$1;
+class Settings {
+ constructor(_options = {}) {
+ this._options = _options;
+ this.basePath = this._getValue(this._options.basePath, undefined);
+ this.concurrency = this._getValue(this._options.concurrency, Number.POSITIVE_INFINITY);
+ this.deepFilter = this._getValue(this._options.deepFilter, null);
+ this.entryFilter = this._getValue(this._options.entryFilter, null);
+ this.errorFilter = this._getValue(this._options.errorFilter, null);
+ this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path$b.sep);
+ this.fsScandirSettings = new fsScandir.Settings({
+ followSymbolicLinks: this._options.followSymbolicLinks,
+ fs: this._options.fs,
+ pathSegmentSeparator: this._options.pathSegmentSeparator,
+ stats: this._options.stats,
+ throwErrorOnBrokenSymbolicLink: this._options.throwErrorOnBrokenSymbolicLink
+ });
+ }
+ _getValue(option, value) {
+ return option !== null && option !== void 0 ? option : value;
+ }
+}
+settings$1.default = Settings;
+
+Object.defineProperty(out$2, "__esModule", { value: true });
+out$2.Settings = out$2.walkStream = out$2.walkSync = out$2.walk = void 0;
+const async_1$1 = async$3;
+const stream_1$4 = stream$1;
+const sync_1$2 = sync$6;
+const settings_1$1 = settings$1;
+out$2.Settings = settings_1$1.default;
+function walk$1(directory, optionsOrSettingsOrCallback, callback) {
+ if (typeof optionsOrSettingsOrCallback === 'function') {
+ new async_1$1.default(directory, getSettings()).read(optionsOrSettingsOrCallback);
+ return;
+ }
+ new async_1$1.default(directory, getSettings(optionsOrSettingsOrCallback)).read(callback);
+}
+out$2.walk = walk$1;
+function walkSync(directory, optionsOrSettings) {
+ const settings = getSettings(optionsOrSettings);
+ const provider = new sync_1$2.default(directory, settings);
+ return provider.read();
+}
+out$2.walkSync = walkSync;
+function walkStream(directory, optionsOrSettings) {
+ const settings = getSettings(optionsOrSettings);
+ const provider = new stream_1$4.default(directory, settings);
+ return provider.read();
+}
+out$2.walkStream = walkStream;
+function getSettings(settingsOrOptions = {}) {
+ if (settingsOrOptions instanceof settings_1$1.default) {
+ return settingsOrOptions;
+ }
+ return new settings_1$1.default(settingsOrOptions);
+}
+
+var reader = {};
+
+Object.defineProperty(reader, "__esModule", { value: true });
+const path$a = path__default;
+const fsStat$2 = out$3;
+const utils$7 = utils$h;
+class Reader {
+ constructor(_settings) {
+ this._settings = _settings;
+ this._fsStatSettings = new fsStat$2.Settings({
+ followSymbolicLink: this._settings.followSymbolicLinks,
+ fs: this._settings.fs,
+ throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks
+ });
+ }
+ _getFullEntryPath(filepath) {
+ return path$a.resolve(this._settings.cwd, filepath);
+ }
+ _makeEntry(stats, pattern) {
+ const entry = {
+ name: pattern,
+ path: pattern,
+ dirent: utils$7.fs.createDirentFromStats(pattern, stats)
+ };
+ if (this._settings.stats) {
+ entry.stats = stats;
+ }
+ return entry;
+ }
+ _isFatalError(error) {
+ return !utils$7.errno.isEnoentCodeError(error) && !this._settings.suppressErrors;
+ }
+}
+reader.default = Reader;
+
+Object.defineProperty(stream$2, "__esModule", { value: true });
+const stream_1$3 = require$$0__default$3;
+const fsStat$1 = out$3;
+const fsWalk$1 = out$2;
+const reader_1$1 = reader;
+class ReaderStream extends reader_1$1.default {
+ constructor() {
+ super(...arguments);
+ this._walkStream = fsWalk$1.walkStream;
+ this._stat = fsStat$1.stat;
+ }
+ dynamic(root, options) {
+ return this._walkStream(root, options);
+ }
+ static(patterns, options) {
+ const filepaths = patterns.map(this._getFullEntryPath, this);
+ const stream = new stream_1$3.PassThrough({ objectMode: true });
+ stream._write = (index, _enc, done) => {
+ return this._getEntry(filepaths[index], patterns[index], options)
+ .then((entry) => {
+ if (entry !== null && options.entryFilter(entry)) {
+ stream.push(entry);
+ }
+ if (index === filepaths.length - 1) {
+ stream.end();
+ }
+ done();
+ })
+ .catch(done);
+ };
+ for (let i = 0; i < filepaths.length; i++) {
+ stream.write(i);
+ }
+ return stream;
+ }
+ _getEntry(filepath, pattern, options) {
+ return this._getStat(filepath)
+ .then((stats) => this._makeEntry(stats, pattern))
+ .catch((error) => {
+ if (options.errorFilter(error)) {
+ return null;
+ }
+ throw error;
+ });
+ }
+ _getStat(filepath) {
+ return new Promise((resolve, reject) => {
+ this._stat(filepath, this._fsStatSettings, (error, stats) => {
+ return error === null ? resolve(stats) : reject(error);
+ });
+ });
+ }
+}
+stream$2.default = ReaderStream;
+
+var provider = {};
+
+var deep = {};
+
+var partial = {};
+
+var matcher = {};
+
+Object.defineProperty(matcher, "__esModule", { value: true });
+const utils$6 = utils$h;
+class Matcher {
+ constructor(_patterns, _settings, _micromatchOptions) {
+ this._patterns = _patterns;
+ this._settings = _settings;
+ this._micromatchOptions = _micromatchOptions;
+ this._storage = [];
+ this._fillStorage();
+ }
+ _fillStorage() {
+ /**
+ * The original pattern may include `{,*,**,a/*}`, which will lead to problems with matching (unresolved level).
+ * So, before expand patterns with brace expansion into separated patterns.
+ */
+ const patterns = utils$6.pattern.expandPatternsWithBraceExpansion(this._patterns);
+ for (const pattern of patterns) {
+ const segments = this._getPatternSegments(pattern);
+ const sections = this._splitSegmentsIntoSections(segments);
+ this._storage.push({
+ complete: sections.length <= 1,
+ pattern,
+ segments,
+ sections
+ });
+ }
+ }
+ _getPatternSegments(pattern) {
+ const parts = utils$6.pattern.getPatternParts(pattern, this._micromatchOptions);
+ return parts.map((part) => {
+ const dynamic = utils$6.pattern.isDynamicPattern(part, this._settings);
+ if (!dynamic) {
+ return {
+ dynamic: false,
+ pattern: part
+ };
+ }
+ return {
+ dynamic: true,
+ pattern: part,
+ patternRe: utils$6.pattern.makeRe(part, this._micromatchOptions)
+ };
+ });
+ }
+ _splitSegmentsIntoSections(segments) {
+ return utils$6.array.splitWhen(segments, (segment) => segment.dynamic && utils$6.pattern.hasGlobStar(segment.pattern));
+ }
+}
+matcher.default = Matcher;
+
+Object.defineProperty(partial, "__esModule", { value: true });
+const matcher_1 = matcher;
+class PartialMatcher extends matcher_1.default {
+ match(filepath) {
+ const parts = filepath.split('/');
+ const levels = parts.length;
+ const patterns = this._storage.filter((info) => !info.complete || info.segments.length > levels);
+ for (const pattern of patterns) {
+ const section = pattern.sections[0];
+ /**
+ * In this case, the pattern has a globstar and we must read all directories unconditionally,
+ * but only if the level has reached the end of the first group.
+ *
+ * fixtures/{a,b}/**
+ * ^ true/false ^ always true
+ */
+ if (!pattern.complete && levels > section.length) {
+ return true;
+ }
+ const match = parts.every((part, index) => {
+ const segment = pattern.segments[index];
+ if (segment.dynamic && segment.patternRe.test(part)) {
+ return true;
+ }
+ if (!segment.dynamic && segment.pattern === part) {
+ return true;
+ }
+ return false;
+ });
+ if (match) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
+partial.default = PartialMatcher;
+
+Object.defineProperty(deep, "__esModule", { value: true });
+const utils$5 = utils$h;
+const partial_1 = partial;
+class DeepFilter {
+ constructor(_settings, _micromatchOptions) {
+ this._settings = _settings;
+ this._micromatchOptions = _micromatchOptions;
+ }
+ getFilter(basePath, positive, negative) {
+ const matcher = this._getMatcher(positive);
+ const negativeRe = this._getNegativePatternsRe(negative);
+ return (entry) => this._filter(basePath, entry, matcher, negativeRe);
+ }
+ _getMatcher(patterns) {
+ return new partial_1.default(patterns, this._settings, this._micromatchOptions);
+ }
+ _getNegativePatternsRe(patterns) {
+ const affectDepthOfReadingPatterns = patterns.filter(utils$5.pattern.isAffectDepthOfReadingPattern);
+ return utils$5.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions);
+ }
+ _filter(basePath, entry, matcher, negativeRe) {
+ if (this._isSkippedByDeep(basePath, entry.path)) {
+ return false;
+ }
+ if (this._isSkippedSymbolicLink(entry)) {
+ return false;
+ }
+ const filepath = utils$5.path.removeLeadingDotSegment(entry.path);
+ if (this._isSkippedByPositivePatterns(filepath, matcher)) {
+ return false;
+ }
+ return this._isSkippedByNegativePatterns(filepath, negativeRe);
+ }
+ _isSkippedByDeep(basePath, entryPath) {
+ /**
+ * Avoid unnecessary depth calculations when it doesn't matter.
+ */
+ if (this._settings.deep === Infinity) {
+ return false;
+ }
+ return this._getEntryLevel(basePath, entryPath) >= this._settings.deep;
+ }
+ _getEntryLevel(basePath, entryPath) {
+ const entryPathDepth = entryPath.split('/').length;
+ if (basePath === '') {
+ return entryPathDepth;
+ }
+ const basePathDepth = basePath.split('/').length;
+ return entryPathDepth - basePathDepth;
+ }
+ _isSkippedSymbolicLink(entry) {
+ return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink();
+ }
+ _isSkippedByPositivePatterns(entryPath, matcher) {
+ return !this._settings.baseNameMatch && !matcher.match(entryPath);
+ }
+ _isSkippedByNegativePatterns(entryPath, patternsRe) {
+ return !utils$5.pattern.matchAny(entryPath, patternsRe);
+ }
+}
+deep.default = DeepFilter;
+
+var entry$1 = {};
+
+Object.defineProperty(entry$1, "__esModule", { value: true });
+const utils$4 = utils$h;
+class EntryFilter {
+ constructor(_settings, _micromatchOptions) {
+ this._settings = _settings;
+ this._micromatchOptions = _micromatchOptions;
+ this.index = new Map();
+ }
+ getFilter(positive, negative) {
+ const positiveRe = utils$4.pattern.convertPatternsToRe(positive, this._micromatchOptions);
+ const negativeRe = utils$4.pattern.convertPatternsToRe(negative, this._micromatchOptions);
+ return (entry) => this._filter(entry, positiveRe, negativeRe);
+ }
+ _filter(entry, positiveRe, negativeRe) {
+ if (this._settings.unique && this._isDuplicateEntry(entry)) {
+ return false;
+ }
+ if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) {
+ return false;
+ }
+ if (this._isSkippedByAbsoluteNegativePatterns(entry.path, negativeRe)) {
+ return false;
+ }
+ const filepath = this._settings.baseNameMatch ? entry.name : entry.path;
+ const isMatched = this._isMatchToPatterns(filepath, positiveRe) && !this._isMatchToPatterns(entry.path, negativeRe);
+ if (this._settings.unique && isMatched) {
+ this._createIndexRecord(entry);
+ }
+ return isMatched;
+ }
+ _isDuplicateEntry(entry) {
+ return this.index.has(entry.path);
+ }
+ _createIndexRecord(entry) {
+ this.index.set(entry.path, undefined);
+ }
+ _onlyFileFilter(entry) {
+ return this._settings.onlyFiles && !entry.dirent.isFile();
+ }
+ _onlyDirectoryFilter(entry) {
+ return this._settings.onlyDirectories && !entry.dirent.isDirectory();
+ }
+ _isSkippedByAbsoluteNegativePatterns(entryPath, patternsRe) {
+ if (!this._settings.absolute) {
+ return false;
+ }
+ const fullpath = utils$4.path.makeAbsolute(this._settings.cwd, entryPath);
+ return utils$4.pattern.matchAny(fullpath, patternsRe);
+ }
+ /**
+ * First, just trying to apply patterns to the path.
+ * Second, trying to apply patterns to the path with final slash.
+ */
+ _isMatchToPatterns(entryPath, patternsRe) {
+ const filepath = utils$4.path.removeLeadingDotSegment(entryPath);
+ return utils$4.pattern.matchAny(filepath, patternsRe) || utils$4.pattern.matchAny(filepath + '/', patternsRe);
+ }
+}
+entry$1.default = EntryFilter;
+
+var error$3 = {};
+
+Object.defineProperty(error$3, "__esModule", { value: true });
+const utils$3 = utils$h;
+class ErrorFilter {
+ constructor(_settings) {
+ this._settings = _settings;
+ }
+ getFilter() {
+ return (error) => this._isNonFatalError(error);
+ }
+ _isNonFatalError(error) {
+ return utils$3.errno.isEnoentCodeError(error) || this._settings.suppressErrors;
+ }
+}
+error$3.default = ErrorFilter;
+
+var entry = {};
+
+Object.defineProperty(entry, "__esModule", { value: true });
+const utils$2 = utils$h;
+class EntryTransformer {
+ constructor(_settings) {
+ this._settings = _settings;
+ }
+ getTransformer() {
+ return (entry) => this._transform(entry);
+ }
+ _transform(entry) {
+ let filepath = entry.path;
+ if (this._settings.absolute) {
+ filepath = utils$2.path.makeAbsolute(this._settings.cwd, filepath);
+ filepath = utils$2.path.unixify(filepath);
+ }
+ if (this._settings.markDirectories && entry.dirent.isDirectory()) {
+ filepath += '/';
+ }
+ if (!this._settings.objectMode) {
+ return filepath;
+ }
+ return Object.assign(Object.assign({}, entry), { path: filepath });
+ }
+}
+entry.default = EntryTransformer;
+
+Object.defineProperty(provider, "__esModule", { value: true });
+const path$9 = path__default;
+const deep_1 = deep;
+const entry_1 = entry$1;
+const error_1 = error$3;
+const entry_2 = entry;
+class Provider {
+ constructor(_settings) {
+ this._settings = _settings;
+ this.errorFilter = new error_1.default(this._settings);
+ this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions());
+ this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions());
+ this.entryTransformer = new entry_2.default(this._settings);
+ }
+ _getRootDirectory(task) {
+ return path$9.resolve(this._settings.cwd, task.base);
+ }
+ _getReaderOptions(task) {
+ const basePath = task.base === '.' ? '' : task.base;
+ return {
+ basePath,
+ pathSegmentSeparator: '/',
+ concurrency: this._settings.concurrency,
+ deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative),
+ entryFilter: this.entryFilter.getFilter(task.positive, task.negative),
+ errorFilter: this.errorFilter.getFilter(),
+ followSymbolicLinks: this._settings.followSymbolicLinks,
+ fs: this._settings.fs,
+ stats: this._settings.stats,
+ throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink,
+ transform: this.entryTransformer.getTransformer()
+ };
+ }
+ _getMicromatchOptions() {
+ return {
+ dot: this._settings.dot,
+ matchBase: this._settings.baseNameMatch,
+ nobrace: !this._settings.braceExpansion,
+ nocase: !this._settings.caseSensitiveMatch,
+ noext: !this._settings.extglob,
+ noglobstar: !this._settings.globstar,
+ posix: true,
+ strictSlashes: false
+ };
+ }
+}
+provider.default = Provider;
+
+Object.defineProperty(async$6, "__esModule", { value: true });
+const stream_1$2 = stream$2;
+const provider_1$2 = provider;
+class ProviderAsync extends provider_1$2.default {
+ constructor() {
+ super(...arguments);
+ this._reader = new stream_1$2.default(this._settings);
+ }
+ read(task) {
+ const root = this._getRootDirectory(task);
+ const options = this._getReaderOptions(task);
+ const entries = [];
+ return new Promise((resolve, reject) => {
+ const stream = this.api(root, task, options);
+ stream.once('error', reject);
+ stream.on('data', (entry) => entries.push(options.transform(entry)));
+ stream.once('end', () => resolve(entries));
+ });
+ }
+ api(root, task, options) {
+ if (task.dynamic) {
+ return this._reader.dynamic(root, options);
+ }
+ return this._reader.static(task.patterns, options);
+ }
+}
+async$6.default = ProviderAsync;
+
+var stream = {};
+
+Object.defineProperty(stream, "__esModule", { value: true });
+const stream_1$1 = require$$0__default$3;
+const stream_2 = stream$2;
+const provider_1$1 = provider;
+class ProviderStream extends provider_1$1.default {
+ constructor() {
+ super(...arguments);
+ this._reader = new stream_2.default(this._settings);
+ }
+ read(task) {
+ const root = this._getRootDirectory(task);
+ const options = this._getReaderOptions(task);
+ const source = this.api(root, task, options);
+ const destination = new stream_1$1.Readable({ objectMode: true, read: () => { } });
+ source
+ .once('error', (error) => destination.emit('error', error))
+ .on('data', (entry) => destination.emit('data', options.transform(entry)))
+ .once('end', () => destination.emit('end'));
+ destination
+ .once('close', () => source.destroy());
+ return destination;
+ }
+ api(root, task, options) {
+ if (task.dynamic) {
+ return this._reader.dynamic(root, options);
+ }
+ return this._reader.static(task.patterns, options);
+ }
+}
+stream.default = ProviderStream;
+
+var sync$4 = {};
+
+var sync$3 = {};
+
+Object.defineProperty(sync$3, "__esModule", { value: true });
+const fsStat = out$3;
+const fsWalk = out$2;
+const reader_1 = reader;
+class ReaderSync extends reader_1.default {
+ constructor() {
+ super(...arguments);
+ this._walkSync = fsWalk.walkSync;
+ this._statSync = fsStat.statSync;
+ }
+ dynamic(root, options) {
+ return this._walkSync(root, options);
+ }
+ static(patterns, options) {
+ const entries = [];
+ for (const pattern of patterns) {
+ const filepath = this._getFullEntryPath(pattern);
+ const entry = this._getEntry(filepath, pattern, options);
+ if (entry === null || !options.entryFilter(entry)) {
+ continue;
+ }
+ entries.push(entry);
+ }
+ return entries;
+ }
+ _getEntry(filepath, pattern, options) {
+ try {
+ const stats = this._getStat(filepath);
+ return this._makeEntry(stats, pattern);
+ }
+ catch (error) {
+ if (options.errorFilter(error)) {
+ return null;
+ }
+ throw error;
+ }
+ }
+ _getStat(filepath) {
+ return this._statSync(filepath, this._fsStatSettings);
+ }
+}
+sync$3.default = ReaderSync;
+
+Object.defineProperty(sync$4, "__esModule", { value: true });
+const sync_1$1 = sync$3;
+const provider_1 = provider;
+class ProviderSync extends provider_1.default {
+ constructor() {
+ super(...arguments);
+ this._reader = new sync_1$1.default(this._settings);
+ }
+ read(task) {
+ const root = this._getRootDirectory(task);
+ const options = this._getReaderOptions(task);
+ const entries = this.api(root, task, options);
+ return entries.map(options.transform);
+ }
+ api(root, task, options) {
+ if (task.dynamic) {
+ return this._reader.dynamic(root, options);
+ }
+ return this._reader.static(task.patterns, options);
+ }
+}
+sync$4.default = ProviderSync;
+
+var settings = {};
+
+(function (exports) {
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DEFAULT_FILE_SYSTEM_ADAPTER = void 0;
+const fs = fs__default;
+const os = require$$2__default;
+/**
+ * The `os.cpus` method can return zero. We expect the number of cores to be greater than zero.
+ * https://github.com/nodejs/node/blob/7faeddf23a98c53896f8b574a6e66589e8fb1eb8/lib/os.js#L106-L107
+ */
+const CPU_COUNT = Math.max(os.cpus().length, 1);
+exports.DEFAULT_FILE_SYSTEM_ADAPTER = {
+ lstat: fs.lstat,
+ lstatSync: fs.lstatSync,
+ stat: fs.stat,
+ statSync: fs.statSync,
+ readdir: fs.readdir,
+ readdirSync: fs.readdirSync
+};
+class Settings {
+ constructor(_options = {}) {
+ this._options = _options;
+ this.absolute = this._getValue(this._options.absolute, false);
+ this.baseNameMatch = this._getValue(this._options.baseNameMatch, false);
+ this.braceExpansion = this._getValue(this._options.braceExpansion, true);
+ this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true);
+ this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT);
+ this.cwd = this._getValue(this._options.cwd, process.cwd());
+ this.deep = this._getValue(this._options.deep, Infinity);
+ this.dot = this._getValue(this._options.dot, false);
+ this.extglob = this._getValue(this._options.extglob, true);
+ this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true);
+ this.fs = this._getFileSystemMethods(this._options.fs);
+ this.globstar = this._getValue(this._options.globstar, true);
+ this.ignore = this._getValue(this._options.ignore, []);
+ this.markDirectories = this._getValue(this._options.markDirectories, false);
+ this.objectMode = this._getValue(this._options.objectMode, false);
+ this.onlyDirectories = this._getValue(this._options.onlyDirectories, false);
+ this.onlyFiles = this._getValue(this._options.onlyFiles, true);
+ this.stats = this._getValue(this._options.stats, false);
+ this.suppressErrors = this._getValue(this._options.suppressErrors, false);
+ this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false);
+ this.unique = this._getValue(this._options.unique, true);
+ if (this.onlyDirectories) {
+ this.onlyFiles = false;
+ }
+ if (this.stats) {
+ this.objectMode = true;
+ }
+ }
+ _getValue(option, value) {
+ return option === undefined ? value : option;
+ }
+ _getFileSystemMethods(methods = {}) {
+ return Object.assign(Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER), methods);
+ }
+}
+exports.default = Settings;
+}(settings));
+
+const taskManager = tasks;
+const patternManager = patterns;
+const async_1 = async$6;
+const stream_1 = stream;
+const sync_1 = sync$4;
+const settings_1 = settings;
+const utils$1 = utils$h;
+async function FastGlob(source, options) {
+ assertPatternsInput(source);
+ const works = getWorks(source, async_1.default, options);
+ const result = await Promise.all(works);
+ return utils$1.array.flatten(result);
+}
+// https://github.com/typescript-eslint/typescript-eslint/issues/60
+// eslint-disable-next-line no-redeclare
+(function (FastGlob) {
+ function sync(source, options) {
+ assertPatternsInput(source);
+ const works = getWorks(source, sync_1.default, options);
+ return utils$1.array.flatten(works);
+ }
+ FastGlob.sync = sync;
+ function stream(source, options) {
+ assertPatternsInput(source);
+ const works = getWorks(source, stream_1.default, options);
+ /**
+ * The stream returned by the provider cannot work with an asynchronous iterator.
+ * To support asynchronous iterators, regardless of the number of tasks, we always multiplex streams.
+ * This affects performance (+25%). I don't see best solution right now.
+ */
+ return utils$1.stream.merge(works);
+ }
+ FastGlob.stream = stream;
+ function generateTasks(source, options) {
+ assertPatternsInput(source);
+ const patterns = patternManager.transform([].concat(source));
+ const settings = new settings_1.default(options);
+ return taskManager.generate(patterns, settings);
+ }
+ FastGlob.generateTasks = generateTasks;
+ function isDynamicPattern(source, options) {
+ assertPatternsInput(source);
+ const settings = new settings_1.default(options);
+ return utils$1.pattern.isDynamicPattern(source, settings);
+ }
+ FastGlob.isDynamicPattern = isDynamicPattern;
+ function escapePath(source) {
+ assertPatternsInput(source);
+ return utils$1.path.escape(source);
+ }
+ FastGlob.escapePath = escapePath;
+})(FastGlob || (FastGlob = {}));
+function getWorks(source, _Provider, options) {
+ const patterns = patternManager.transform([].concat(source));
+ const settings = new settings_1.default(options);
+ const tasks = taskManager.generate(patterns, settings);
+ const provider = new _Provider(settings);
+ return tasks.map(provider.read, provider);
+}
+function assertPatternsInput(input) {
+ const source = [].concat(input);
+ const isValidSource = source.every((item) => utils$1.string.isString(item) && !utils$1.string.isEmpty(item));
+ if (!isValidSource) {
+ throw new TypeError('Patterns must be a string (non empty) or an array of strings');
+ }
+}
+var out = FastGlob;
+
+class VariableDynamicImportError extends Error {}
+
+/* eslint-disable-next-line no-template-curly-in-string */
+const example = 'For example: import(`./foo/${bar}.js`).';
+
+function sanitizeString(str) {
+ if (str.includes('*')) {
+ throw new VariableDynamicImportError('A dynamic import cannot contain * characters.');
+ }
+ return str;
+}
+
+function templateLiteralToGlob(node) {
+ let glob = '';
+
+ for (let i = 0; i < node.quasis.length; i += 1) {
+ glob += sanitizeString(node.quasis[i].value.raw);
+ if (node.expressions[i]) {
+ glob += expressionToGlob(node.expressions[i]);
+ }
+ }
+
+ return glob;
+}
+
+function callExpressionToGlob(node) {
+ const { callee } = node;
+ if (
+ callee.type === 'MemberExpression' &&
+ callee.property.type === 'Identifier' &&
+ callee.property.name === 'concat'
+ ) {
+ return `${expressionToGlob(callee.object)}${node.arguments.map(expressionToGlob).join('')}`;
+ }
+ return '*';
+}
+
+function binaryExpressionToGlob(node) {
+ if (node.operator !== '+') {
+ throw new VariableDynamicImportError(`${node.operator} operator is not supported.`);
+ }
+
+ return `${expressionToGlob(node.left)}${expressionToGlob(node.right)}`;
+}
+
+function expressionToGlob(node) {
+ switch (node.type) {
+ case 'TemplateLiteral':
+ return templateLiteralToGlob(node);
+ case 'CallExpression':
+ return callExpressionToGlob(node);
+ case 'BinaryExpression':
+ return binaryExpressionToGlob(node);
+ case 'Literal': {
+ return sanitizeString(node.value);
+ }
+ default:
+ return '*';
+ }
+}
+
+function dynamicImportToGlob(node, sourceString) {
+ let glob = expressionToGlob(node);
+ if (!glob.includes('*') || glob.startsWith('data:')) {
+ return null;
+ }
+ glob = glob.replace(/\*\*/g, '*');
+
+ if (glob.startsWith('*')) {
+ throw new VariableDynamicImportError(
+ `invalid import "${sourceString}". It cannot be statically analyzed. Variable dynamic imports must start with ./ and be limited to a specific directory. ${example}`
+ );
+ }
+
+ if (glob.startsWith('/')) {
+ throw new VariableDynamicImportError(
+ `invalid import "${sourceString}". Variable absolute imports are not supported, imports must start with ./ in the static part of the import. ${example}`
+ );
+ }
+
+ if (!glob.startsWith('./') && !glob.startsWith('../')) {
+ throw new VariableDynamicImportError(
+ `invalid import "${sourceString}". Variable bare imports are not supported, imports must start with ./ in the static part of the import. ${example}`
+ );
+ }
+
+ // Disallow ./*.ext
+ const ownDirectoryStarExtension = /^\.\/\*\.[\w]+$/;
+ if (ownDirectoryStarExtension.test(glob)) {
+ throw new VariableDynamicImportError(
+ `${
+ `invalid import "${sourceString}". Variable imports cannot import their own directory, ` +
+ 'place imports in a separate directory or make the import filename more specific. '
+ }${example}`
+ );
+ }
+
+ if (path__default.extname(glob) === '') {
+ throw new VariableDynamicImportError(
+ `invalid import "${sourceString}". A file extension must be included in the static part of the import. ${example}`
+ );
+ }
+
+ return glob;
+}
+
+function dynamicImportVariables({ include, exclude, warnOnError } = {}) {
+ const filter = createFilter$1(include, exclude);
+
+ return {
+ name: 'rollup-plugin-dynamic-import-variables',
+
+ transform(code, id) {
+ if (!filter(id)) {
+ return null;
+ }
+
+ const parsed = this.parse(code);
+
+ let dynamicImportIndex = -1;
+ let ms;
+
+ walk$2(parsed, {
+ enter: (node) => {
+ if (node.type !== 'ImportExpression') {
+ return;
+ }
+ dynamicImportIndex += 1;
+
+ try {
+ // see if this is a variable dynamic import, and generate a glob expression
+ const glob = dynamicImportToGlob(node.source, code.substring(node.start, node.end));
+
+ if (!glob) {
+ // this was not a variable dynamic import
+ return;
+ }
+
+ // execute the glob
+ const result = out.sync(glob, { cwd: path__default.dirname(id) });
+ const paths = result.map((r) =>
+ r.startsWith('./') || r.startsWith('../') ? r : `./${r}`
+ );
+
+ // create magic string if it wasn't created already
+ ms = ms || new MagicString$1(code);
+ // unpack variable dynamic import into a function with import statements per file, rollup
+ // will turn these into chunks automatically
+ ms.prepend(
+ `function __variableDynamicImportRuntime${dynamicImportIndex}__(path) {
+ switch (path) {
+${paths.map((p) => ` case '${p}': return import('${p}');`).join('\n')}
+${` default: return new Promise(function(resolve, reject) {
+ (typeof queueMicrotask === 'function' ? queueMicrotask : setTimeout)(
+ reject.bind(null, new Error("Unknown variable dynamic import: " + path))
+ );
+ })\n`} }
+ }\n\n`
+ );
+ // call the runtime function instead of doing a dynamic import, the import specifier will
+ // be evaluated at runtime and the correct import will be returned by the injected function
+ ms.overwrite(
+ node.start,
+ node.start + 6,
+ `__variableDynamicImportRuntime${dynamicImportIndex}__`
+ );
+ } catch (error) {
+ if (error instanceof VariableDynamicImportError) {
+ // TODO: line number
+ if (warnOnError) {
+ this.warn(error);
+ } else {
+ this.error(error);
+ }
+ } else {
+ this.error(error);
+ }
+ }
+ }
+ });
+
+ if (ms && dynamicImportIndex !== -1) {
+ return {
+ code: ms.toString(),
+ map: ms.generateMap({
+ file: id,
+ includeContent: true,
+ hires: true
+ })
+ };
+ }
+ return null;
+ }
+ };
+}
+
+const comma = 44;
+const semicolon = 59;
+const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+const intToChar = new Uint8Array(65); // 65 possible chars.
+const charToInteger = new Uint8Array(123); // z is 122 in ASCII
+for (let i = 0; i < chars.length; i++) {
+ const c = chars.charCodeAt(i);
+ charToInteger[c] = i;
+ intToChar[i] = c;
+}
+// Provide a fallback for older environments.
+const td = typeof TextDecoder !== 'undefined'
+ ? new TextDecoder()
+ : typeof Buffer !== 'undefined'
+ ? {
+ decode(buf) {
+ const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);
+ return out.toString();
+ },
+ }
+ : {
+ decode(buf) {
+ let out = '';
+ for (let i = 0; i < buf.length; i++) {
+ out += String.fromCharCode(buf[i]);
+ }
+ return out;
+ },
+ };
+function decode(mappings) {
+ const state = new Int32Array(5);
+ const decoded = [];
+ let line = [];
+ let sorted = true;
+ let lastCol = 0;
+ for (let i = 0; i < mappings.length;) {
+ const c = mappings.charCodeAt(i);
+ if (c === comma) {
+ i++;
+ }
+ else if (c === semicolon) {
+ state[0] = lastCol = 0;
+ if (!sorted)
+ sort(line);
+ sorted = true;
+ decoded.push(line);
+ line = [];
+ i++;
+ }
+ else {
+ i = decodeInteger(mappings, i, state, 0); // generatedCodeColumn
+ const col = state[0];
+ if (col < lastCol)
+ sorted = false;
+ lastCol = col;
+ if (!hasMoreSegments(mappings, i)) {
+ line.push([col]);
+ continue;
+ }
+ i = decodeInteger(mappings, i, state, 1); // sourceFileIndex
+ i = decodeInteger(mappings, i, state, 2); // sourceCodeLine
+ i = decodeInteger(mappings, i, state, 3); // sourceCodeColumn
+ if (!hasMoreSegments(mappings, i)) {
+ line.push([col, state[1], state[2], state[3]]);
+ continue;
+ }
+ i = decodeInteger(mappings, i, state, 4); // nameIndex
+ line.push([col, state[1], state[2], state[3], state[4]]);
+ }
+ }
+ if (!sorted)
+ sort(line);
+ decoded.push(line);
+ return decoded;
+}
+function decodeInteger(mappings, pos, state, j) {
+ let value = 0;
+ let shift = 0;
+ let integer = 0;
+ do {
+ const c = mappings.charCodeAt(pos++);
+ integer = charToInteger[c];
+ value |= (integer & 31) << shift;
+ shift += 5;
+ } while (integer & 32);
+ const shouldNegate = value & 1;
+ value >>>= 1;
+ if (shouldNegate) {
+ value = value === 0 ? -0x80000000 : -value;
+ }
+ state[j] += value;
+ return pos;
+}
+function hasMoreSegments(mappings, i) {
+ if (i >= mappings.length)
+ return false;
+ const c = mappings.charCodeAt(i);
+ if (c === comma || c === semicolon)
+ return false;
+ return true;
+}
+function sort(line) {
+ line.sort(sortComparator$1);
+}
+function sortComparator$1(a, b) {
+ return a[0] - b[0];
+}
+function encode(decoded) {
+ const state = new Int32Array(5);
+ let buf = new Uint8Array(1000);
+ let pos = 0;
+ for (let i = 0; i < decoded.length; i++) {
+ const line = decoded[i];
+ if (i > 0) {
+ buf = reserve(buf, pos, 1);
+ buf[pos++] = semicolon;
+ }
+ if (line.length === 0)
+ continue;
+ state[0] = 0;
+ for (let j = 0; j < line.length; j++) {
+ const segment = line[j];
+ // We can push up to 5 ints, each int can take at most 7 chars, and we
+ // may push a comma.
+ buf = reserve(buf, pos, 36);
+ if (j > 0)
+ buf[pos++] = comma;
+ pos = encodeInteger(buf, pos, state, segment, 0); // generatedCodeColumn
+ if (segment.length === 1)
+ continue;
+ pos = encodeInteger(buf, pos, state, segment, 1); // sourceFileIndex
+ pos = encodeInteger(buf, pos, state, segment, 2); // sourceCodeLine
+ pos = encodeInteger(buf, pos, state, segment, 3); // sourceCodeColumn
+ if (segment.length === 4)
+ continue;
+ pos = encodeInteger(buf, pos, state, segment, 4); // nameIndex
+ }
+ }
+ return td.decode(buf.subarray(0, pos));
+}
+function reserve(buf, pos, count) {
+ if (buf.length > pos + count)
+ return buf;
+ const swap = new Uint8Array(buf.length * 2);
+ swap.set(buf);
+ return swap;
+}
+function encodeInteger(buf, pos, state, segment, j) {
+ const next = segment[j];
+ let num = next - state[j];
+ state[j] = next;
+ num = num < 0 ? (-num << 1) | 1 : num << 1;
+ do {
+ let clamped = num & 31;
+ num >>>= 5;
+ if (num > 0)
+ clamped |= 32;
+ buf[pos++] = intToChar[clamped];
+ } while (num > 0);
+ return pos;
+}
+
+// Matches the scheme of a URL, eg "http://"
+const schemeRegex = /^[\w+.-]+:\/\//;
+/**
+ * Matches the parts of a URL:
+ * 1. Scheme, including ":", guaranteed.
+ * 2. User/password, including "@", optional.
+ * 3. Host, guaranteed.
+ * 4. Port, including ":", optional.
+ * 5. Path, including "/", optional.
+ */
+const urlRegex = /^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?/;
+function isAbsoluteUrl(input) {
+ return schemeRegex.test(input);
+}
+function isSchemeRelativeUrl(input) {
+ return input.startsWith('//');
+}
+function isAbsolutePath(input) {
+ return input.startsWith('/');
+}
+function parseAbsoluteUrl(input) {
+ const match = urlRegex.exec(input);
+ return {
+ scheme: match[1],
+ user: match[2] || '',
+ host: match[3],
+ port: match[4] || '',
+ path: match[5] || '/',
+ relativePath: false,
+ };
+}
+function parseUrl$2(input) {
+ if (isSchemeRelativeUrl(input)) {
+ const url = parseAbsoluteUrl('http:' + input);
+ url.scheme = '';
+ return url;
+ }
+ if (isAbsolutePath(input)) {
+ const url = parseAbsoluteUrl('http://foo.com' + input);
+ url.scheme = '';
+ url.host = '';
+ return url;
+ }
+ if (!isAbsoluteUrl(input)) {
+ const url = parseAbsoluteUrl('http://foo.com/' + input);
+ url.scheme = '';
+ url.host = '';
+ url.relativePath = true;
+ return url;
+ }
+ return parseAbsoluteUrl(input);
+}
+function stripPathFilename(path) {
+ // If a path ends with a parent directory "..", then it's a relative path with excess parent
+ // paths. It's not a file, so we can't strip it.
+ if (path.endsWith('/..'))
+ return path;
+ const index = path.lastIndexOf('/');
+ return path.slice(0, index + 1);
+}
+function mergePaths(url, base) {
+ // If we're not a relative path, then we're an absolute path, and it doesn't matter what base is.
+ if (!url.relativePath)
+ return;
+ normalizePath$4(base);
+ // If the path is just a "/", then it was an empty path to begin with (remember, we're a relative
+ // path).
+ if (url.path === '/') {
+ url.path = base.path;
+ }
+ else {
+ // Resolution happens relative to the base path's directory, not the file.
+ url.path = stripPathFilename(base.path) + url.path;
+ }
+ // If the base path is absolute, then our path is now absolute too.
+ url.relativePath = base.relativePath;
+}
+/**
+ * The path can have empty directories "//", unneeded parents "foo/..", or current directory
+ * "foo/.". We need to normalize to a standard representation.
+ */
+function normalizePath$4(url) {
+ const { relativePath } = url;
+ const pieces = url.path.split('/');
+ // We need to preserve the first piece always, so that we output a leading slash. The item at
+ // pieces[0] is an empty string.
+ let pointer = 1;
+ // Positive is the number of real directories we've output, used for popping a parent directory.
+ // Eg, "foo/bar/.." will have a positive 2, and we can decrement to be left with just "foo".
+ let positive = 0;
+ // We need to keep a trailing slash if we encounter an empty directory (eg, splitting "foo/" will
+ // generate `["foo", ""]` pieces). And, if we pop a parent directory. But once we encounter a
+ // real directory, we won't need to append, unless the other conditions happen again.
+ let addTrailingSlash = false;
+ for (let i = 1; i < pieces.length; i++) {
+ const piece = pieces[i];
+ // An empty directory, could be a trailing slash, or just a double "//" in the path.
+ if (!piece) {
+ addTrailingSlash = true;
+ continue;
+ }
+ // If we encounter a real directory, then we don't need to append anymore.
+ addTrailingSlash = false;
+ // A current directory, which we can always drop.
+ if (piece === '.')
+ continue;
+ // A parent directory, we need to see if there are any real directories we can pop. Else, we
+ // have an excess of parents, and we'll need to keep the "..".
+ if (piece === '..') {
+ if (positive) {
+ addTrailingSlash = true;
+ positive--;
+ pointer--;
+ }
+ else if (relativePath) {
+ // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute
+ // URL, protocol relative URL, or an absolute path, we don't need to keep excess.
+ pieces[pointer++] = piece;
+ }
+ continue;
+ }
+ // We've encountered a real directory. Move it to the next insertion pointer, which accounts for
+ // any popped or dropped directories.
+ pieces[pointer++] = piece;
+ positive++;
+ }
+ let path = '';
+ for (let i = 1; i < pointer; i++) {
+ path += '/' + pieces[i];
+ }
+ if (!path || (addTrailingSlash && !path.endsWith('/..'))) {
+ path += '/';
+ }
+ url.path = path;
+}
+/**
+ * Attempts to resolve `input` URL/path relative to `base`.
+ */
+function resolve$3(input, base) {
+ if (!input && !base)
+ return '';
+ const url = parseUrl$2(input);
+ // If we have a base, and the input isn't already an absolute URL, then we need to merge.
+ if (base && !url.scheme) {
+ const baseUrl = parseUrl$2(base);
+ url.scheme = baseUrl.scheme;
+ // If there's no host, then we were just a path.
+ if (!url.host || baseUrl.scheme === 'file:') {
+ // The host, user, and port are joined, you can't copy one without the others.
+ url.user = baseUrl.user;
+ url.host = baseUrl.host;
+ url.port = baseUrl.port;
+ }
+ mergePaths(url, baseUrl);
+ }
+ normalizePath$4(url);
+ // If the input (and base, if there was one) are both relative, then we need to output a relative.
+ if (url.relativePath) {
+ // The first char is always a "/".
+ const path = url.path.slice(1);
+ if (!path)
+ return '.';
+ // If base started with a leading ".", or there is no base and input started with a ".", then we
+ // need to ensure that the relative path starts with a ".". We don't know if relative starts
+ // with a "..", though, so check before prepending.
+ const keepRelative = (base || input).startsWith('.');
+ return !keepRelative || path.startsWith('.') ? path : './' + path;
+ }
+ // If there's no host (and no scheme/user/port), then we need to output an absolute path.
+ if (!url.scheme && !url.host)
+ return url.path;
+ // We're outputting either an absolute URL, or a protocol relative one.
+ return `${url.scheme}//${url.user}${url.host}${url.port}${url.path}`;
+}
+
+function resolve$2(input, base) {
+ // The base is always treated as a directory, if it's not empty.
+ // https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327
+ // https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401
+ if (base && !base.endsWith('/'))
+ base += '/';
+ return resolve$3(input, base);
+}
+
+/**
+ * Removes everything after the last "/", but leaves the slash.
+ */
+function stripFilename(path) {
+ if (!path)
+ return '';
+ const index = path.lastIndexOf('/');
+ return path.slice(0, index + 1);
+}
+
+const COLUMN = 0;
+const SOURCES_INDEX = 1;
+const SOURCE_LINE = 2;
+const SOURCE_COLUMN = 3;
+const NAMES_INDEX = 4;
+
+function maybeSort(mappings, owned) {
+ const unsortedIndex = nextUnsortedSegmentLine(mappings, 0);
+ if (unsortedIndex === mappings.length)
+ return mappings;
+ // If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If
+ // not, we do not want to modify the consumer's input array.
+ if (!owned)
+ mappings = mappings.slice();
+ for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) {
+ mappings[i] = sortSegments(mappings[i], owned);
+ }
+ return mappings;
+}
+function nextUnsortedSegmentLine(mappings, start) {
+ for (let i = start; i < mappings.length; i++) {
+ if (!isSorted(mappings[i]))
+ return i;
+ }
+ return mappings.length;
+}
+function isSorted(line) {
+ for (let j = 1; j < line.length; j++) {
+ if (line[j][COLUMN] < line[j - 1][COLUMN]) {
+ return false;
+ }
+ }
+ return true;
+}
+function sortSegments(line, owned) {
+ if (!owned)
+ line = line.slice();
+ return line.sort(sortComparator);
+}
+function sortComparator(a, b) {
+ return a[COLUMN] - b[COLUMN];
+}
+
+let found = false;
+/**
+ * A binary search implementation that returns the index if a match is found.
+ * If no match is found, then the left-index (the index associated with the item that comes just
+ * before the desired index) is returned. To maintain proper sort order, a splice would happen at
+ * the next index:
+ *
+ * ```js
+ * const array = [1, 3];
+ * const needle = 2;
+ * const index = binarySearch(array, needle, (item, needle) => item - needle);
+ *
+ * assert.equal(index, 0);
+ * array.splice(index + 1, 0, needle);
+ * assert.deepEqual(array, [1, 2, 3]);
+ * ```
+ */
+function binarySearch(haystack, needle, low, high) {
+ while (low <= high) {
+ const mid = low + ((high - low) >> 1);
+ const cmp = haystack[mid][COLUMN] - needle;
+ if (cmp === 0) {
+ found = true;
+ return mid;
+ }
+ if (cmp < 0) {
+ low = mid + 1;
+ }
+ else {
+ high = mid - 1;
+ }
+ }
+ found = false;
+ return low - 1;
+}
+function upperBound(haystack, needle, index) {
+ for (let i = index + 1; i < haystack.length; i++, index++) {
+ if (haystack[i][COLUMN] !== needle)
+ break;
+ }
+ return index;
+}
+function lowerBound(haystack, needle, index) {
+ for (let i = index - 1; i >= 0; i--, index--) {
+ if (haystack[i][COLUMN] !== needle)
+ break;
+ }
+ return index;
+}
+function memoizedState() {
+ return {
+ lastKey: -1,
+ lastNeedle: -1,
+ lastIndex: -1,
+ };
+}
+/**
+ * This overly complicated beast is just to record the last tested line/column and the resulting
+ * index, allowing us to skip a few tests if mappings are monotonically increasing.
+ */
+function memoizedBinarySearch(haystack, needle, state, key) {
+ const { lastKey, lastNeedle, lastIndex } = state;
+ let low = 0;
+ let high = haystack.length - 1;
+ if (key === lastKey) {
+ if (needle === lastNeedle) {
+ found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle;
+ return lastIndex;
+ }
+ if (needle >= lastNeedle) {
+ // lastIndex may be -1 if the previous needle was not found.
+ low = lastIndex === -1 ? 0 : lastIndex;
+ }
+ else {
+ high = lastIndex;
+ }
+ }
+ state.lastKey = key;
+ state.lastNeedle = needle;
+ return (state.lastIndex = binarySearch(haystack, needle, low, high));
+}
+
+const INVALID_ORIGINAL_MAPPING = Object.freeze({
+ source: null,
+ line: null,
+ column: null,
+ name: null,
+});
+Object.freeze({
+ line: null,
+ column: null,
+});
+const LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)';
+const COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)';
+const LEAST_UPPER_BOUND = -1;
+const GREATEST_LOWER_BOUND = 1;
+/**
+ * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.
+ */
+let decodedMappings;
+/**
+ * A low-level API to find the segment associated with a generated line/column (think, from a
+ * stack trace). Line and column here are 0-based, unlike `originalPositionFor`.
+ */
+let traceSegment;
+/**
+ * A higher-level API to find the source/line/column associated with a generated line/column
+ * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in
+ * `source-map` library.
+ */
+let originalPositionFor$1;
+class TraceMap {
+ constructor(map, mapUrl) {
+ this._decodedMemo = memoizedState();
+ this._bySources = undefined;
+ this._bySourceMemos = undefined;
+ const isString = typeof map === 'string';
+ if (!isString && map.constructor === TraceMap)
+ return map;
+ const parsed = (isString ? JSON.parse(map) : map);
+ const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;
+ this.version = version;
+ this.file = file;
+ this.names = names;
+ this.sourceRoot = sourceRoot;
+ this.sources = sources;
+ this.sourcesContent = sourcesContent;
+ if (sourceRoot || mapUrl) {
+ const from = resolve$2(sourceRoot || '', stripFilename(mapUrl));
+ this.resolvedSources = sources.map((s) => resolve$2(s || '', from));
+ }
+ else {
+ this.resolvedSources = sources.map((s) => s || '');
+ }
+ const { mappings } = parsed;
+ if (typeof mappings === 'string') {
+ this._encoded = mappings;
+ this._decoded = undefined;
+ }
+ else {
+ this._encoded = undefined;
+ this._decoded = maybeSort(mappings, isString);
+ }
+ }
+}
+(() => {
+ decodedMappings = (map) => {
+ return (map._decoded || (map._decoded = decode(map._encoded)));
+ };
+ traceSegment = (map, line, column) => {
+ const decoded = decodedMappings(map);
+ // It's common for parent source maps to have pointers to lines that have no
+ // mapping (like a "//# sourceMappingURL=") at the end of the child file.
+ if (line >= decoded.length)
+ return null;
+ return traceSegmentInternal(decoded[line], map._decodedMemo, line, column, GREATEST_LOWER_BOUND);
+ };
+ originalPositionFor$1 = (map, { line, column, bias }) => {
+ line--;
+ if (line < 0)
+ throw new Error(LINE_GTR_ZERO);
+ if (column < 0)
+ throw new Error(COL_GTR_EQ_ZERO);
+ const decoded = decodedMappings(map);
+ // It's common for parent source maps to have pointers to lines that have no
+ // mapping (like a "//# sourceMappingURL=") at the end of the child file.
+ if (line >= decoded.length)
+ return INVALID_ORIGINAL_MAPPING;
+ const segment = traceSegmentInternal(decoded[line], map._decodedMemo, line, column, bias || GREATEST_LOWER_BOUND);
+ if (segment == null)
+ return INVALID_ORIGINAL_MAPPING;
+ if (segment.length == 1)
+ return INVALID_ORIGINAL_MAPPING;
+ const { names, resolvedSources } = map;
+ return {
+ source: resolvedSources[segment[SOURCES_INDEX]],
+ line: segment[SOURCE_LINE] + 1,
+ column: segment[SOURCE_COLUMN],
+ name: segment.length === 5 ? names[segment[NAMES_INDEX]] : null,
+ };
+ };
+})();
+function traceSegmentInternal(segments, memo, line, column, bias) {
+ let index = memoizedBinarySearch(segments, column, memo, line);
+ if (found) {
+ index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index);
+ }
+ else if (bias === LEAST_UPPER_BOUND)
+ index++;
+ if (index === -1 || index === segments.length)
+ return null;
+ return segments[index];
+}
+
+/**
+ * Gets the index associated with `key` in the backing array, if it is already present.
+ */
+let get;
+/**
+ * Puts `key` into the backing array, if it is not already present. Returns
+ * the index of the `key` in the backing array.
+ */
+let put;
+/**
+ * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the
+ * index of the `key` in the backing array.
+ *
+ * This is designed to allow synchronizing a second array with the contents of the backing array,
+ * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,
+ * and there are never duplicates.
+ */
+class SetArray {
+ constructor() {
+ this._indexes = { __proto__: null };
+ this.array = [];
+ }
+}
+(() => {
+ get = (strarr, key) => strarr._indexes[key];
+ put = (strarr, key) => {
+ // The key may or may not be present. If it is present, it's a number.
+ const index = get(strarr, key);
+ if (index !== undefined)
+ return index;
+ const { array, _indexes: indexes } = strarr;
+ return (indexes[key] = array.push(key) - 1);
+ };
+})();
+
+/**
+ * A low-level API to associate a generated position with an original source position. Line and
+ * column here are 0-based, unlike `addMapping`.
+ */
+let addSegment;
+/**
+ * Adds/removes the content of the source file to the source map.
+ */
+let setSourceContent;
+/**
+ * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects
+ * a sourcemap, or to JSON.stringify.
+ */
+let decodedMap;
+/**
+ * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects
+ * a sourcemap, or to JSON.stringify.
+ */
+let encodedMap;
+/**
+ * Provides the state to generate a sourcemap.
+ */
+class GenMapping {
+ constructor({ file, sourceRoot } = {}) {
+ this._names = new SetArray();
+ this._sources = new SetArray();
+ this._sourcesContent = [];
+ this._mappings = [];
+ this.file = file;
+ this.sourceRoot = sourceRoot;
+ }
+}
+(() => {
+ addSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name) => {
+ const { _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
+ const line = getLine$1(mappings, genLine);
+ if (source == null) {
+ const seg = [genColumn];
+ const index = getColumnIndex(line, genColumn, seg);
+ return insert(line, index, seg);
+ }
+ const sourcesIndex = put(sources, source);
+ const seg = name
+ ? [genColumn, sourcesIndex, sourceLine, sourceColumn, put(names, name)]
+ : [genColumn, sourcesIndex, sourceLine, sourceColumn];
+ const index = getColumnIndex(line, genColumn, seg);
+ if (sourcesIndex === sourcesContent.length)
+ sourcesContent[sourcesIndex] = null;
+ insert(line, index, seg);
+ };
+ setSourceContent = (map, source, content) => {
+ const { _sources: sources, _sourcesContent: sourcesContent } = map;
+ sourcesContent[put(sources, source)] = content;
+ };
+ decodedMap = (map) => {
+ const { file, sourceRoot, _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
+ return {
+ version: 3,
+ file,
+ names: names.array,
+ sourceRoot: sourceRoot || undefined,
+ sources: sources.array,
+ sourcesContent,
+ mappings,
+ };
+ };
+ encodedMap = (map) => {
+ const decoded = decodedMap(map);
+ return Object.assign(Object.assign({}, decoded), { mappings: encode(decoded.mappings) });
+ };
+})();
+function getLine$1(mappings, index) {
+ for (let i = mappings.length; i <= index; i++) {
+ mappings[i] = [];
+ }
+ return mappings[index];
+}
+function getColumnIndex(line, column, seg) {
+ let index = line.length;
+ for (let i = index - 1; i >= 0; i--, index--) {
+ const current = line[i];
+ const col = current[0];
+ if (col > column)
+ continue;
+ if (col < column)
+ break;
+ const cmp = compare(current, seg);
+ if (cmp === 0)
+ return index;
+ if (cmp < 0)
+ break;
+ }
+ return index;
+}
+function compare(a, b) {
+ let cmp = compareNum(a.length, b.length);
+ if (cmp !== 0)
+ return cmp;
+ // We've already checked genColumn
+ if (a.length === 1)
+ return 0;
+ cmp = compareNum(a[1], b[1]);
+ if (cmp !== 0)
+ return cmp;
+ cmp = compareNum(a[2], b[2]);
+ if (cmp !== 0)
+ return cmp;
+ cmp = compareNum(a[3], b[3]);
+ if (cmp !== 0)
+ return cmp;
+ if (a.length === 4)
+ return 0;
+ return compareNum(a[4], b[4]);
+}
+function compareNum(a, b) {
+ return a - b;
+}
+function insert(array, index, value) {
+ if (index === -1)
+ return;
+ for (let i = array.length; i > index; i--) {
+ array[i] = array[i - 1];
+ }
+ array[index] = value;
+}
+
+const SOURCELESS_MAPPING = {
+ source: null,
+ column: null,
+ line: null,
+ name: null,
+ content: null,
+};
+const EMPTY_SOURCES = [];
+function Source(map, sources, source, content) {
+ return {
+ map,
+ sources,
+ source,
+ content,
+ };
+}
+/**
+ * MapSource represents a single sourcemap, with the ability to trace mappings into its child nodes
+ * (which may themselves be SourceMapTrees).
+ */
+function MapSource(map, sources) {
+ return Source(map, sources, '', null);
+}
+/**
+ * A "leaf" node in the sourcemap tree, representing an original, unmodified source file. Recursive
+ * segment tracing ends at the `OriginalSource`.
+ */
+function OriginalSource(source, content) {
+ return Source(null, EMPTY_SOURCES, source, content);
+}
+/**
+ * traceMappings is only called on the root level SourceMapTree, and begins the process of
+ * resolving each mapping in terms of the original source files.
+ */
+function traceMappings(tree) {
+ const gen = new GenMapping({ file: tree.map.file });
+ const { sources: rootSources, map } = tree;
+ const rootNames = map.names;
+ const rootMappings = decodedMappings(map);
+ for (let i = 0; i < rootMappings.length; i++) {
+ const segments = rootMappings[i];
+ let lastSource = null;
+ let lastSourceLine = null;
+ let lastSourceColumn = null;
+ for (let j = 0; j < segments.length; j++) {
+ const segment = segments[j];
+ const genCol = segment[0];
+ let traced = SOURCELESS_MAPPING;
+ // 1-length segments only move the current generated column, there's no source information
+ // to gather from it.
+ if (segment.length !== 1) {
+ const source = rootSources[segment[1]];
+ traced = originalPositionFor(source, segment[2], segment[3], segment.length === 5 ? rootNames[segment[4]] : '');
+ // If the trace is invalid, then the trace ran into a sourcemap that doesn't contain a
+ // respective segment into an original source.
+ if (traced == null)
+ continue;
+ }
+ // So we traced a segment down into its original source file. Now push a
+ // new segment pointing to this location.
+ const { column, line, name, content, source } = traced;
+ if (line === lastSourceLine && column === lastSourceColumn && source === lastSource) {
+ continue;
+ }
+ lastSourceLine = line;
+ lastSourceColumn = column;
+ lastSource = source;
+ // Sigh, TypeScript can't figure out source/line/column are either all null, or all non-null...
+ addSegment(gen, i, genCol, source, line, column, name);
+ if (content != null)
+ setSourceContent(gen, source, content);
+ }
+ }
+ return gen;
+}
+/**
+ * originalPositionFor is only called on children SourceMapTrees. It recurses down into its own
+ * child SourceMapTrees, until we find the original source map.
+ */
+function originalPositionFor(source, line, column, name) {
+ if (!source.map) {
+ return { column, line, name, source: source.source, content: source.content };
+ }
+ const segment = traceSegment(source.map, line, column);
+ // If we couldn't find a segment, then this doesn't exist in the sourcemap.
+ if (segment == null)
+ return null;
+ // 1-length segments only move the current generated column, there's no source information
+ // to gather from it.
+ if (segment.length === 1)
+ return SOURCELESS_MAPPING;
+ return originalPositionFor(source.sources[segment[1]], segment[2], segment[3], segment.length === 5 ? source.map.names[segment[4]] : name);
+}
+
+function asArray(value) {
+ if (Array.isArray(value))
+ return value;
+ return [value];
+}
+/**
+ * Recursively builds a tree structure out of sourcemap files, with each node
+ * being either an `OriginalSource` "leaf" or a `SourceMapTree` composed of
+ * `OriginalSource`s and `SourceMapTree`s.
+ *
+ * Every sourcemap is composed of a collection of source files and mappings
+ * into locations of those source files. When we generate a `SourceMapTree` for
+ * the sourcemap, we attempt to load each source file's own sourcemap. If it
+ * does not have an associated sourcemap, it is considered an original,
+ * unmodified source file.
+ */
+function buildSourceMapTree(input, loader) {
+ const maps = asArray(input).map((m) => new TraceMap(m, ''));
+ const map = maps.pop();
+ for (let i = 0; i < maps.length; i++) {
+ if (maps[i].sources.length > 1) {
+ throw new Error(`Transformation map ${i} must have exactly one source file.\n` +
+ 'Did you specify these with the most recent transformation maps first?');
+ }
+ }
+ let tree = build$2(map, loader, '', 0);
+ for (let i = maps.length - 1; i >= 0; i--) {
+ tree = MapSource(maps[i], [tree]);
+ }
+ return tree;
+}
+function build$2(map, loader, importer, importerDepth) {
+ const { resolvedSources, sourcesContent } = map;
+ const depth = importerDepth + 1;
+ const children = resolvedSources.map((sourceFile, i) => {
+ // The loading context gives the loader more information about why this file is being loaded
+ // (eg, from which importer). It also allows the loader to override the location of the loaded
+ // sourcemap/original source, or to override the content in the sourcesContent field if it's
+ // an unmodified source file.
+ const ctx = {
+ importer,
+ depth,
+ source: sourceFile || '',
+ content: undefined,
+ };
+ // Use the provided loader callback to retrieve the file's sourcemap.
+ // TODO: We should eventually support async loading of sourcemap files.
+ const sourceMap = loader(ctx.source, ctx);
+ const { source, content } = ctx;
+ // If there is a sourcemap, then we need to recurse into it to load its source files.
+ if (sourceMap)
+ return build$2(new TraceMap(sourceMap, source), loader, source, depth);
+ // Else, it's an an unmodified source file.
+ // The contents of this unmodified source file can be overridden via the loader context,
+ // allowing it to be explicitly null or a string. If it remains undefined, we fall back to
+ // the importing sourcemap's `sourcesContent` field.
+ const sourceContent = content !== undefined ? content : sourcesContent ? sourcesContent[i] : null;
+ return OriginalSource(source, sourceContent);
+ });
+ return MapSource(map, children);
+}
+
+/**
+ * A SourceMap v3 compatible sourcemap, which only includes fields that were
+ * provided to it.
+ */
+class SourceMap$1 {
+ constructor(map, options) {
+ const out = options.decodedMappings ? decodedMap(map) : encodedMap(map);
+ this.version = out.version; // SourceMap spec says this should be first.
+ this.file = out.file;
+ this.mappings = out.mappings;
+ this.names = out.names;
+ this.sourceRoot = out.sourceRoot;
+ this.sources = out.sources;
+ if (!options.excludeContent) {
+ this.sourcesContent = out.sourcesContent;
+ }
+ }
+ toString() {
+ return JSON.stringify(this);
+ }
+}
+
+/**
+ * Traces through all the mappings in the root sourcemap, through the sources
+ * (and their sourcemaps), all the way back to the original source location.
+ *
+ * `loader` will be called every time we encounter a source file. If it returns
+ * a sourcemap, we will recurse into that sourcemap to continue the trace. If
+ * it returns a falsey value, that source file is treated as an original,
+ * unmodified source file.
+ *
+ * Pass `excludeContent` to exclude any self-containing source file content
+ * from the output sourcemap.
+ *
+ * Pass `decodedMappings` to receive a SourceMap with decoded (instead of
+ * VLQ encoded) mappings.
+ */
+function remapping(input, loader, options) {
+ const opts = typeof options === 'object' ? options : { excludeContent: !!options, decodedMappings: false };
+ const tree = buildSourceMapTree(input, loader);
+ return new SourceMap$1(traceMappings(tree), opts);
+}
+
+var src$2 = {exports: {}};
+
+var browser$1 = {exports: {}};
+
+/**
+ * Helpers.
+ */
+
+var s$1 = 1000;
+var m$1 = s$1 * 60;
+var h$1 = m$1 * 60;
+var d$1 = h$1 * 24;
+var w = d$1 * 7;
+var y$1 = d$1 * 365.25;
+
+/**
+ * Parse or format the given `val`.
+ *
+ * Options:
+ *
+ * - `long` verbose formatting [false]
+ *
+ * @param {String|Number} val
+ * @param {Object} [options]
+ * @throws {Error} throw an error if val is not a non-empty string or a number
+ * @return {String|Number}
+ * @api public
+ */
+
+var ms$1 = function(val, options) {
+ options = options || {};
+ var type = typeof val;
+ if (type === 'string' && val.length > 0) {
+ return parse$g(val);
+ } else if (type === 'number' && isFinite(val)) {
+ return options.long ? fmtLong$1(val) : fmtShort$1(val);
+ }
+ throw new Error(
+ 'val is not a non-empty string or a valid number. val=' +
+ JSON.stringify(val)
+ );
+};
+
+/**
+ * Parse the given `str` and return milliseconds.
+ *
+ * @param {String} str
+ * @return {Number}
+ * @api private
+ */
+
+function parse$g(str) {
+ str = String(str);
+ if (str.length > 100) {
+ return;
+ }
+ var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
+ str
+ );
+ if (!match) {
+ return;
+ }
+ var n = parseFloat(match[1]);
+ var type = (match[2] || 'ms').toLowerCase();
+ switch (type) {
+ case 'years':
+ case 'year':
+ case 'yrs':
+ case 'yr':
+ case 'y':
+ return n * y$1;
+ case 'weeks':
+ case 'week':
+ case 'w':
+ return n * w;
+ case 'days':
+ case 'day':
+ case 'd':
+ return n * d$1;
+ case 'hours':
+ case 'hour':
+ case 'hrs':
+ case 'hr':
+ case 'h':
+ return n * h$1;
+ case 'minutes':
+ case 'minute':
+ case 'mins':
+ case 'min':
+ case 'm':
+ return n * m$1;
+ case 'seconds':
+ case 'second':
+ case 'secs':
+ case 'sec':
+ case 's':
+ return n * s$1;
+ case 'milliseconds':
+ case 'millisecond':
+ case 'msecs':
+ case 'msec':
+ case 'ms':
+ return n;
+ default:
+ return undefined;
+ }
+}
+
+/**
+ * Short format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+function fmtShort$1(ms) {
+ var msAbs = Math.abs(ms);
+ if (msAbs >= d$1) {
+ return Math.round(ms / d$1) + 'd';
+ }
+ if (msAbs >= h$1) {
+ return Math.round(ms / h$1) + 'h';
+ }
+ if (msAbs >= m$1) {
+ return Math.round(ms / m$1) + 'm';
+ }
+ if (msAbs >= s$1) {
+ return Math.round(ms / s$1) + 's';
+ }
+ return ms + 'ms';
+}
+
+/**
+ * Long format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+function fmtLong$1(ms) {
+ var msAbs = Math.abs(ms);
+ if (msAbs >= d$1) {
+ return plural$1(ms, msAbs, d$1, 'day');
+ }
+ if (msAbs >= h$1) {
+ return plural$1(ms, msAbs, h$1, 'hour');
+ }
+ if (msAbs >= m$1) {
+ return plural$1(ms, msAbs, m$1, 'minute');
+ }
+ if (msAbs >= s$1) {
+ return plural$1(ms, msAbs, s$1, 'second');
+ }
+ return ms + ' ms';
+}
+
+/**
+ * Pluralization helper.
+ */
+
+function plural$1(ms, msAbs, n, name) {
+ var isPlural = msAbs >= n * 1.5;
+ return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
+}
+
+/**
+ * This is the common logic for both the Node.js and web browser
+ * implementations of `debug()`.
+ */
+
+function setup(env) {
+ createDebug.debug = createDebug;
+ createDebug.default = createDebug;
+ createDebug.coerce = coerce;
+ createDebug.disable = disable;
+ createDebug.enable = enable;
+ createDebug.enabled = enabled;
+ createDebug.humanize = ms$1;
+ createDebug.destroy = destroy;
+
+ Object.keys(env).forEach(key => {
+ createDebug[key] = env[key];
+ });
+
+ /**
+ * The currently active debug mode names, and names to skip.
+ */
+
+ createDebug.names = [];
+ createDebug.skips = [];
+
+ /**
+ * Map of special "%n" handling functions, for the debug "format" argument.
+ *
+ * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
+ */
+ createDebug.formatters = {};
+
+ /**
+ * Selects a color for a debug namespace
+ * @param {String} namespace The namespace string for the debug instance to be colored
+ * @return {Number|String} An ANSI color code for the given namespace
+ * @api private
+ */
+ function selectColor(namespace) {
+ let hash = 0;
+
+ for (let i = 0; i < namespace.length; i++) {
+ hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
+ hash |= 0; // Convert to 32bit integer
+ }
+
+ return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
+ }
+ createDebug.selectColor = selectColor;
+
+ /**
+ * Create a debugger with the given `namespace`.
+ *
+ * @param {String} namespace
+ * @return {Function}
+ * @api public
+ */
+ function createDebug(namespace) {
+ let prevTime;
+ let enableOverride = null;
+ let namespacesCache;
+ let enabledCache;
+
+ function debug(...args) {
+ // Disabled?
+ if (!debug.enabled) {
+ return;
+ }
+
+ const self = debug;
+
+ // Set `diff` timestamp
+ const curr = Number(new Date());
+ const ms = curr - (prevTime || curr);
+ self.diff = ms;
+ self.prev = prevTime;
+ self.curr = curr;
+ prevTime = curr;
+
+ args[0] = createDebug.coerce(args[0]);
+
+ if (typeof args[0] !== 'string') {
+ // Anything else let's inspect with %O
+ args.unshift('%O');
+ }
+
+ // Apply any `formatters` transformations
+ let index = 0;
+ args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
+ // If we encounter an escaped % then don't increase the array index
+ if (match === '%%') {
+ return '%';
+ }
+ index++;
+ const formatter = createDebug.formatters[format];
+ if (typeof formatter === 'function') {
+ const val = args[index];
+ match = formatter.call(self, val);
+
+ // Now we need to remove `args[index]` since it's inlined in the `format`
+ args.splice(index, 1);
+ index--;
+ }
+ return match;
+ });
+
+ // Apply env-specific formatting (colors, etc.)
+ createDebug.formatArgs.call(self, args);
+
+ const logFn = self.log || createDebug.log;
+ logFn.apply(self, args);
+ }
+
+ debug.namespace = namespace;
+ debug.useColors = createDebug.useColors();
+ debug.color = createDebug.selectColor(namespace);
+ debug.extend = extend;
+ debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.
+
+ Object.defineProperty(debug, 'enabled', {
+ enumerable: true,
+ configurable: false,
+ get: () => {
+ if (enableOverride !== null) {
+ return enableOverride;
+ }
+ if (namespacesCache !== createDebug.namespaces) {
+ namespacesCache = createDebug.namespaces;
+ enabledCache = createDebug.enabled(namespace);
+ }
+
+ return enabledCache;
+ },
+ set: v => {
+ enableOverride = v;
+ }
+ });
+
+ // Env-specific initialization logic for debug instances
+ if (typeof createDebug.init === 'function') {
+ createDebug.init(debug);
+ }
+
+ return debug;
+ }
+
+ function extend(namespace, delimiter) {
+ const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
+ newDebug.log = this.log;
+ return newDebug;
+ }
+
+ /**
+ * Enables a debug mode by namespaces. This can include modes
+ * separated by a colon and wildcards.
+ *
+ * @param {String} namespaces
+ * @api public
+ */
+ function enable(namespaces) {
+ createDebug.save(namespaces);
+ createDebug.namespaces = namespaces;
+
+ createDebug.names = [];
+ createDebug.skips = [];
+
+ let i;
+ const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
+ const len = split.length;
+
+ for (i = 0; i < len; i++) {
+ if (!split[i]) {
+ // ignore empty strings
+ continue;
+ }
+
+ namespaces = split[i].replace(/\*/g, '.*?');
+
+ if (namespaces[0] === '-') {
+ createDebug.skips.push(new RegExp('^' + namespaces.slice(1) + '$'));
+ } else {
+ createDebug.names.push(new RegExp('^' + namespaces + '$'));
+ }
+ }
+ }
+
+ /**
+ * Disable debug output.
+ *
+ * @return {String} namespaces
+ * @api public
+ */
+ function disable() {
+ const namespaces = [
+ ...createDebug.names.map(toNamespace),
+ ...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)
+ ].join(',');
+ createDebug.enable('');
+ return namespaces;
+ }
+
+ /**
+ * Returns true if the given mode name is enabled, false otherwise.
+ *
+ * @param {String} name
+ * @return {Boolean}
+ * @api public
+ */
+ function enabled(name) {
+ if (name[name.length - 1] === '*') {
+ return true;
+ }
+
+ let i;
+ let len;
+
+ for (i = 0, len = createDebug.skips.length; i < len; i++) {
+ if (createDebug.skips[i].test(name)) {
+ return false;
+ }
+ }
+
+ for (i = 0, len = createDebug.names.length; i < len; i++) {
+ if (createDebug.names[i].test(name)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Convert regexp to namespace
+ *
+ * @param {RegExp} regxep
+ * @return {String} namespace
+ * @api private
+ */
+ function toNamespace(regexp) {
+ return regexp.toString()
+ .substring(2, regexp.toString().length - 2)
+ .replace(/\.\*\?$/, '*');
+ }
+
+ /**
+ * Coerce `val`.
+ *
+ * @param {Mixed} val
+ * @return {Mixed}
+ * @api private
+ */
+ function coerce(val) {
+ if (val instanceof Error) {
+ return val.stack || val.message;
+ }
+ return val;
+ }
+
+ /**
+ * XXX DO NOT USE. This is a temporary stub function.
+ * XXX It WILL be removed in the next major release.
+ */
+ function destroy() {
+ console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
+ }
+
+ createDebug.enable(createDebug.load());
+
+ return createDebug;
+}
+
+var common$4 = setup;
+
+/* eslint-env browser */
+
+(function (module, exports) {
+/**
+ * This is the web browser implementation of `debug()`.
+ */
+
+exports.formatArgs = formatArgs;
+exports.save = save;
+exports.load = load;
+exports.useColors = useColors;
+exports.storage = localstorage();
+exports.destroy = (() => {
+ let warned = false;
+
+ return () => {
+ if (!warned) {
+ warned = true;
+ console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
+ }
+ };
+})();
+
+/**
+ * Colors.
+ */
+
+exports.colors = [
+ '#0000CC',
+ '#0000FF',
+ '#0033CC',
+ '#0033FF',
+ '#0066CC',
+ '#0066FF',
+ '#0099CC',
+ '#0099FF',
+ '#00CC00',
+ '#00CC33',
+ '#00CC66',
+ '#00CC99',
+ '#00CCCC',
+ '#00CCFF',
+ '#3300CC',
+ '#3300FF',
+ '#3333CC',
+ '#3333FF',
+ '#3366CC',
+ '#3366FF',
+ '#3399CC',
+ '#3399FF',
+ '#33CC00',
+ '#33CC33',
+ '#33CC66',
+ '#33CC99',
+ '#33CCCC',
+ '#33CCFF',
+ '#6600CC',
+ '#6600FF',
+ '#6633CC',
+ '#6633FF',
+ '#66CC00',
+ '#66CC33',
+ '#9900CC',
+ '#9900FF',
+ '#9933CC',
+ '#9933FF',
+ '#99CC00',
+ '#99CC33',
+ '#CC0000',
+ '#CC0033',
+ '#CC0066',
+ '#CC0099',
+ '#CC00CC',
+ '#CC00FF',
+ '#CC3300',
+ '#CC3333',
+ '#CC3366',
+ '#CC3399',
+ '#CC33CC',
+ '#CC33FF',
+ '#CC6600',
+ '#CC6633',
+ '#CC9900',
+ '#CC9933',
+ '#CCCC00',
+ '#CCCC33',
+ '#FF0000',
+ '#FF0033',
+ '#FF0066',
+ '#FF0099',
+ '#FF00CC',
+ '#FF00FF',
+ '#FF3300',
+ '#FF3333',
+ '#FF3366',
+ '#FF3399',
+ '#FF33CC',
+ '#FF33FF',
+ '#FF6600',
+ '#FF6633',
+ '#FF9900',
+ '#FF9933',
+ '#FFCC00',
+ '#FFCC33'
+];
+
+/**
+ * Currently only WebKit-based Web Inspectors, Firefox >= v31,
+ * and the Firebug extension (any Firefox version) are known
+ * to support "%c" CSS customizations.
+ *
+ * TODO: add a `localStorage` variable to explicitly enable/disable colors
+ */
+
+// eslint-disable-next-line complexity
+function useColors() {
+ // NB: In an Electron preload script, document will be defined but not fully
+ // initialized. Since we know we're in Chrome, we'll just detect this case
+ // explicitly
+ if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
+ return true;
+ }
+
+ // Internet Explorer and Edge do not support colors.
+ if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
+ return false;
+ }
+
+ // Is webkit? http://stackoverflow.com/a/16459606/376773
+ // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
+ return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
+ // Is firebug? http://stackoverflow.com/a/398120/376773
+ (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
+ // Is firefox >= v31?
+ // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
+ (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
+ // Double check webkit in userAgent just in case we are in a worker
+ (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
+}
+
+/**
+ * Colorize log arguments if enabled.
+ *
+ * @api public
+ */
+
+function formatArgs(args) {
+ args[0] = (this.useColors ? '%c' : '') +
+ this.namespace +
+ (this.useColors ? ' %c' : ' ') +
+ args[0] +
+ (this.useColors ? '%c ' : ' ') +
+ '+' + module.exports.humanize(this.diff);
+
+ if (!this.useColors) {
+ return;
+ }
+
+ const c = 'color: ' + this.color;
+ args.splice(1, 0, c, 'color: inherit');
+
+ // The final "%c" is somewhat tricky, because there could be other
+ // arguments passed either before or after the %c, so we need to
+ // figure out the correct index to insert the CSS into
+ let index = 0;
+ let lastC = 0;
+ args[0].replace(/%[a-zA-Z%]/g, match => {
+ if (match === '%%') {
+ return;
+ }
+ index++;
+ if (match === '%c') {
+ // We only are interested in the *last* %c
+ // (the user may have provided their own)
+ lastC = index;
+ }
+ });
+
+ args.splice(lastC, 0, c);
+}
+
+/**
+ * Invokes `console.debug()` when available.
+ * No-op when `console.debug` is not a "function".
+ * If `console.debug` is not available, falls back
+ * to `console.log`.
+ *
+ * @api public
+ */
+exports.log = console.debug || console.log || (() => {});
+
+/**
+ * Save `namespaces`.
+ *
+ * @param {String} namespaces
+ * @api private
+ */
+function save(namespaces) {
+ try {
+ if (namespaces) {
+ exports.storage.setItem('debug', namespaces);
+ } else {
+ exports.storage.removeItem('debug');
+ }
+ } catch (error) {
+ // Swallow
+ // XXX (@Qix-) should we be logging these?
+ }
+}
+
+/**
+ * Load `namespaces`.
+ *
+ * @return {String} returns the previously persisted debug modes
+ * @api private
+ */
+function load() {
+ let r;
+ try {
+ r = exports.storage.getItem('debug');
+ } catch (error) {
+ // Swallow
+ // XXX (@Qix-) should we be logging these?
+ }
+
+ // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
+ if (!r && typeof process !== 'undefined' && 'env' in process) {
+ r = process.env.DEBUG;
+ }
+
+ return r;
+}
+
+/**
+ * Localstorage attempts to return the localstorage.
+ *
+ * This is necessary because safari throws
+ * when a user disables cookies/localstorage
+ * and you attempt to access it.
+ *
+ * @return {LocalStorage}
+ * @api private
+ */
+
+function localstorage() {
+ try {
+ // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
+ // The Browser also has localStorage in the global context.
+ return localStorage;
+ } catch (error) {
+ // Swallow
+ // XXX (@Qix-) should we be logging these?
+ }
+}
+
+module.exports = common$4(exports);
+
+const {formatters} = module.exports;
+
+/**
+ * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
+ */
+
+formatters.j = function (v) {
+ try {
+ return JSON.stringify(v);
+ } catch (error) {
+ return '[UnexpectedJSONParseError]: ' + error.message;
+ }
+};
+}(browser$1, browser$1.exports));
+
+var node$1 = {exports: {}};
+
+/**
+ * Module dependencies.
+ */
+
+(function (module, exports) {
+const tty = require$$0__default;
+const util = require$$0__default$2;
+
+/**
+ * This is the Node.js implementation of `debug()`.
+ */
+
+exports.init = init;
+exports.log = log;
+exports.formatArgs = formatArgs;
+exports.save = save;
+exports.load = load;
+exports.useColors = useColors;
+exports.destroy = util.deprecate(
+ () => {},
+ 'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'
+);
+
+/**
+ * Colors.
+ */
+
+exports.colors = [6, 2, 3, 4, 5, 1];
+
+try {
+ // Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
+ // eslint-disable-next-line import/no-extraneous-dependencies
+ const supportsColor = require('supports-color');
+
+ if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
+ exports.colors = [
+ 20,
+ 21,
+ 26,
+ 27,
+ 32,
+ 33,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 56,
+ 57,
+ 62,
+ 63,
+ 68,
+ 69,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 92,
+ 93,
+ 98,
+ 99,
+ 112,
+ 113,
+ 128,
+ 129,
+ 134,
+ 135,
+ 148,
+ 149,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 178,
+ 179,
+ 184,
+ 185,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 214,
+ 215,
+ 220,
+ 221
+ ];
+ }
+} catch (error) {
+ // Swallow - we only care if `supports-color` is available; it doesn't have to be.
+}
+
+/**
+ * Build up the default `inspectOpts` object from the environment variables.
+ *
+ * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
+ */
+
+exports.inspectOpts = Object.keys(process.env).filter(key => {
+ return /^debug_/i.test(key);
+}).reduce((obj, key) => {
+ // Camel-case
+ const prop = key
+ .substring(6)
+ .toLowerCase()
+ .replace(/_([a-z])/g, (_, k) => {
+ return k.toUpperCase();
+ });
+
+ // Coerce string value into JS value
+ let val = process.env[key];
+ if (/^(yes|on|true|enabled)$/i.test(val)) {
+ val = true;
+ } else if (/^(no|off|false|disabled)$/i.test(val)) {
+ val = false;
+ } else if (val === 'null') {
+ val = null;
+ } else {
+ val = Number(val);
+ }
+
+ obj[prop] = val;
+ return obj;
+}, {});
+
+/**
+ * Is stdout a TTY? Colored output is enabled when `true`.
+ */
+
+function useColors() {
+ return 'colors' in exports.inspectOpts ?
+ Boolean(exports.inspectOpts.colors) :
+ tty.isatty(process.stderr.fd);
+}
+
+/**
+ * Adds ANSI color escape codes if enabled.
+ *
+ * @api public
+ */
+
+function formatArgs(args) {
+ const {namespace: name, useColors} = this;
+
+ if (useColors) {
+ const c = this.color;
+ const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c);
+ const prefix = ` ${colorCode};1m${name} \u001B[0m`;
+
+ args[0] = prefix + args[0].split('\n').join('\n' + prefix);
+ args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m');
+ } else {
+ args[0] = getDate() + name + ' ' + args[0];
+ }
+}
+
+function getDate() {
+ if (exports.inspectOpts.hideDate) {
+ return '';
+ }
+ return new Date().toISOString() + ' ';
+}
+
+/**
+ * Invokes `util.format()` with the specified arguments and writes to stderr.
+ */
+
+function log(...args) {
+ return process.stderr.write(util.format(...args) + '\n');
+}
+
+/**
+ * Save `namespaces`.
+ *
+ * @param {String} namespaces
+ * @api private
+ */
+function save(namespaces) {
+ if (namespaces) {
+ process.env.DEBUG = namespaces;
+ } else {
+ // If you set a process.env field to null or undefined, it gets cast to the
+ // string 'null' or 'undefined'. Just delete instead.
+ delete process.env.DEBUG;
+ }
+}
+
+/**
+ * Load `namespaces`.
+ *
+ * @return {String} returns the previously persisted debug modes
+ * @api private
+ */
+
+function load() {
+ return process.env.DEBUG;
+}
+
+/**
+ * Init logic for `debug` instances.
+ *
+ * Create a new `inspectOpts` object in case `useColors` is set
+ * differently for a particular `debug` instance.
+ */
+
+function init(debug) {
+ debug.inspectOpts = {};
+
+ const keys = Object.keys(exports.inspectOpts);
+ for (let i = 0; i < keys.length; i++) {
+ debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
+ }
+}
+
+module.exports = common$4(exports);
+
+const {formatters} = module.exports;
+
+/**
+ * Map %o to `util.inspect()`, all on a single line.
+ */
+
+formatters.o = function (v) {
+ this.inspectOpts.colors = this.useColors;
+ return util.inspect(v, this.inspectOpts)
+ .split('\n')
+ .map(str => str.trim())
+ .join(' ');
+};
+
+/**
+ * Map %O to `util.inspect()`, allowing multiple lines if needed.
+ */
+
+formatters.O = function (v) {
+ this.inspectOpts.colors = this.useColors;
+ return util.inspect(v, this.inspectOpts);
+};
+}(node$1, node$1.exports));
+
+/**
+ * Detect Electron renderer / nwjs process, which is node, but we should
+ * treat as a browser.
+ */
+
+if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
+ src$2.exports = browser$1.exports;
+} else {
+ src$2.exports = node$1.exports;
+}
+
+var _debug = src$2.exports;
+
+const DEFAULT_MAIN_FIELDS = [
+ 'module',
+ 'jsnext:main',
+ 'jsnext'
+];
+const DEFAULT_EXTENSIONS$1 = [
+ '.mjs',
+ '.js',
+ '.ts',
+ '.jsx',
+ '.tsx',
+ '.json'
+];
+const JS_TYPES_RE = /\.(?:j|t)sx?$|\.mjs$/;
+const OPTIMIZABLE_ENTRY_RE = /\.(?:m?js|ts)$/;
+const SPECIAL_QUERY_RE = /[\?&](?:worker|sharedworker|raw|url)\b/;
+/**
+ * Prefix for resolved fs paths, since windows paths may not be valid as URLs.
+ */
+const FS_PREFIX = `/@fs/`;
+/**
+ * Prefix for resolved Ids that are not valid browser import specifiers
+ */
+const VALID_ID_PREFIX = `/@id/`;
+/**
+ * Plugins that use 'virtual modules' (e.g. for helper functions), prefix the
+ * module ID with `\0`, a convention from the rollup ecosystem.
+ * This prevents other plugins from trying to process the id (like node resolution),
+ * and core features like sourcemaps can use this info to differentiate between
+ * virtual modules and regular files.
+ * `\0` is not a permitted char in import URLs so we have to replace them during
+ * import analysis. The id will be decoded back before entering the plugins pipeline.
+ * These encoded virtual ids are also prefixed by the VALID_ID_PREFIX, so virtual
+ * modules in the browser end up encoded as `/@id/__x00__{id}`
+ */
+const NULL_BYTE_PLACEHOLDER = `__x00__`;
+const CLIENT_PUBLIC_PATH = `/@vite/client`;
+const ENV_PUBLIC_PATH = `/@vite/env`;
+// eslint-disable-next-line node/no-missing-require
+const CLIENT_ENTRY = require.resolve('vite/dist/client/client.mjs');
+// eslint-disable-next-line node/no-missing-require
+const ENV_ENTRY = require.resolve('vite/dist/client/env.mjs');
+const CLIENT_DIR = path__default.dirname(CLIENT_ENTRY);
+// ** READ THIS ** before editing `KNOWN_ASSET_TYPES`.
+// If you add an asset to `KNOWN_ASSET_TYPES`, make sure to also add it
+// to the TypeScript declaration file `packages/vite/client.d.ts`.
+const KNOWN_ASSET_TYPES = [
+ // images
+ 'png',
+ 'jpe?g',
+ 'gif',
+ 'svg',
+ 'ico',
+ 'webp',
+ 'avif',
+ // media
+ 'mp4',
+ 'webm',
+ 'ogg',
+ 'mp3',
+ 'wav',
+ 'flac',
+ 'aac',
+ // fonts
+ 'woff2?',
+ 'eot',
+ 'ttf',
+ 'otf',
+ // other
+ 'wasm',
+ 'webmanifest',
+ 'pdf',
+ 'txt'
+];
+const DEFAULT_ASSETS_RE = new RegExp(`\\.(` + KNOWN_ASSET_TYPES.join('|') + `)(\\?.*)?$`);
+const DEP_VERSION_RE = /[\?&](v=[\w\.-]+)\b/;
+
+function slash(p) {
+ return p.replace(/\\/g, '/');
+}
+// Strip valid id prefix. This is prepended to resolved Ids that are
+// not valid browser import specifiers by the importAnalysis plugin.
+function unwrapId(id) {
+ return id.startsWith(VALID_ID_PREFIX) ? id.slice(VALID_ID_PREFIX.length) : id;
+}
+const flattenId = (id) => id.replace(/(\s*>\s*)/g, '__').replace(/[\/\.:]/g, '_');
+const normalizeId = (id) => id.replace(/(\s*>\s*)/g, ' > ');
+//TODO: revisit later to see if the edge case that "compiling using node v12 code to be run in node v16 in the server" is what we intend to support.
+const builtins = new Set([
+ ...require$$0$7.builtinModules,
+ 'assert/strict',
+ 'diagnostics_channel',
+ 'dns/promises',
+ 'fs/promises',
+ 'path/posix',
+ 'path/win32',
+ 'readline/promises',
+ 'stream/consumers',
+ 'stream/promises',
+ 'stream/web',
+ 'timers/promises',
+ 'util/types',
+ 'wasi'
+]);
+function isBuiltin(id) {
+ return builtins.has(id.replace(/^node:/, ''));
+}
+function moduleListContains(moduleList, id) {
+ return moduleList === null || moduleList === void 0 ? void 0 : moduleList.some((m) => m === id || id.startsWith(m + '/'));
+}
+const bareImportRE = /^[\w@](?!.*:\/\/)/;
+let isRunningWithYarnPnp;
+try {
+ isRunningWithYarnPnp = Boolean(require('pnpapi'));
+}
+catch { }
+const ssrExtensions = ['.js', '.cjs', '.json', '.node'];
+function resolveFrom(id, basedir, preserveSymlinks = false, ssr = false) {
+ return resolve__default.sync(id, {
+ basedir,
+ paths: [],
+ extensions: ssr ? ssrExtensions : DEFAULT_EXTENSIONS$1,
+ // necessary to work with pnpm
+ preserveSymlinks: preserveSymlinks || isRunningWithYarnPnp || false
+ });
+}
+/**
+ * like `resolveFrom` but supports resolving `>` path in `id`,
+ * for example: `foo > bar > baz`
+ */
+function nestedResolveFrom(id, basedir, preserveSymlinks = false) {
+ const pkgs = id.split('>').map((pkg) => pkg.trim());
+ try {
+ for (const pkg of pkgs) {
+ basedir = resolveFrom(pkg, basedir, preserveSymlinks);
+ }
+ }
+ catch { }
+ return basedir;
+}
+// set in bin/vite.js
+const filter = process.env.VITE_DEBUG_FILTER;
+const DEBUG = process.env.DEBUG;
+function createDebugger(namespace, options = {}) {
+ const log = _debug(namespace);
+ const { onlyWhenFocused } = options;
+ const focus = typeof onlyWhenFocused === 'string' ? onlyWhenFocused : namespace;
+ return (msg, ...args) => {
+ if (filter && !msg.includes(filter)) {
+ return;
+ }
+ if (onlyWhenFocused && !(DEBUG === null || DEBUG === void 0 ? void 0 : DEBUG.includes(focus))) {
+ return;
+ }
+ log(msg, ...args);
+ };
+}
+function testCaseInsensitiveFS() {
+ if (!CLIENT_ENTRY.endsWith('client.mjs')) {
+ throw new Error(`cannot test case insensitive FS, CLIENT_ENTRY const doesn't contain client.mjs`);
+ }
+ if (!fs__default.existsSync(CLIENT_ENTRY)) {
+ throw new Error('cannot test case insensitive FS, CLIENT_ENTRY does not point to an existing file: ' +
+ CLIENT_ENTRY);
+ }
+ return fs__default.existsSync(CLIENT_ENTRY.replace('client.mjs', 'cLiEnT.mjs'));
+}
+const isCaseInsensitiveFS = testCaseInsensitiveFS();
+const isWindows$3 = require$$2__default.platform() === 'win32';
+const VOLUME_RE = /^[A-Z]:/i;
+function normalizePath$3(id) {
+ return path__default.posix.normalize(isWindows$3 ? slash(id) : id);
+}
+function fsPathFromId(id) {
+ const fsPath = normalizePath$3(id.startsWith(FS_PREFIX) ? id.slice(FS_PREFIX.length) : id);
+ return fsPath.startsWith('/') || fsPath.match(VOLUME_RE)
+ ? fsPath
+ : `/${fsPath}`;
+}
+function fsPathFromUrl(url) {
+ return fsPathFromId(cleanUrl(url));
+}
+/**
+ * Check if dir is a parent of file
+ *
+ * Warning: parameters are not validated, only works with normalized absolute paths
+ *
+ * @param dir - normalized absolute path
+ * @param file - normalized absolute path
+ * @returns true if dir is a parent of file
+ */
+function isParentDirectory(dir, file) {
+ if (!dir.endsWith('/')) {
+ dir = `${dir}/`;
+ }
+ return (file.startsWith(dir) ||
+ (isCaseInsensitiveFS && file.toLowerCase().startsWith(dir.toLowerCase())));
+}
+function ensureVolumeInPath(file) {
+ return isWindows$3 ? path__default.resolve(file) : file;
+}
+const queryRE = /\?.*$/s;
+const hashRE = /#.*$/s;
+const cleanUrl = (url) => url.replace(hashRE, '').replace(queryRE, '');
+const externalRE = /^(https?:)?\/\//;
+const isExternalUrl = (url) => externalRE.test(url);
+const dataUrlRE = /^\s*data:/i;
+const isDataUrl = (url) => dataUrlRE.test(url);
+const virtualModuleRE = /^virtual-module:.*/;
+const virtualModulePrefix = 'virtual-module:';
+const knownJsSrcRE = /\.((j|t)sx?|mjs|vue|marko|svelte|astro)($|\?)/;
+const isJSRequest = (url) => {
+ url = cleanUrl(url);
+ if (knownJsSrcRE.test(url)) {
+ return true;
+ }
+ if (!path__default.extname(url) && !url.endsWith('/')) {
+ return true;
+ }
+ return false;
+};
+const knownTsRE = /\.(ts|mts|cts|tsx)$/;
+const knownTsOutputRE = /\.(js|mjs|cjs|jsx)$/;
+const isTsRequest = (url) => knownTsRE.test(url);
+const isPossibleTsOutput = (url) => knownTsOutputRE.test(cleanUrl(url));
+function getPotentialTsSrcPaths(filePath) {
+ const [name, type, query = ''] = filePath.split(/(\.(?:[cm]?js|jsx))(\?.*)?$/);
+ const paths = [name + type.replace('js', 'ts') + query];
+ if (!type.endsWith('x')) {
+ paths.push(name + type.replace('js', 'tsx') + query);
+ }
+ return paths;
+}
+const importQueryRE = /(\?|&)import=?(?:&|$)/;
+const internalPrefixes = [
+ FS_PREFIX,
+ VALID_ID_PREFIX,
+ CLIENT_PUBLIC_PATH,
+ ENV_PUBLIC_PATH
+];
+const InternalPrefixRE = new RegExp(`^(?:${internalPrefixes.join('|')})`);
+const trailingSeparatorRE = /[\?&]$/;
+const isImportRequest = (url) => importQueryRE.test(url);
+const isInternalRequest = (url) => InternalPrefixRE.test(url);
+function removeImportQuery(url) {
+ return url.replace(importQueryRE, '$1').replace(trailingSeparatorRE, '');
+}
+function injectQuery(url, queryToInject) {
+ // encode percents for consistent behavior with pathToFileURL
+ // see #2614 for details
+ let resolvedUrl = new require$$0$6.URL(url.replace(/%/g, '%25'), 'relative:///');
+ if (resolvedUrl.protocol !== 'relative:') {
+ resolvedUrl = require$$0$6.pathToFileURL(url);
+ }
+ let { protocol, pathname, search, hash } = resolvedUrl;
+ if (protocol === 'file:') {
+ pathname = pathname.slice(1);
+ }
+ pathname = decodeURIComponent(pathname);
+ return `${pathname}?${queryToInject}${search ? `&` + search.slice(1) : ''}${hash !== null && hash !== void 0 ? hash : ''}`;
+}
+const timestampRE = /\bt=\d{13}&?\b/;
+function removeTimestampQuery(url) {
+ return url.replace(timestampRE, '').replace(trailingSeparatorRE, '');
+}
+async function asyncReplace(input, re, replacer) {
+ let match;
+ let remaining = input;
+ let rewritten = '';
+ while ((match = re.exec(remaining))) {
+ rewritten += remaining.slice(0, match.index);
+ rewritten += await replacer(match);
+ remaining = remaining.slice(match.index + match[0].length);
+ }
+ rewritten += remaining;
+ return rewritten;
+}
+function timeFrom(start, subtract = 0) {
+ const time = perf_hooks.performance.now() - start - subtract;
+ const timeString = (time.toFixed(2) + `ms`).padEnd(5, ' ');
+ if (time < 10) {
+ return colors$1.green(timeString);
+ }
+ else if (time < 50) {
+ return colors$1.yellow(timeString);
+ }
+ else {
+ return colors$1.red(timeString);
+ }
+}
+/**
+ * pretty url for logging.
+ */
+function prettifyUrl(url, root) {
+ url = removeTimestampQuery(url);
+ const isAbsoluteFile = url.startsWith(root);
+ if (isAbsoluteFile || url.startsWith(FS_PREFIX)) {
+ let file = path__default.relative(root, isAbsoluteFile ? url : fsPathFromId(url));
+ const seg = file.split('/');
+ const npmIndex = seg.indexOf(`node_modules`);
+ const isSourceMap = file.endsWith('.map');
+ if (npmIndex > 0) {
+ file = seg[npmIndex + 1];
+ if (file.startsWith('@')) {
+ file = `${file}/${seg[npmIndex + 2]}`;
+ }
+ file = `npm: ${colors$1.dim(file)}${isSourceMap ? ` (source map)` : ``}`;
+ }
+ return colors$1.dim(file);
+ }
+ else {
+ return colors$1.dim(url);
+ }
+}
+function isObject$1(value) {
+ return Object.prototype.toString.call(value) === '[object Object]';
+}
+function isDefined(value) {
+ return value != null;
+}
+function lookupFile(dir, formats, options) {
+ for (const format of formats) {
+ const fullPath = path__default.join(dir, format);
+ if (fs__default.existsSync(fullPath) && fs__default.statSync(fullPath).isFile()) {
+ return (options === null || options === void 0 ? void 0 : options.pathOnly) ? fullPath : fs__default.readFileSync(fullPath, 'utf-8');
+ }
+ }
+ const parentDir = path__default.dirname(dir);
+ if (parentDir !== dir &&
+ (!(options === null || options === void 0 ? void 0 : options.rootDir) || parentDir.startsWith(options === null || options === void 0 ? void 0 : options.rootDir))) {
+ return lookupFile(parentDir, formats, options);
+ }
+}
+const splitRE = /\r?\n/;
+const range = 2;
+function pad(source, n = 2) {
+ const lines = source.split(splitRE);
+ return lines.map((l) => ` `.repeat(n) + l).join(`\n`);
+}
+function posToNumber(source, pos) {
+ if (typeof pos === 'number')
+ return pos;
+ const lines = source.split(splitRE);
+ const { line, column } = pos;
+ let start = 0;
+ for (let i = 0; i < line - 1; i++) {
+ if (lines[i]) {
+ start += lines[i].length + 1;
+ }
+ }
+ return start + column;
+}
+function numberToPos(source, offset) {
+ if (typeof offset !== 'number')
+ return offset;
+ if (offset > source.length) {
+ throw new Error(`offset is longer than source length! offset ${offset} > length ${source.length}`);
+ }
+ const lines = source.split(splitRE);
+ let counted = 0;
+ let line = 0;
+ let column = 0;
+ for (; line < lines.length; line++) {
+ const lineLength = lines[line].length + 1;
+ if (counted + lineLength >= offset) {
+ column = offset - counted + 1;
+ break;
+ }
+ counted += lineLength;
+ }
+ return { line: line + 1, column };
+}
+function generateCodeFrame(source, start = 0, end) {
+ start = posToNumber(source, start);
+ end = end || start;
+ const lines = source.split(splitRE);
+ let count = 0;
+ const res = [];
+ for (let i = 0; i < lines.length; i++) {
+ count += lines[i].length + 1;
+ if (count >= start) {
+ for (let j = i - range; j <= i + range || end > count; j++) {
+ if (j < 0 || j >= lines.length)
+ continue;
+ const line = j + 1;
+ res.push(`${line}${' '.repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`);
+ const lineLength = lines[j].length;
+ if (j === i) {
+ // push underline
+ const pad = start - (count - lineLength) + 1;
+ const length = Math.max(1, end > count ? lineLength - pad : end - start);
+ res.push(` | ` + ' '.repeat(pad) + '^'.repeat(length));
+ }
+ else if (j > i) {
+ if (end > count) {
+ const length = Math.max(Math.min(end - count, lineLength), 1);
+ res.push(` | ` + '^'.repeat(length));
+ }
+ count += lineLength + 1;
+ }
+ }
+ break;
+ }
+ }
+ return res.join('\n');
+}
+function writeFile(filename, content) {
+ const dir = path__default.dirname(filename);
+ if (!fs__default.existsSync(dir)) {
+ fs__default.mkdirSync(dir, { recursive: true });
+ }
+ fs__default.writeFileSync(filename, content);
+}
+/**
+ * Use instead of fs.existsSync(filename)
+ * #2051 if we don't have read permission on a directory, existsSync() still
+ * works and will result in massively slow subsequent checks (which are
+ * unnecessary in the first place)
+ */
+function isFileReadable(filename) {
+ try {
+ const stat = fs__default.statSync(filename, { throwIfNoEntry: false });
+ return !!stat;
+ }
+ catch {
+ return false;
+ }
+}
+/**
+ * Delete every file and subdirectory. **The given directory must exist.**
+ * Pass an optional `skip` array to preserve files in the root directory.
+ */
+function emptyDir(dir, skip) {
+ for (const file of fs__default.readdirSync(dir)) {
+ if (skip === null || skip === void 0 ? void 0 : skip.includes(file)) {
+ continue;
+ }
+ const abs = path__default.resolve(dir, file);
+ // baseline is Node 12 so can't use rmSync :(
+ if (fs__default.lstatSync(abs).isDirectory()) {
+ emptyDir(abs);
+ fs__default.rmdirSync(abs);
+ }
+ else {
+ fs__default.unlinkSync(abs);
+ }
+ }
+}
+function copyDir(srcDir, destDir) {
+ fs__default.mkdirSync(destDir, { recursive: true });
+ for (const file of fs__default.readdirSync(srcDir)) {
+ const srcFile = path__default.resolve(srcDir, file);
+ if (srcFile === destDir) {
+ continue;
+ }
+ const destFile = path__default.resolve(destDir, file);
+ const stat = fs__default.statSync(srcFile);
+ if (stat.isDirectory()) {
+ copyDir(srcFile, destFile);
+ }
+ else {
+ fs__default.copyFileSync(srcFile, destFile);
+ }
+ }
+}
+function removeDirSync(dir) {
+ var _a;
+ if (fs__default.existsSync(dir)) {
+ const rmSync = (_a = fs__default.rmSync) !== null && _a !== void 0 ? _a : fs__default.rmdirSync; // TODO: Remove after support for Node 12 is dropped
+ rmSync(dir, { recursive: true });
+ }
+}
+const removeDir = isWindows$3
+ ? require$$0$4.promisify(gracefulRemoveDir)
+ : removeDirSync;
+const renameDir = isWindows$3 ? require$$0$4.promisify(gracefulRename) : fs__default.renameSync;
+function ensureWatchedFile(watcher, file, root) {
+ if (file &&
+ // only need to watch if out of root
+ !file.startsWith(root + '/') &&
+ // some rollup plugins use null bytes for private resolved Ids
+ !file.includes('\0') &&
+ fs__default.existsSync(file)) {
+ // resolve file to normalized system path
+ watcher.add(path__default.resolve(file));
+ }
+}
+const escapedSpaceCharacters = /( |\\t|\\n|\\f|\\r)+/g;
+const imageSetUrlRE = /^(?:[\w\-]+\(.*?\)|'.*?'|".*?"|\S*)/;
+async function processSrcSet(srcs, replacer) {
+ const imageCandidates = splitSrcSet(srcs)
+ .map((s) => {
+ const src = s.replace(escapedSpaceCharacters, ' ').trim();
+ const [url] = imageSetUrlRE.exec(src) || [];
+ return {
+ url,
+ descriptor: src === null || src === void 0 ? void 0 : src.slice(url.length).trim()
+ };
+ })
+ .filter(({ url }) => !!url);
+ const ret = await Promise.all(imageCandidates.map(async ({ url, descriptor }) => {
+ return {
+ url: await replacer({ url, descriptor }),
+ descriptor
+ };
+ }));
+ return ret.reduce((prev, { url, descriptor }, index) => {
+ descriptor !== null && descriptor !== void 0 ? descriptor : (descriptor = '');
+ return (prev +=
+ url + ` ${descriptor}${index === ret.length - 1 ? '' : ', '}`);
+ }, '');
+}
+function splitSrcSet(srcs) {
+ const parts = [];
+ // There could be a ',' inside of url(data:...), linear-gradient(...) or "data:..."
+ const cleanedSrcs = srcs.replace(/(?:url|image|gradient|cross-fade)\([^\)]*\)|"([^"]|(?<=\\)")*"|'([^']|(?<=\\)')*'/g, blankReplacer);
+ let startIndex = 0;
+ let splitIndex;
+ do {
+ splitIndex = cleanedSrcs.indexOf(',', startIndex);
+ parts.push(srcs.slice(startIndex, splitIndex !== -1 ? splitIndex : undefined));
+ startIndex = splitIndex + 1;
+ } while (splitIndex !== -1);
+ return parts;
+}
+function escapeToLinuxLikePath(path) {
+ if (/^[A-Z]:/.test(path)) {
+ return path.replace(/^([A-Z]):\//, '/windows/$1/');
+ }
+ if (/^\/[^/]/.test(path)) {
+ return `/linux${path}`;
+ }
+ return path;
+}
+function unescapeToLinuxLikePath(path) {
+ if (path.startsWith('/linux/')) {
+ return path.slice('/linux'.length);
+ }
+ if (path.startsWith('/windows/')) {
+ return path.replace(/^\/windows\/([A-Z])\//, '$1:/');
+ }
+ return path;
+}
+// based on https://github.com/sveltejs/svelte/blob/abf11bb02b2afbd3e4cac509a0f70e318c306364/src/compiler/utils/mapped_code.ts#L221
+const nullSourceMap = {
+ names: [],
+ sources: [],
+ mappings: '',
+ version: 3
+};
+function combineSourcemaps(filename, sourcemapList, excludeContent = true) {
+ if (sourcemapList.length === 0 ||
+ sourcemapList.every((m) => m.sources.length === 0)) {
+ return { ...nullSourceMap };
+ }
+ // hack for parse broken with normalized absolute paths on windows (C:/path/to/something).
+ // escape them to linux like paths
+ // also avoid mutation here to prevent breaking plugin's using cache to generate sourcemaps like vue (see #7442)
+ sourcemapList = sourcemapList.map((sourcemap) => {
+ const newSourcemaps = { ...sourcemap };
+ newSourcemaps.sources = sourcemap.sources.map((source) => source ? escapeToLinuxLikePath(source) : null);
+ if (sourcemap.sourceRoot) {
+ newSourcemaps.sourceRoot = escapeToLinuxLikePath(sourcemap.sourceRoot);
+ }
+ return newSourcemaps;
+ });
+ const escapedFilename = escapeToLinuxLikePath(filename);
+ // We don't declare type here so we can convert/fake/map as RawSourceMap
+ let map; //: SourceMap
+ let mapIndex = 1;
+ const useArrayInterface = sourcemapList.slice(0, -1).find((m) => m.sources.length !== 1) === undefined;
+ if (useArrayInterface) {
+ map = remapping(sourcemapList, () => null, excludeContent);
+ }
+ else {
+ map = remapping(sourcemapList[0], function loader(sourcefile) {
+ if (sourcefile === escapedFilename && sourcemapList[mapIndex]) {
+ return sourcemapList[mapIndex++];
+ }
+ else {
+ return null;
+ }
+ }, excludeContent);
+ }
+ if (!map.file) {
+ delete map.file;
+ }
+ // unescape the previous hack
+ map.sources = map.sources.map((source) => source ? unescapeToLinuxLikePath(source) : source);
+ map.file = filename;
+ return map;
+}
+function resolveHostname(optionsHost) {
+ let host;
+ if (optionsHost === undefined || optionsHost === false) {
+ // Use a secure default
+ host = '127.0.0.1';
+ }
+ else if (optionsHost === true) {
+ // If passed --host in the CLI without arguments
+ host = undefined; // undefined typically means 0.0.0.0 or :: (listen on all IPs)
+ }
+ else {
+ host = optionsHost;
+ }
+ // Set host name to localhost when possible, unless the user explicitly asked for '127.0.0.1'
+ const name = (optionsHost !== '127.0.0.1' && host === '127.0.0.1') ||
+ host === '0.0.0.0' ||
+ host === '::' ||
+ host === undefined
+ ? 'localhost'
+ : host;
+ return { host, name };
+}
+function arraify(target) {
+ return Array.isArray(target) ? target : [target];
+}
+function toUpperCaseDriveLetter(pathName) {
+ return pathName.replace(/^\w:/, (letter) => letter.toUpperCase());
+}
+const multilineCommentsRE = /\/\*(.|[\r\n])*?\*\//gm;
+const singlelineCommentsRE = /\/\/.*/g;
+const usingDynamicImport = typeof jest === 'undefined';
+/**
+ * Dynamically import files. It will make sure it's not being compiled away by TS/Rollup.
+ *
+ * As a temporary workaround for Jest's lack of stable ESM support, we fallback to require
+ * if we're in a Jest environment.
+ * See https://github.com/vitejs/vite/pull/5197#issuecomment-938054077
+ *
+ * @param file File path to import.
+ */
+const dynamicImport = usingDynamicImport
+ ? new Function('file', 'return import(file)')
+ : require;
+function parseRequest(id) {
+ const { search } = require$$0$6.parse(id);
+ if (!search) {
+ return null;
+ }
+ return Object.fromEntries(new require$$0$6.URLSearchParams(search.slice(1)));
+}
+const blankReplacer = (match) => ' '.repeat(match.length);
+// Based on node-graceful-fs
+// The ISC License
+// Copyright (c) 2011-2022 Isaac Z. Schlueter, Ben Noordhuis, and Contributors
+// https://github.com/isaacs/node-graceful-fs/blob/main/LICENSE
+// On Windows, A/V software can lock the directory, causing this
+// to fail with an EACCES or EPERM if the directory contains newly
+// created files. The original tried for up to 60 seconds, we only
+// wait for 5 seconds, as a longer time would be seen as an error
+const GRACEFUL_RENAME_TIMEOUT = 5000;
+function gracefulRename(from, to, cb) {
+ const start = Date.now();
+ let backoff = 0;
+ fs__default.rename(from, to, function CB(er) {
+ if (er &&
+ (er.code === 'EACCES' || er.code === 'EPERM') &&
+ Date.now() - start < GRACEFUL_RENAME_TIMEOUT) {
+ setTimeout(function () {
+ fs__default.stat(to, function (stater, st) {
+ if (stater && stater.code === 'ENOENT')
+ fs__default.rename(from, to, CB);
+ else
+ CB(er);
+ });
+ }, backoff);
+ if (backoff < 100)
+ backoff += 10;
+ return;
+ }
+ if (cb)
+ cb(er);
+ });
+}
+const GRACEFUL_REMOVE_DIR_TIMEOUT = 5000;
+function gracefulRemoveDir(dir, cb) {
+ var _a;
+ const rmdir = (_a = fs__default.rm) !== null && _a !== void 0 ? _a : fs__default.rmdir; // TODO: Remove after support for Node 12 is dropped
+ const start = Date.now();
+ let backoff = 0;
+ rmdir(dir, { recursive: true }, function CB(er) {
+ if (er) {
+ if ((er.code === 'ENOTEMPTY' ||
+ er.code === 'EACCES' ||
+ er.code === 'EPERM') &&
+ Date.now() - start < GRACEFUL_REMOVE_DIR_TIMEOUT) {
+ setTimeout(function () {
+ rmdir(dir, { recursive: true }, CB);
+ }, backoff);
+ if (backoff < 100)
+ backoff += 10;
+ return;
+ }
+ if (er.code === 'ENOENT') {
+ er = null;
+ }
+ }
+ if (cb)
+ cb(er);
+ });
+}
+function emptyCssComments(raw) {
+ return raw.replace(multilineCommentsRE, (s) => ' '.repeat(s.length));
+}
+
+/* eslint no-console: 0 */
+const LogLevels = {
+ silent: 0,
+ error: 1,
+ warn: 2,
+ info: 3
+};
+let lastType;
+let lastMsg;
+let sameCount = 0;
+function clearScreen() {
+ const repeatCount = process.stdout.rows - 2;
+ const blank = repeatCount > 0 ? '\n'.repeat(repeatCount) : '';
+ console.log(blank);
+ readline__default.cursorTo(process.stdout, 0, 0);
+ readline__default.clearScreenDown(process.stdout);
+}
+function createLogger(level = 'info', options = {}) {
+ if (options.customLogger) {
+ return options.customLogger;
+ }
+ const loggedErrors = new WeakSet();
+ const { prefix = '[vite]', allowClearScreen = true } = options;
+ const thresh = LogLevels[level];
+ const canClearScreen = allowClearScreen && process.stdout.isTTY && !process.env.CI;
+ const clear = canClearScreen ? clearScreen : () => { };
+ function output(type, msg, options = {}) {
+ if (thresh >= LogLevels[type]) {
+ const method = type === 'info' ? 'log' : type;
+ const format = () => {
+ if (options.timestamp) {
+ const tag = type === 'info'
+ ? colors$1.cyan(colors$1.bold(prefix))
+ : type === 'warn'
+ ? colors$1.yellow(colors$1.bold(prefix))
+ : colors$1.red(colors$1.bold(prefix));
+ return `${colors$1.dim(new Date().toLocaleTimeString())} ${tag} ${msg}`;
+ }
+ else {
+ return msg;
+ }
+ };
+ if (options.error) {
+ loggedErrors.add(options.error);
+ }
+ if (canClearScreen) {
+ if (type === lastType && msg === lastMsg) {
+ sameCount++;
+ clear();
+ console[method](format(), colors$1.yellow(`(x${sameCount + 1})`));
+ }
+ else {
+ sameCount = 0;
+ lastMsg = msg;
+ lastType = type;
+ if (options.clear) {
+ clear();
+ }
+ console[method](format());
+ }
+ }
+ else {
+ console[method](format());
+ }
+ }
+ }
+ const warnedMessages = new Set();
+ const logger = {
+ hasWarned: false,
+ info(msg, opts) {
+ output('info', msg, opts);
+ },
+ warn(msg, opts) {
+ logger.hasWarned = true;
+ output('warn', msg, opts);
+ },
+ warnOnce(msg, opts) {
+ if (warnedMessages.has(msg))
+ return;
+ logger.hasWarned = true;
+ output('warn', msg, opts);
+ warnedMessages.add(msg);
+ },
+ error(msg, opts) {
+ logger.hasWarned = true;
+ output('error', msg, opts);
+ },
+ clearScreen(type) {
+ if (thresh >= LogLevels[type]) {
+ clear();
+ }
+ },
+ hasErrorLogged(error) {
+ return loggedErrors.has(error);
+ }
+ };
+ return logger;
+}
+/**
+ * @deprecated Use `server.printUrls()` instead
+ */
+function printHttpServerUrls(server, config) {
+ printCommonServerUrls(server, config.server, config);
+}
+function printCommonServerUrls(server, options, config) {
+ const address = server.address();
+ const isAddressInfo = (x) => x === null || x === void 0 ? void 0 : x.address;
+ if (isAddressInfo(address)) {
+ const hostname = resolveHostname(options.host);
+ const protocol = options.https ? 'https' : 'http';
+ printServerUrls(hostname, protocol, address.port, config.base, config.logger.info);
+ }
+}
+function printServerUrls(hostname, protocol, port, base, info) {
+ if (hostname.host === '127.0.0.1') {
+ const url = `${protocol}://${hostname.name}:${colors$1.bold(port)}${base}`;
+ info(` > Local: ${colors$1.cyan(url)}`);
+ if (hostname.name !== '127.0.0.1') {
+ info(` > Network: ${colors$1.dim('use `--host` to expose')}`);
+ }
+ }
+ else {
+ Object.values(require$$2__default.networkInterfaces())
+ .flatMap((nInterface) => nInterface !== null && nInterface !== void 0 ? nInterface : [])
+ .filter((detail) => detail &&
+ detail.address &&
+ // Node < v18
+ ((typeof detail.family === 'string' && detail.family === 'IPv4') ||
+ // Node >= v18
+ (typeof detail.family === 'number' && detail.family === 4)))
+ .map((detail) => {
+ const type = detail.address.includes('127.0.0.1')
+ ? 'Local: '
+ : 'Network: ';
+ const host = detail.address.replace('127.0.0.1', hostname.name);
+ const url = `${protocol}://${host}:${colors$1.bold(port)}${base}`;
+ return ` > ${type} ${colors$1.cyan(url)}`;
+ })
+ .forEach((msg) => info(msg));
+ }
+}
+
+const writeColors = {
+ [0 /* JS */]: colors$1.cyan,
+ [1 /* CSS */]: colors$1.magenta,
+ [2 /* ASSET */]: colors$1.green,
+ [3 /* HTML */]: colors$1.blue,
+ [4 /* SOURCE_MAP */]: colors$1.gray
+};
+function buildReporterPlugin(config) {
+ const compress = require$$0$4.promisify(zlib$1.gzip);
+ const chunkLimit = config.build.chunkSizeWarningLimit;
+ function isLarge(code) {
+ // bail out on particularly large chunks
+ return code.length / 1024 > chunkLimit;
+ }
+ async function getCompressedSize(code) {
+ if (config.build.ssr ||
+ !config.build.reportCompressedSize ||
+ config.build.brotliSize === false) {
+ return '';
+ }
+ return ` / gzip: ${((await compress(typeof code === 'string' ? code : Buffer.from(code)))
+ .length / 1024).toFixed(2)} KiB`;
+ }
+ function printFileInfo(filePath, content, type, maxLength, compressedSize = '') {
+ const outDir = normalizePath$3(path__default.relative(config.root, path__default.resolve(config.root, config.build.outDir))) + '/';
+ const kibs = content.length / 1024;
+ const sizeColor = kibs > chunkLimit ? colors$1.yellow : colors$1.dim;
+ config.logger.info(`${colors$1.gray(colors$1.white(colors$1.dim(outDir)))}${writeColors[type](filePath.padEnd(maxLength + 2))} ${sizeColor(`${kibs.toFixed(2)} KiB${compressedSize}`)}`);
+ }
+ const tty = process.stdout.isTTY && !process.env.CI;
+ const shouldLogInfo = LogLevels[config.logLevel || 'info'] >= LogLevels.info;
+ let hasTransformed = false;
+ let hasRenderedChunk = false;
+ let transformedCount = 0;
+ let chunkCount = 0;
+ const logTransform = throttle((id) => {
+ writeLine(`transforming (${transformedCount}) ${colors$1.dim(path__default.relative(config.root, id))}`);
+ });
+ return {
+ name: 'vite:reporter',
+ transform(_, id) {
+ transformedCount++;
+ if (shouldLogInfo) {
+ if (!tty) {
+ if (!hasTransformed) {
+ config.logger.info(`transforming...`);
+ }
+ }
+ else {
+ if (id.includes(`?`))
+ return;
+ logTransform(id);
+ }
+ hasTransformed = true;
+ }
+ return null;
+ },
+ buildEnd() {
+ if (shouldLogInfo) {
+ if (tty) {
+ process.stdout.clearLine(0);
+ process.stdout.cursorTo(0);
+ }
+ config.logger.info(`${colors$1.green(`✓`)} ${transformedCount} modules transformed.`);
+ }
+ },
+ renderStart() {
+ chunkCount = 0;
+ },
+ renderChunk() {
+ chunkCount++;
+ if (shouldLogInfo) {
+ if (!tty) {
+ if (!hasRenderedChunk) {
+ config.logger.info('rendering chunks...');
+ }
+ }
+ else {
+ writeLine(`rendering chunks (${chunkCount})...`);
+ }
+ hasRenderedChunk = true;
+ }
+ return null;
+ },
+ generateBundle() {
+ if (shouldLogInfo && tty) {
+ process.stdout.clearLine(0);
+ process.stdout.cursorTo(0);
+ }
+ },
+ async writeBundle(_, output) {
+ let hasLargeChunks = false;
+ if (shouldLogInfo) {
+ let longest = 0;
+ for (const file in output) {
+ const l = output[file].fileName.length;
+ if (l > longest)
+ longest = l;
+ }
+ // large chunks are deferred to be logged at the end so they are more
+ // visible.
+ const deferredLogs = [];
+ await Promise.all(Object.keys(output).map(async (file) => {
+ const chunk = output[file];
+ if (chunk.type === 'chunk') {
+ const log = async () => {
+ printFileInfo(chunk.fileName, chunk.code, 0 /* JS */, longest, await getCompressedSize(chunk.code));
+ if (chunk.map) {
+ printFileInfo(chunk.fileName + '.map', chunk.map.toString(), 4 /* SOURCE_MAP */, longest);
+ }
+ };
+ if (isLarge(chunk.code)) {
+ hasLargeChunks = true;
+ deferredLogs.push(log);
+ }
+ else {
+ await log();
+ }
+ }
+ else if (chunk.source) {
+ const isCSS = chunk.fileName.endsWith('.css');
+ const isMap = chunk.fileName.endsWith('.js.map');
+ printFileInfo(chunk.fileName, chunk.source, isCSS
+ ? 1 /* CSS */
+ : isMap
+ ? 4 /* SOURCE_MAP */
+ : 2 /* ASSET */, longest, isCSS ? await getCompressedSize(chunk.source) : undefined);
+ }
+ }));
+ await Promise.all(deferredLogs.map((l) => l()));
+ }
+ else {
+ hasLargeChunks = Object.keys(output).some((file) => {
+ const chunk = output[file];
+ return chunk.type === 'chunk' && chunk.code.length / 1024 > chunkLimit;
+ });
+ }
+ if (hasLargeChunks &&
+ config.build.minify &&
+ !config.build.lib &&
+ !config.build.ssr) {
+ config.logger.warn(colors$1.yellow(`\n(!) Some chunks are larger than ${chunkLimit} KiB after minification. Consider:\n` +
+ `- Using dynamic import() to code-split the application\n` +
+ `- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/guide/en/#outputmanualchunks\n` +
+ `- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.`));
+ }
+ }
+ };
+}
+function writeLine(output) {
+ process.stdout.clearLine(0);
+ process.stdout.cursorTo(0);
+ if (output.length < process.stdout.columns) {
+ process.stdout.write(output);
+ }
+ else {
+ process.stdout.write(output.substring(0, process.stdout.columns - 1));
+ }
+}
+function throttle(fn) {
+ let timerHandle = null;
+ return (...args) => {
+ if (timerHandle)
+ return;
+ fn(...args);
+ timerHandle = setTimeout(() => {
+ timerHandle = null;
+ }, 100);
+ };
+}
+
+var __defProp = Object.defineProperty;
+var __defProps = Object.defineProperties;
+var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
+var __getOwnPropSymbols = Object.getOwnPropertySymbols;
+var __hasOwnProp = Object.prototype.hasOwnProperty;
+var __propIsEnum = Object.prototype.propertyIsEnumerable;
+var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
+var __spreadValues = (a, b) => {
+ for (var prop in b || (b = {}))
+ if (__hasOwnProp.call(b, prop))
+ __defNormalProp(a, prop, b[prop]);
+ if (__getOwnPropSymbols)
+ for (var prop of __getOwnPropSymbols(b)) {
+ if (__propIsEnum.call(b, prop))
+ __defNormalProp(a, prop, b[prop]);
+ }
+ return a;
+};
+var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
+async function find(filename, options) {
+ let dir = path__default.dirname(path__default.resolve(filename));
+ const root = (options == null ? void 0 : options.root) ? path__default.resolve(options.root) : null;
+ while (dir) {
+ const tsconfig = await tsconfigInDir(dir, options);
+ if (tsconfig) {
+ return tsconfig;
+ } else {
+ if (root === dir) {
+ break;
+ }
+ const parent = path__default.dirname(dir);
+ if (parent === dir) {
+ break;
+ } else {
+ dir = parent;
+ }
+ }
+ }
+ throw new Error(`no tsconfig file found for ${filename}`);
+}
+async function tsconfigInDir(dir, options) {
+ const tsconfig = path__default.join(dir, "tsconfig.json");
+ if (options == null ? void 0 : options.tsConfigPaths) {
+ return options.tsConfigPaths.has(tsconfig) ? tsconfig : void 0;
+ }
+ try {
+ const stat = await fs$n.promises.stat(tsconfig);
+ if (stat.isFile() || stat.isFIFO()) {
+ return tsconfig;
+ }
+ } catch (e) {
+ if (e.code !== "ENOENT") {
+ throw e;
+ }
+ }
+}
+async function findAll(dir, options) {
+ const files = [];
+ for await (const tsconfigFile of findTSConfig(path__default.resolve(dir), options)) {
+ files.push(tsconfigFile);
+ }
+ return files;
+}
+async function* findTSConfig(dir, options, visited = /* @__PURE__ */ new Set()) {
+ if (!visited.has(dir)) {
+ visited.add(dir);
+ try {
+ const dirents = await fs$n.promises.readdir(dir, { withFileTypes: true });
+ for (const dirent of dirents) {
+ if (dirent.isDirectory() && (!(options == null ? void 0 : options.skip) || !options.skip(dirent.name))) {
+ yield* findTSConfig(path__default.resolve(dir, dirent.name), options, visited);
+ } else if (dirent.isFile() && dirent.name === "tsconfig.json") {
+ yield path__default.resolve(dir, dirent.name);
+ }
+ }
+ } catch (e) {
+ if (e.code === "EACCES" || e.code === "ENOENT") {
+ return;
+ }
+ throw e;
+ }
+ }
+}
+
+// src/to-json.ts
+function toJson(tsconfigJson) {
+ const stripped = stripDanglingComma(stripJsonComments(stripBom(tsconfigJson)));
+ if (stripped.trim() === "") {
+ return "{}";
+ } else {
+ return stripped;
+ }
+}
+function stripDanglingComma(pseudoJson) {
+ let insideString = false;
+ let offset = 0;
+ let result = "";
+ let danglingCommaPos = null;
+ for (let i = 0; i < pseudoJson.length; i++) {
+ const currentCharacter = pseudoJson[i];
+ if (currentCharacter === '"') {
+ const escaped = isEscaped(pseudoJson, i);
+ if (!escaped) {
+ insideString = !insideString;
+ }
+ }
+ if (insideString) {
+ danglingCommaPos = null;
+ continue;
+ }
+ if (currentCharacter === ",") {
+ danglingCommaPos = i;
+ continue;
+ }
+ if (danglingCommaPos) {
+ if (currentCharacter === "}" || currentCharacter === "]") {
+ result += pseudoJson.slice(offset, danglingCommaPos) + " ";
+ offset = danglingCommaPos + 1;
+ danglingCommaPos = null;
+ } else if (!currentCharacter.match(/\s/)) {
+ danglingCommaPos = null;
+ }
+ }
+ }
+ return result + pseudoJson.substring(offset);
+}
+function isEscaped(jsonString, quotePosition) {
+ let index = quotePosition - 1;
+ let backslashCount = 0;
+ while (jsonString[index] === "\\") {
+ index -= 1;
+ backslashCount += 1;
+ }
+ return Boolean(backslashCount % 2);
+}
+function strip(string, start, end) {
+ return string.slice(start, end).replace(/\S/g, " ");
+}
+var singleComment = Symbol("singleComment");
+var multiComment = Symbol("multiComment");
+function stripJsonComments(jsonString) {
+ let isInsideString = false;
+ let isInsideComment = false;
+ let offset = 0;
+ let result = "";
+ for (let index = 0; index < jsonString.length; index++) {
+ const currentCharacter = jsonString[index];
+ const nextCharacter = jsonString[index + 1];
+ if (!isInsideComment && currentCharacter === '"') {
+ const escaped = isEscaped(jsonString, index);
+ if (!escaped) {
+ isInsideString = !isInsideString;
+ }
+ }
+ if (isInsideString) {
+ continue;
+ }
+ if (!isInsideComment && currentCharacter + nextCharacter === "//") {
+ result += jsonString.slice(offset, index);
+ offset = index;
+ isInsideComment = singleComment;
+ index++;
+ } else if (isInsideComment === singleComment && currentCharacter + nextCharacter === "\r\n") {
+ index++;
+ isInsideComment = false;
+ result += strip(jsonString, offset, index);
+ offset = index;
+ } else if (isInsideComment === singleComment && currentCharacter === "\n") {
+ isInsideComment = false;
+ result += strip(jsonString, offset, index);
+ offset = index;
+ } else if (!isInsideComment && currentCharacter + nextCharacter === "/*") {
+ result += jsonString.slice(offset, index);
+ offset = index;
+ isInsideComment = multiComment;
+ index++;
+ } else if (isInsideComment === multiComment && currentCharacter + nextCharacter === "*/") {
+ index++;
+ isInsideComment = false;
+ result += strip(jsonString, offset, index + 1);
+ offset = index + 1;
+ }
+ }
+ return result + (isInsideComment ? strip(jsonString.slice(offset)) : jsonString.slice(offset));
+}
+function stripBom(string) {
+ if (string.charCodeAt(0) === 65279) {
+ return string.slice(1);
+ }
+ return string;
+}
+var POSIX_SEP_RE = new RegExp("\\" + path__default.posix.sep, "g");
+var NATIVE_SEP_RE = new RegExp("\\" + path__default.sep, "g");
+var PATTERN_REGEX_CACHE = /* @__PURE__ */ new Map();
+var GLOB_ALL_PATTERN = `**/*`;
+var DEFAULT_EXTENSIONS = [".ts", ".tsx", ".mts", ".cts"];
+var DEFAULT_EXTENSIONS_RE_GROUP = `\\.(?:${DEFAULT_EXTENSIONS.map((ext) => ext.substring(1)).join("|")})`;
+new Function("path", "return import(path).then(m => m.default)");
+async function resolveTSConfig(filename) {
+ if (path__default.extname(filename) !== ".json") {
+ return;
+ }
+ const tsconfig = path__default.resolve(filename);
+ try {
+ const stat = await fs$n.promises.stat(tsconfig);
+ if (stat.isFile() || stat.isFIFO()) {
+ return tsconfig;
+ }
+ } catch (e) {
+ if (e.code !== "ENOENT") {
+ throw e;
+ }
+ }
+ throw new Error(`no tsconfig file found for ${filename}`);
+}
+function posix2native(filename) {
+ return path__default.posix.sep !== path__default.sep && filename.includes(path__default.posix.sep) ? filename.replace(POSIX_SEP_RE, path__default.sep) : filename;
+}
+function native2posix(filename) {
+ return path__default.posix.sep !== path__default.sep && filename.includes(path__default.sep) ? filename.replace(NATIVE_SEP_RE, path__default.posix.sep) : filename;
+}
+function resolve2posix(dir, filename) {
+ if (path__default.sep === path__default.posix.sep) {
+ return dir ? path__default.resolve(dir, filename) : path__default.resolve(filename);
+ }
+ return native2posix(dir ? path__default.resolve(posix2native(dir), posix2native(filename)) : path__default.resolve(posix2native(filename)));
+}
+function resolveReferencedTSConfigFiles(result) {
+ const dir = path__default.dirname(result.tsconfigFile);
+ return result.tsconfig.references.map((ref) => {
+ const refPath = ref.path.endsWith(".json") ? ref.path : path__default.join(ref.path, "tsconfig.json");
+ return resolve2posix(dir, refPath);
+ });
+}
+function resolveSolutionTSConfig(filename, result) {
+ if (result.referenced && DEFAULT_EXTENSIONS.some((ext) => filename.endsWith(ext)) && !isIncluded(filename, result)) {
+ const solutionTSConfig = result.referenced.find((referenced) => isIncluded(filename, referenced));
+ if (solutionTSConfig) {
+ return __spreadProps(__spreadValues({}, solutionTSConfig), {
+ solution: result
+ });
+ }
+ }
+ return result;
+}
+function isIncluded(filename, result) {
+ const dir = native2posix(path__default.dirname(result.tsconfigFile));
+ const files = (result.tsconfig.files || []).map((file) => resolve2posix(dir, file));
+ const absoluteFilename = resolve2posix(null, filename);
+ if (files.includes(filename)) {
+ return true;
+ }
+ const isIncluded2 = isGlobMatch(absoluteFilename, dir, result.tsconfig.include || (result.tsconfig.files ? [] : [GLOB_ALL_PATTERN]));
+ if (isIncluded2) {
+ const isExcluded = isGlobMatch(absoluteFilename, dir, result.tsconfig.exclude || []);
+ return !isExcluded;
+ }
+ return false;
+}
+function isGlobMatch(filename, dir, patterns) {
+ return patterns.some((pattern) => {
+ let lastWildcardIndex = pattern.length;
+ let hasWildcard = false;
+ for (let i = pattern.length - 1; i > -1; i--) {
+ if (pattern[i] === "*" || pattern[i] === "?") {
+ lastWildcardIndex = i;
+ hasWildcard = true;
+ break;
+ }
+ }
+ if (lastWildcardIndex < pattern.length - 1 && !filename.endsWith(pattern.slice(lastWildcardIndex + 1))) {
+ return false;
+ }
+ if (pattern.endsWith("*") && !DEFAULT_EXTENSIONS.some((ext) => filename.endsWith(ext))) {
+ return false;
+ }
+ if (pattern === GLOB_ALL_PATTERN) {
+ return filename.startsWith(`${dir}/`);
+ }
+ const resolvedPattern = resolve2posix(dir, pattern);
+ let firstWildcardIndex = -1;
+ for (let i = 0; i < resolvedPattern.length; i++) {
+ if (resolvedPattern[i] === "*" || resolvedPattern[i] === "?") {
+ firstWildcardIndex = i;
+ hasWildcard = true;
+ break;
+ }
+ }
+ if (firstWildcardIndex > 1 && !filename.startsWith(resolvedPattern.slice(0, firstWildcardIndex - 1))) {
+ return false;
+ }
+ if (!hasWildcard) {
+ return filename === resolvedPattern;
+ }
+ if (PATTERN_REGEX_CACHE.has(resolvedPattern)) {
+ return PATTERN_REGEX_CACHE.get(resolvedPattern).test(filename);
+ }
+ const regex = pattern2regex(resolvedPattern);
+ PATTERN_REGEX_CACHE.set(resolvedPattern, regex);
+ return regex.test(filename);
+ });
+}
+function pattern2regex(resolvedPattern) {
+ let regexStr = "^";
+ for (let i = 0; i < resolvedPattern.length; i++) {
+ const char = resolvedPattern[i];
+ if (char === "?") {
+ regexStr += "[^\\/]";
+ continue;
+ }
+ if (char === "*") {
+ if (resolvedPattern[i + 1] === "*" && resolvedPattern[i + 2] === "/") {
+ i += 2;
+ regexStr += "(?:[^\\/]*\\/)*";
+ continue;
+ }
+ regexStr += "[^\\/]*";
+ continue;
+ }
+ if ("/.+^${}()|[]\\".includes(char)) {
+ regexStr += `\\`;
+ }
+ regexStr += char;
+ }
+ if (resolvedPattern.endsWith("*")) {
+ regexStr += DEFAULT_EXTENSIONS_RE_GROUP;
+ }
+ regexStr += "$";
+ return new RegExp(regexStr);
+}
+
+// src/parse.ts
+async function parse$f(filename, options) {
+ const cache = options == null ? void 0 : options.cache;
+ if (cache == null ? void 0 : cache.has(filename)) {
+ return cache.get(filename);
+ }
+ let tsconfigFile;
+ if (options == null ? void 0 : options.resolveWithEmptyIfConfigNotFound) {
+ try {
+ tsconfigFile = await resolveTSConfig(filename) || await find(filename, options);
+ } catch (e) {
+ const notFoundResult = {
+ tsconfigFile: "no_tsconfig_file_found",
+ tsconfig: {}
+ };
+ cache == null ? void 0 : cache.set(filename, notFoundResult);
+ return notFoundResult;
+ }
+ } else {
+ tsconfigFile = await resolveTSConfig(filename) || await find(filename, options);
+ }
+ let result;
+ if (cache == null ? void 0 : cache.has(tsconfigFile)) {
+ result = cache.get(tsconfigFile);
+ } else {
+ result = await parseFile$1(tsconfigFile, cache);
+ await Promise.all([parseExtends(result, cache), parseReferences(result, cache)]);
+ cache == null ? void 0 : cache.set(tsconfigFile, result);
+ }
+ result = resolveSolutionTSConfig(filename, result);
+ cache == null ? void 0 : cache.set(filename, result);
+ return result;
+}
+async function parseFile$1(tsconfigFile, cache) {
+ if (cache == null ? void 0 : cache.has(tsconfigFile)) {
+ return cache.get(tsconfigFile);
+ }
+ try {
+ const tsconfigJson = await fs$n.promises.readFile(tsconfigFile, "utf-8");
+ const json = toJson(tsconfigJson);
+ const result = {
+ tsconfigFile,
+ tsconfig: normalizeTSConfig(JSON.parse(json), path__default.dirname(tsconfigFile))
+ };
+ cache == null ? void 0 : cache.set(tsconfigFile, result);
+ return result;
+ } catch (e) {
+ throw new TSConfckParseError(`parsing ${tsconfigFile} failed: ${e}`, "PARSE_FILE", tsconfigFile, e);
+ }
+}
+function normalizeTSConfig(tsconfig, dir) {
+ var _a;
+ if (((_a = tsconfig.compilerOptions) == null ? void 0 : _a.baseUrl) && !path__default.isAbsolute(tsconfig.compilerOptions.baseUrl)) {
+ tsconfig.compilerOptions.baseUrl = resolve2posix(dir, tsconfig.compilerOptions.baseUrl);
+ }
+ return tsconfig;
+}
+async function parseReferences(result, cache) {
+ if (!result.tsconfig.references) {
+ return;
+ }
+ const referencedFiles = resolveReferencedTSConfigFiles(result);
+ const referenced = await Promise.all(referencedFiles.map((file) => parseFile$1(file, cache)));
+ await Promise.all(referenced.map((ref) => parseExtends(ref, cache)));
+ result.referenced = referenced;
+}
+async function parseExtends(result, cache) {
+ if (!result.tsconfig.extends) {
+ return;
+ }
+ const extended = [
+ { tsconfigFile: result.tsconfigFile, tsconfig: JSON.parse(JSON.stringify(result.tsconfig)) }
+ ];
+ while (extended[extended.length - 1].tsconfig.extends) {
+ const extending = extended[extended.length - 1];
+ const extendedTSConfigFile = resolveExtends(extending.tsconfig.extends, extending.tsconfigFile);
+ if (extended.some((x) => x.tsconfigFile === extendedTSConfigFile)) {
+ const circle = extended.concat({ tsconfigFile: extendedTSConfigFile, tsconfig: null }).map((e) => e.tsconfigFile).join(" -> ");
+ throw new TSConfckParseError(`Circular dependency in "extends": ${circle}`, "EXTENDS_CIRCULAR", result.tsconfigFile);
+ }
+ extended.push(await parseFile$1(extendedTSConfigFile, cache));
+ }
+ result.extended = extended;
+ for (const ext of result.extended.slice(1)) {
+ extendTSConfig(result, ext);
+ }
+}
+function resolveExtends(extended, from) {
+ let error;
+ try {
+ return require$$0$7.createRequire(from).resolve(extended);
+ } catch (e) {
+ error = e;
+ }
+ if (!path__default.isAbsolute(extended) && !extended.startsWith("./") && !extended.startsWith("../")) {
+ try {
+ const fallbackExtended = path__default.join(extended, "tsconfig.json");
+ return require$$0$7.createRequire(from).resolve(fallbackExtended);
+ } catch (e) {
+ error = e;
+ }
+ }
+ throw new TSConfckParseError(`failed to resolve "extends":"${extended}" in ${from}`, "EXTENDS_RESOLVE", from, error);
+}
+var EXTENDABLE_KEYS = [
+ "compilerOptions",
+ "files",
+ "include",
+ "exclude",
+ "watchOptions",
+ "compileOnSave",
+ "typeAcquisition",
+ "buildOptions"
+];
+function extendTSConfig(extending, extended) {
+ const extendingConfig = extending.tsconfig;
+ const extendedConfig = extended.tsconfig;
+ const relativePath = native2posix(path__default.relative(path__default.dirname(extending.tsconfigFile), path__default.dirname(extended.tsconfigFile)));
+ for (const key of Object.keys(extendedConfig).filter((key2) => EXTENDABLE_KEYS.includes(key2))) {
+ if (key === "compilerOptions") {
+ if (!extendingConfig.compilerOptions) {
+ extendingConfig.compilerOptions = {};
+ }
+ for (const option of Object.keys(extendedConfig.compilerOptions)) {
+ if (Object.prototype.hasOwnProperty.call(extendingConfig.compilerOptions, option)) {
+ continue;
+ }
+ extendingConfig.compilerOptions[option] = rebaseRelative(option, extendedConfig.compilerOptions[option], relativePath);
+ }
+ } else if (extendingConfig[key] === void 0) {
+ if (key === "watchOptions") {
+ extendingConfig.watchOptions = {};
+ for (const option of Object.keys(extendedConfig.watchOptions)) {
+ extendingConfig.watchOptions[option] = rebaseRelative(option, extendedConfig.watchOptions[option], relativePath);
+ }
+ } else {
+ extendingConfig[key] = rebaseRelative(key, extendedConfig[key], relativePath);
+ }
+ }
+ }
+}
+var REBASE_KEYS = [
+ "files",
+ "include",
+ "exclude",
+ "baseUrl",
+ "rootDir",
+ "rootDirs",
+ "typeRoots",
+ "outDir",
+ "outFile",
+ "declarationDir",
+ "excludeDirectories",
+ "excludeFiles"
+];
+function rebaseRelative(key, value, prependPath) {
+ if (!REBASE_KEYS.includes(key)) {
+ return value;
+ }
+ if (Array.isArray(value)) {
+ return value.map((x) => rebasePath(x, prependPath));
+ } else {
+ return rebasePath(value, prependPath);
+ }
+}
+function rebasePath(value, prependPath) {
+ if (path__default.isAbsolute(value)) {
+ return value;
+ } else {
+ return path__default.posix.normalize(path__default.posix.join(prependPath, value));
+ }
+}
+var TSConfckParseError = class extends Error {
+ constructor(message, code, tsconfigFile, cause) {
+ super(message);
+ Object.setPrototypeOf(this, TSConfckParseError.prototype);
+ this.name = TSConfckParseError.name;
+ this.code = code;
+ this.cause = cause;
+ this.tsconfigFile = tsconfigFile;
+ }
+};
+
+const debug$f = createDebugger('vite:esbuild');
+const INJECT_HELPERS_IIFE_RE = /(.*)(var [^\s]+=function\([^)]*?\){"use strict";)(.*)/;
+const INJECT_HELPERS_UMD_RE = /(.*)(\(function\([^)]*?\){.+amd.+function\([^)]*?\){"use strict";)(.*)/;
+let server;
+async function transformWithEsbuild(code, filename, options, inMap) {
+ var _a;
+ let loader = options === null || options === void 0 ? void 0 : options.loader;
+ if (!loader) {
+ // if the id ends with a valid ext, use it (e.g. vue blocks)
+ // otherwise, cleanup the query before checking the ext
+ const ext = path__default
+ .extname(/\.\w+$/.test(filename) ? filename : cleanUrl(filename))
+ .slice(1);
+ if (ext === 'cjs' || ext === 'mjs') {
+ loader = 'js';
+ }
+ else {
+ loader = ext;
+ }
+ }
+ let tsconfigRaw = options === null || options === void 0 ? void 0 : options.tsconfigRaw;
+ // if options provide tsconfigraw in string, it takes highest precedence
+ if (typeof tsconfigRaw !== 'string') {
+ // these fields would affect the compilation result
+ // https://esbuild.github.io/content-types/#tsconfig-json
+ const meaningfulFields = [
+ 'target',
+ 'jsxFactory',
+ 'jsxFragmentFactory',
+ 'useDefineForClassFields',
+ 'importsNotUsedAsValues',
+ 'preserveValueImports'
+ ];
+ const compilerOptionsForFile = {};
+ if (loader === 'ts' || loader === 'tsx') {
+ const loadedTsconfig = await loadTsconfigJsonForFile(filename);
+ const loadedCompilerOptions = (_a = loadedTsconfig.compilerOptions) !== null && _a !== void 0 ? _a : {};
+ for (const field of meaningfulFields) {
+ if (field in loadedCompilerOptions) {
+ // @ts-ignore TypeScript can't tell they are of the same type
+ compilerOptionsForFile[field] = loadedCompilerOptions[field];
+ }
+ }
+ }
+ tsconfigRaw = {
+ ...tsconfigRaw,
+ compilerOptions: {
+ ...compilerOptionsForFile,
+ ...tsconfigRaw === null || tsconfigRaw === void 0 ? void 0 : tsconfigRaw.compilerOptions
+ }
+ };
+ }
+ const resolvedOptions = {
+ sourcemap: true,
+ // ensure source file name contains full query
+ sourcefile: filename,
+ ...options,
+ loader,
+ tsconfigRaw
+ };
+ delete resolvedOptions.include;
+ delete resolvedOptions.exclude;
+ delete resolvedOptions.jsxInject;
+ try {
+ const result = await esbuild.transform(code, resolvedOptions);
+ let map;
+ if (inMap && resolvedOptions.sourcemap) {
+ const nextMap = JSON.parse(result.map);
+ nextMap.sourcesContent = [];
+ map = combineSourcemaps(filename, [
+ nextMap,
+ inMap
+ ]);
+ }
+ else {
+ map = resolvedOptions.sourcemap
+ ? JSON.parse(result.map)
+ : { mappings: '' };
+ }
+ if (Array.isArray(map.sources)) {
+ map.sources = map.sources.map((it) => toUpperCaseDriveLetter(it));
+ }
+ return {
+ ...result,
+ map
+ };
+ }
+ catch (e) {
+ debug$f(`esbuild error with options used: `, resolvedOptions);
+ // patch error information
+ if (e.errors) {
+ e.frame = '';
+ e.errors.forEach((m) => {
+ e.frame += `\n` + prettifyMessage(m, code);
+ });
+ e.loc = e.errors[0].location;
+ }
+ throw e;
+ }
+}
+function esbuildPlugin(options = {}) {
+ const filter = createFilter$1(options.include || /\.(tsx?|jsx)$/, options.exclude || /\.js$/);
+ return {
+ name: 'vite:esbuild',
+ configureServer(_server) {
+ server = _server;
+ server.watcher
+ .on('add', reloadOnTsconfigChange)
+ .on('change', reloadOnTsconfigChange)
+ .on('unlink', reloadOnTsconfigChange);
+ },
+ async configResolved(config) {
+ await initTSConfck(config);
+ },
+ buildEnd() {
+ // recycle serve to avoid preventing Node self-exit (#6815)
+ server = null;
+ },
+ async transform(code, id) {
+ if (filter(id) || filter(cleanUrl(id))) {
+ const result = await transformWithEsbuild(code, id, options);
+ if (result.warnings.length) {
+ result.warnings.forEach((m) => {
+ this.warn(prettifyMessage(m, code));
+ });
+ }
+ if (options.jsxInject && /\.(?:j|t)sx\b/.test(id)) {
+ result.code = options.jsxInject + ';' + result.code;
+ }
+ return {
+ code: result.code,
+ map: result.map
+ };
+ }
+ }
+ };
+}
+const rollupToEsbuildFormatMap = {
+ es: 'esm',
+ cjs: 'cjs',
+ // passing `var Lib = (() => {})()` to esbuild with format = "iife"
+ // will turn it to `(() => { var Lib = (() => {})() })()`,
+ // so we remove the format config to tell esbuild not doing this
+ //
+ // although esbuild doesn't change format, there is still possibility
+ // that `{ treeShaking: true }` removes a top-level no-side-effect variable
+ // like: `var Lib = 1`, which becomes `` after esbuild transforming,
+ // but thankfully rollup does not do this optimization now
+ iife: undefined
+};
+const buildEsbuildPlugin = (config) => {
+ return {
+ name: 'vite:esbuild-transpile',
+ async configResolved(config) {
+ await initTSConfck(config);
+ },
+ async renderChunk(code, chunk, opts) {
+ // @ts-ignore injected by @vitejs/plugin-legacy
+ if (opts.__vite_skip_esbuild__) {
+ return null;
+ }
+ const target = config.build.target;
+ const minify = config.build.minify === 'esbuild' &&
+ // Do not minify ES lib output since that would remove pure annotations
+ // and break tree-shaking
+ // https://github.com/vuejs/core/issues/2860#issuecomment-926882793
+ !(config.build.lib && opts.format === 'es');
+ if ((!target || target === 'esnext') && !minify) {
+ return null;
+ }
+ const res = await transformWithEsbuild(code, chunk.fileName, {
+ ...config.esbuild,
+ target: target || undefined,
+ ...(minify
+ ? {
+ minify,
+ treeShaking: true,
+ format: rollupToEsbuildFormatMap[opts.format]
+ }
+ : undefined)
+ });
+ if (config.build.lib) {
+ // #7188, esbuild adds helpers out of the UMD and IIFE wrappers, and the
+ // names are minified potentially causing collision with other globals.
+ // We use a regex to inject the helpers inside the wrappers.
+ // We don't need to create a MagicString here because both the helpers and
+ // the headers don't modify the sourcemap
+ const injectHelpers = opts.format === 'umd'
+ ? INJECT_HELPERS_UMD_RE
+ : opts.format === 'iife'
+ ? INJECT_HELPERS_IIFE_RE
+ : undefined;
+ if (injectHelpers) {
+ res.code = res.code.replace(injectHelpers, (_, helpers, header, rest) => header + helpers + rest);
+ }
+ }
+ return res;
+ }
+ };
+};
+function prettifyMessage(m, code) {
+ let res = colors$1.yellow(m.text);
+ if (m.location) {
+ const lines = code.split(/\r?\n/g);
+ const line = Number(m.location.line);
+ const column = Number(m.location.column);
+ const offset = lines
+ .slice(0, line - 1)
+ .map((l) => l.length)
+ .reduce((total, l) => total + l + 1, 0) + column;
+ res += `\n` + generateCodeFrame(code, offset, offset + 1);
+ }
+ return res + `\n`;
+}
+const tsconfckParseOptions = {
+ cache: new Map(),
+ tsConfigPaths: undefined,
+ root: undefined,
+ resolveWithEmptyIfConfigNotFound: true
+};
+async function initTSConfck(config) {
+ tsconfckParseOptions.cache.clear();
+ const workspaceRoot = searchForWorkspaceRoot(config.root);
+ tsconfckParseOptions.root = workspaceRoot;
+ tsconfckParseOptions.tsConfigPaths = new Set([
+ ...(await findAll(workspaceRoot, {
+ skip: (dir) => dir === 'node_modules' || dir === '.git'
+ }))
+ ]);
+}
+async function loadTsconfigJsonForFile(filename) {
+ try {
+ const result = await parse$f(filename, tsconfckParseOptions);
+ // tsconfig could be out of root, make sure it is watched on dev
+ if (server && result.tsconfigFile !== 'no_tsconfig_file_found') {
+ ensureWatchedFile(server.watcher, result.tsconfigFile, server.config.root);
+ }
+ return result.tsconfig;
+ }
+ catch (e) {
+ if (e instanceof TSConfckParseError) {
+ // tsconfig could be out of root, make sure it is watched on dev
+ if (server && e.tsconfigFile) {
+ ensureWatchedFile(server.watcher, e.tsconfigFile, server.config.root);
+ }
+ }
+ throw e;
+ }
+}
+function reloadOnTsconfigChange(changedFile) {
+ var _a;
+ // any tsconfig.json that's added in the workspace could be closer to a code file than a previously cached one
+ // any json file in the tsconfig cache could have been used to compile ts
+ if (path__default.basename(changedFile) === 'tsconfig.json' ||
+ (changedFile.endsWith('.json') &&
+ ((_a = tsconfckParseOptions === null || tsconfckParseOptions === void 0 ? void 0 : tsconfckParseOptions.cache) === null || _a === void 0 ? void 0 : _a.has(changedFile)))) {
+ server.config.logger.info(`changed tsconfig file detected: ${changedFile} - Clearing cache and forcing full-reload to ensure typescript is compiled with updated config values.`, { clear: server.config.clearScreen, timestamp: true });
+ // clear module graph to remove code compiled with outdated config
+ server.moduleGraph.invalidateAll();
+ // reset tsconfck so that recompile works with up2date configs
+ initTSConfck(server.config).finally(() => {
+ // force full reload
+ server.ws.send({
+ type: 'full-reload',
+ path: '*'
+ });
+ });
+ }
+}
+
+var dist$2 = {};
+
+var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(dist$2, "__esModule", { value: true });
+var Worker_1 = dist$2.Worker = void 0;
+const os_1 = __importDefault(require$$2__default);
+const worker_threads_1 = require$$1__default;
+class Worker {
+ constructor(fn, options = {}) {
+ this.code = genWorkerCode(fn);
+ this.max = options.max || Math.max(1, os_1.default.cpus().length - 1);
+ this.pool = [];
+ this.idlePool = [];
+ this.queue = [];
+ }
+ async run(...args) {
+ const worker = await this._getAvailableWorker();
+ return new Promise((resolve, reject) => {
+ worker.currentResolve = resolve;
+ worker.currentReject = reject;
+ worker.postMessage(args);
+ });
+ }
+ stop() {
+ this.pool.forEach((w) => w.unref());
+ this.queue.forEach(([_, reject]) => reject(new Error('Main worker pool stopped before a worker was available.')));
+ this.pool = [];
+ this.idlePool = [];
+ this.queue = [];
+ }
+ async _getAvailableWorker() {
+ // has idle one?
+ if (this.idlePool.length) {
+ return this.idlePool.shift();
+ }
+ // can spawn more?
+ if (this.pool.length < this.max) {
+ const worker = new worker_threads_1.Worker(this.code, { eval: true });
+ worker.on('message', (res) => {
+ worker.currentResolve && worker.currentResolve(res);
+ worker.currentResolve = null;
+ this._assignDoneWorker(worker);
+ });
+ worker.on('error', (err) => {
+ worker.currentReject && worker.currentReject(err);
+ worker.currentReject = null;
+ });
+ worker.on('exit', (code) => {
+ const i = this.pool.indexOf(worker);
+ if (i > -1)
+ this.pool.splice(i, 1);
+ if (code !== 0 && worker.currentReject) {
+ worker.currentReject(new Error(`Wroker stopped with non-0 exit code ${code}`));
+ worker.currentReject = null;
+ }
+ });
+ this.pool.push(worker);
+ return worker;
+ }
+ // no one is available, we have to wait
+ let resolve;
+ let reject;
+ const onWorkerAvailablePromise = new Promise((r, rj) => {
+ resolve = r;
+ reject = rj;
+ });
+ this.queue.push([resolve, reject]);
+ return onWorkerAvailablePromise;
+ }
+ _assignDoneWorker(worker) {
+ // someone's waiting already?
+ if (this.queue.length) {
+ const [resolve] = this.queue.shift();
+ resolve(worker);
+ return;
+ }
+ // take a rest.
+ this.idlePool.push(worker);
+ }
+}
+Worker_1 = dist$2.Worker = Worker;
+function genWorkerCode(fn) {
+ return `
+const doWork = ${fn.toString()}
+
+const { parentPort } = require('worker_threads')
+
+parentPort.on('message', async (args) => {
+ const res = await doWork(...args)
+ parentPort.postMessage(res)
+})
+ `;
+}
+
+function terserPlugin(config) {
+ const makeWorker = () => new Worker_1((basedir, code, options) => {
+ // when vite is linked, the worker thread won't share the same resolve
+ // root with vite itself, so we have to pass in the basedir and resolve
+ // terser first.
+ // eslint-disable-next-line node/no-restricted-require
+ const terserPath = require.resolve('vite/dist/node/terser', {
+ paths: [basedir]
+ });
+ return require(terserPath).minify(code, options);
+ });
+ let worker;
+ return {
+ name: 'vite:terser',
+ async renderChunk(code, _chunk, outputOptions) {
+ // This plugin is included for any non-false value of config.build.minify,
+ // so that normal chunks can use the preferred minifier, and legacy chunks
+ // can use terser.
+ if (config.build.minify !== 'terser' &&
+ // @ts-ignore injected by @vitejs/plugin-legacy
+ !outputOptions.__vite_force_terser__) {
+ return null;
+ }
+ // Do not minify ES lib output since that would remove pure annotations
+ // and break tree-shaking.
+ if (config.build.lib && outputOptions.format === 'es') {
+ return null;
+ }
+ // Lazy load worker.
+ worker || (worker = makeWorker());
+ const res = await worker.run(__dirname, code, {
+ safari10: true,
+ ...config.build.terserOptions,
+ sourceMap: !!outputOptions.sourcemap,
+ module: outputOptions.format.startsWith('es'),
+ toplevel: outputOptions.format === 'cjs'
+ });
+ return {
+ code: res.code,
+ map: res.map
+ };
+ },
+ closeBundle() {
+ worker === null || worker === void 0 ? void 0 : worker.stop();
+ }
+ };
+}
+
+function manifestPlugin(config) {
+ const manifest = {};
+ let outputCount;
+ return {
+ name: 'vite:manifest',
+ buildStart() {
+ outputCount = 0;
+ },
+ generateBundle({ format }, bundle) {
+ var _a;
+ function getChunkName(chunk) {
+ if (chunk.facadeModuleId) {
+ let name = normalizePath$3(path__default.relative(config.root, chunk.facadeModuleId));
+ if (format === 'system' && !chunk.name.includes('-legacy')) {
+ const ext = path__default.extname(name);
+ name = name.slice(0, -ext.length) + `-legacy` + ext;
+ }
+ return name.replace(/\0/g, '');
+ }
+ else {
+ return `_` + path__default.basename(chunk.fileName);
+ }
+ }
+ function getInternalImports(imports) {
+ const filteredImports = [];
+ for (const file of imports) {
+ if (bundle[file] === undefined) {
+ continue;
+ }
+ filteredImports.push(getChunkName(bundle[file]));
+ }
+ return filteredImports;
+ }
+ function createChunk(chunk) {
+ const manifestChunk = {
+ file: chunk.fileName
+ };
+ if (chunk.facadeModuleId) {
+ manifestChunk.src = getChunkName(chunk);
+ }
+ if (chunk.isEntry) {
+ manifestChunk.isEntry = true;
+ }
+ if (chunk.isDynamicEntry) {
+ manifestChunk.isDynamicEntry = true;
+ }
+ if (chunk.imports.length) {
+ const internalImports = getInternalImports(chunk.imports);
+ if (internalImports.length > 0) {
+ manifestChunk.imports = internalImports;
+ }
+ }
+ if (chunk.dynamicImports.length) {
+ const internalImports = getInternalImports(chunk.dynamicImports);
+ if (internalImports.length > 0) {
+ manifestChunk.dynamicImports = internalImports;
+ }
+ }
+ if (chunk.viteMetadata.importedCss.size) {
+ manifestChunk.css = [...chunk.viteMetadata.importedCss];
+ }
+ if (chunk.viteMetadata.importedAssets.size) {
+ manifestChunk.assets = [...chunk.viteMetadata.importedAssets];
+ }
+ return manifestChunk;
+ }
+ for (const file in bundle) {
+ const chunk = bundle[file];
+ if (chunk.type === 'chunk') {
+ manifest[getChunkName(chunk)] = createChunk(chunk);
+ }
+ }
+ outputCount++;
+ const output = (_a = config.build.rollupOptions) === null || _a === void 0 ? void 0 : _a.output;
+ const outputLength = Array.isArray(output) ? output.length : 1;
+ if (outputCount >= outputLength) {
+ this.emitFile({
+ fileName: typeof config.build.manifest === 'string'
+ ? config.build.manifest
+ : 'manifest.json',
+ type: 'asset',
+ source: JSON.stringify(manifest, null, 2)
+ });
+ }
+ }
+ };
+}
+
+// This is based on @rollup/plugin-data-uri
+const dataUriRE = /^([^/]+\/[^;,]+)(;base64)?,([\s\S]*)$/;
+const dataUriPrefix = `/@data-uri/`;
+/**
+ * Build only, since importing from a data URI works natively.
+ */
+function dataURIPlugin() {
+ let resolved;
+ return {
+ name: 'vite:data-uri',
+ buildStart() {
+ resolved = {};
+ },
+ resolveId(id) {
+ if (!dataUriRE.test(id)) {
+ return null;
+ }
+ const uri = new require$$0$6.URL(id);
+ if (uri.protocol !== 'data:') {
+ return null;
+ }
+ const match = uri.pathname.match(dataUriRE);
+ if (!match) {
+ return null;
+ }
+ const [, mime, format, data] = match;
+ if (mime !== 'text/javascript') {
+ throw new Error(`data URI with non-JavaScript mime type is not supported.`);
+ }
+ // decode data
+ const base64 = format && /base64/i.test(format.substring(1));
+ const content = base64
+ ? Buffer.from(data, 'base64').toString('utf-8')
+ : data;
+ resolved[id] = content;
+ return dataUriPrefix + id;
+ },
+ load(id) {
+ if (id.startsWith(dataUriPrefix)) {
+ id = id.slice(dataUriPrefix.length);
+ return resolved[id] || null;
+ }
+ }
+ };
+}
+
+class BitSet {
+ constructor(arg) {
+ this.bits = arg instanceof BitSet ? arg.bits.slice() : [];
+ }
+
+ add(n) {
+ this.bits[n >> 5] |= 1 << (n & 31);
+ }
+
+ has(n) {
+ return !!(this.bits[n >> 5] & (1 << (n & 31)));
+ }
+}
+
+class Chunk {
+ constructor(start, end, content) {
+ this.start = start;
+ this.end = end;
+ this.original = content;
+
+ this.intro = '';
+ this.outro = '';
+
+ this.content = content;
+ this.storeName = false;
+ this.edited = false;
+
+ // we make these non-enumerable, for sanity while debugging
+ Object.defineProperties(this, {
+ previous: { writable: true, value: null },
+ next: { writable: true, value: null },
+ });
+ }
+
+ appendLeft(content) {
+ this.outro += content;
+ }
+
+ appendRight(content) {
+ this.intro = this.intro + content;
+ }
+
+ clone() {
+ const chunk = new Chunk(this.start, this.end, this.original);
+
+ chunk.intro = this.intro;
+ chunk.outro = this.outro;
+ chunk.content = this.content;
+ chunk.storeName = this.storeName;
+ chunk.edited = this.edited;
+
+ return chunk;
+ }
+
+ contains(index) {
+ return this.start < index && index < this.end;
+ }
+
+ eachNext(fn) {
+ let chunk = this;
+ while (chunk) {
+ fn(chunk);
+ chunk = chunk.next;
+ }
+ }
+
+ eachPrevious(fn) {
+ let chunk = this;
+ while (chunk) {
+ fn(chunk);
+ chunk = chunk.previous;
+ }
+ }
+
+ edit(content, storeName, contentOnly) {
+ this.content = content;
+ if (!contentOnly) {
+ this.intro = '';
+ this.outro = '';
+ }
+ this.storeName = storeName;
+
+ this.edited = true;
+
+ return this;
+ }
+
+ prependLeft(content) {
+ this.outro = content + this.outro;
+ }
+
+ prependRight(content) {
+ this.intro = content + this.intro;
+ }
+
+ split(index) {
+ const sliceIndex = index - this.start;
+
+ const originalBefore = this.original.slice(0, sliceIndex);
+ const originalAfter = this.original.slice(sliceIndex);
+
+ this.original = originalBefore;
+
+ const newChunk = new Chunk(index, this.end, originalAfter);
+ newChunk.outro = this.outro;
+ this.outro = '';
+
+ this.end = index;
+
+ if (this.edited) {
+ // TODO is this block necessary?...
+ newChunk.edit('', false);
+ this.content = '';
+ } else {
+ this.content = originalBefore;
+ }
+
+ newChunk.next = this.next;
+ if (newChunk.next) newChunk.next.previous = newChunk;
+ newChunk.previous = this;
+ this.next = newChunk;
+
+ return newChunk;
+ }
+
+ toString() {
+ return this.intro + this.content + this.outro;
+ }
+
+ trimEnd(rx) {
+ this.outro = this.outro.replace(rx, '');
+ if (this.outro.length) return true;
+
+ const trimmed = this.content.replace(rx, '');
+
+ if (trimmed.length) {
+ if (trimmed !== this.content) {
+ this.split(this.start + trimmed.length).edit('', undefined, true);
+ }
+ return true;
+ } else {
+ this.edit('', undefined, true);
+
+ this.intro = this.intro.replace(rx, '');
+ if (this.intro.length) return true;
+ }
+ }
+
+ trimStart(rx) {
+ this.intro = this.intro.replace(rx, '');
+ if (this.intro.length) return true;
+
+ const trimmed = this.content.replace(rx, '');
+
+ if (trimmed.length) {
+ if (trimmed !== this.content) {
+ this.split(this.end - trimmed.length);
+ this.edit('', undefined, true);
+ }
+ return true;
+ } else {
+ this.edit('', undefined, true);
+
+ this.outro = this.outro.replace(rx, '');
+ if (this.outro.length) return true;
+ }
+ }
+}
+
+let btoa$1 = () => {
+ throw new Error('Unsupported environment: `window.btoa` or `Buffer` should be supported.');
+};
+if (typeof window !== 'undefined' && typeof window.btoa === 'function') {
+ btoa$1 = (str) => window.btoa(unescape(encodeURIComponent(str)));
+} else if (typeof Buffer === 'function') {
+ btoa$1 = (str) => Buffer.from(str, 'utf-8').toString('base64');
+}
+
+class SourceMap {
+ constructor(properties) {
+ this.version = 3;
+ this.file = properties.file;
+ this.sources = properties.sources;
+ this.sourcesContent = properties.sourcesContent;
+ this.names = properties.names;
+ this.mappings = encode$1(properties.mappings);
+ }
+
+ toString() {
+ return JSON.stringify(this);
+ }
+
+ toUrl() {
+ return 'data:application/json;charset=utf-8;base64,' + btoa$1(this.toString());
+ }
+}
+
+function guessIndent(code) {
+ const lines = code.split('\n');
+
+ const tabbed = lines.filter((line) => /^\t+/.test(line));
+ const spaced = lines.filter((line) => /^ {2,}/.test(line));
+
+ if (tabbed.length === 0 && spaced.length === 0) {
+ return null;
+ }
+
+ // More lines tabbed than spaced? Assume tabs, and
+ // default to tabs in the case of a tie (or nothing
+ // to go on)
+ if (tabbed.length >= spaced.length) {
+ return '\t';
+ }
+
+ // Otherwise, we need to guess the multiple
+ const min = spaced.reduce((previous, current) => {
+ const numSpaces = /^ +/.exec(current)[0].length;
+ return Math.min(numSpaces, previous);
+ }, Infinity);
+
+ return new Array(min + 1).join(' ');
+}
+
+function getRelativePath(from, to) {
+ const fromParts = from.split(/[/\\]/);
+ const toParts = to.split(/[/\\]/);
+
+ fromParts.pop(); // get dirname
+
+ while (fromParts[0] === toParts[0]) {
+ fromParts.shift();
+ toParts.shift();
+ }
+
+ if (fromParts.length) {
+ let i = fromParts.length;
+ while (i--) fromParts[i] = '..';
+ }
+
+ return fromParts.concat(toParts).join('/');
+}
+
+const toString$2 = Object.prototype.toString;
+
+function isObject(thing) {
+ return toString$2.call(thing) === '[object Object]';
+}
+
+function getLocator(source) {
+ const originalLines = source.split('\n');
+ const lineOffsets = [];
+
+ for (let i = 0, pos = 0; i < originalLines.length; i++) {
+ lineOffsets.push(pos);
+ pos += originalLines[i].length + 1;
+ }
+
+ return function locate(index) {
+ let i = 0;
+ let j = lineOffsets.length;
+ while (i < j) {
+ const m = (i + j) >> 1;
+ if (index < lineOffsets[m]) {
+ j = m;
+ } else {
+ i = m + 1;
+ }
+ }
+ const line = i - 1;
+ const column = index - lineOffsets[line];
+ return { line, column };
+ };
+}
+
+class Mappings {
+ constructor(hires) {
+ this.hires = hires;
+ this.generatedCodeLine = 0;
+ this.generatedCodeColumn = 0;
+ this.raw = [];
+ this.rawSegments = this.raw[this.generatedCodeLine] = [];
+ this.pending = null;
+ }
+
+ addEdit(sourceIndex, content, loc, nameIndex) {
+ if (content.length) {
+ const segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];
+ if (nameIndex >= 0) {
+ segment.push(nameIndex);
+ }
+ this.rawSegments.push(segment);
+ } else if (this.pending) {
+ this.rawSegments.push(this.pending);
+ }
+
+ this.advance(content);
+ this.pending = null;
+ }
+
+ addUneditedChunk(sourceIndex, chunk, original, loc, sourcemapLocations) {
+ let originalCharIndex = chunk.start;
+ let first = true;
+
+ while (originalCharIndex < chunk.end) {
+ if (this.hires || first || sourcemapLocations.has(originalCharIndex)) {
+ this.rawSegments.push([this.generatedCodeColumn, sourceIndex, loc.line, loc.column]);
+ }
+
+ if (original[originalCharIndex] === '\n') {
+ loc.line += 1;
+ loc.column = 0;
+ this.generatedCodeLine += 1;
+ this.raw[this.generatedCodeLine] = this.rawSegments = [];
+ this.generatedCodeColumn = 0;
+ first = true;
+ } else {
+ loc.column += 1;
+ this.generatedCodeColumn += 1;
+ first = false;
+ }
+
+ originalCharIndex += 1;
+ }
+
+ this.pending = null;
+ }
+
+ advance(str) {
+ if (!str) return;
+
+ const lines = str.split('\n');
+
+ if (lines.length > 1) {
+ for (let i = 0; i < lines.length - 1; i++) {
+ this.generatedCodeLine++;
+ this.raw[this.generatedCodeLine] = this.rawSegments = [];
+ }
+ this.generatedCodeColumn = 0;
+ }
+
+ this.generatedCodeColumn += lines[lines.length - 1].length;
+ }
+}
+
+const n = '\n';
+
+const warned$1 = {
+ insertLeft: false,
+ insertRight: false,
+ storeName: false,
+};
+
+class MagicString {
+ constructor(string, options = {}) {
+ const chunk = new Chunk(0, string.length, string);
+
+ Object.defineProperties(this, {
+ original: { writable: true, value: string },
+ outro: { writable: true, value: '' },
+ intro: { writable: true, value: '' },
+ firstChunk: { writable: true, value: chunk },
+ lastChunk: { writable: true, value: chunk },
+ lastSearchedChunk: { writable: true, value: chunk },
+ byStart: { writable: true, value: {} },
+ byEnd: { writable: true, value: {} },
+ filename: { writable: true, value: options.filename },
+ indentExclusionRanges: { writable: true, value: options.indentExclusionRanges },
+ sourcemapLocations: { writable: true, value: new BitSet() },
+ storedNames: { writable: true, value: {} },
+ indentStr: { writable: true, value: guessIndent(string) },
+ });
+
+ this.byStart[0] = chunk;
+ this.byEnd[string.length] = chunk;
+ }
+
+ addSourcemapLocation(char) {
+ this.sourcemapLocations.add(char);
+ }
+
+ append(content) {
+ if (typeof content !== 'string') throw new TypeError('outro content must be a string');
+
+ this.outro += content;
+ return this;
+ }
+
+ appendLeft(index, content) {
+ if (typeof content !== 'string') throw new TypeError('inserted content must be a string');
+
+ this._split(index);
+
+ const chunk = this.byEnd[index];
+
+ if (chunk) {
+ chunk.appendLeft(content);
+ } else {
+ this.intro += content;
+ }
+ return this;
+ }
+
+ appendRight(index, content) {
+ if (typeof content !== 'string') throw new TypeError('inserted content must be a string');
+
+ this._split(index);
+
+ const chunk = this.byStart[index];
+
+ if (chunk) {
+ chunk.appendRight(content);
+ } else {
+ this.outro += content;
+ }
+ return this;
+ }
+
+ clone() {
+ const cloned = new MagicString(this.original, { filename: this.filename });
+
+ let originalChunk = this.firstChunk;
+ let clonedChunk = (cloned.firstChunk = cloned.lastSearchedChunk = originalChunk.clone());
+
+ while (originalChunk) {
+ cloned.byStart[clonedChunk.start] = clonedChunk;
+ cloned.byEnd[clonedChunk.end] = clonedChunk;
+
+ const nextOriginalChunk = originalChunk.next;
+ const nextClonedChunk = nextOriginalChunk && nextOriginalChunk.clone();
+
+ if (nextClonedChunk) {
+ clonedChunk.next = nextClonedChunk;
+ nextClonedChunk.previous = clonedChunk;
+
+ clonedChunk = nextClonedChunk;
+ }
+
+ originalChunk = nextOriginalChunk;
+ }
+
+ cloned.lastChunk = clonedChunk;
+
+ if (this.indentExclusionRanges) {
+ cloned.indentExclusionRanges = this.indentExclusionRanges.slice();
+ }
+
+ cloned.sourcemapLocations = new BitSet(this.sourcemapLocations);
+
+ cloned.intro = this.intro;
+ cloned.outro = this.outro;
+
+ return cloned;
+ }
+
+ generateDecodedMap(options) {
+ options = options || {};
+
+ const sourceIndex = 0;
+ const names = Object.keys(this.storedNames);
+ const mappings = new Mappings(options.hires);
+
+ const locate = getLocator(this.original);
+
+ if (this.intro) {
+ mappings.advance(this.intro);
+ }
+
+ this.firstChunk.eachNext((chunk) => {
+ const loc = locate(chunk.start);
+
+ if (chunk.intro.length) mappings.advance(chunk.intro);
+
+ if (chunk.edited) {
+ mappings.addEdit(
+ sourceIndex,
+ chunk.content,
+ loc,
+ chunk.storeName ? names.indexOf(chunk.original) : -1
+ );
+ } else {
+ mappings.addUneditedChunk(sourceIndex, chunk, this.original, loc, this.sourcemapLocations);
+ }
+
+ if (chunk.outro.length) mappings.advance(chunk.outro);
+ });
+
+ return {
+ file: options.file ? options.file.split(/[/\\]/).pop() : null,
+ sources: [options.source ? getRelativePath(options.file || '', options.source) : null],
+ sourcesContent: options.includeContent ? [this.original] : [null],
+ names,
+ mappings: mappings.raw,
+ };
+ }
+
+ generateMap(options) {
+ return new SourceMap(this.generateDecodedMap(options));
+ }
+
+ getIndentString() {
+ return this.indentStr === null ? '\t' : this.indentStr;
+ }
+
+ indent(indentStr, options) {
+ const pattern = /^[^\r\n]/gm;
+
+ if (isObject(indentStr)) {
+ options = indentStr;
+ indentStr = undefined;
+ }
+
+ indentStr = indentStr !== undefined ? indentStr : this.indentStr || '\t';
+
+ if (indentStr === '') return this; // noop
+
+ options = options || {};
+
+ // Process exclusion ranges
+ const isExcluded = {};
+
+ if (options.exclude) {
+ const exclusions =
+ typeof options.exclude[0] === 'number' ? [options.exclude] : options.exclude;
+ exclusions.forEach((exclusion) => {
+ for (let i = exclusion[0]; i < exclusion[1]; i += 1) {
+ isExcluded[i] = true;
+ }
+ });
+ }
+
+ let shouldIndentNextCharacter = options.indentStart !== false;
+ const replacer = (match) => {
+ if (shouldIndentNextCharacter) return `${indentStr}${match}`;
+ shouldIndentNextCharacter = true;
+ return match;
+ };
+
+ this.intro = this.intro.replace(pattern, replacer);
+
+ let charIndex = 0;
+ let chunk = this.firstChunk;
+
+ while (chunk) {
+ const end = chunk.end;
+
+ if (chunk.edited) {
+ if (!isExcluded[charIndex]) {
+ chunk.content = chunk.content.replace(pattern, replacer);
+
+ if (chunk.content.length) {
+ shouldIndentNextCharacter = chunk.content[chunk.content.length - 1] === '\n';
+ }
+ }
+ } else {
+ charIndex = chunk.start;
+
+ while (charIndex < end) {
+ if (!isExcluded[charIndex]) {
+ const char = this.original[charIndex];
+
+ if (char === '\n') {
+ shouldIndentNextCharacter = true;
+ } else if (char !== '\r' && shouldIndentNextCharacter) {
+ shouldIndentNextCharacter = false;
+
+ if (charIndex === chunk.start) {
+ chunk.prependRight(indentStr);
+ } else {
+ this._splitChunk(chunk, charIndex);
+ chunk = chunk.next;
+ chunk.prependRight(indentStr);
+ }
+ }
+ }
+
+ charIndex += 1;
+ }
+ }
+
+ charIndex = chunk.end;
+ chunk = chunk.next;
+ }
+
+ this.outro = this.outro.replace(pattern, replacer);
+
+ return this;
+ }
+
+ insert() {
+ throw new Error(
+ 'magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)'
+ );
+ }
+
+ insertLeft(index, content) {
+ if (!warned$1.insertLeft) {
+ console.warn(
+ 'magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead'
+ ); // eslint-disable-line no-console
+ warned$1.insertLeft = true;
+ }
+
+ return this.appendLeft(index, content);
+ }
+
+ insertRight(index, content) {
+ if (!warned$1.insertRight) {
+ console.warn(
+ 'magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead'
+ ); // eslint-disable-line no-console
+ warned$1.insertRight = true;
+ }
+
+ return this.prependRight(index, content);
+ }
+
+ move(start, end, index) {
+ if (index >= start && index <= end) throw new Error('Cannot move a selection inside itself');
+
+ this._split(start);
+ this._split(end);
+ this._split(index);
+
+ const first = this.byStart[start];
+ const last = this.byEnd[end];
+
+ const oldLeft = first.previous;
+ const oldRight = last.next;
+
+ const newRight = this.byStart[index];
+ if (!newRight && last === this.lastChunk) return this;
+ const newLeft = newRight ? newRight.previous : this.lastChunk;
+
+ if (oldLeft) oldLeft.next = oldRight;
+ if (oldRight) oldRight.previous = oldLeft;
+
+ if (newLeft) newLeft.next = first;
+ if (newRight) newRight.previous = last;
+
+ if (!first.previous) this.firstChunk = last.next;
+ if (!last.next) {
+ this.lastChunk = first.previous;
+ this.lastChunk.next = null;
+ }
+
+ first.previous = newLeft;
+ last.next = newRight || null;
+
+ if (!newLeft) this.firstChunk = first;
+ if (!newRight) this.lastChunk = last;
+ return this;
+ }
+
+ overwrite(start, end, content, options) {
+ if (typeof content !== 'string') throw new TypeError('replacement content must be a string');
+
+ while (start < 0) start += this.original.length;
+ while (end < 0) end += this.original.length;
+
+ if (end > this.original.length) throw new Error('end is out of bounds');
+ if (start === end)
+ throw new Error(
+ 'Cannot overwrite a zero-length range – use appendLeft or prependRight instead'
+ );
+
+ this._split(start);
+ this._split(end);
+
+ if (options === true) {
+ if (!warned$1.storeName) {
+ console.warn(
+ 'The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string'
+ ); // eslint-disable-line no-console
+ warned$1.storeName = true;
+ }
+
+ options = { storeName: true };
+ }
+ const storeName = options !== undefined ? options.storeName : false;
+ const contentOnly = options !== undefined ? options.contentOnly : false;
+
+ if (storeName) {
+ const original = this.original.slice(start, end);
+ Object.defineProperty(this.storedNames, original, {
+ writable: true,
+ value: true,
+ enumerable: true,
+ });
+ }
+
+ const first = this.byStart[start];
+ const last = this.byEnd[end];
+
+ if (first) {
+ let chunk = first;
+ while (chunk !== last) {
+ if (chunk.next !== this.byStart[chunk.end]) {
+ throw new Error('Cannot overwrite across a split point');
+ }
+ chunk = chunk.next;
+ chunk.edit('', false);
+ }
+
+ first.edit(content, storeName, contentOnly);
+ } else {
+ // must be inserting at the end
+ const newChunk = new Chunk(start, end, '').edit(content, storeName);
+
+ // TODO last chunk in the array may not be the last chunk, if it's moved...
+ last.next = newChunk;
+ newChunk.previous = last;
+ }
+ return this;
+ }
+
+ prepend(content) {
+ if (typeof content !== 'string') throw new TypeError('outro content must be a string');
+
+ this.intro = content + this.intro;
+ return this;
+ }
+
+ prependLeft(index, content) {
+ if (typeof content !== 'string') throw new TypeError('inserted content must be a string');
+
+ this._split(index);
+
+ const chunk = this.byEnd[index];
+
+ if (chunk) {
+ chunk.prependLeft(content);
+ } else {
+ this.intro = content + this.intro;
+ }
+ return this;
+ }
+
+ prependRight(index, content) {
+ if (typeof content !== 'string') throw new TypeError('inserted content must be a string');
+
+ this._split(index);
+
+ const chunk = this.byStart[index];
+
+ if (chunk) {
+ chunk.prependRight(content);
+ } else {
+ this.outro = content + this.outro;
+ }
+ return this;
+ }
+
+ remove(start, end) {
+ while (start < 0) start += this.original.length;
+ while (end < 0) end += this.original.length;
+
+ if (start === end) return this;
+
+ if (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');
+ if (start > end) throw new Error('end must be greater than start');
+
+ this._split(start);
+ this._split(end);
+
+ let chunk = this.byStart[start];
+
+ while (chunk) {
+ chunk.intro = '';
+ chunk.outro = '';
+ chunk.edit('');
+
+ chunk = end > chunk.end ? this.byStart[chunk.end] : null;
+ }
+ return this;
+ }
+
+ lastChar() {
+ if (this.outro.length) return this.outro[this.outro.length - 1];
+ let chunk = this.lastChunk;
+ do {
+ if (chunk.outro.length) return chunk.outro[chunk.outro.length - 1];
+ if (chunk.content.length) return chunk.content[chunk.content.length - 1];
+ if (chunk.intro.length) return chunk.intro[chunk.intro.length - 1];
+ } while ((chunk = chunk.previous));
+ if (this.intro.length) return this.intro[this.intro.length - 1];
+ return '';
+ }
+
+ lastLine() {
+ let lineIndex = this.outro.lastIndexOf(n);
+ if (lineIndex !== -1) return this.outro.substr(lineIndex + 1);
+ let lineStr = this.outro;
+ let chunk = this.lastChunk;
+ do {
+ if (chunk.outro.length > 0) {
+ lineIndex = chunk.outro.lastIndexOf(n);
+ if (lineIndex !== -1) return chunk.outro.substr(lineIndex + 1) + lineStr;
+ lineStr = chunk.outro + lineStr;
+ }
+
+ if (chunk.content.length > 0) {
+ lineIndex = chunk.content.lastIndexOf(n);
+ if (lineIndex !== -1) return chunk.content.substr(lineIndex + 1) + lineStr;
+ lineStr = chunk.content + lineStr;
+ }
+
+ if (chunk.intro.length > 0) {
+ lineIndex = chunk.intro.lastIndexOf(n);
+ if (lineIndex !== -1) return chunk.intro.substr(lineIndex + 1) + lineStr;
+ lineStr = chunk.intro + lineStr;
+ }
+ } while ((chunk = chunk.previous));
+ lineIndex = this.intro.lastIndexOf(n);
+ if (lineIndex !== -1) return this.intro.substr(lineIndex + 1) + lineStr;
+ return this.intro + lineStr;
+ }
+
+ slice(start = 0, end = this.original.length) {
+ while (start < 0) start += this.original.length;
+ while (end < 0) end += this.original.length;
+
+ let result = '';
+
+ // find start chunk
+ let chunk = this.firstChunk;
+ while (chunk && (chunk.start > start || chunk.end <= start)) {
+ // found end chunk before start
+ if (chunk.start < end && chunk.end >= end) {
+ return result;
+ }
+
+ chunk = chunk.next;
+ }
+
+ if (chunk && chunk.edited && chunk.start !== start)
+ throw new Error(`Cannot use replaced character ${start} as slice start anchor.`);
+
+ const startChunk = chunk;
+ while (chunk) {
+ if (chunk.intro && (startChunk !== chunk || chunk.start === start)) {
+ result += chunk.intro;
+ }
+
+ const containsEnd = chunk.start < end && chunk.end >= end;
+ if (containsEnd && chunk.edited && chunk.end !== end)
+ throw new Error(`Cannot use replaced character ${end} as slice end anchor.`);
+
+ const sliceStart = startChunk === chunk ? start - chunk.start : 0;
+ const sliceEnd = containsEnd ? chunk.content.length + end - chunk.end : chunk.content.length;
+
+ result += chunk.content.slice(sliceStart, sliceEnd);
+
+ if (chunk.outro && (!containsEnd || chunk.end === end)) {
+ result += chunk.outro;
+ }
+
+ if (containsEnd) {
+ break;
+ }
+
+ chunk = chunk.next;
+ }
+
+ return result;
+ }
+
+ // TODO deprecate this? not really very useful
+ snip(start, end) {
+ const clone = this.clone();
+ clone.remove(0, start);
+ clone.remove(end, clone.original.length);
+
+ return clone;
+ }
+
+ _split(index) {
+ if (this.byStart[index] || this.byEnd[index]) return;
+
+ let chunk = this.lastSearchedChunk;
+ const searchForward = index > chunk.end;
+
+ while (chunk) {
+ if (chunk.contains(index)) return this._splitChunk(chunk, index);
+
+ chunk = searchForward ? this.byStart[chunk.end] : this.byEnd[chunk.start];
+ }
+ }
+
+ _splitChunk(chunk, index) {
+ if (chunk.edited && chunk.content.length) {
+ // zero-length edited chunks are a special case (overlapping replacements)
+ const loc = getLocator(this.original)(index);
+ throw new Error(
+ `Cannot split a chunk that has already been edited (${loc.line}:${loc.column} – "${chunk.original}")`
+ );
+ }
+
+ const newChunk = chunk.split(index);
+
+ this.byEnd[index] = chunk;
+ this.byStart[index] = newChunk;
+ this.byEnd[newChunk.end] = newChunk;
+
+ if (chunk === this.lastChunk) this.lastChunk = newChunk;
+
+ this.lastSearchedChunk = chunk;
+ return true;
+ }
+
+ toString() {
+ let str = this.intro;
+
+ let chunk = this.firstChunk;
+ while (chunk) {
+ str += chunk.toString();
+ chunk = chunk.next;
+ }
+
+ return str + this.outro;
+ }
+
+ isEmpty() {
+ let chunk = this.firstChunk;
+ do {
+ if (
+ (chunk.intro.length && chunk.intro.trim()) ||
+ (chunk.content.length && chunk.content.trim()) ||
+ (chunk.outro.length && chunk.outro.trim())
+ )
+ return false;
+ } while ((chunk = chunk.next));
+ return true;
+ }
+
+ length() {
+ let chunk = this.firstChunk;
+ let length = 0;
+ do {
+ length += chunk.intro.length + chunk.content.length + chunk.outro.length;
+ } while ((chunk = chunk.next));
+ return length;
+ }
+
+ trimLines() {
+ return this.trim('[\\r\\n]');
+ }
+
+ trim(charType) {
+ return this.trimStart(charType).trimEnd(charType);
+ }
+
+ trimEndAborted(charType) {
+ const rx = new RegExp((charType || '\\s') + '+$');
+
+ this.outro = this.outro.replace(rx, '');
+ if (this.outro.length) return true;
+
+ let chunk = this.lastChunk;
+
+ do {
+ const end = chunk.end;
+ const aborted = chunk.trimEnd(rx);
+
+ // if chunk was trimmed, we have a new lastChunk
+ if (chunk.end !== end) {
+ if (this.lastChunk === chunk) {
+ this.lastChunk = chunk.next;
+ }
+
+ this.byEnd[chunk.end] = chunk;
+ this.byStart[chunk.next.start] = chunk.next;
+ this.byEnd[chunk.next.end] = chunk.next;
+ }
+
+ if (aborted) return true;
+ chunk = chunk.previous;
+ } while (chunk);
+
+ return false;
+ }
+
+ trimEnd(charType) {
+ this.trimEndAborted(charType);
+ return this;
+ }
+ trimStartAborted(charType) {
+ const rx = new RegExp('^' + (charType || '\\s') + '+');
+
+ this.intro = this.intro.replace(rx, '');
+ if (this.intro.length) return true;
+
+ let chunk = this.firstChunk;
+
+ do {
+ const end = chunk.end;
+ const aborted = chunk.trimStart(rx);
+
+ if (chunk.end !== end) {
+ // special case...
+ if (chunk === this.lastChunk) this.lastChunk = chunk.next;
+
+ this.byEnd[chunk.end] = chunk;
+ this.byStart[chunk.next.start] = chunk.next;
+ this.byEnd[chunk.next.end] = chunk.next;
+ }
+
+ if (aborted) return true;
+ chunk = chunk.next;
+ } while (chunk);
+
+ return false;
+ }
+
+ trimStart(charType) {
+ this.trimStartAborted(charType);
+ return this;
+ }
+
+ hasChanged() {
+ return this.original !== this.toString();
+ }
+
+ replace(searchValue, replacement) {
+ function getReplacement(match, str) {
+ if (typeof replacement === 'string') {
+ return replacement.replace(/\$(\$|&|\d+)/g, (_, i) => {
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_a_parameter
+ if (i === '$') return '$';
+ if (i === '&') return match[0];
+ const num = +i;
+ if (num < match.length) return match[+i];
+ return `$${i}`;
+ });
+ } else {
+ return replacement(...match, match.index, str, match.groups);
+ }
+ }
+ function matchAll(re, str) {
+ let match;
+ const matches = [];
+ while ((match = re.exec(str))) {
+ matches.push(match);
+ }
+ return matches;
+ }
+ if (typeof searchValue !== 'string' && searchValue.global) {
+ const matches = matchAll(searchValue, this.original);
+ matches.forEach((match) => {
+ if (match.index != null)
+ this.overwrite(
+ match.index,
+ match.index + match[0].length,
+ getReplacement(match, this.original)
+ );
+ });
+ } else {
+ const match = this.original.match(searchValue);
+ if (match && match.index != null)
+ this.overwrite(
+ match.index,
+ match.index + match[0].length,
+ getReplacement(match, this.original)
+ );
+ }
+ return this;
+ }
+}
+
+/* es-module-lexer 0.10.5 */
+const A=1===new Uint8Array(new Uint16Array([1]).buffer)[0];function parse$e(E,g="@"){if(!C)return init.then((()=>parse$e(E)));const I=E.length+1,o=(C.__heap_base.value||C.__heap_base)+4*I-C.memory.buffer.byteLength;o>0&&C.memory.grow(Math.ceil(o/65536));const k=C.sa(I-1);if((A?B:Q)(E,new Uint16Array(C.memory.buffer,k,I)),!C.parse())throw Object.assign(new Error(`Parse error ${g}:${E.slice(0,C.e()).split("\n").length}:${C.e()-E.lastIndexOf("\n",C.e()-1)}`),{idx:C.e()});const J=[],i=[];for(;C.ri();){const A=C.is(),Q=C.ie(),B=C.ai(),g=C.id(),I=C.ss(),o=C.se();let k;C.ip()&&(k=w(E.slice(-1===g?A-1:A,-1===g?Q+1:Q))),J.push({n:k,s:A,e:Q,ss:I,se:o,d:g,a:B});}for(;C.re();){const A=E.slice(C.es(),C.ee()),Q=A[0];i.push('"'===Q||"'"===Q?w(A):A);}function w(A){try{return (0, eval)(A)}catch(A){}}return [J,i,!!C.f()]}function Q(A,Q){const B=A.length;let C=0;for(;C>>8;}}function B(A,Q){const B=A.length;let C=0;for(;CA.charCodeAt(0))))).then(WebAssembly.instantiate).then((({exports:A})=>{C=A;}));var E;
+
+// This is a generated file. Do not edit.
+var Space_Separator = /[\u1680\u2000-\u200A\u202F\u205F\u3000]/;
+var ID_Start = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/;
+var ID_Continue = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/;
+
+var unicode = {
+ Space_Separator: Space_Separator,
+ ID_Start: ID_Start,
+ ID_Continue: ID_Continue
+};
+
+var util$1 = {
+ isSpaceSeparator (c) {
+ return typeof c === 'string' && unicode.Space_Separator.test(c)
+ },
+
+ isIdStartChar (c) {
+ return typeof c === 'string' && (
+ (c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ (c === '$') || (c === '_') ||
+ unicode.ID_Start.test(c)
+ )
+ },
+
+ isIdContinueChar (c) {
+ return typeof c === 'string' && (
+ (c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ (c >= '0' && c <= '9') ||
+ (c === '$') || (c === '_') ||
+ (c === '\u200C') || (c === '\u200D') ||
+ unicode.ID_Continue.test(c)
+ )
+ },
+
+ isDigit (c) {
+ return typeof c === 'string' && /[0-9]/.test(c)
+ },
+
+ isHexDigit (c) {
+ return typeof c === 'string' && /[0-9A-Fa-f]/.test(c)
+ },
+};
+
+let source;
+let parseState;
+let stack;
+let pos;
+let line;
+let column;
+let token;
+let key;
+let root;
+
+var parse$d = function parse (text, reviver) {
+ source = String(text);
+ parseState = 'start';
+ stack = [];
+ pos = 0;
+ line = 1;
+ column = 0;
+ token = undefined;
+ key = undefined;
+ root = undefined;
+
+ do {
+ token = lex();
+
+ // This code is unreachable.
+ // if (!parseStates[parseState]) {
+ // throw invalidParseState()
+ // }
+
+ parseStates[parseState]();
+ } while (token.type !== 'eof')
+
+ if (typeof reviver === 'function') {
+ return internalize({'': root}, '', reviver)
+ }
+
+ return root
+};
+
+function internalize (holder, name, reviver) {
+ const value = holder[name];
+ if (value != null && typeof value === 'object') {
+ for (const key in value) {
+ const replacement = internalize(value, key, reviver);
+ if (replacement === undefined) {
+ delete value[key];
+ } else {
+ value[key] = replacement;
+ }
+ }
+ }
+
+ return reviver.call(holder, name, value)
+}
+
+let lexState;
+let buffer;
+let doubleQuote;
+let sign;
+let c;
+
+function lex () {
+ lexState = 'default';
+ buffer = '';
+ doubleQuote = false;
+ sign = 1;
+
+ for (;;) {
+ c = peek();
+
+ // This code is unreachable.
+ // if (!lexStates[lexState]) {
+ // throw invalidLexState(lexState)
+ // }
+
+ const token = lexStates[lexState]();
+ if (token) {
+ return token
+ }
+ }
+}
+
+function peek () {
+ if (source[pos]) {
+ return String.fromCodePoint(source.codePointAt(pos))
+ }
+}
+
+function read () {
+ const c = peek();
+
+ if (c === '\n') {
+ line++;
+ column = 0;
+ } else if (c) {
+ column += c.length;
+ } else {
+ column++;
+ }
+
+ if (c) {
+ pos += c.length;
+ }
+
+ return c
+}
+
+const lexStates = {
+ default () {
+ switch (c) {
+ case '\t':
+ case '\v':
+ case '\f':
+ case ' ':
+ case '\u00A0':
+ case '\uFEFF':
+ case '\n':
+ case '\r':
+ case '\u2028':
+ case '\u2029':
+ read();
+ return
+
+ case '/':
+ read();
+ lexState = 'comment';
+ return
+
+ case undefined:
+ read();
+ return newToken('eof')
+ }
+
+ if (util$1.isSpaceSeparator(c)) {
+ read();
+ return
+ }
+
+ // This code is unreachable.
+ // if (!lexStates[parseState]) {
+ // throw invalidLexState(parseState)
+ // }
+
+ return lexStates[parseState]()
+ },
+
+ comment () {
+ switch (c) {
+ case '*':
+ read();
+ lexState = 'multiLineComment';
+ return
+
+ case '/':
+ read();
+ lexState = 'singleLineComment';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ multiLineComment () {
+ switch (c) {
+ case '*':
+ read();
+ lexState = 'multiLineCommentAsterisk';
+ return
+
+ case undefined:
+ throw invalidChar(read())
+ }
+
+ read();
+ },
+
+ multiLineCommentAsterisk () {
+ switch (c) {
+ case '*':
+ read();
+ return
+
+ case '/':
+ read();
+ lexState = 'default';
+ return
+
+ case undefined:
+ throw invalidChar(read())
+ }
+
+ read();
+ lexState = 'multiLineComment';
+ },
+
+ singleLineComment () {
+ switch (c) {
+ case '\n':
+ case '\r':
+ case '\u2028':
+ case '\u2029':
+ read();
+ lexState = 'default';
+ return
+
+ case undefined:
+ read();
+ return newToken('eof')
+ }
+
+ read();
+ },
+
+ value () {
+ switch (c) {
+ case '{':
+ case '[':
+ return newToken('punctuator', read())
+
+ case 'n':
+ read();
+ literal$1('ull');
+ return newToken('null', null)
+
+ case 't':
+ read();
+ literal$1('rue');
+ return newToken('boolean', true)
+
+ case 'f':
+ read();
+ literal$1('alse');
+ return newToken('boolean', false)
+
+ case '-':
+ case '+':
+ if (read() === '-') {
+ sign = -1;
+ }
+
+ lexState = 'sign';
+ return
+
+ case '.':
+ buffer = read();
+ lexState = 'decimalPointLeading';
+ return
+
+ case '0':
+ buffer = read();
+ lexState = 'zero';
+ return
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ buffer = read();
+ lexState = 'decimalInteger';
+ return
+
+ case 'I':
+ read();
+ literal$1('nfinity');
+ return newToken('numeric', Infinity)
+
+ case 'N':
+ read();
+ literal$1('aN');
+ return newToken('numeric', NaN)
+
+ case '"':
+ case "'":
+ doubleQuote = (read() === '"');
+ buffer = '';
+ lexState = 'string';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ identifierNameStartEscape () {
+ if (c !== 'u') {
+ throw invalidChar(read())
+ }
+
+ read();
+ const u = unicodeEscape();
+ switch (u) {
+ case '$':
+ case '_':
+ break
+
+ default:
+ if (!util$1.isIdStartChar(u)) {
+ throw invalidIdentifier()
+ }
+
+ break
+ }
+
+ buffer += u;
+ lexState = 'identifierName';
+ },
+
+ identifierName () {
+ switch (c) {
+ case '$':
+ case '_':
+ case '\u200C':
+ case '\u200D':
+ buffer += read();
+ return
+
+ case '\\':
+ read();
+ lexState = 'identifierNameEscape';
+ return
+ }
+
+ if (util$1.isIdContinueChar(c)) {
+ buffer += read();
+ return
+ }
+
+ return newToken('identifier', buffer)
+ },
+
+ identifierNameEscape () {
+ if (c !== 'u') {
+ throw invalidChar(read())
+ }
+
+ read();
+ const u = unicodeEscape();
+ switch (u) {
+ case '$':
+ case '_':
+ case '\u200C':
+ case '\u200D':
+ break
+
+ default:
+ if (!util$1.isIdContinueChar(u)) {
+ throw invalidIdentifier()
+ }
+
+ break
+ }
+
+ buffer += u;
+ lexState = 'identifierName';
+ },
+
+ sign () {
+ switch (c) {
+ case '.':
+ buffer = read();
+ lexState = 'decimalPointLeading';
+ return
+
+ case '0':
+ buffer = read();
+ lexState = 'zero';
+ return
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ buffer = read();
+ lexState = 'decimalInteger';
+ return
+
+ case 'I':
+ read();
+ literal$1('nfinity');
+ return newToken('numeric', sign * Infinity)
+
+ case 'N':
+ read();
+ literal$1('aN');
+ return newToken('numeric', NaN)
+ }
+
+ throw invalidChar(read())
+ },
+
+ zero () {
+ switch (c) {
+ case '.':
+ buffer += read();
+ lexState = 'decimalPoint';
+ return
+
+ case 'e':
+ case 'E':
+ buffer += read();
+ lexState = 'decimalExponent';
+ return
+
+ case 'x':
+ case 'X':
+ buffer += read();
+ lexState = 'hexadecimal';
+ return
+ }
+
+ return newToken('numeric', sign * 0)
+ },
+
+ decimalInteger () {
+ switch (c) {
+ case '.':
+ buffer += read();
+ lexState = 'decimalPoint';
+ return
+
+ case 'e':
+ case 'E':
+ buffer += read();
+ lexState = 'decimalExponent';
+ return
+ }
+
+ if (util$1.isDigit(c)) {
+ buffer += read();
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ decimalPointLeading () {
+ if (util$1.isDigit(c)) {
+ buffer += read();
+ lexState = 'decimalFraction';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ decimalPoint () {
+ switch (c) {
+ case 'e':
+ case 'E':
+ buffer += read();
+ lexState = 'decimalExponent';
+ return
+ }
+
+ if (util$1.isDigit(c)) {
+ buffer += read();
+ lexState = 'decimalFraction';
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ decimalFraction () {
+ switch (c) {
+ case 'e':
+ case 'E':
+ buffer += read();
+ lexState = 'decimalExponent';
+ return
+ }
+
+ if (util$1.isDigit(c)) {
+ buffer += read();
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ decimalExponent () {
+ switch (c) {
+ case '+':
+ case '-':
+ buffer += read();
+ lexState = 'decimalExponentSign';
+ return
+ }
+
+ if (util$1.isDigit(c)) {
+ buffer += read();
+ lexState = 'decimalExponentInteger';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ decimalExponentSign () {
+ if (util$1.isDigit(c)) {
+ buffer += read();
+ lexState = 'decimalExponentInteger';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ decimalExponentInteger () {
+ if (util$1.isDigit(c)) {
+ buffer += read();
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ hexadecimal () {
+ if (util$1.isHexDigit(c)) {
+ buffer += read();
+ lexState = 'hexadecimalInteger';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ hexadecimalInteger () {
+ if (util$1.isHexDigit(c)) {
+ buffer += read();
+ return
+ }
+
+ return newToken('numeric', sign * Number(buffer))
+ },
+
+ string () {
+ switch (c) {
+ case '\\':
+ read();
+ buffer += escape$1();
+ return
+
+ case '"':
+ if (doubleQuote) {
+ read();
+ return newToken('string', buffer)
+ }
+
+ buffer += read();
+ return
+
+ case "'":
+ if (!doubleQuote) {
+ read();
+ return newToken('string', buffer)
+ }
+
+ buffer += read();
+ return
+
+ case '\n':
+ case '\r':
+ throw invalidChar(read())
+
+ case '\u2028':
+ case '\u2029':
+ separatorChar(c);
+ break
+
+ case undefined:
+ throw invalidChar(read())
+ }
+
+ buffer += read();
+ },
+
+ start () {
+ switch (c) {
+ case '{':
+ case '[':
+ return newToken('punctuator', read())
+
+ // This code is unreachable since the default lexState handles eof.
+ // case undefined:
+ // return newToken('eof')
+ }
+
+ lexState = 'value';
+ },
+
+ beforePropertyName () {
+ switch (c) {
+ case '$':
+ case '_':
+ buffer = read();
+ lexState = 'identifierName';
+ return
+
+ case '\\':
+ read();
+ lexState = 'identifierNameStartEscape';
+ return
+
+ case '}':
+ return newToken('punctuator', read())
+
+ case '"':
+ case "'":
+ doubleQuote = (read() === '"');
+ lexState = 'string';
+ return
+ }
+
+ if (util$1.isIdStartChar(c)) {
+ buffer += read();
+ lexState = 'identifierName';
+ return
+ }
+
+ throw invalidChar(read())
+ },
+
+ afterPropertyName () {
+ if (c === ':') {
+ return newToken('punctuator', read())
+ }
+
+ throw invalidChar(read())
+ },
+
+ beforePropertyValue () {
+ lexState = 'value';
+ },
+
+ afterPropertyValue () {
+ switch (c) {
+ case ',':
+ case '}':
+ return newToken('punctuator', read())
+ }
+
+ throw invalidChar(read())
+ },
+
+ beforeArrayValue () {
+ if (c === ']') {
+ return newToken('punctuator', read())
+ }
+
+ lexState = 'value';
+ },
+
+ afterArrayValue () {
+ switch (c) {
+ case ',':
+ case ']':
+ return newToken('punctuator', read())
+ }
+
+ throw invalidChar(read())
+ },
+
+ end () {
+ // This code is unreachable since it's handled by the default lexState.
+ // if (c === undefined) {
+ // read()
+ // return newToken('eof')
+ // }
+
+ throw invalidChar(read())
+ },
+};
+
+function newToken (type, value) {
+ return {
+ type,
+ value,
+ line,
+ column,
+ }
+}
+
+function literal$1 (s) {
+ for (const c of s) {
+ const p = peek();
+
+ if (p !== c) {
+ throw invalidChar(read())
+ }
+
+ read();
+ }
+}
+
+function escape$1 () {
+ const c = peek();
+ switch (c) {
+ case 'b':
+ read();
+ return '\b'
+
+ case 'f':
+ read();
+ return '\f'
+
+ case 'n':
+ read();
+ return '\n'
+
+ case 'r':
+ read();
+ return '\r'
+
+ case 't':
+ read();
+ return '\t'
+
+ case 'v':
+ read();
+ return '\v'
+
+ case '0':
+ read();
+ if (util$1.isDigit(peek())) {
+ throw invalidChar(read())
+ }
+
+ return '\0'
+
+ case 'x':
+ read();
+ return hexEscape()
+
+ case 'u':
+ read();
+ return unicodeEscape()
+
+ case '\n':
+ case '\u2028':
+ case '\u2029':
+ read();
+ return ''
+
+ case '\r':
+ read();
+ if (peek() === '\n') {
+ read();
+ }
+
+ return ''
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ throw invalidChar(read())
+
+ case undefined:
+ throw invalidChar(read())
+ }
+
+ return read()
+}
+
+function hexEscape () {
+ let buffer = '';
+ let c = peek();
+
+ if (!util$1.isHexDigit(c)) {
+ throw invalidChar(read())
+ }
+
+ buffer += read();
+
+ c = peek();
+ if (!util$1.isHexDigit(c)) {
+ throw invalidChar(read())
+ }
+
+ buffer += read();
+
+ return String.fromCodePoint(parseInt(buffer, 16))
+}
+
+function unicodeEscape () {
+ let buffer = '';
+ let count = 4;
+
+ while (count-- > 0) {
+ const c = peek();
+ if (!util$1.isHexDigit(c)) {
+ throw invalidChar(read())
+ }
+
+ buffer += read();
+ }
+
+ return String.fromCodePoint(parseInt(buffer, 16))
+}
+
+const parseStates = {
+ start () {
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ push$1();
+ },
+
+ beforePropertyName () {
+ switch (token.type) {
+ case 'identifier':
+ case 'string':
+ key = token.value;
+ parseState = 'afterPropertyName';
+ return
+
+ case 'punctuator':
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.value !== '}') {
+ // throw invalidToken()
+ // }
+
+ pop();
+ return
+
+ case 'eof':
+ throw invalidEOF()
+ }
+
+ // This code is unreachable since it's handled by the lexState.
+ // throw invalidToken()
+ },
+
+ afterPropertyName () {
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.type !== 'punctuator' || token.value !== ':') {
+ // throw invalidToken()
+ // }
+
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ parseState = 'beforePropertyValue';
+ },
+
+ beforePropertyValue () {
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ push$1();
+ },
+
+ beforeArrayValue () {
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ if (token.type === 'punctuator' && token.value === ']') {
+ pop();
+ return
+ }
+
+ push$1();
+ },
+
+ afterPropertyValue () {
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.type !== 'punctuator') {
+ // throw invalidToken()
+ // }
+
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ switch (token.value) {
+ case ',':
+ parseState = 'beforePropertyName';
+ return
+
+ case '}':
+ pop();
+ }
+
+ // This code is unreachable since it's handled by the lexState.
+ // throw invalidToken()
+ },
+
+ afterArrayValue () {
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.type !== 'punctuator') {
+ // throw invalidToken()
+ // }
+
+ if (token.type === 'eof') {
+ throw invalidEOF()
+ }
+
+ switch (token.value) {
+ case ',':
+ parseState = 'beforeArrayValue';
+ return
+
+ case ']':
+ pop();
+ }
+
+ // This code is unreachable since it's handled by the lexState.
+ // throw invalidToken()
+ },
+
+ end () {
+ // This code is unreachable since it's handled by the lexState.
+ // if (token.type !== 'eof') {
+ // throw invalidToken()
+ // }
+ },
+};
+
+function push$1 () {
+ let value;
+
+ switch (token.type) {
+ case 'punctuator':
+ switch (token.value) {
+ case '{':
+ value = {};
+ break
+
+ case '[':
+ value = [];
+ break
+ }
+
+ break
+
+ case 'null':
+ case 'boolean':
+ case 'numeric':
+ case 'string':
+ value = token.value;
+ break
+
+ // This code is unreachable.
+ // default:
+ // throw invalidToken()
+ }
+
+ if (root === undefined) {
+ root = value;
+ } else {
+ const parent = stack[stack.length - 1];
+ if (Array.isArray(parent)) {
+ parent.push(value);
+ } else {
+ parent[key] = value;
+ }
+ }
+
+ if (value !== null && typeof value === 'object') {
+ stack.push(value);
+
+ if (Array.isArray(value)) {
+ parseState = 'beforeArrayValue';
+ } else {
+ parseState = 'beforePropertyName';
+ }
+ } else {
+ const current = stack[stack.length - 1];
+ if (current == null) {
+ parseState = 'end';
+ } else if (Array.isArray(current)) {
+ parseState = 'afterArrayValue';
+ } else {
+ parseState = 'afterPropertyValue';
+ }
+ }
+}
+
+function pop () {
+ stack.pop();
+
+ const current = stack[stack.length - 1];
+ if (current == null) {
+ parseState = 'end';
+ } else if (Array.isArray(current)) {
+ parseState = 'afterArrayValue';
+ } else {
+ parseState = 'afterPropertyValue';
+ }
+}
+
+// This code is unreachable.
+// function invalidParseState () {
+// return new Error(`JSON5: invalid parse state '${parseState}'`)
+// }
+
+// This code is unreachable.
+// function invalidLexState (state) {
+// return new Error(`JSON5: invalid lex state '${state}'`)
+// }
+
+function invalidChar (c) {
+ if (c === undefined) {
+ return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
+ }
+
+ return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)
+}
+
+function invalidEOF () {
+ return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
+}
+
+// This code is unreachable.
+// function invalidToken () {
+// if (token.type === 'eof') {
+// return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
+// }
+
+// const c = String.fromCodePoint(token.value.codePointAt(0))
+// return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)
+// }
+
+function invalidIdentifier () {
+ column -= 5;
+ return syntaxError(`JSON5: invalid identifier character at ${line}:${column}`)
+}
+
+function separatorChar (c) {
+ console.warn(`JSON5: '${formatChar(c)}' in strings is not valid ECMAScript; consider escaping`);
+}
+
+function formatChar (c) {
+ const replacements = {
+ "'": "\\'",
+ '"': '\\"',
+ '\\': '\\\\',
+ '\b': '\\b',
+ '\f': '\\f',
+ '\n': '\\n',
+ '\r': '\\r',
+ '\t': '\\t',
+ '\v': '\\v',
+ '\0': '\\0',
+ '\u2028': '\\u2028',
+ '\u2029': '\\u2029',
+ };
+
+ if (replacements[c]) {
+ return replacements[c]
+ }
+
+ if (c < ' ') {
+ const hexString = c.charCodeAt(0).toString(16);
+ return '\\x' + ('00' + hexString).substring(hexString.length)
+ }
+
+ return c
+}
+
+function syntaxError (message) {
+ const err = new SyntaxError(message);
+ err.lineNumber = line;
+ err.columnNumber = column;
+ return err
+}
+
+var stringify$2 = function stringify (value, replacer, space) {
+ const stack = [];
+ let indent = '';
+ let propertyList;
+ let replacerFunc;
+ let gap = '';
+ let quote;
+
+ if (
+ replacer != null &&
+ typeof replacer === 'object' &&
+ !Array.isArray(replacer)
+ ) {
+ space = replacer.space;
+ quote = replacer.quote;
+ replacer = replacer.replacer;
+ }
+
+ if (typeof replacer === 'function') {
+ replacerFunc = replacer;
+ } else if (Array.isArray(replacer)) {
+ propertyList = [];
+ for (const v of replacer) {
+ let item;
+
+ if (typeof v === 'string') {
+ item = v;
+ } else if (
+ typeof v === 'number' ||
+ v instanceof String ||
+ v instanceof Number
+ ) {
+ item = String(v);
+ }
+
+ if (item !== undefined && propertyList.indexOf(item) < 0) {
+ propertyList.push(item);
+ }
+ }
+ }
+
+ if (space instanceof Number) {
+ space = Number(space);
+ } else if (space instanceof String) {
+ space = String(space);
+ }
+
+ if (typeof space === 'number') {
+ if (space > 0) {
+ space = Math.min(10, Math.floor(space));
+ gap = ' '.substr(0, space);
+ }
+ } else if (typeof space === 'string') {
+ gap = space.substr(0, 10);
+ }
+
+ return serializeProperty('', {'': value})
+
+ function serializeProperty (key, holder) {
+ let value = holder[key];
+ if (value != null) {
+ if (typeof value.toJSON5 === 'function') {
+ value = value.toJSON5(key);
+ } else if (typeof value.toJSON === 'function') {
+ value = value.toJSON(key);
+ }
+ }
+
+ if (replacerFunc) {
+ value = replacerFunc.call(holder, key, value);
+ }
+
+ if (value instanceof Number) {
+ value = Number(value);
+ } else if (value instanceof String) {
+ value = String(value);
+ } else if (value instanceof Boolean) {
+ value = value.valueOf();
+ }
+
+ switch (value) {
+ case null: return 'null'
+ case true: return 'true'
+ case false: return 'false'
+ }
+
+ if (typeof value === 'string') {
+ return quoteString(value)
+ }
+
+ if (typeof value === 'number') {
+ return String(value)
+ }
+
+ if (typeof value === 'object') {
+ return Array.isArray(value) ? serializeArray(value) : serializeObject(value)
+ }
+
+ return undefined
+ }
+
+ function quoteString (value) {
+ const quotes = {
+ "'": 0.1,
+ '"': 0.2,
+ };
+
+ const replacements = {
+ "'": "\\'",
+ '"': '\\"',
+ '\\': '\\\\',
+ '\b': '\\b',
+ '\f': '\\f',
+ '\n': '\\n',
+ '\r': '\\r',
+ '\t': '\\t',
+ '\v': '\\v',
+ '\0': '\\0',
+ '\u2028': '\\u2028',
+ '\u2029': '\\u2029',
+ };
+
+ let product = '';
+
+ for (let i = 0; i < value.length; i++) {
+ const c = value[i];
+ switch (c) {
+ case "'":
+ case '"':
+ quotes[c]++;
+ product += c;
+ continue
+
+ case '\0':
+ if (util$1.isDigit(value[i + 1])) {
+ product += '\\x00';
+ continue
+ }
+ }
+
+ if (replacements[c]) {
+ product += replacements[c];
+ continue
+ }
+
+ if (c < ' ') {
+ let hexString = c.charCodeAt(0).toString(16);
+ product += '\\x' + ('00' + hexString).substring(hexString.length);
+ continue
+ }
+
+ product += c;
+ }
+
+ const quoteChar = quote || Object.keys(quotes).reduce((a, b) => (quotes[a] < quotes[b]) ? a : b);
+
+ product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar]);
+
+ return quoteChar + product + quoteChar
+ }
+
+ function serializeObject (value) {
+ if (stack.indexOf(value) >= 0) {
+ throw TypeError('Converting circular structure to JSON5')
+ }
+
+ stack.push(value);
+
+ let stepback = indent;
+ indent = indent + gap;
+
+ let keys = propertyList || Object.keys(value);
+ let partial = [];
+ for (const key of keys) {
+ const propertyString = serializeProperty(key, value);
+ if (propertyString !== undefined) {
+ let member = serializeKey(key) + ':';
+ if (gap !== '') {
+ member += ' ';
+ }
+ member += propertyString;
+ partial.push(member);
+ }
+ }
+
+ let final;
+ if (partial.length === 0) {
+ final = '{}';
+ } else {
+ let properties;
+ if (gap === '') {
+ properties = partial.join(',');
+ final = '{' + properties + '}';
+ } else {
+ let separator = ',\n' + indent;
+ properties = partial.join(separator);
+ final = '{\n' + indent + properties + ',\n' + stepback + '}';
+ }
+ }
+
+ stack.pop();
+ indent = stepback;
+ return final
+ }
+
+ function serializeKey (key) {
+ if (key.length === 0) {
+ return quoteString(key)
+ }
+
+ const firstChar = String.fromCodePoint(key.codePointAt(0));
+ if (!util$1.isIdStartChar(firstChar)) {
+ return quoteString(key)
+ }
+
+ for (let i = firstChar.length; i < key.length; i++) {
+ if (!util$1.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) {
+ return quoteString(key)
+ }
+ }
+
+ return key
+ }
+
+ function serializeArray (value) {
+ if (stack.indexOf(value) >= 0) {
+ throw TypeError('Converting circular structure to JSON5')
+ }
+
+ stack.push(value);
+
+ let stepback = indent;
+ indent = indent + gap;
+
+ let partial = [];
+ for (let i = 0; i < value.length; i++) {
+ const propertyString = serializeProperty(String(i), value);
+ partial.push((propertyString !== undefined) ? propertyString : 'null');
+ }
+
+ let final;
+ if (partial.length === 0) {
+ final = '[]';
+ } else {
+ if (gap === '') {
+ let properties = partial.join(',');
+ final = '[' + properties + ']';
+ } else {
+ let separator = ',\n' + indent;
+ let properties = partial.join(separator);
+ final = '[\n' + indent + properties + ',\n' + stepback + ']';
+ }
+ }
+
+ stack.pop();
+ indent = stepback;
+ return final
+ }
+};
+
+const JSON5 = {
+ parse: parse$d,
+ stringify: stringify$2,
+};
+
+var lib$2 = JSON5;
+
+var dist$1 = {};
+
+(function (exports) {
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.lilconfigSync = exports.lilconfig = exports.defaultLoaders = void 0;
+const path = path__default;
+const fs = fs__default;
+const os = require$$2__default;
+const fsReadFileAsync = fs.promises.readFile;
+function getDefaultSearchPlaces(name) {
+ return [
+ 'package.json',
+ `.${name}rc.json`,
+ `.${name}rc.js`,
+ `${name}.config.js`,
+ `.${name}rc.cjs`,
+ `${name}.config.cjs`,
+ ];
+}
+function getSearchPaths(startDir, stopDir) {
+ return startDir
+ .split(path.sep)
+ .reduceRight((acc, _, ind, arr) => {
+ const currentPath = arr.slice(0, ind + 1).join(path.sep);
+ if (!acc.passedStopDir)
+ acc.searchPlaces.push(currentPath || path.sep);
+ if (currentPath === stopDir)
+ acc.passedStopDir = true;
+ return acc;
+ }, { searchPlaces: [], passedStopDir: false }).searchPlaces;
+}
+exports.defaultLoaders = Object.freeze({
+ '.js': eval('require'),
+ '.json': eval('require'),
+ '.cjs': eval('require'),
+ noExt(_, content) {
+ return JSON.parse(content);
+ },
+});
+function getExtDesc(ext) {
+ return ext === 'noExt' ? 'files without extensions' : `extension "${ext}"`;
+}
+function getOptions(name, options = {}) {
+ const conf = {
+ stopDir: os.homedir(),
+ searchPlaces: getDefaultSearchPlaces(name),
+ ignoreEmptySearchPlaces: true,
+ transform: (x) => x,
+ packageProp: [name],
+ ...options,
+ loaders: { ...exports.defaultLoaders, ...options.loaders },
+ };
+ conf.searchPlaces.forEach(place => {
+ const key = path.extname(place) || 'noExt';
+ const loader = conf.loaders[key];
+ if (!loader) {
+ throw new Error(`No loader specified for ${getExtDesc(key)}, so searchPlaces item "${place}" is invalid`);
+ }
+ if (typeof loader !== 'function') {
+ throw new Error(`loader for ${getExtDesc(key)} is not a function (type provided: "${typeof loader}"), so searchPlaces item "${place}" is invalid`);
+ }
+ });
+ return conf;
+}
+function getPackageProp(props, obj) {
+ if (typeof props === 'string' && props in obj)
+ return obj[props];
+ return ((Array.isArray(props) ? props : props.split('.')).reduce((acc, prop) => (acc === undefined ? acc : acc[prop]), obj) || null);
+}
+function getSearchItems(searchPlaces, searchPaths) {
+ return searchPaths.reduce((acc, searchPath) => {
+ searchPlaces.forEach(fileName => acc.push({
+ fileName,
+ filepath: path.join(searchPath, fileName),
+ loaderKey: path.extname(fileName) || 'noExt',
+ }));
+ return acc;
+ }, []);
+}
+function validateFilePath(filepath) {
+ if (!filepath)
+ throw new Error('load must pass a non-empty string');
+}
+function validateLoader(loader, ext) {
+ if (!loader)
+ throw new Error(`No loader specified for extension "${ext}"`);
+ if (typeof loader !== 'function')
+ throw new Error('loader is not a function');
+}
+function lilconfig(name, options) {
+ const { ignoreEmptySearchPlaces, loaders, packageProp, searchPlaces, stopDir, transform, } = getOptions(name, options);
+ return {
+ async search(searchFrom = process.cwd()) {
+ const searchPaths = getSearchPaths(searchFrom, stopDir);
+ const result = {
+ config: null,
+ filepath: '',
+ };
+ const searchItems = getSearchItems(searchPlaces, searchPaths);
+ for (const { fileName, filepath, loaderKey } of searchItems) {
+ try {
+ await fs.promises.access(filepath);
+ }
+ catch (_a) {
+ continue;
+ }
+ const content = String(await fsReadFileAsync(filepath));
+ const loader = loaders[loaderKey];
+ if (fileName === 'package.json') {
+ const pkg = await loader(filepath, content);
+ const maybeConfig = getPackageProp(packageProp, pkg);
+ if (maybeConfig != null) {
+ result.config = maybeConfig;
+ result.filepath = filepath;
+ break;
+ }
+ continue;
+ }
+ const isEmpty = content.trim() === '';
+ if (isEmpty && ignoreEmptySearchPlaces)
+ continue;
+ if (isEmpty) {
+ result.isEmpty = true;
+ result.config = undefined;
+ }
+ else {
+ validateLoader(loader, loaderKey);
+ result.config = await loader(filepath, content);
+ }
+ result.filepath = filepath;
+ break;
+ }
+ if (result.filepath === '' && result.config === null)
+ return transform(null);
+ return transform(result);
+ },
+ async load(filepath) {
+ validateFilePath(filepath);
+ const absPath = path.resolve(process.cwd(), filepath);
+ const { base, ext } = path.parse(absPath);
+ const loaderKey = ext || 'noExt';
+ const loader = loaders[loaderKey];
+ validateLoader(loader, loaderKey);
+ const content = String(await fsReadFileAsync(absPath));
+ if (base === 'package.json') {
+ const pkg = await loader(absPath, content);
+ return transform({
+ config: getPackageProp(packageProp, pkg),
+ filepath: absPath,
+ });
+ }
+ const result = {
+ config: null,
+ filepath: absPath,
+ };
+ const isEmpty = content.trim() === '';
+ if (isEmpty && ignoreEmptySearchPlaces)
+ return transform({
+ config: undefined,
+ filepath: absPath,
+ isEmpty: true,
+ });
+ result.config = isEmpty
+ ? undefined
+ : await loader(absPath, content);
+ return transform(isEmpty ? { ...result, isEmpty, config: undefined } : result);
+ },
+ };
+}
+exports.lilconfig = lilconfig;
+function lilconfigSync(name, options) {
+ const { ignoreEmptySearchPlaces, loaders, packageProp, searchPlaces, stopDir, transform, } = getOptions(name, options);
+ return {
+ search(searchFrom = process.cwd()) {
+ const searchPaths = getSearchPaths(searchFrom, stopDir);
+ const result = {
+ config: null,
+ filepath: '',
+ };
+ const searchItems = getSearchItems(searchPlaces, searchPaths);
+ for (const { fileName, filepath, loaderKey } of searchItems) {
+ try {
+ fs.accessSync(filepath);
+ }
+ catch (_a) {
+ continue;
+ }
+ const loader = loaders[loaderKey];
+ const content = String(fs.readFileSync(filepath));
+ if (fileName === 'package.json') {
+ const pkg = loader(filepath, content);
+ const maybeConfig = getPackageProp(packageProp, pkg);
+ if (maybeConfig != null) {
+ result.config = maybeConfig;
+ result.filepath = filepath;
+ break;
+ }
+ continue;
+ }
+ const isEmpty = content.trim() === '';
+ if (isEmpty && ignoreEmptySearchPlaces)
+ continue;
+ if (isEmpty) {
+ result.isEmpty = true;
+ result.config = undefined;
+ }
+ else {
+ validateLoader(loader, loaderKey);
+ result.config = loader(filepath, content);
+ }
+ result.filepath = filepath;
+ break;
+ }
+ if (result.filepath === '' && result.config === null)
+ return transform(null);
+ return transform(result);
+ },
+ load(filepath) {
+ validateFilePath(filepath);
+ const absPath = path.resolve(process.cwd(), filepath);
+ const { base, ext } = path.parse(absPath);
+ const loaderKey = ext || 'noExt';
+ const loader = loaders[loaderKey];
+ validateLoader(loader, loaderKey);
+ const content = String(fs.readFileSync(absPath));
+ if (base === 'package.json') {
+ const pkg = loader(absPath, content);
+ return transform({
+ config: getPackageProp(packageProp, pkg),
+ filepath: absPath,
+ });
+ }
+ const result = {
+ config: null,
+ filepath: absPath,
+ };
+ const isEmpty = content.trim() === '';
+ if (isEmpty && ignoreEmptySearchPlaces)
+ return transform({
+ filepath: absPath,
+ config: undefined,
+ isEmpty: true,
+ });
+ result.config = isEmpty ? undefined : loader(absPath, content);
+ return transform(isEmpty ? { ...result, isEmpty, config: undefined } : result);
+ },
+ };
+}
+exports.lilconfigSync = lilconfigSync;
+}(dist$1));
+
+var dist = {};
+
+var parseCst$1 = {};
+
+var PlainValueEc8e588e = {};
+
+const Char = {
+ ANCHOR: '&',
+ COMMENT: '#',
+ TAG: '!',
+ DIRECTIVES_END: '-',
+ DOCUMENT_END: '.'
+};
+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'
+};
+const defaultTagPrefix = 'tag:yaml.org,2002:';
+const defaultTags = {
+ MAP: 'tag:yaml.org,2002:map',
+ SEQ: 'tag:yaml.org,2002:seq',
+ STR: 'tag:yaml.org,2002:str'
+};
+
+function 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}
+ */
+
+
+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}
+ */
+
+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}
+ */
+
+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}`;
+}
+
+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;
+ }
+
+}
+
+/** Root class of all nodes */
+
+class Node$2 {
+ static addStringTerminator(src, offset, str) {
+ if (str[str.length - 1] === '\n') return str;
+ const next = Node$2.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$2.endOfIndent(src, lineStart);
+
+ if (inEnd > lineStart + indent) {
+ return inEnd;
+ } else {
+ const wsEnd = Node$2.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$2.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$2.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$2.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$2.endOfLine(src, start + 1);
+ const commentRange = new Range(start, end);
+ this.props.push(commentRange);
+ 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$2.addStringTerminator(src, range.end, str);
+ }
+
+}
+
+class YAMLError extends Error {
+ constructor(name, source, message) {
+ if (!message || !(source instanceof Node$2)) 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;
+ }
+
+}
+class YAMLReferenceError extends YAMLError {
+ constructor(source, message) {
+ super('YAMLReferenceError', source, message);
+ }
+
+}
+class YAMLSemanticError extends YAMLError {
+ constructor(source, message) {
+ super('YAMLSemanticError', source, message);
+ }
+
+}
+class YAMLSyntaxError extends YAMLError {
+ constructor(source, message) {
+ super('YAMLSyntaxError', source, message);
+ }
+
+}
+class YAMLWarning extends YAMLError {
+ constructor(source, message) {
+ super('YAMLWarning', source, message);
+ }
+
+}
+
+function _defineProperty(obj, key, value) {
+ if (key in obj) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
+ }
+
+ return obj;
+}
+
+class PlainValue$6 extends Node$2 {
+ 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$2.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$2.atDocumentBoundary(src, offset + 1)) break;
+ const end = Node$2.endOfBlockIndent(src, indent, offset + 1);
+ if (end === null || src[end] === '#') break;
+
+ if (src[end] === '\n') {
+ offset = end;
+ } else {
+ valueEnd = PlainValue$6.endOfLine(src, end, inFlow);
+ offset = valueEnd;
+ }
+ }
+
+ if (this.valueRange.isEmpty()) this.valueRange.start = start;
+ this.valueRange.end = valueEnd;
+ 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;
+ const {
+ inFlow,
+ src
+ } = context;
+ let offset = start;
+ const ch = src[offset];
+
+ if (ch && ch !== '#' && ch !== '\n') {
+ offset = PlainValue$6.endOfLine(src, start, inFlow);
+ }
+
+ this.valueRange = new Range(start, offset);
+ offset = Node$2.endOfWhiteSpace(src, offset);
+ offset = this.parseComment(offset);
+
+ if (!this.hasComment || this.valueRange.isEmpty()) {
+ offset = this.parseBlockValue(offset);
+ }
+
+ return offset;
+ }
+
+}
+
+PlainValueEc8e588e.Char = Char;
+PlainValueEc8e588e.Node = Node$2;
+PlainValueEc8e588e.PlainValue = PlainValue$6;
+PlainValueEc8e588e.Range = Range;
+PlainValueEc8e588e.Type = Type;
+PlainValueEc8e588e.YAMLError = YAMLError;
+PlainValueEc8e588e.YAMLReferenceError = YAMLReferenceError;
+PlainValueEc8e588e.YAMLSemanticError = YAMLSemanticError;
+PlainValueEc8e588e.YAMLSyntaxError = YAMLSyntaxError;
+PlainValueEc8e588e.YAMLWarning = YAMLWarning;
+PlainValueEc8e588e._defineProperty = _defineProperty;
+PlainValueEc8e588e.defaultTagPrefix = defaultTagPrefix;
+PlainValueEc8e588e.defaultTags = defaultTags;
+
+var PlainValue$5 = PlainValueEc8e588e;
+
+class BlankLine extends PlainValue$5.Node {
+ constructor() {
+ super(PlainValue$5.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 PlainValue$5.Range(start, start + 1);
+ return start + 1;
+ }
+
+}
+
+class CollectionItem extends PlainValue$5.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;
+ const {
+ parseNode,
+ src
+ } = context;
+ let {
+ atLineStart,
+ lineStart
+ } = context;
+ if (!atLineStart && this.type === PlainValue$5.Type.SEQ_ITEM) this.error = new PlainValue$5.YAMLSemanticError(this, 'Sequence items must not have preceding content on the same line');
+ const indent = atLineStart ? start - lineStart : context.indent;
+ let offset = PlainValue$5.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 = PlainValue$5.Node.endOfLine(src, offset + 1);
+ comments.push(new PlainValue$5.Range(offset, end));
+ offset = end;
+ } else {
+ atLineStart = true;
+ lineStart = offset + 1;
+ const wsEnd = PlainValue$5.Node.endOfWhiteSpace(src, lineStart);
+
+ if (src[wsEnd] === '\n' && comments.length === 0) {
+ blankLine = new BlankLine();
+ lineStart = blankLine.parse({
+ src
+ }, lineStart);
+ }
+
+ offset = PlainValue$5.Node.endOfIndent(src, lineStart);
+ }
+
+ ch = src[offset];
+ }
+
+ if (PlainValue$5.Node.nextNodeIsIndented(ch, offset - (lineStart + indent), this.type !== PlainValue$5.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 = PlainValue$5.Node.endOfLine(src, start + 1);
+ }
+ }
+
+ const end = this.node ? this.node.valueRange.end : offset;
+ this.valueRange = new PlainValue$5.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 PlainValue$5.Node.addStringTerminator(src, range.end, str);
+ }
+
+}
+
+class Comment extends PlainValue$5.Node {
+ constructor() {
+ super(PlainValue$5.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 PlainValue$5.Range(start, offset);
+ return offset;
+ }
+
+}
+
+function grabCollectionEndComments(node) {
+ let cnode = node;
+
+ while (cnode instanceof CollectionItem) cnode = cnode.node;
+
+ if (!(cnode instanceof Collection$1)) 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 === PlainValue$5.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 === PlainValue$5.Type.BLANK_LINE) ci = i;else break;
+ }
+
+ if (ci === -1) return null;
+ const ca = cnode.items.splice(ci, len - ci);
+ 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;
+}
+class Collection$1 extends PlainValue$5.Node {
+ static nextContentHasIndent(src, offset, indent) {
+ const lineStart = PlainValue$5.Node.endOfLine(src, offset) + 1;
+ offset = PlainValue$5.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$1.nextContentHasIndent(src, offset, indent);
+ }
+
+ constructor(firstItem) {
+ super(firstItem.type === PlainValue$5.Type.SEQ_ITEM ? PlainValue$5.Type.SEQ : PlainValue$5.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) {
+ 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 = PlainValue$5.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 = PlainValue$5.Range.copy(firstItem.valueRange);
+ const indent = firstItem.range.start - firstItem.context.lineStart;
+ let offset = start;
+ offset = PlainValue$5.Node.normalizeOffset(src, offset);
+ let ch = src[offset];
+ let atLineStart = PlainValue$5.Node.endOfWhiteSpace(src, lineStart) === offset;
+ let prevIncludesTrailingLines = false;
+
+ 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);
+ offset -= 1; // blankLine.parse() consumes terminal newline
+ } else if (ch === '#') {
+ if (offset < lineStart + indent && !Collection$1.nextContentHasIndent(src, offset, 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 = PlainValue$5.Node.endOfIndent(src, lineStart);
+
+ if (PlainValue$5.Node.atBlank(src, offset)) {
+ const wsEnd = PlainValue$5.Node.endOfWhiteSpace(src, offset);
+ const next = src[wsEnd];
+
+ if (!next || next === '\n' || next === '#') {
+ offset = wsEnd;
+ }
+ }
+
+ ch = src[offset];
+ atLineStart = true;
+ }
+
+ if (!ch) {
+ break;
+ }
+
+ if (offset !== lineStart + indent && (atLineStart || ch !== ':')) {
+ if (offset < lineStart + indent) {
+ if (lineStart > start) offset = lineStart;
+ break;
+ } else if (!this.error) {
+ const msg = 'All collection items must start at the same column';
+ this.error = new PlainValue$5.YAMLSyntaxError(this, msg);
+ }
+ }
+
+ if (firstItem.type === PlainValue$5.Type.SEQ_ITEM) {
+ if (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 PlainValue$5.YAMLSyntaxError(this, msg);
+ }
+ }
+
+ 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 = PlainValue$5.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);
+ }
+
+ 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 PlainValue$5.Node.addStringTerminator(src, range.end, str);
+ }
+
+}
+
+class Directive extends PlainValue$5.Node {
+ constructor() {
+ super(PlainValue$5.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 PlainValue$5.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 PlainValue$5.Range(start, offset);
+ return offset;
+ }
+
+}
+
+class Document$3 extends PlainValue$5.Node {
+ static startCommentOrEndBlankLine(src, start) {
+ const offset = PlainValue$5.Node.endOfWhiteSpace(src, start);
+ const ch = src[offset];
+ return ch === '#' || ch === '\n' ? offset : start;
+ }
+
+ constructor() {
+ super(PlainValue$5.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 (!PlainValue$5.Node.atDocumentBoundary(src, offset, PlainValue$5.Char.DIRECTIVES_END)) {
+ offset = Document$3.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);
+ }
+ } else {
+ offset += 1;
+ atLineStart = true;
+ }
+
+ break;
+
+ case '#':
+ {
+ const comment = new Comment();
+ offset = comment.parse({
+ src
+ }, offset);
+ this.directives.push(comment);
+ atLineStart = false;
+ }
+ break;
+
+ case '%':
+ {
+ const directive = new Directive();
+ offset = directive.parse({
+ parent: this,
+ src
+ }, offset);
+ this.directives.push(directive);
+ hasDirectives = true;
+ atLineStart = false;
+ }
+ break;
+
+ default:
+ if (hasDirectives) {
+ this.error = new PlainValue$5.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 PlainValue$5.Range(offset, offset + 3);
+ return offset + 3;
+ }
+
+ if (hasDirectives) {
+ this.error = new PlainValue$5.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 = PlainValue$5.Node.endOfWhiteSpace(src, start);
+ let atLineStart = lineStart === start;
+ this.valueRange = new PlainValue$5.Range(offset);
+
+ while (!PlainValue$5.Node.atDocumentBoundary(src, offset, PlainValue$5.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);
+ }
+ } else {
+ offset += 1;
+ atLineStart = true;
+ }
+
+ lineStart = offset;
+ break;
+
+ case '#':
+ {
+ const comment = new Comment();
+ offset = comment.parse({
+ src
+ }, offset);
+ this.contents.push(comment);
+ atLineStart = false;
+ }
+ break;
+
+ default:
+ {
+ const iEnd = PlainValue$5.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);
+ }
+ }
+
+ offset = Document$3.startCommentOrEndBlankLine(src, offset);
+ }
+
+ this.valueRange.end = offset;
+
+ if (src[offset]) {
+ this.documentEndMarker = new PlainValue$5.Range(offset, offset + 3);
+ offset += 3;
+
+ if (src[offset]) {
+ offset = PlainValue$5.Node.endOfWhiteSpace(src, offset);
+
+ if (src[offset] === '#') {
+ const comment = new Comment();
+ offset = comment.parse({
+ src
+ }, offset);
+ this.contents.push(comment);
+ }
+
+ switch (src[offset]) {
+ case '\n':
+ offset += 1;
+ break;
+
+ case undefined:
+ break;
+
+ default:
+ this.error = new PlainValue$5.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;
+ let offset = src.charCodeAt(start) === 0xfeff ? start + 1 : start; // skip BOM
+
+ offset = this.parseDirectives(offset);
+ offset = this.parseContents(offset);
+ 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 === PlainValue$5.Type.COMMENT) str += '---\n';
+ str += contents.join('');
+ }
+
+ if (str[str.length - 1] !== '\n') str += '\n';
+ return str;
+ }
+
+}
+
+class Alias$1 extends PlainValue$5.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 = PlainValue$5.Node.endOfIdentifier(src, start + 1);
+ this.valueRange = new PlainValue$5.Range(start + 1, offset);
+ offset = PlainValue$5.Node.endOfWhiteSpace(src, offset);
+ offset = this.parseComment(offset);
+ return offset;
+ }
+
+}
+
+const Chomp = {
+ CLIP: 'CLIP',
+ KEEP: 'KEEP',
+ STRIP: 'STRIP'
+};
+class BlockValue extends PlainValue$5.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 === PlainValue$5.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 = PlainValue$5.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 PlainValue$5.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 (PlainValue$5.Node.atDocumentBoundary(src, offset)) break;
+ const end = PlainValue$5.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 PlainValue$5.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 PlainValue$5.YAMLSemanticError(this, msg);
+ }
+ }
+
+ if (src[end] === '\n') {
+ offset = end;
+ } else {
+ offset = valueEnd = PlainValue$5.Node.endOfLine(src, end);
+ }
+ }
+
+ if (this.chomping !== Chomp.KEEP) {
+ offset = src[valueEnd] ? valueEnd + 1 : valueEnd;
+ }
+
+ this.valueRange = new PlainValue$5.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;
+ const {
+ src
+ } = context;
+ let offset = this.parseBlockHeader(start);
+ offset = PlainValue$5.Node.endOfWhiteSpace(src, offset);
+ offset = this.parseComment(offset);
+ offset = this.parseBlockValue(offset);
+ return offset;
+ }
+
+ setOrigRanges(cr, offset) {
+ offset = super.setOrigRanges(cr, offset);
+ return this.header ? this.header.setOrigRange(cr, offset) : offset;
+ }
+
+}
+
+class FlowCollection extends PlainValue$5.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 === PlainValue$5.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) {
+ this.context = context;
+ const {
+ parseNode,
+ src
+ } = context;
+ let {
+ indent,
+ lineStart
+ } = context;
+ let char = src[start]; // { or [
+
+ this.items = [{
+ char,
+ offset: start
+ }];
+ let offset = PlainValue$5.Node.endOfWhiteSpace(src, start + 1);
+ char = src[offset];
+
+ while (char && char !== ']' && char !== '}') {
+ switch (char) {
+ case '\n':
+ {
+ lineStart = offset + 1;
+ const wsEnd = PlainValue$5.Node.endOfWhiteSpace(src, lineStart);
+
+ if (src[wsEnd] === '\n') {
+ const blankLine = new BlankLine();
+ lineStart = blankLine.parse({
+ src
+ }, lineStart);
+ this.items.push(blankLine);
+ }
+
+ offset = PlainValue$5.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 PlainValue$5.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 PlainValue$5.Range(start, offset);
+ return offset;
+ }
+
+ this.items.push(node);
+ offset = PlainValue$5.Node.normalizeOffset(src, node.range.end);
+ }
+ }
+
+ offset = PlainValue$5.Node.endOfWhiteSpace(src, offset);
+ char = src[offset];
+ }
+
+ this.valueRange = new PlainValue$5.Range(start, offset + 1);
+
+ if (char) {
+ this.items.push({
+ char,
+ offset
+ });
+ offset = PlainValue$5.Node.endOfWhiteSpace(src, offset + 1);
+ offset = this.parseComment(offset);
+ }
+
+ return offset;
+ }
+
+ setOrigRanges(cr, offset) {
+ offset = super.setOrigRanges(cr, offset);
+ this.items.forEach(node => {
+ if (node instanceof PlainValue$5.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 PlainValue$5.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 PlainValue$5.Node.addStringTerminator(src, range.end, str);
+ }
+
+}
+
+class QuoteDouble extends PlainValue$5.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 PlainValue$5.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 (PlainValue$5.Node.atDocumentBoundary(src, i + 1)) errors.push(new PlainValue$5.YAMLSemanticError(this, 'Document boundary indicators are not allowed within string values'));
+ const {
+ fold,
+ offset,
+ error
+ } = PlainValue$5.Node.foldNewline(src, i, indent);
+ str += fold;
+ i = offset;
+ if (error) errors.push(new PlainValue$5.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 PlainValue$5.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 PlainValue$5.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 PlainValue$5.Range(start, offset);
+ offset = PlainValue$5.Node.endOfWhiteSpace(src, offset);
+ offset = this.parseComment(offset);
+ return offset;
+ }
+
+}
+
+class QuoteSingle extends PlainValue$5.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 PlainValue$5.YAMLSyntaxError(this, "Missing closing 'quote"));
+ let str = '';
+
+ for (let i = start + 1; i < end - 1; ++i) {
+ const ch = src[i];
+
+ if (ch === '\n') {
+ if (PlainValue$5.Node.atDocumentBoundary(src, i + 1)) errors.push(new PlainValue$5.YAMLSemanticError(this, 'Document boundary indicators are not allowed within string values'));
+ const {
+ fold,
+ offset,
+ error
+ } = PlainValue$5.Node.foldNewline(src, i, indent);
+ str += fold;
+ i = offset;
+ if (error) errors.push(new PlainValue$5.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 PlainValue$5.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 PlainValue$5.Range(start, offset);
+ offset = PlainValue$5.Node.endOfWhiteSpace(src, offset);
+ offset = this.parseComment(offset);
+ return offset;
+ }
+
+}
+
+function createNewNode(type, props) {
+ switch (type) {
+ case PlainValue$5.Type.ALIAS:
+ return new Alias$1(type, props);
+
+ case PlainValue$5.Type.BLOCK_FOLDED:
+ case PlainValue$5.Type.BLOCK_LITERAL:
+ return new BlockValue(type, props);
+
+ case PlainValue$5.Type.FLOW_MAP:
+ case PlainValue$5.Type.FLOW_SEQ:
+ return new FlowCollection(type, props);
+
+ case PlainValue$5.Type.MAP_KEY:
+ case PlainValue$5.Type.MAP_VALUE:
+ case PlainValue$5.Type.SEQ_ITEM:
+ return new CollectionItem(type, props);
+
+ case PlainValue$5.Type.COMMENT:
+ case PlainValue$5.Type.PLAIN:
+ return new PlainValue$5.PlainValue(type, props);
+
+ case PlainValue$5.Type.QUOTE_DOUBLE:
+ return new QuoteDouble(type, props);
+
+ case PlainValue$5.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
+ */
+
+
+class ParseContext {
+ static parseType(src, offset, inFlow) {
+ switch (src[offset]) {
+ case '*':
+ return PlainValue$5.Type.ALIAS;
+
+ case '>':
+ return PlainValue$5.Type.BLOCK_FOLDED;
+
+ case '|':
+ return PlainValue$5.Type.BLOCK_LITERAL;
+
+ case '{':
+ return PlainValue$5.Type.FLOW_MAP;
+
+ case '[':
+ return PlainValue$5.Type.FLOW_SEQ;
+
+ case '?':
+ return !inFlow && PlainValue$5.Node.atBlank(src, offset + 1, true) ? PlainValue$5.Type.MAP_KEY : PlainValue$5.Type.PLAIN;
+
+ case ':':
+ return !inFlow && PlainValue$5.Node.atBlank(src, offset + 1, true) ? PlainValue$5.Type.MAP_VALUE : PlainValue$5.Type.PLAIN;
+
+ case '-':
+ return !inFlow && PlainValue$5.Node.atBlank(src, offset + 1, true) ? PlainValue$5.Type.SEQ_ITEM : PlainValue$5.Type.PLAIN;
+
+ case '"':
+ return PlainValue$5.Type.QUOTE_DOUBLE;
+
+ case "'":
+ return PlainValue$5.Type.QUOTE_SINGLE;
+
+ default:
+ return PlainValue$5.Type.PLAIN;
+ }
+ }
+
+ constructor(orig = {}, {
+ atLineStart,
+ inCollection,
+ inFlow,
+ indent,
+ lineStart,
+ parent
+ } = {}) {
+ PlainValue$5._defineProperty(this, "parseNode", (overlay, start) => {
+ if (PlainValue$5.Node.atDocumentBoundary(this.src, start)) return null;
+ const context = new ParseContext(this, overlay);
+ const {
+ props,
+ type,
+ valueStart
+ } = context.parseProps(start);
+ const node = createNewNode(type, props);
+ let offset = node.parse(context, valueStart);
+ node.range = new PlainValue$5.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;
+ }
+
+ if (context.nodeStartsCollection(node)) {
+ if (!node.error && !context.atLineStart && context.parent.type === PlainValue$5.Type.DOCUMENT) {
+ node.error = new PlainValue$5.YAMLSyntaxError(node, 'Block collection must not have preceding content here (e.g. directives-end indicator)');
+ }
+
+ const collection = new Collection$1(node);
+ offset = collection.parse(new ParseContext(context), offset);
+ collection.range = new PlainValue$5.Range(start, offset);
+ return collection;
+ }
+
+ return node;
+ });
+
+ 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 = PlainValue$5.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 ? PlainValue$5.Node.endOfIndent(src, offset) : PlainValue$5.Node.endOfWhiteSpace(src, offset);
+ let ch = src[offset];
+
+ while (ch === PlainValue$5.Char.ANCHOR || ch === PlainValue$5.Char.COMMENT || ch === PlainValue$5.Char.TAG || ch === '\n') {
+ if (ch === '\n') {
+ let inEnd = offset;
+ let lineStart;
+
+ do {
+ lineStart = inEnd + 1;
+ inEnd = PlainValue$5.Node.endOfIndent(src, lineStart);
+ } while (src[inEnd] === '\n');
+
+ const indentDiff = inEnd - (lineStart + this.indent);
+ const noIndicatorAsIndent = parent.type === PlainValue$5.Type.SEQ_ITEM && parent.context.atLineStart;
+ if (src[inEnd] !== '#' && !PlainValue$5.Node.nextNodeIsIndented(src[inEnd], indentDiff, !noIndicatorAsIndent)) break;
+ this.atLineStart = true;
+ this.lineStart = lineStart;
+ lineHasProps = false;
+ offset = inEnd;
+ } else if (ch === PlainValue$5.Char.COMMENT) {
+ const end = PlainValue$5.Node.endOfLine(src, offset + 1);
+ props.push(new PlainValue$5.Range(offset, end));
+ offset = end;
+ } else {
+ let end = PlainValue$5.Node.endOfIdentifier(src, offset + 1);
+
+ if (ch === PlainValue$5.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 = PlainValue$5.Node.endOfIdentifier(src, end + 5);
+ }
+
+ props.push(new PlainValue$5.Range(offset, end));
+ lineHasProps = true;
+ offset = PlainValue$5.Node.endOfWhiteSpace(src, end);
+ }
+
+ ch = src[offset];
+ } // '- &a : b' has an anchor on an empty node
+
+
+ if (lineHasProps && ch === ':' && PlainValue$5.Node.atBlank(src, offset + 1, true)) offset -= 1;
+ const type = ParseContext.parseType(src, offset, inFlow);
+ 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
+ */
+
+
+}
+
+// Published as 'yaml/parse-cst'
+function parse$c(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$3();
+ 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;
+}
+
+parseCst$1.parse = parse$c;
+
+var Document9b4560a1 = {};
+
+var resolveSeqD03cb037 = {};
+
+var PlainValue$4 = PlainValueEc8e588e;
+
+function addCommentBefore(str, indent, comment) {
+ if (!comment) return str;
+ const cc = comment.replace(/[\s\S]^/gm, `$&${indent}#`);
+ return `#${cc}\n${indent}${str}`;
+}
+function addComment(str, indent, comment) {
+ return !comment ? str : comment.indexOf('\n') === -1 ? `${str} #${comment}` : `${str}\n` + comment.replace(/^/gm, `${indent || ''}#`);
+}
+
+class Node$1 {}
+
+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;
+}
+
+class Scalar extends Node$1 {
+ 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);
+ }
+
+}
+
+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. [])
+
+
+const isEmptyPath = path => path == null || typeof path === 'object' && path[Symbol.iterator]().next().done;
+class Collection extends Node$1 {
+ constructor(schema) {
+ super();
+
+ PlainValue$4._defineProperty(this, "items", []);
+
+ 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 === PlainValue$4.Type.FLOW_MAP || this.type === PlainValue$4.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;
+ }
+
+}
+
+PlainValue$4._defineProperty(Collection, "maxFlowStringSingleLineLength", 60);
+
+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;
+}
+
+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);
+ }
+
+}
+
+const stringifyKey = (key, jsKey, ctx) => {
+ if (jsKey === null) return '';
+ if (typeof jsKey !== 'object') return String(jsKey);
+ if (key instanceof Node$1 && 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);
+};
+
+class Pair extends Node$1 {
+ constructor(key, value = null) {
+ super();
+ this.key = key;
+ this.value = value;
+ this.type = Pair.Type.PAIR;
+ }
+
+ get commentBefore() {
+ return this.key instanceof Node$1 ? this.key.commentBefore : undefined;
+ }
+
+ set commentBefore(cb) {
+ if (this.key == null) this.key = new Scalar(null);
+ if (this.key instanceof Node$1) 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$1 && 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$1 ? key instanceof Collection || key.type === PlainValue$4.Type.BLOCK_FOLDED || key.type === PlainValue$4.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$1) {
+ 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 !== PlainValue$4.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);
+ }
+
+}
+
+PlainValue$4._defineProperty(Pair, "Type", {
+ PAIR: 'PAIR',
+ MERGE_PAIR: 'MERGE_PAIR'
+});
+
+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;
+};
+
+class Alias extends Node$1 {
+ 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 = PlainValue$4.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 PlainValue$4.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 PlainValue$4.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);
+ }
+
+}
+
+PlainValue$4._defineProperty(Alias, "default", true);
+
+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;
+}
+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);
+ }
+
+}
+
+const MERGE_KEY = '<<';
+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;
+ }
+
+}
+
+const binaryOptions = {
+ defaultType: PlainValue$4.Type.BLOCK_LITERAL,
+ lineWidth: 76
+};
+const boolOptions = {
+ trueStr: 'true',
+ falseStr: 'false'
+};
+const intOptions = {
+ asBigInt: false
+};
+const nullOptions = {
+ nullStr: 'null'
+};
+const strOptions = {
+ defaultType: PlainValue$4.Type.PLAIN,
+ doubleQuoted: {
+ jsonEncoding: false,
+ minMultiLineLength: 40
+ },
+ fold: {
+ lineWidth: 80,
+ minContentWidth: 20
+ }
+};
+
+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);
+}
+
+const FOLD_FLOW = 'flow';
+const FOLD_BLOCK = 'block';
+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
+ */
+
+
+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;
+}
+
+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 === PlainValue$4.Type.BLOCK_FOLDED ? false : type === PlainValue$4.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 !== PlainValue$4.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;
+}
+
+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 PlainValue$4.Type.BLOCK_FOLDED:
+ case PlainValue$4.Type.BLOCK_LITERAL:
+ return blockString(item, ctx, onComment, onChompKeep);
+
+ case PlainValue$4.Type.QUOTE_DOUBLE:
+ return doubleQuotedString(value, ctx);
+
+ case PlainValue$4.Type.QUOTE_SINGLE:
+ return singleQuotedString(value, ctx);
+
+ case PlainValue$4.Type.PLAIN:
+ return plainString(item, ctx, onComment, onChompKeep);
+
+ default:
+ return null;
+ }
+ };
+
+ if (type !== PlainValue$4.Type.QUOTE_DOUBLE && /[\x00-\x08\x0b-\x1f\x7f-\x9f]/.test(value)) {
+ // force double quotes on control characters
+ type = PlainValue$4.Type.QUOTE_DOUBLE;
+ } else if ((implicitKey || inFlow) && (type === PlainValue$4.Type.BLOCK_FOLDED || type === PlainValue$4.Type.BLOCK_LITERAL)) {
+ // should not happen; blocks are not valid inside flow containers
+ type = PlainValue$4.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;
+}
+
+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;
+}
+
+function checkFlowCollectionEnd(errors, cst) {
+ let char, name;
+
+ switch (cst.type) {
+ case PlainValue$4.Type.FLOW_MAP:
+ char = '}';
+ name = 'flow map';
+ break;
+
+ case PlainValue$4.Type.FLOW_SEQ:
+ char = ']';
+ name = 'flow sequence';
+ break;
+
+ default:
+ errors.push(new PlainValue$4.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 !== PlainValue$4.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 PlainValue$4.YAMLSemanticError(cst, msg);
+ err.offset = lastItem.offset + 1;
+ } else {
+ err = new PlainValue$4.YAMLSemanticError(lastItem, msg);
+ if (lastItem.range && lastItem.range.end) err.offset = lastItem.range.end - lastItem.range.start;
+ }
+
+ errors.push(err);
+ }
+}
+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 PlainValue$4.YAMLSemanticError(comment, msg));
+ }
+}
+function getLongKeyError(source, key) {
+ const sk = String(key);
+ const k = sk.substr(0, 8) + '...' + sk.substr(-8);
+ return new PlainValue$4.YAMLSemanticError(source, `The "${k}" key is too long`);
+}
+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;
+ }
+ }
+ }
+}
+
+// on error, will return { str: string, errors: Error[] }
+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;
+}
+
+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 PlainValue$4.YAMLSemanticError(node, `The ${handle} tag handle is non-default and was not declared.`);
+ }
+
+ if (!suffix) throw new PlainValue$4.YAMLSemanticError(node, `The ${handle} tag has no suffix.`);
+
+ if (handle === '!' && (doc.version || doc.options.version) === '1.0') {
+ if (suffix[0] === '^') {
+ doc.warnings.push(new PlainValue$4.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);
+}
+
+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 PlainValue$4.YAMLSemanticError(node, msg));
+ } else if (handle === '!' && !suffix) {
+ nonSpecific = true;
+ } else {
+ try {
+ return resolveTagHandle(doc, node);
+ } catch (error) {
+ doc.errors.push(error);
+ }
+ }
+ }
+
+ switch (type) {
+ case PlainValue$4.Type.BLOCK_FOLDED:
+ case PlainValue$4.Type.BLOCK_LITERAL:
+ case PlainValue$4.Type.QUOTE_DOUBLE:
+ case PlainValue$4.Type.QUOTE_SINGLE:
+ return PlainValue$4.defaultTags.STR;
+
+ case PlainValue$4.Type.FLOW_MAP:
+ case PlainValue$4.Type.MAP:
+ return PlainValue$4.defaultTags.MAP;
+
+ case PlainValue$4.Type.FLOW_SEQ:
+ case PlainValue$4.Type.SEQ:
+ return PlainValue$4.defaultTags.SEQ;
+
+ case PlainValue$4.Type.PLAIN:
+ return nonSpecific ? PlainValue$4.defaultTags.STR : null;
+
+ default:
+ return null;
+ }
+}
+
+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 PlainValue$4.Type.FLOW_MAP:
+ case PlainValue$4.Type.MAP:
+ return PlainValue$4.defaultTags.MAP;
+
+ case PlainValue$4.Type.FLOW_SEQ:
+ case PlainValue$4.Type.SEQ:
+ return PlainValue$4.defaultTags.SEQ;
+
+ default:
+ return PlainValue$4.defaultTags.STR;
+ }
+}
+
+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 PlainValue$4.YAMLWarning(node, msg));
+ const res = resolveByTagName(doc, node, fallback);
+ res.tag = tagName;
+ return res;
+ } catch (error) {
+ const refError = new PlainValue$4.YAMLReferenceError(node, error.message);
+ refError.stack = error.stack;
+ doc.errors.push(refError);
+ return null;
+ }
+}
+
+const isCollectionItem = node => {
+ if (!node) return false;
+ const {
+ type
+ } = node;
+ return type === PlainValue$4.Type.MAP_KEY || type === PlainValue$4.Type.MAP_VALUE || type === PlainValue$4.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 PlainValue$4.Char.COMMENT:
+ {
+ if (!node.commentHasRequiredWhitespace(start)) {
+ const msg = 'Comments must be separated from other tokens by white space characters';
+ errors.push(new PlainValue$4.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 PlainValue$4.Char.ANCHOR:
+ if (hasAnchor) {
+ const msg = 'A node can have at most one anchor';
+ errors.push(new PlainValue$4.YAMLSemanticError(node, msg));
+ }
+
+ hasAnchor = true;
+ break;
+
+ case PlainValue$4.Char.TAG:
+ if (hasTag) {
+ const msg = 'A node can have at most one tag';
+ errors.push(new PlainValue$4.YAMLSemanticError(node, msg));
+ }
+
+ hasTag = true;
+ break;
+ }
+ }
+
+ return {
+ comments,
+ hasAnchor,
+ hasTag
+ };
+}
+
+function resolveNodeValue(doc, node) {
+ const {
+ anchors,
+ errors,
+ schema
+ } = doc;
+
+ if (node.type === PlainValue$4.Type.ALIAS) {
+ const name = node.rawValue;
+ const src = anchors.getNode(name);
+
+ if (!src) {
+ const msg = `Aliased anchor not found: ${name}`;
+ errors.push(new PlainValue$4.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 !== PlainValue$4.Type.PLAIN) {
+ const msg = `Failed to resolve ${node.type} node here`;
+ errors.push(new PlainValue$4.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
+
+
+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 === PlainValue$4.Type.ALIAS && (hasAnchor || hasTag)) {
+ const msg = 'An alias node must not specify any properties';
+ doc.errors.push(new PlainValue$4.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;
+}
+
+function resolveMap(doc, cst) {
+ if (cst.type !== PlainValue$4.Type.MAP && cst.type !== PlainValue$4.Type.FLOW_MAP) {
+ const msg = `A ${cst.type} node cannot be resolved as a mapping`;
+ doc.errors.push(new PlainValue$4.YAMLSyntaxError(cst, msg));
+ return null;
+ }
+
+ const {
+ comments,
+ items
+ } = cst.type === PlainValue$4.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 === PlainValue$4.Type.MAP || type === PlainValue$4.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 PlainValue$4.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 PlainValue$4.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 PlainValue$4.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] !== PlainValue$4.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, PlainValue$4.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 PlainValue$4.Type.BLANK_LINE:
+ comments.push({
+ afterKey: !!key,
+ before: items.length
+ });
+ break;
+
+ case PlainValue$4.Type.COMMENT:
+ comments.push({
+ afterKey: !!key,
+ before: items.length,
+ comment: item.comment
+ });
+ break;
+
+ case PlainValue$4.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 PlainValue$4.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 === PlainValue$4.Type.MAP && !item.node.context.atLineStart) {
+ const msg = 'Nested mappings are not allowed in compact mappings';
+ doc.errors.push(new PlainValue$4.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$4.PlainValue(PlainValue$4.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 PlainValue$4.Type.BLANK_LINE:
+ case PlainValue$4.Type.COMMENT:
+ continue next;
+
+ case PlainValue$4.Type.MAP_VALUE:
+ break next;
+
+ default:
+ {
+ const msg = 'Implicit map keys need to be followed by map values';
+ doc.errors.push(new PlainValue$4.YAMLSemanticError(item, msg));
+ break next;
+ }
+ }
+ }
+
+ if (item.valueRangeContainsNewline) {
+ const msg = 'Implicit map keys need to be on a single line';
+ doc.errors.push(new PlainValue$4.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 PlainValue$4.YAMLSyntaxError(cst, msg);
+ err.offset = offset;
+ doc.errors.push(err);
+ } else if (item.type === PlainValue$4.Type.BLANK_LINE) {
+ comments.push({
+ afterKey: !!key,
+ before: items.length
+ });
+ } else if (item.type === PlainValue$4.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 PlainValue$4.YAMLSemanticError(item, 'Separator , missing in flow map'));
+ key = resolveNode(doc, item);
+ } else {
+ if (next !== ',') doc.errors.push(new PlainValue$4.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
+ };
+}
+
+function resolveSeq$3(doc, cst) {
+ if (cst.type !== PlainValue$4.Type.SEQ && cst.type !== PlainValue$4.Type.FLOW_SEQ) {
+ const msg = `A ${cst.type} node cannot be resolved as a sequence`;
+ doc.errors.push(new PlainValue$4.YAMLSyntaxError(cst, msg));
+ return null;
+ }
+
+ const {
+ comments,
+ items
+ } = cst.type === PlainValue$4.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 PlainValue$4.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 PlainValue$4.Type.BLANK_LINE:
+ comments.push({
+ before: items.length
+ });
+ break;
+
+ case PlainValue$4.Type.COMMENT:
+ comments.push({
+ comment: item.comment,
+ before: items.length
+ });
+ break;
+
+ case PlainValue$4.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 PlainValue$4.YAMLSemanticError(item, msg));
+ }
+
+ break;
+
+ default:
+ if (item.error) doc.errors.push(item.error);
+ doc.errors.push(new PlainValue$4.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 PlainValue$4.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 PlainValue$4.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 PlainValue$4.YAMLSyntaxError(cst, msg);
+ err.offset = offset;
+ doc.errors.push(err);
+ }
+ } else if (item.type === PlainValue$4.Type.BLANK_LINE) {
+ comments.push({
+ before: items.length
+ });
+ } else if (item.type === PlainValue$4.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 PlainValue$4.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
+ };
+}
+
+resolveSeqD03cb037.Alias = Alias;
+resolveSeqD03cb037.Collection = Collection;
+resolveSeqD03cb037.Merge = Merge;
+resolveSeqD03cb037.Node = Node$1;
+resolveSeqD03cb037.Pair = Pair;
+resolveSeqD03cb037.Scalar = Scalar;
+resolveSeqD03cb037.YAMLMap = YAMLMap;
+resolveSeqD03cb037.YAMLSeq = YAMLSeq;
+resolveSeqD03cb037.addComment = addComment;
+resolveSeqD03cb037.binaryOptions = binaryOptions;
+resolveSeqD03cb037.boolOptions = boolOptions;
+resolveSeqD03cb037.findPair = findPair;
+resolveSeqD03cb037.intOptions = intOptions;
+resolveSeqD03cb037.isEmptyPath = isEmptyPath;
+resolveSeqD03cb037.nullOptions = nullOptions;
+resolveSeqD03cb037.resolveMap = resolveMap;
+resolveSeqD03cb037.resolveNode = resolveNode;
+resolveSeqD03cb037.resolveSeq = resolveSeq$3;
+resolveSeqD03cb037.resolveString = resolveString;
+resolveSeqD03cb037.strOptions = strOptions;
+resolveSeqD03cb037.stringifyNumber = stringifyNumber;
+resolveSeqD03cb037.stringifyString = stringifyString;
+resolveSeqD03cb037.toJSON = toJSON;
+
+var Schema88e323a7 = {};
+
+var warnings1000a372 = {};
+
+var PlainValue$3 = PlainValueEc8e588e;
+var resolveSeq$2 = resolveSeqD03cb037;
+
+/* global atob, btoa, Buffer */
+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 = resolveSeq$2.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 PlainValue$3.YAMLReferenceError(node, msg));
+ return null;
+ }
+ },
+ options: resolveSeq$2.binaryOptions,
+ 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 = resolveSeq$2.binaryOptions.defaultType;
+
+ if (type === PlainValue$3.Type.QUOTE_DOUBLE) {
+ value = src;
+ } else {
+ const {
+ lineWidth
+ } = resolveSeq$2.binaryOptions;
+ 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 === PlainValue$3.Type.BLOCK_LITERAL ? '\n' : ' ');
+ }
+
+ return resolveSeq$2.stringifyString({
+ comment,
+ type,
+ value
+ }, ctx, onComment, onChompKeep);
+ }
+};
+
+function parsePairs(doc, cst) {
+ const seq = resolveSeq$2.resolveSeq(doc, cst);
+
+ for (let i = 0; i < seq.items.length; ++i) {
+ let item = seq.items[i];
+ if (item instanceof resolveSeq$2.Pair) continue;else if (item instanceof resolveSeq$2.YAMLMap) {
+ if (item.items.length > 1) {
+ const msg = 'Each pair must have its own sequence indicator';
+ throw new PlainValue$3.YAMLSemanticError(cst, msg);
+ }
+
+ const pair = item.items[0] || new resolveSeq$2.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 resolveSeq$2.Pair ? item : new resolveSeq$2.Pair(item);
+ }
+
+ return seq;
+}
+function createPairs(schema, iterable, ctx) {
+ const pairs = new resolveSeq$2.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;
+}
+const pairs = {
+ default: false,
+ tag: 'tag:yaml.org,2002:pairs',
+ resolve: parsePairs,
+ createNode: createPairs
+};
+
+class YAMLOMap extends resolveSeq$2.YAMLSeq {
+ constructor() {
+ super();
+
+ PlainValue$3._defineProperty(this, "add", resolveSeq$2.YAMLMap.prototype.add.bind(this));
+
+ PlainValue$3._defineProperty(this, "delete", resolveSeq$2.YAMLMap.prototype.delete.bind(this));
+
+ PlainValue$3._defineProperty(this, "get", resolveSeq$2.YAMLMap.prototype.get.bind(this));
+
+ PlainValue$3._defineProperty(this, "has", resolveSeq$2.YAMLMap.prototype.has.bind(this));
+
+ PlainValue$3._defineProperty(this, "set", resolveSeq$2.YAMLMap.prototype.set.bind(this));
+
+ this.tag = YAMLOMap.tag;
+ }
+
+ 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 resolveSeq$2.Pair) {
+ key = resolveSeq$2.toJSON(pair.key, '', ctx);
+ value = resolveSeq$2.toJSON(pair.value, key, ctx);
+ } else {
+ key = resolveSeq$2.toJSON(pair, '', ctx);
+ }
+
+ if (map.has(key)) throw new Error('Ordered maps must not include duplicate keys');
+ map.set(key, value);
+ }
+
+ return map;
+ }
+
+}
+
+PlainValue$3._defineProperty(YAMLOMap, "tag", 'tag:yaml.org,2002:omap');
+
+function parseOMap(doc, cst) {
+ const pairs = parsePairs(doc, cst);
+ const seenKeys = [];
+
+ for (const {
+ key
+ } of pairs.items) {
+ if (key instanceof resolveSeq$2.Scalar) {
+ if (seenKeys.includes(key.value)) {
+ const msg = 'Ordered maps must not include duplicate keys';
+ throw new PlainValue$3.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;
+}
+
+const omap = {
+ identify: value => value instanceof Map,
+ nodeClass: YAMLOMap,
+ default: false,
+ tag: 'tag:yaml.org,2002:omap',
+ resolve: parseOMap,
+ createNode: createOMap
+};
+
+class YAMLSet extends resolveSeq$2.YAMLMap {
+ constructor() {
+ super();
+ this.tag = YAMLSet.tag;
+ }
+
+ add(key) {
+ const pair = key instanceof resolveSeq$2.Pair ? key : new resolveSeq$2.Pair(key);
+ const prev = resolveSeq$2.findPair(this.items, pair.key);
+ if (!prev) this.items.push(pair);
+ }
+
+ get(key, keepPair) {
+ const pair = resolveSeq$2.findPair(this.items, key);
+ return !keepPair && pair instanceof resolveSeq$2.Pair ? pair.key instanceof resolveSeq$2.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 = resolveSeq$2.findPair(this.items, key);
+
+ if (prev && !value) {
+ this.items.splice(this.items.indexOf(prev), 1);
+ } else if (!prev && value) {
+ this.items.push(new resolveSeq$2.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');
+ }
+
+}
+
+PlainValue$3._defineProperty(YAMLSet, "tag", 'tag:yaml.org,2002:set');
+
+function parseSet(doc, cst) {
+ const map = resolveSeq$2.resolveMap(doc, cst);
+ if (!map.hasAllNullValues()) throw new PlainValue$3.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;
+}
+
+const set = {
+ identify: value => value instanceof Set,
+ nodeClass: YAMLSet,
+ default: false,
+ tag: 'tag:yaml.org,2002:set',
+ resolve: parseSet,
+ createNode: createSet
+};
+
+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 resolveSeq$2.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
+ ;
+};
+
+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
+};
+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
+};
+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$/, '')
+};
+
+/* 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;
+}
+
+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);
+ }
+ }
+}
+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 = {};
+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');
+ }
+}
+
+warnings1000a372.binary = binary;
+warnings1000a372.floatTime = floatTime;
+warnings1000a372.intTime = intTime;
+warnings1000a372.omap = omap;
+warnings1000a372.pairs = pairs;
+warnings1000a372.set = set;
+warnings1000a372.timestamp = timestamp;
+warnings1000a372.warn = warn;
+warnings1000a372.warnFileDeprecation = warnFileDeprecation;
+warnings1000a372.warnOptionDeprecation = warnOptionDeprecation;
+
+var PlainValue$2 = PlainValueEc8e588e;
+var resolveSeq$1 = resolveSeqD03cb037;
+var warnings$1 = warnings1000a372;
+
+function createMap(schema, obj, ctx) {
+ const map = new resolveSeq$1.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;
+}
+
+const map = {
+ createNode: createMap,
+ default: true,
+ nodeClass: resolveSeq$1.YAMLMap,
+ tag: 'tag:yaml.org,2002:map',
+ resolve: resolveSeq$1.resolveMap
+};
+
+function createSeq(schema, obj, ctx) {
+ const seq = new resolveSeq$1.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;
+}
+
+const seq = {
+ createNode: createSeq,
+ default: true,
+ nodeClass: resolveSeq$1.YAMLSeq,
+ tag: 'tag:yaml.org,2002:seq',
+ resolve: resolveSeq$1.resolveSeq
+};
+
+const string = {
+ identify: value => typeof value === 'string',
+ default: true,
+ tag: 'tag:yaml.org,2002:str',
+ resolve: resolveSeq$1.resolveString,
+
+ stringify(item, ctx, onComment, onChompKeep) {
+ ctx = Object.assign({
+ actualString: true
+ }, ctx);
+ return resolveSeq$1.stringifyString(item, ctx, onComment, onChompKeep);
+ },
+
+ options: resolveSeq$1.strOptions
+};
+
+const failsafe = [map, seq, string];
+
+/* global BigInt */
+
+const intIdentify$2 = value => typeof value === 'bigint' || Number.isInteger(value);
+
+const intResolve$1 = (src, part, radix) => resolveSeq$1.intOptions.asBigInt ? BigInt(src) : parseInt(part, radix);
+
+function intStringify$1(node, radix, prefix) {
+ const {
+ value
+ } = node;
+ if (intIdentify$2(value) && value >= 0) return prefix + value.toString(radix);
+ return resolveSeq$1.stringifyNumber(node);
+}
+
+const nullObj = {
+ identify: value => value == null,
+ createNode: (schema, value, ctx) => ctx.wrapScalars ? new resolveSeq$1.Scalar(null) : null,
+ default: true,
+ tag: 'tag:yaml.org,2002:null',
+ test: /^(?:~|[Nn]ull|NULL)?$/,
+ resolve: () => null,
+ options: resolveSeq$1.nullOptions,
+ stringify: () => resolveSeq$1.nullOptions.nullStr
+};
+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: resolveSeq$1.boolOptions,
+ stringify: ({
+ value
+ }) => value ? resolveSeq$1.boolOptions.trueStr : resolveSeq$1.boolOptions.falseStr
+};
+const octObj = {
+ identify: value => intIdentify$2(value) && value >= 0,
+ default: true,
+ tag: 'tag:yaml.org,2002:int',
+ format: 'OCT',
+ test: /^0o([0-7]+)$/,
+ resolve: (str, oct) => intResolve$1(str, oct, 8),
+ options: resolveSeq$1.intOptions,
+ stringify: node => intStringify$1(node, 8, '0o')
+};
+const intObj = {
+ identify: intIdentify$2,
+ default: true,
+ tag: 'tag:yaml.org,2002:int',
+ test: /^[-+]?[0-9]+$/,
+ resolve: str => intResolve$1(str, str, 10),
+ options: resolveSeq$1.intOptions,
+ stringify: resolveSeq$1.stringifyNumber
+};
+const hexObj = {
+ identify: value => intIdentify$2(value) && value >= 0,
+ default: true,
+ tag: 'tag:yaml.org,2002:int',
+ format: 'HEX',
+ test: /^0x([0-9a-fA-F]+)$/,
+ resolve: (str, hex) => intResolve$1(str, hex, 16),
+ options: resolveSeq$1.intOptions,
+ stringify: node => intStringify$1(node, 16, '0x')
+};
+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: resolveSeq$1.stringifyNumber
+};
+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()
+};
+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 resolveSeq$1.Scalar(parseFloat(str));
+ if (frac && frac[frac.length - 1] === '0') node.minFractionDigits = frac.length;
+ return node;
+ },
+
+ stringify: resolveSeq$1.stringifyNumber
+};
+const core$1 = failsafe.concat([nullObj, boolObj, octObj, intObj, hexObj, nanObj, expObj, floatObj]);
+
+/* global BigInt */
+
+const intIdentify$1 = value => typeof value === 'bigint' || Number.isInteger(value);
+
+const stringifyJSON = ({
+ value
+}) => JSON.stringify(value);
+
+const json = [map, seq, {
+ identify: value => typeof value === 'string',
+ default: true,
+ tag: 'tag:yaml.org,2002:str',
+ resolve: resolveSeq$1.resolveString,
+ stringify: stringifyJSON
+}, {
+ identify: value => value == null,
+ createNode: (schema, value, ctx) => ctx.wrapScalars ? new resolveSeq$1.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$1,
+ default: true,
+ tag: 'tag:yaml.org,2002:int',
+ test: /^-?(?:0|[1-9][0-9]*)$/,
+ resolve: str => resolveSeq$1.intOptions.asBigInt ? BigInt(str) : parseInt(str, 10),
+ stringify: ({
+ value
+ }) => intIdentify$1(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)}`);
+};
+
+/* global BigInt */
+
+const boolStringify = ({
+ value
+}) => value ? resolveSeq$1.boolOptions.trueStr : resolveSeq$1.boolOptions.falseStr;
+
+const intIdentify = value => typeof value === 'bigint' || Number.isInteger(value);
+
+function intResolve(sign, src, radix) {
+ let str = src.replace(/_/g, '');
+
+ if (resolveSeq$1.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 resolveSeq$1.stringifyNumber(node);
+}
+
+const yaml11 = failsafe.concat([{
+ identify: value => value == null,
+ createNode: (schema, value, ctx) => ctx.wrapScalars ? new resolveSeq$1.Scalar(null) : null,
+ default: true,
+ tag: 'tag:yaml.org,2002:null',
+ test: /^(?:~|[Nn]ull|NULL)?$/,
+ resolve: () => null,
+ options: resolveSeq$1.nullOptions,
+ stringify: () => resolveSeq$1.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: resolveSeq$1.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: resolveSeq$1.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: resolveSeq$1.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: resolveSeq$1.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 resolveSeq$1.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: resolveSeq$1.stringifyNumber
+}], warnings$1.binary, warnings$1.omap, warnings$1.pairs, warnings$1.set, warnings$1.intTime, warnings$1.floatTime, warnings$1.timestamp);
+
+const schemas = {
+ core: core$1,
+ failsafe,
+ json,
+ yaml11
+};
+const tags = {
+ binary: warnings$1.binary,
+ bool: boolObj,
+ float: floatObj,
+ floatExp: expObj,
+ floatNaN: nanObj,
+ floatTime: warnings$1.floatTime,
+ int: intObj,
+ intHex: hexObj,
+ intOct: octObj,
+ intTime: warnings$1.intTime,
+ map,
+ null: nullObj,
+ omap: warnings$1.omap,
+ pairs: warnings$1.pairs,
+ seq,
+ set: warnings$1.set,
+ timestamp: warnings$1.timestamp
+};
+
+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);
+}
+
+function createNode$1(value, tagName, ctx) {
+ if (value instanceof resolveSeq$1.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 resolveSeq$1.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 resolveSeq$1.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 resolveSeq$1.Scalar(value) : value;
+ if (tagName && obj.node instanceof resolveSeq$1.Node) obj.node.tag = tagName;
+ return obj.node;
+}
+
+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;
+}
+
+const sortMapEntriesByKey = (a, b) => a.key < b.key ? -1 : a.key > b.key ? 1 : 0;
+
+class Schema$2 {
+ // TODO: remove in v2
+ // 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) warnings$1.warnOptionDeprecation('tags', 'customTags');
+ this.tags = getSchemaTags(schemas, tags, customTags || deprecatedCustomTags, schema);
+ }
+
+ createNode(value, wrapScalars, tagName, ctx) {
+ const baseCtx = {
+ defaultPrefix: Schema$2.defaultPrefix,
+ schema: this,
+ wrapScalars
+ };
+ const createCtx = ctx ? Object.assign(ctx, baseCtx) : baseCtx;
+ return createNode$1(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 resolveSeq$1.Pair(k, v);
+ }
+
+}
+
+PlainValue$2._defineProperty(Schema$2, "defaultPrefix", PlainValue$2.defaultTagPrefix);
+
+PlainValue$2._defineProperty(Schema$2, "defaultTags", PlainValue$2.defaultTags);
+
+Schema88e323a7.Schema = Schema$2;
+
+var PlainValue$1 = PlainValueEc8e588e;
+var resolveSeq = resolveSeqD03cb037;
+var Schema$1 = Schema88e323a7;
+
+const defaultOptions$1 = {
+ 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'
+};
+const scalarOptions = {
+ get binary() {
+ return resolveSeq.binaryOptions;
+ },
+
+ set binary(opt) {
+ Object.assign(resolveSeq.binaryOptions, opt);
+ },
+
+ get bool() {
+ return resolveSeq.boolOptions;
+ },
+
+ set bool(opt) {
+ Object.assign(resolveSeq.boolOptions, opt);
+ },
+
+ get int() {
+ return resolveSeq.intOptions;
+ },
+
+ set int(opt) {
+ Object.assign(resolveSeq.intOptions, opt);
+ },
+
+ get null() {
+ return resolveSeq.nullOptions;
+ },
+
+ set null(opt) {
+ Object.assign(resolveSeq.nullOptions, opt);
+ },
+
+ get str() {
+ return resolveSeq.strOptions;
+ },
+
+ set str(opt) {
+ Object.assign(resolveSeq.strOptions, opt);
+ }
+
+};
+const documentOptions = {
+ '1.0': {
+ schema: 'yaml-1.1',
+ merge: true,
+ tagPrefixes: [{
+ handle: '!',
+ prefix: PlainValue$1.defaultTagPrefix
+ }, {
+ handle: '!!',
+ prefix: 'tag:private.yaml.org,2002:'
+ }]
+ },
+ 1.1: {
+ schema: 'yaml-1.1',
+ merge: true,
+ tagPrefixes: [{
+ handle: '!',
+ prefix: '!'
+ }, {
+ handle: '!!',
+ prefix: PlainValue$1.defaultTagPrefix
+ }]
+ },
+ 1.2: {
+ schema: 'core',
+ merge: false,
+ tagPrefixes: [{
+ handle: '!',
+ prefix: '!'
+ }, {
+ handle: '!!',
+ prefix: PlainValue$1.defaultTagPrefix
+ }]
+ }
+};
+
+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;
+}
+
+function getTagObject(tags, item) {
+ if (item instanceof resolveSeq.Alias) return resolveSeq.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 resolveSeq.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(' ');
+}
+
+function stringify$1(item, ctx, onComment, onChompKeep) {
+ const {
+ anchors,
+ schema
+ } = ctx.doc;
+ let tagObj;
+
+ if (!(item instanceof resolveSeq.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 resolveSeq.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 resolveSeq.Scalar ? resolveSeq.stringifyString(item, ctx, onComment, onChompKeep) : item.toString(ctx, onComment, onChompKeep);
+ if (!props) return str;
+ return item instanceof resolveSeq.Scalar || str[0] === '{' || str[0] === '[' ? `${props} ${str}` : `${props}\n${ctx.indent}${str}`;
+}
+
+class Anchors {
+ static validAnchorNode(node) {
+ return node instanceof resolveSeq.Scalar || node instanceof resolveSeq.YAMLSeq || node instanceof resolveSeq.YAMLMap;
+ }
+
+ constructor(prefix) {
+ PlainValue$1._defineProperty(this, "map", Object.create(null));
+
+ this.prefix = prefix;
+ }
+
+ createAlias(node, name) {
+ this.setAnchor(node, name);
+ return new resolveSeq.Alias(node);
+ }
+
+ createMergePair(...sources) {
+ const merge = new resolveSeq.Merge();
+ merge.value.items = sources.map(s => {
+ if (s instanceof resolveSeq.Alias) {
+ if (s.source instanceof resolveSeq.YAMLMap) return s;
+ } else if (s instanceof resolveSeq.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;
+ }
+
+}
+
+const visit = (node, tags) => {
+ if (node && typeof node === 'object') {
+ const {
+ tag
+ } = node;
+
+ if (node instanceof resolveSeq.Collection) {
+ if (tag) tags[tag] = true;
+ node.items.forEach(n => visit(n, tags));
+ } else if (node instanceof resolveSeq.Pair) {
+ visit(node.key, tags);
+ visit(node.value, tags);
+ } else if (node instanceof resolveSeq.Scalar) {
+ if (tag) tags[tag] = true;
+ }
+ }
+
+ return tags;
+};
+
+const listTagNames = node => Object.keys(visit(node, {}));
+
+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 PlainValue$1.YAMLSyntaxError(node, msg));
+ break;
+ }
+
+ const res = resolveSeq.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 === PlainValue$1.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 resolveSeq.Collection && body.items[0] ? body.items[0] : body;
+ cbNode.commentBefore = cbNode.commentBefore ? `${cb}\n${cbNode.commentBefore}` : cb;
+ }
+
+ doc.comment = comments.after.join('\n') || null;
+ }
+}
+
+function resolveTagDirective({
+ tagPrefixes
+}, directive) {
+ const [handle, prefix] = directive.parameters;
+
+ if (!handle || !prefix) {
+ const msg = 'Insufficient parameters given for %TAG directive';
+ throw new PlainValue$1.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 PlainValue$1.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 PlainValue$1.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 PlainValue$1.YAMLWarning(directive, msg));
+ }
+
+ return version;
+}
+
+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 PlainValue$1.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 PlainValue$1.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;
+}
+
+function assertCollection(contents) {
+ if (contents instanceof resolveSeq.Collection) return true;
+ throw new Error('Expected a YAML collection as document contents');
+}
+
+class Document$2 {
+ 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 (resolveSeq.isEmptyPath(path)) {
+ if (this.contents == null) return false;
+ this.contents = null;
+ return true;
+ }
+
+ assertCollection(this.contents);
+ return this.contents.deleteIn(path);
+ }
+
+ getDefaults() {
+ return Document$2.defaults[this.version] || Document$2.defaults[this.options.version] || {};
+ }
+
+ get(key, keepScalar) {
+ return this.contents instanceof resolveSeq.Collection ? this.contents.get(key, keepScalar) : undefined;
+ }
+
+ getIn(path, keepScalar) {
+ if (resolveSeq.isEmptyPath(path)) return !keepScalar && this.contents instanceof resolveSeq.Scalar ? this.contents.value : this.contents;
+ return this.contents instanceof resolveSeq.Collection ? this.contents.getIn(path, keepScalar) : undefined;
+ }
+
+ has(key) {
+ return this.contents instanceof resolveSeq.Collection ? this.contents.has(key) : false;
+ }
+
+ hasIn(path) {
+ if (resolveSeq.isEmptyPath(path)) return this.contents !== undefined;
+ return this.contents instanceof resolveSeq.Collection ? this.contents.hasIn(path) : false;
+ }
+
+ set(key, value) {
+ assertCollection(this.contents);
+ this.contents.set(key, value);
+ }
+
+ setIn(path, value) {
+ if (resolveSeq.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$1.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 PlainValue$1.YAMLError) error.makePretty();
+
+ for (const warn of this.warnings) if (warn instanceof PlainValue$1.YAMLError) warn.makePretty();
+ }
+
+ return this;
+ }
+
+ listNonDefaultTags() {
+ return listTagNames(this.contents).filter(t => t.indexOf(Schema$1.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 resolveSeq.Scalar));
+ const ctx = {
+ doc: this,
+ indentStep: ' ',
+ keep,
+ mapAsMap: keep && !!mapAsMap,
+ maxAliasCount,
+ stringify: stringify$1 // 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 = resolveSeq.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: stringify$1 // Requiring directly in nodes would create circular dependencies
+
+ };
+ let chompKeep = false;
+ let contentComment = null;
+
+ if (this.contents) {
+ if (this.contents instanceof resolveSeq.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$1(this.contents, ctx, () => contentComment = null, onChompKeep);
+ lines.push(resolveSeq.addComment(body, '', contentComment));
+ } else if (this.contents !== undefined) {
+ lines.push(stringify$1(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';
+ }
+
+}
+
+PlainValue$1._defineProperty(Document$2, "defaults", documentOptions);
+
+Document9b4560a1.Document = Document$2;
+Document9b4560a1.defaultOptions = defaultOptions$1;
+Document9b4560a1.scalarOptions = scalarOptions;
+
+var parseCst = parseCst$1;
+var Document$1 = Document9b4560a1;
+var Schema = Schema88e323a7;
+var PlainValue = PlainValueEc8e588e;
+var warnings = warnings1000a372;
+
+
+function createNode(value, wrapScalars = true, tag) {
+ if (tag === undefined && typeof wrapScalars === 'string') {
+ tag = wrapScalars;
+ wrapScalars = true;
+ }
+
+ const options = Object.assign({}, Document$1.Document.defaults[Document$1.defaultOptions.version], Document$1.defaultOptions);
+ const schema = new Schema.Schema(options);
+ return schema.createNode(value, wrapScalars, tag);
+}
+
+class Document extends Document$1.Document {
+ constructor(options) {
+ super(Object.assign({}, Document$1.defaultOptions, options));
+ }
+
+}
+
+function parseAllDocuments(src, options) {
+ const stream = [];
+ let prev;
+
+ for (const cstDoc of parseCst.parse(src)) {
+ const doc = new Document(options);
+ doc.parse(cstDoc, prev);
+ stream.push(doc);
+ prev = doc;
+ }
+
+ return stream;
+}
+
+function parseDocument(src, options) {
+ const cst = parseCst.parse(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 PlainValue.YAMLSemanticError(cst[1], errMsg));
+ }
+
+ return doc;
+}
+
+function parse$b(src, options) {
+ const doc = parseDocument(src, options);
+ doc.warnings.forEach(warning => warnings.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);
+}
+
+const YAML = {
+ createNode,
+ defaultOptions: Document$1.defaultOptions,
+ Document,
+ parse: parse$b,
+ parseAllDocuments,
+ parseCST: parseCst.parse,
+ parseDocument,
+ scalarOptions: Document$1.scalarOptions,
+ stringify
+};
+
+dist.YAML = YAML;
+
+var yaml$1 = dist.YAML;
+
+// eslint-disable-next-line node/no-deprecated-api
+const { createRequire, createRequireFromPath } = require$$0__default$4;
+
+function req$2 (name, rootFile) {
+ const create = createRequire || createRequireFromPath;
+ const require = create(rootFile);
+ return require(name)
+}
+
+var req_1 = req$2;
+
+const req$1 = req_1;
+
+/**
+ * Load Options
+ *
+ * @private
+ * @method options
+ *
+ * @param {Object} config PostCSS Config
+ *
+ * @return {Object} options PostCSS Options
+ */
+const options = (config, file) => {
+ if (config.parser && typeof config.parser === 'string') {
+ try {
+ config.parser = req$1(config.parser, file);
+ } catch (err) {
+ throw new Error(`Loading PostCSS Parser failed: ${err.message}\n\n(@${file})`)
+ }
+ }
+
+ if (config.syntax && typeof config.syntax === 'string') {
+ try {
+ config.syntax = req$1(config.syntax, file);
+ } catch (err) {
+ throw new Error(`Loading PostCSS Syntax failed: ${err.message}\n\n(@${file})`)
+ }
+ }
+
+ if (config.stringifier && typeof config.stringifier === 'string') {
+ try {
+ config.stringifier = req$1(config.stringifier, file);
+ } catch (err) {
+ throw new Error(`Loading PostCSS Stringifier failed: ${err.message}\n\n(@${file})`)
+ }
+ }
+
+ if (config.plugins) {
+ delete config.plugins;
+ }
+
+ return config
+};
+
+var options_1 = options;
+
+const req = req_1;
+
+/**
+ * Plugin Loader
+ *
+ * @private
+ * @method load
+ *
+ * @param {String} plugin PostCSS Plugin Name
+ * @param {Object} options PostCSS Plugin Options
+ *
+ * @return {Function} PostCSS Plugin
+ */
+const load = (plugin, options, file) => {
+ try {
+ if (
+ options === null ||
+ options === undefined ||
+ Object.keys(options).length === 0
+ ) {
+ return req(plugin, file)
+ } else {
+ return req(plugin, file)(options)
+ }
+ } catch (err) {
+ throw new Error(`Loading PostCSS Plugin failed: ${err.message}\n\n(@${file})`)
+ }
+};
+
+/**
+ * Load Plugins
+ *
+ * @private
+ * @method plugins
+ *
+ * @param {Object} config PostCSS Config Plugins
+ *
+ * @return {Array} plugins PostCSS Plugins
+ */
+const plugins = (config, file) => {
+ let plugins = [];
+
+ if (Array.isArray(config.plugins)) {
+ plugins = config.plugins.filter(Boolean);
+ } else {
+ plugins = Object.keys(config.plugins)
+ .filter((plugin) => {
+ return config.plugins[plugin] !== false ? plugin : ''
+ })
+ .map((plugin) => {
+ return load(plugin, config.plugins[plugin], file)
+ });
+ }
+
+ if (plugins.length && plugins.length > 0) {
+ plugins.forEach((plugin, i) => {
+ if (plugin.default) {
+ plugin = plugin.default;
+ }
+
+ if (plugin.postcss === true) {
+ plugin = plugin();
+ } else if (plugin.postcss) {
+ plugin = plugin.postcss;
+ }
+
+ if (
+ // eslint-disable-next-line
+ !(
+ (typeof plugin === 'object' && Array.isArray(plugin.plugins)) ||
+ (typeof plugin === 'object' && plugin.postcssPlugin) ||
+ (typeof plugin === 'function')
+ )
+ ) {
+ throw new TypeError(`Invalid PostCSS Plugin found at: plugins[${i}]\n\n(@${file})`)
+ }
+ });
+ }
+
+ return plugins
+};
+
+var plugins_1 = plugins;
+
+const resolve$1 = path__default.resolve;
+
+const config = dist$1;
+const yaml = yaml$1;
+
+const loadOptions = options_1;
+const loadPlugins = plugins_1;
+
+/* istanbul ignore next */
+const interopRequireDefault = (obj) => obj && obj.__esModule ? obj : { default: obj };
+
+/**
+ * Process the result from cosmiconfig
+ *
+ * @param {Object} ctx Config Context
+ * @param {Object} result Cosmiconfig result
+ *
+ * @return {Object} PostCSS Config
+ */
+const processResult = (ctx, result) => {
+ const file = result.filepath || '';
+ let config = interopRequireDefault(result.config).default || {};
+
+ if (typeof config === 'function') {
+ config = config(ctx);
+ } else {
+ config = Object.assign({}, config, ctx);
+ }
+
+ if (!config.plugins) {
+ config.plugins = [];
+ }
+
+ return {
+ plugins: loadPlugins(config, file),
+ options: loadOptions(config, file),
+ file: file
+ }
+};
+
+/**
+ * Builds the Config Context
+ *
+ * @param {Object} ctx Config Context
+ *
+ * @return {Object} Config Context
+ */
+const createContext = (ctx) => {
+ /**
+ * @type {Object}
+ *
+ * @prop {String} cwd=process.cwd() Config search start location
+ * @prop {String} env=process.env.NODE_ENV Config Enviroment, will be set to `development` by `postcss-load-config` if `process.env.NODE_ENV` is `undefined`
+ */
+ ctx = Object.assign({
+ cwd: process.cwd(),
+ env: process.env.NODE_ENV
+ }, ctx);
+
+ if (!ctx.env) {
+ process.env.NODE_ENV = 'development';
+ }
+
+ return ctx
+};
+
+const addTypeScriptLoader = (options = {}, loader) => {
+ const moduleName = 'postcss';
+
+ return {
+ ...options,
+ searchPlaces: [
+ ...(options.searchPlaces || []),
+ 'package.json',
+ `.${moduleName}rc`,
+ `.${moduleName}rc.json`,
+ `.${moduleName}rc.yaml`,
+ `.${moduleName}rc.yml`,
+ `.${moduleName}rc.ts`,
+ `.${moduleName}rc.js`,
+ `.${moduleName}rc.cjs`,
+ `${moduleName}.config.ts`,
+ `${moduleName}.config.js`,
+ `${moduleName}.config.cjs`
+ ],
+ loaders: {
+ ...options.loaders,
+ '.yaml': (filepath, content) => yaml.parse(content),
+ '.yml': (filepath, content) => yaml.parse(content),
+ '.ts': loader
+ }
+ }
+};
+
+const withTypeScriptLoader = (rcFunc) => {
+ return (ctx, path, options) => {
+ return rcFunc(ctx, path, addTypeScriptLoader(options, (configFile) => {
+ let registerer = { enabled () {} };
+
+ try {
+ // Register TypeScript compiler instance
+ registerer = require('ts-node').register();
+
+ return eval('require')(configFile)
+ } catch (err) {
+ if (err.code === 'MODULE_NOT_FOUND') {
+ throw new Error(
+ `'ts-node' is required for the TypeScript configuration files. Make sure it is installed\nError: ${err.message}`
+ )
+ }
+
+ throw err
+ } finally {
+ registerer.enabled(false);
+ }
+ }))
+ }
+};
+
+/**
+ * Load Config
+ *
+ * @method rc
+ *
+ * @param {Object} ctx Config Context
+ * @param {String} path Config Path
+ * @param {Object} options Config Options
+ *
+ * @return {Promise} config PostCSS Config
+ */
+const rc = withTypeScriptLoader((ctx, path, options) => {
+ /**
+ * @type {Object} The full Config Context
+ */
+ ctx = createContext(ctx);
+
+ /**
+ * @type {String} `process.cwd()`
+ */
+ path = path ? resolve$1(path) : process.cwd();
+
+ return config.lilconfig('postcss', options)
+ .search(path)
+ .then((result) => {
+ if (!result) {
+ throw new Error(`No PostCSS Config found in: ${path}`)
+ }
+
+ return processResult(ctx, result)
+ })
+});
+
+rc.sync = withTypeScriptLoader((ctx, path, options) => {
+ /**
+ * @type {Object} The full Config Context
+ */
+ ctx = createContext(ctx);
+
+ /**
+ * @type {String} `process.cwd()`
+ */
+ path = path ? resolve$1(path) : process.cwd();
+
+ const result = config.lilconfigSync('postcss', options).search(path);
+
+ if (!result) {
+ throw new Error(`No PostCSS Config found in: ${path}`)
+ }
+
+ return processResult(ctx, result)
+});
+
+/**
+ * Autoload Config for PostCSS
+ *
+ * @author Michael Ciniawsky @michael-ciniawsky
+ * @license MIT
+ *
+ * @module postcss-load-config
+ * @version 2.1.0
+ *
+ * @requires comsiconfig
+ * @requires ./options
+ * @requires ./plugins
+ */
+var src$1 = rc;
+
+const isDebug$6 = !!process.env.DEBUG;
+const debug$e = createDebugger('vite:sourcemap', {
+ onlyWhenFocused: true
+});
+// Virtual modules should be prefixed with a null byte to avoid a
+// false positive "missing source" warning. We also check for certain
+// prefixes used for special handling in esbuildDepPlugin.
+const virtualSourceRE = /^(\0|dep:|browser-external:)/;
+async function injectSourcesContent(map, file, logger) {
+ let sourceRoot;
+ try {
+ // The source root is undefined for virtual modules and permission errors.
+ sourceRoot = await fs$n.promises.realpath(path__default.resolve(path__default.dirname(file), map.sourceRoot || ''));
+ }
+ catch { }
+ const missingSources = [];
+ map.sourcesContent = await Promise.all(map.sources.map((sourcePath) => {
+ if (sourcePath && !virtualSourceRE.test(sourcePath)) {
+ sourcePath = decodeURI(sourcePath);
+ if (sourceRoot) {
+ sourcePath = path__default.resolve(sourceRoot, sourcePath);
+ }
+ return fs$n.promises.readFile(sourcePath, 'utf-8').catch(() => {
+ missingSources.push(sourcePath);
+ return null;
+ });
+ }
+ return null;
+ }));
+ // Use this command…
+ // DEBUG="vite:sourcemap" vite build
+ // …to log the missing sources.
+ if (missingSources.length) {
+ logger.warnOnce(`Sourcemap for "${file}" points to missing source files`);
+ isDebug$6 && debug$e(`Missing sources:\n ` + missingSources.join(`\n `));
+ }
+}
+function genSourceMapUrl(map) {
+ if (typeof map !== 'string') {
+ map = JSON.stringify(map);
+ }
+ return `data:application/json;base64,${Buffer.from(map).toString('base64')}`;
+}
+function getCodeWithSourcemap(type, code, map) {
+ if (isDebug$6) {
+ code += `\n/*${JSON.stringify(map, null, 2).replace(/\*\//g, '*\\/')}*/\n`;
+ }
+ if (type === 'js') {
+ code += `\n//# sourceMappingURL=${genSourceMapUrl(map !== null && map !== void 0 ? map : undefined)}`;
+ }
+ else if (type === 'css') {
+ code += `\n/*# sourceMappingURL=${genSourceMapUrl(map !== null && map !== void 0 ? map : undefined)} */`;
+ }
+ return code;
+}
+
+// This file was generated. Do not modify manually!
+var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 154, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 161, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 19306, 9, 87, 9, 39, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4706, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 262, 6, 10, 9, 357, 0, 62, 13, 1495, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];
+
+// This file was generated. Do not modify manually!
+var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 85, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 190, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1070, 4050, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 46, 2, 18, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 482, 44, 11, 6, 17, 0, 322, 29, 19, 43, 1269, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4152, 8, 221, 3, 5761, 15, 7472, 3104, 541, 1507, 4938];
+
+// This file was generated. Do not modify manually!
+var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f";
+
+// This file was generated. Do not modify manually!
+var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ca\ua7d0\ua7d1\ua7d3\ua7d5-\ua7d9\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc";
+
+// These are a run-length and offset encoded representation of the
+
+// Reserved word lists for various dialects of the language
+
+var reservedWords = {
+ 3: "abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile",
+ 5: "class enum extends super const export import",
+ 6: "enum",
+ strict: "implements interface let package private protected public static yield",
+ strictBind: "eval arguments"
+};
+
+// And the keywords
+
+var ecma5AndLessKeywords = "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this";
+
+var keywords$1 = {
+ 5: ecma5AndLessKeywords,
+ "5module": ecma5AndLessKeywords + " export import",
+ 6: ecma5AndLessKeywords + " const class extends export import super"
+};
+
+var keywordRelationalOperator = /^in(stanceof)?$/;
+
+// ## Character categories
+
+var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]");
+var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]");
+
+// This has a complexity linear to the value of the code. The
+// assumption is that looking up astral identifier characters is
+// rare.
+function isInAstralSet(code, set) {
+ var pos = 0x10000;
+ for (var i = 0; i < set.length; i += 2) {
+ pos += set[i];
+ if (pos > code) { return false }
+ pos += set[i + 1];
+ if (pos >= code) { return true }
+ }
+}
+
+// Test whether a given character code starts an identifier.
+
+function isIdentifierStart(code, astral) {
+ if (code < 65) { return code === 36 }
+ if (code < 91) { return true }
+ if (code < 97) { return code === 95 }
+ if (code < 123) { return true }
+ if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)) }
+ if (astral === false) { return false }
+ return isInAstralSet(code, astralIdentifierStartCodes)
+}
+
+// Test whether a given character is part of an identifier.
+
+function isIdentifierChar(code, astral) {
+ if (code < 48) { return code === 36 }
+ if (code < 58) { return true }
+ if (code < 65) { return false }
+ if (code < 91) { return true }
+ if (code < 97) { return code === 95 }
+ if (code < 123) { return true }
+ if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)) }
+ if (astral === false) { return false }
+ return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes)
+}
+
+// ## Token types
+
+// The assignment of fine-grained, information-carrying type objects
+// allows the tokenizer to store the information it has about a
+// token in a way that is very cheap for the parser to look up.
+
+// All token type variables start with an underscore, to make them
+// easy to recognize.
+
+// The `beforeExpr` property is used to disambiguate between regular
+// expressions and divisions. It is set on all token types that can
+// be followed by an expression (thus, a slash after them would be a
+// regular expression).
+//
+// The `startsExpr` property is used to check if the token ends a
+// `yield` expression. It is set on all token types that either can
+// directly start an expression (like a quotation mark) or can
+// continue an expression (like the body of a string).
+//
+// `isLoop` marks a keyword as starting a loop, which is important
+// to know when parsing a label, in order to allow or disallow
+// continue jumps to that label.
+
+var TokenType = function TokenType(label, conf) {
+ if ( conf === void 0 ) conf = {};
+
+ this.label = label;
+ this.keyword = conf.keyword;
+ this.beforeExpr = !!conf.beforeExpr;
+ this.startsExpr = !!conf.startsExpr;
+ this.isLoop = !!conf.isLoop;
+ this.isAssign = !!conf.isAssign;
+ this.prefix = !!conf.prefix;
+ this.postfix = !!conf.postfix;
+ this.binop = conf.binop || null;
+ this.updateContext = null;
+};
+
+function binop(name, prec) {
+ return new TokenType(name, {beforeExpr: true, binop: prec})
+}
+var beforeExpr = {beforeExpr: true}, startsExpr = {startsExpr: true};
+
+// Map keyword names to token types.
+
+var keywords = {};
+
+// Succinct definitions of keyword token types
+function kw(name, options) {
+ if ( options === void 0 ) options = {};
+
+ options.keyword = name;
+ return keywords[name] = new TokenType(name, options)
+}
+
+var types$1 = {
+ num: new TokenType("num", startsExpr),
+ regexp: new TokenType("regexp", startsExpr),
+ string: new TokenType("string", startsExpr),
+ name: new TokenType("name", startsExpr),
+ privateId: new TokenType("privateId", startsExpr),
+ eof: new TokenType("eof"),
+
+ // Punctuation token types.
+ bracketL: new TokenType("[", {beforeExpr: true, startsExpr: true}),
+ bracketR: new TokenType("]"),
+ braceL: new TokenType("{", {beforeExpr: true, startsExpr: true}),
+ braceR: new TokenType("}"),
+ parenL: new TokenType("(", {beforeExpr: true, startsExpr: true}),
+ parenR: new TokenType(")"),
+ comma: new TokenType(",", beforeExpr),
+ semi: new TokenType(";", beforeExpr),
+ colon: new TokenType(":", beforeExpr),
+ dot: new TokenType("."),
+ question: new TokenType("?", beforeExpr),
+ questionDot: new TokenType("?."),
+ arrow: new TokenType("=>", beforeExpr),
+ template: new TokenType("template"),
+ invalidTemplate: new TokenType("invalidTemplate"),
+ ellipsis: new TokenType("...", beforeExpr),
+ backQuote: new TokenType("`", startsExpr),
+ dollarBraceL: new TokenType("${", {beforeExpr: true, startsExpr: true}),
+
+ // Operators. These carry several kinds of properties to help the
+ // parser use them properly (the presence of these properties is
+ // what categorizes them as operators).
+ //
+ // `binop`, when present, specifies that this operator is a binary
+ // operator, and will refer to its precedence.
+ //
+ // `prefix` and `postfix` mark the operator as a prefix or postfix
+ // unary operator.
+ //
+ // `isAssign` marks all of `=`, `+=`, `-=` etcetera, which act as
+ // binary operators with a very low precedence, that should result
+ // in AssignmentExpression nodes.
+
+ eq: new TokenType("=", {beforeExpr: true, isAssign: true}),
+ assign: new TokenType("_=", {beforeExpr: true, isAssign: true}),
+ incDec: new TokenType("++/--", {prefix: true, postfix: true, startsExpr: true}),
+ prefix: new TokenType("!/~", {beforeExpr: true, prefix: true, startsExpr: true}),
+ logicalOR: binop("||", 1),
+ logicalAND: binop("&&", 2),
+ bitwiseOR: binop("|", 3),
+ bitwiseXOR: binop("^", 4),
+ bitwiseAND: binop("&", 5),
+ equality: binop("==/!=/===/!==", 6),
+ relational: binop(">/<=/>=", 7),
+ bitShift: binop("<>>/>>>", 8),
+ plusMin: new TokenType("+/-", {beforeExpr: true, binop: 9, prefix: true, startsExpr: true}),
+ modulo: binop("%", 10),
+ star: binop("*", 10),
+ slash: binop("/", 10),
+ starstar: new TokenType("**", {beforeExpr: true}),
+ coalesce: binop("??", 1),
+
+ // Keyword token types.
+ _break: kw("break"),
+ _case: kw("case", beforeExpr),
+ _catch: kw("catch"),
+ _continue: kw("continue"),
+ _debugger: kw("debugger"),
+ _default: kw("default", beforeExpr),
+ _do: kw("do", {isLoop: true, beforeExpr: true}),
+ _else: kw("else", beforeExpr),
+ _finally: kw("finally"),
+ _for: kw("for", {isLoop: true}),
+ _function: kw("function", startsExpr),
+ _if: kw("if"),
+ _return: kw("return", beforeExpr),
+ _switch: kw("switch"),
+ _throw: kw("throw", beforeExpr),
+ _try: kw("try"),
+ _var: kw("var"),
+ _const: kw("const"),
+ _while: kw("while", {isLoop: true}),
+ _with: kw("with"),
+ _new: kw("new", {beforeExpr: true, startsExpr: true}),
+ _this: kw("this", startsExpr),
+ _super: kw("super", startsExpr),
+ _class: kw("class", startsExpr),
+ _extends: kw("extends", beforeExpr),
+ _export: kw("export"),
+ _import: kw("import", startsExpr),
+ _null: kw("null", startsExpr),
+ _true: kw("true", startsExpr),
+ _false: kw("false", startsExpr),
+ _in: kw("in", {beforeExpr: true, binop: 7}),
+ _instanceof: kw("instanceof", {beforeExpr: true, binop: 7}),
+ _typeof: kw("typeof", {beforeExpr: true, prefix: true, startsExpr: true}),
+ _void: kw("void", {beforeExpr: true, prefix: true, startsExpr: true}),
+ _delete: kw("delete", {beforeExpr: true, prefix: true, startsExpr: true})
+};
+
+// Matches a whole line break (where CRLF is considered a single
+// line break). Used to count lines.
+
+var lineBreak = /\r\n?|\n|\u2028|\u2029/;
+var lineBreakG = new RegExp(lineBreak.source, "g");
+
+function isNewLine(code) {
+ return code === 10 || code === 13 || code === 0x2028 || code === 0x2029
+}
+
+function nextLineBreak(code, from, end) {
+ if ( end === void 0 ) end = code.length;
+
+ for (var i = from; i < end; i++) {
+ var next = code.charCodeAt(i);
+ if (isNewLine(next))
+ { return i < end - 1 && next === 13 && code.charCodeAt(i + 1) === 10 ? i + 2 : i + 1 }
+ }
+ return -1
+}
+
+var nonASCIIwhitespace = /[\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff]/;
+
+var skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g;
+
+var ref = Object.prototype;
+var hasOwnProperty$1 = ref.hasOwnProperty;
+var toString$1 = ref.toString;
+
+var hasOwn = Object.hasOwn || (function (obj, propName) { return (
+ hasOwnProperty$1.call(obj, propName)
+); });
+
+var isArray = Array.isArray || (function (obj) { return (
+ toString$1.call(obj) === "[object Array]"
+); });
+
+function wordsRegexp(words) {
+ return new RegExp("^(?:" + words.replace(/ /g, "|") + ")$")
+}
+
+function codePointToString(code) {
+ // UTF-16 Decoding
+ if (code <= 0xFFFF) { return String.fromCharCode(code) }
+ code -= 0x10000;
+ return String.fromCharCode((code >> 10) + 0xD800, (code & 1023) + 0xDC00)
+}
+
+var loneSurrogate = /(?:[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/;
+
+// These are used when `options.locations` is on, for the
+// `startLoc` and `endLoc` properties.
+
+var Position = function Position(line, col) {
+ this.line = line;
+ this.column = col;
+};
+
+Position.prototype.offset = function offset (n) {
+ return new Position(this.line, this.column + n)
+};
+
+var SourceLocation = function SourceLocation(p, start, end) {
+ this.start = start;
+ this.end = end;
+ if (p.sourceFile !== null) { this.source = p.sourceFile; }
+};
+
+// The `getLineInfo` function is mostly useful when the
+// `locations` option is off (for performance reasons) and you
+// want to find the line/column position for a given character
+// offset. `input` should be the code string that the offset refers
+// into.
+
+function getLineInfo(input, offset) {
+ for (var line = 1, cur = 0;;) {
+ var nextBreak = nextLineBreak(input, cur, offset);
+ if (nextBreak < 0) { return new Position(line, offset - cur) }
+ ++line;
+ cur = nextBreak;
+ }
+}
+
+// A second argument must be given to configure the parser process.
+// These options are recognized (only `ecmaVersion` is required):
+
+var defaultOptions = {
+ // `ecmaVersion` indicates the ECMAScript version to parse. Must be
+ // either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10
+ // (2019), 11 (2020), 12 (2021), 13 (2022), or `"latest"` (the
+ // latest version the library supports). This influences support
+ // for strict mode, the set of reserved words, and support for
+ // new syntax features.
+ ecmaVersion: null,
+ // `sourceType` indicates the mode the code should be parsed in.
+ // Can be either `"script"` or `"module"`. This influences global
+ // strict mode and parsing of `import` and `export` declarations.
+ sourceType: "script",
+ // `onInsertedSemicolon` can be a callback that will be called
+ // when a semicolon is automatically inserted. It will be passed
+ // the position of the comma as an offset, and if `locations` is
+ // enabled, it is given the location as a `{line, column}` object
+ // as second argument.
+ onInsertedSemicolon: null,
+ // `onTrailingComma` is similar to `onInsertedSemicolon`, but for
+ // trailing commas.
+ onTrailingComma: null,
+ // By default, reserved words are only enforced if ecmaVersion >= 5.
+ // Set `allowReserved` to a boolean value to explicitly turn this on
+ // an off. When this option has the value "never", reserved words
+ // and keywords can also not be used as property names.
+ allowReserved: null,
+ // When enabled, a return at the top level is not considered an
+ // error.
+ allowReturnOutsideFunction: false,
+ // When enabled, import/export statements are not constrained to
+ // appearing at the top of the program, and an import.meta expression
+ // in a script isn't considered an error.
+ allowImportExportEverywhere: false,
+ // By default, await identifiers are allowed to appear at the top-level scope only if ecmaVersion >= 2022.
+ // When enabled, await identifiers are allowed to appear at the top-level scope,
+ // but they are still not allowed in non-async functions.
+ allowAwaitOutsideFunction: null,
+ // When enabled, super identifiers are not constrained to
+ // appearing in methods and do not raise an error when they appear elsewhere.
+ allowSuperOutsideMethod: null,
+ // When enabled, hashbang directive in the beginning of file
+ // is allowed and treated as a line comment.
+ allowHashBang: false,
+ // When `locations` is on, `loc` properties holding objects with
+ // `start` and `end` properties in `{line, column}` form (with
+ // line being 1-based and column 0-based) will be attached to the
+ // nodes.
+ locations: false,
+ // A function can be passed as `onToken` option, which will
+ // cause Acorn to call that function with object in the same
+ // format as tokens returned from `tokenizer().getToken()`. Note
+ // that you are not allowed to call the parser from the
+ // callback—that will corrupt its internal state.
+ onToken: null,
+ // A function can be passed as `onComment` option, which will
+ // cause Acorn to call that function with `(block, text, start,
+ // end)` parameters whenever a comment is skipped. `block` is a
+ // boolean indicating whether this is a block (`/* */`) comment,
+ // `text` is the content of the comment, and `start` and `end` are
+ // character offsets that denote the start and end of the comment.
+ // When the `locations` option is on, two more parameters are
+ // passed, the full `{line, column}` locations of the start and
+ // end of the comments. Note that you are not allowed to call the
+ // parser from the callback—that will corrupt its internal state.
+ onComment: null,
+ // Nodes have their start and end characters offsets recorded in
+ // `start` and `end` properties (directly on the node, rather than
+ // the `loc` object, which holds line/column data. To also add a
+ // [semi-standardized][range] `range` property holding a `[start,
+ // end]` array with the same numbers, set the `ranges` option to
+ // `true`.
+ //
+ // [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678
+ ranges: false,
+ // It is possible to parse multiple files into a single AST by
+ // passing the tree produced by parsing the first file as
+ // `program` option in subsequent parses. This will add the
+ // toplevel forms of the parsed file to the `Program` (top) node
+ // of an existing parse tree.
+ program: null,
+ // When `locations` is on, you can pass this to record the source
+ // file in every node's `loc` object.
+ sourceFile: null,
+ // This value, if given, is stored in every node, whether
+ // `locations` is on or off.
+ directSourceFile: null,
+ // When enabled, parenthesized expressions are represented by
+ // (non-standard) ParenthesizedExpression nodes
+ preserveParens: false
+};
+
+// Interpret and default an options object
+
+var warnedAboutEcmaVersion = false;
+
+function getOptions(opts) {
+ var options = {};
+
+ for (var opt in defaultOptions)
+ { options[opt] = opts && hasOwn(opts, opt) ? opts[opt] : defaultOptions[opt]; }
+
+ if (options.ecmaVersion === "latest") {
+ options.ecmaVersion = 1e8;
+ } else if (options.ecmaVersion == null) {
+ if (!warnedAboutEcmaVersion && typeof console === "object" && console.warn) {
+ warnedAboutEcmaVersion = true;
+ console.warn("Since Acorn 8.0.0, options.ecmaVersion is required.\nDefaulting to 2020, but this will stop working in the future.");
+ }
+ options.ecmaVersion = 11;
+ } else if (options.ecmaVersion >= 2015) {
+ options.ecmaVersion -= 2009;
+ }
+
+ if (options.allowReserved == null)
+ { options.allowReserved = options.ecmaVersion < 5; }
+
+ if (isArray(options.onToken)) {
+ var tokens = options.onToken;
+ options.onToken = function (token) { return tokens.push(token); };
+ }
+ if (isArray(options.onComment))
+ { options.onComment = pushComment(options, options.onComment); }
+
+ return options
+}
+
+function pushComment(options, array) {
+ return function(block, text, start, end, startLoc, endLoc) {
+ var comment = {
+ type: block ? "Block" : "Line",
+ value: text,
+ start: start,
+ end: end
+ };
+ if (options.locations)
+ { comment.loc = new SourceLocation(this, startLoc, endLoc); }
+ if (options.ranges)
+ { comment.range = [start, end]; }
+ array.push(comment);
+ }
+}
+
+// Each scope gets a bitset that may contain these flags
+var
+ SCOPE_TOP = 1,
+ SCOPE_FUNCTION = 2,
+ SCOPE_ASYNC = 4,
+ SCOPE_GENERATOR = 8,
+ SCOPE_ARROW = 16,
+ SCOPE_SIMPLE_CATCH = 32,
+ SCOPE_SUPER = 64,
+ SCOPE_DIRECT_SUPER = 128,
+ SCOPE_CLASS_STATIC_BLOCK = 256,
+ SCOPE_VAR = SCOPE_TOP | SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK;
+
+function functionFlags(async, generator) {
+ return SCOPE_FUNCTION | (async ? SCOPE_ASYNC : 0) | (generator ? SCOPE_GENERATOR : 0)
+}
+
+// Used in checkLVal* and declareName to determine the type of a binding
+var
+ BIND_NONE = 0, // Not a binding
+ BIND_VAR = 1, // Var-style binding
+ BIND_LEXICAL = 2, // Let- or const-style binding
+ BIND_FUNCTION = 3, // Function declaration
+ BIND_SIMPLE_CATCH = 4, // Simple (identifier pattern) catch binding
+ BIND_OUTSIDE = 5; // Special case for function names as bound inside the function
+
+var Parser = function Parser(options, input, startPos) {
+ this.options = options = getOptions(options);
+ this.sourceFile = options.sourceFile;
+ this.keywords = wordsRegexp(keywords$1[options.ecmaVersion >= 6 ? 6 : options.sourceType === "module" ? "5module" : 5]);
+ var reserved = "";
+ if (options.allowReserved !== true) {
+ reserved = reservedWords[options.ecmaVersion >= 6 ? 6 : options.ecmaVersion === 5 ? 5 : 3];
+ if (options.sourceType === "module") { reserved += " await"; }
+ }
+ this.reservedWords = wordsRegexp(reserved);
+ var reservedStrict = (reserved ? reserved + " " : "") + reservedWords.strict;
+ this.reservedWordsStrict = wordsRegexp(reservedStrict);
+ this.reservedWordsStrictBind = wordsRegexp(reservedStrict + " " + reservedWords.strictBind);
+ this.input = String(input);
+
+ // Used to signal to callers of `readWord1` whether the word
+ // contained any escape sequences. This is needed because words with
+ // escape sequences must not be interpreted as keywords.
+ this.containsEsc = false;
+
+ // Set up token state
+
+ // The current position of the tokenizer in the input.
+ if (startPos) {
+ this.pos = startPos;
+ this.lineStart = this.input.lastIndexOf("\n", startPos - 1) + 1;
+ this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length;
+ } else {
+ this.pos = this.lineStart = 0;
+ this.curLine = 1;
+ }
+
+ // Properties of the current token:
+ // Its type
+ this.type = types$1.eof;
+ // For tokens that include more information than their type, the value
+ this.value = null;
+ // Its start and end offset
+ this.start = this.end = this.pos;
+ // And, if locations are used, the {line, column} object
+ // corresponding to those offsets
+ this.startLoc = this.endLoc = this.curPosition();
+
+ // Position information for the previous token
+ this.lastTokEndLoc = this.lastTokStartLoc = null;
+ this.lastTokStart = this.lastTokEnd = this.pos;
+
+ // The context stack is used to superficially track syntactic
+ // context to predict whether a regular expression is allowed in a
+ // given position.
+ this.context = this.initialContext();
+ this.exprAllowed = true;
+
+ // Figure out if it's a module code.
+ this.inModule = options.sourceType === "module";
+ this.strict = this.inModule || this.strictDirective(this.pos);
+
+ // Used to signify the start of a potential arrow function
+ this.potentialArrowAt = -1;
+ this.potentialArrowInForAwait = false;
+
+ // Positions to delayed-check that yield/await does not exist in default parameters.
+ this.yieldPos = this.awaitPos = this.awaitIdentPos = 0;
+ // Labels in scope.
+ this.labels = [];
+ // Thus-far undefined exports.
+ this.undefinedExports = Object.create(null);
+
+ // If enabled, skip leading hashbang line.
+ if (this.pos === 0 && options.allowHashBang && this.input.slice(0, 2) === "#!")
+ { this.skipLineComment(2); }
+
+ // Scope tracking for duplicate variable names (see scope.js)
+ this.scopeStack = [];
+ this.enterScope(SCOPE_TOP);
+
+ // For RegExp validation
+ this.regexpState = null;
+
+ // The stack of private names.
+ // Each element has two properties: 'declared' and 'used'.
+ // When it exited from the outermost class definition, all used private names must be declared.
+ this.privateNameStack = [];
+};
+
+var prototypeAccessors = { inFunction: { configurable: true },inGenerator: { configurable: true },inAsync: { configurable: true },canAwait: { configurable: true },allowSuper: { configurable: true },allowDirectSuper: { configurable: true },treatFunctionsAsVar: { configurable: true },allowNewDotTarget: { configurable: true },inClassStaticBlock: { configurable: true } };
+
+Parser.prototype.parse = function parse () {
+ var node = this.options.program || this.startNode();
+ this.nextToken();
+ return this.parseTopLevel(node)
+};
+
+prototypeAccessors.inFunction.get = function () { return (this.currentVarScope().flags & SCOPE_FUNCTION) > 0 };
+
+prototypeAccessors.inGenerator.get = function () { return (this.currentVarScope().flags & SCOPE_GENERATOR) > 0 && !this.currentVarScope().inClassFieldInit };
+
+prototypeAccessors.inAsync.get = function () { return (this.currentVarScope().flags & SCOPE_ASYNC) > 0 && !this.currentVarScope().inClassFieldInit };
+
+prototypeAccessors.canAwait.get = function () {
+ for (var i = this.scopeStack.length - 1; i >= 0; i--) {
+ var scope = this.scopeStack[i];
+ if (scope.inClassFieldInit || scope.flags & SCOPE_CLASS_STATIC_BLOCK) { return false }
+ if (scope.flags & SCOPE_FUNCTION) { return (scope.flags & SCOPE_ASYNC) > 0 }
+ }
+ return (this.inModule && this.options.ecmaVersion >= 13) || this.options.allowAwaitOutsideFunction
+};
+
+prototypeAccessors.allowSuper.get = function () {
+ var ref = this.currentThisScope();
+ var flags = ref.flags;
+ var inClassFieldInit = ref.inClassFieldInit;
+ return (flags & SCOPE_SUPER) > 0 || inClassFieldInit || this.options.allowSuperOutsideMethod
+};
+
+prototypeAccessors.allowDirectSuper.get = function () { return (this.currentThisScope().flags & SCOPE_DIRECT_SUPER) > 0 };
+
+prototypeAccessors.treatFunctionsAsVar.get = function () { return this.treatFunctionsAsVarInScope(this.currentScope()) };
+
+prototypeAccessors.allowNewDotTarget.get = function () {
+ var ref = this.currentThisScope();
+ var flags = ref.flags;
+ var inClassFieldInit = ref.inClassFieldInit;
+ return (flags & (SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK)) > 0 || inClassFieldInit
+};
+
+prototypeAccessors.inClassStaticBlock.get = function () {
+ return (this.currentVarScope().flags & SCOPE_CLASS_STATIC_BLOCK) > 0
+};
+
+Parser.extend = function extend () {
+ var plugins = [], len = arguments.length;
+ while ( len-- ) plugins[ len ] = arguments[ len ];
+
+ var cls = this;
+ for (var i = 0; i < plugins.length; i++) { cls = plugins[i](cls); }
+ return cls
+};
+
+Parser.parse = function parse (input, options) {
+ return new this(options, input).parse()
+};
+
+Parser.parseExpressionAt = function parseExpressionAt (input, pos, options) {
+ var parser = new this(options, input, pos);
+ parser.nextToken();
+ return parser.parseExpression()
+};
+
+Parser.tokenizer = function tokenizer (input, options) {
+ return new this(options, input)
+};
+
+Object.defineProperties( Parser.prototype, prototypeAccessors );
+
+var pp$9 = Parser.prototype;
+
+// ## Parser utilities
+
+var literal = /^(?:'((?:\\.|[^'\\])*?)'|"((?:\\.|[^"\\])*?)")/;
+pp$9.strictDirective = function(start) {
+ if (this.options.ecmaVersion < 5) { return false }
+ for (;;) {
+ // Try to find string literal.
+ skipWhiteSpace.lastIndex = start;
+ start += skipWhiteSpace.exec(this.input)[0].length;
+ var match = literal.exec(this.input.slice(start));
+ if (!match) { return false }
+ if ((match[1] || match[2]) === "use strict") {
+ skipWhiteSpace.lastIndex = start + match[0].length;
+ var spaceAfter = skipWhiteSpace.exec(this.input), end = spaceAfter.index + spaceAfter[0].length;
+ var next = this.input.charAt(end);
+ return next === ";" || next === "}" ||
+ (lineBreak.test(spaceAfter[0]) &&
+ !(/[(`.[+\-/*%<>=,?^&]/.test(next) || next === "!" && this.input.charAt(end + 1) === "="))
+ }
+ start += match[0].length;
+
+ // Skip semicolon, if any.
+ skipWhiteSpace.lastIndex = start;
+ start += skipWhiteSpace.exec(this.input)[0].length;
+ if (this.input[start] === ";")
+ { start++; }
+ }
+};
+
+// Predicate that tests whether the next token is of the given
+// type, and if yes, consumes it as a side effect.
+
+pp$9.eat = function(type) {
+ if (this.type === type) {
+ this.next();
+ return true
+ } else {
+ return false
+ }
+};
+
+// Tests whether parsed token is a contextual keyword.
+
+pp$9.isContextual = function(name) {
+ return this.type === types$1.name && this.value === name && !this.containsEsc
+};
+
+// Consumes contextual keyword if possible.
+
+pp$9.eatContextual = function(name) {
+ if (!this.isContextual(name)) { return false }
+ this.next();
+ return true
+};
+
+// Asserts that following token is given contextual keyword.
+
+pp$9.expectContextual = function(name) {
+ if (!this.eatContextual(name)) { this.unexpected(); }
+};
+
+// Test whether a semicolon can be inserted at the current position.
+
+pp$9.canInsertSemicolon = function() {
+ return this.type === types$1.eof ||
+ this.type === types$1.braceR ||
+ lineBreak.test(this.input.slice(this.lastTokEnd, this.start))
+};
+
+pp$9.insertSemicolon = function() {
+ if (this.canInsertSemicolon()) {
+ if (this.options.onInsertedSemicolon)
+ { this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc); }
+ return true
+ }
+};
+
+// Consume a semicolon, or, failing that, see if we are allowed to
+// pretend that there is a semicolon at this position.
+
+pp$9.semicolon = function() {
+ if (!this.eat(types$1.semi) && !this.insertSemicolon()) { this.unexpected(); }
+};
+
+pp$9.afterTrailingComma = function(tokType, notNext) {
+ if (this.type === tokType) {
+ if (this.options.onTrailingComma)
+ { this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc); }
+ if (!notNext)
+ { this.next(); }
+ return true
+ }
+};
+
+// Expect a token of a given type. If found, consume it, otherwise,
+// raise an unexpected token error.
+
+pp$9.expect = function(type) {
+ this.eat(type) || this.unexpected();
+};
+
+// Raise an unexpected token error.
+
+pp$9.unexpected = function(pos) {
+ this.raise(pos != null ? pos : this.start, "Unexpected token");
+};
+
+var DestructuringErrors = function DestructuringErrors() {
+ this.shorthandAssign =
+ this.trailingComma =
+ this.parenthesizedAssign =
+ this.parenthesizedBind =
+ this.doubleProto =
+ -1;
+};
+
+pp$9.checkPatternErrors = function(refDestructuringErrors, isAssign) {
+ if (!refDestructuringErrors) { return }
+ if (refDestructuringErrors.trailingComma > -1)
+ { this.raiseRecoverable(refDestructuringErrors.trailingComma, "Comma is not permitted after the rest element"); }
+ var parens = isAssign ? refDestructuringErrors.parenthesizedAssign : refDestructuringErrors.parenthesizedBind;
+ if (parens > -1) { this.raiseRecoverable(parens, "Parenthesized pattern"); }
+};
+
+pp$9.checkExpressionErrors = function(refDestructuringErrors, andThrow) {
+ if (!refDestructuringErrors) { return false }
+ var shorthandAssign = refDestructuringErrors.shorthandAssign;
+ var doubleProto = refDestructuringErrors.doubleProto;
+ if (!andThrow) { return shorthandAssign >= 0 || doubleProto >= 0 }
+ if (shorthandAssign >= 0)
+ { this.raise(shorthandAssign, "Shorthand property assignments are valid only in destructuring patterns"); }
+ if (doubleProto >= 0)
+ { this.raiseRecoverable(doubleProto, "Redefinition of __proto__ property"); }
+};
+
+pp$9.checkYieldAwaitInDefaultParams = function() {
+ if (this.yieldPos && (!this.awaitPos || this.yieldPos < this.awaitPos))
+ { this.raise(this.yieldPos, "Yield expression cannot be a default value"); }
+ if (this.awaitPos)
+ { this.raise(this.awaitPos, "Await expression cannot be a default value"); }
+};
+
+pp$9.isSimpleAssignTarget = function(expr) {
+ if (expr.type === "ParenthesizedExpression")
+ { return this.isSimpleAssignTarget(expr.expression) }
+ return expr.type === "Identifier" || expr.type === "MemberExpression"
+};
+
+var pp$8 = Parser.prototype;
+
+// ### Statement parsing
+
+// Parse a program. Initializes the parser, reads any number of
+// statements, and wraps them in a Program node. Optionally takes a
+// `program` argument. If present, the statements will be appended
+// to its body instead of creating a new node.
+
+pp$8.parseTopLevel = function(node) {
+ var exports = Object.create(null);
+ if (!node.body) { node.body = []; }
+ while (this.type !== types$1.eof) {
+ var stmt = this.parseStatement(null, true, exports);
+ node.body.push(stmt);
+ }
+ if (this.inModule)
+ { for (var i = 0, list = Object.keys(this.undefinedExports); i < list.length; i += 1)
+ {
+ var name = list[i];
+
+ this.raiseRecoverable(this.undefinedExports[name].start, ("Export '" + name + "' is not defined"));
+ } }
+ this.adaptDirectivePrologue(node.body);
+ this.next();
+ node.sourceType = this.options.sourceType;
+ return this.finishNode(node, "Program")
+};
+
+var loopLabel = {kind: "loop"}, switchLabel = {kind: "switch"};
+
+pp$8.isLet = function(context) {
+ if (this.options.ecmaVersion < 6 || !this.isContextual("let")) { return false }
+ skipWhiteSpace.lastIndex = this.pos;
+ var skip = skipWhiteSpace.exec(this.input);
+ var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next);
+ // For ambiguous cases, determine if a LexicalDeclaration (or only a
+ // Statement) is allowed here. If context is not empty then only a Statement
+ // is allowed. However, `let [` is an explicit negative lookahead for
+ // ExpressionStatement, so special-case it first.
+ if (nextCh === 91 || nextCh === 92 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true } // '[', '/', astral
+ if (context) { return false }
+
+ if (nextCh === 123) { return true } // '{'
+ if (isIdentifierStart(nextCh, true)) {
+ var pos = next + 1;
+ while (isIdentifierChar(nextCh = this.input.charCodeAt(pos), true)) { ++pos; }
+ if (nextCh === 92 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true }
+ var ident = this.input.slice(next, pos);
+ if (!keywordRelationalOperator.test(ident)) { return true }
+ }
+ return false
+};
+
+// check 'async [no LineTerminator here] function'
+// - 'async /*foo*/ function' is OK.
+// - 'async /*\n*/ function' is invalid.
+pp$8.isAsyncFunction = function() {
+ if (this.options.ecmaVersion < 8 || !this.isContextual("async"))
+ { return false }
+
+ skipWhiteSpace.lastIndex = this.pos;
+ var skip = skipWhiteSpace.exec(this.input);
+ var next = this.pos + skip[0].length, after;
+ return !lineBreak.test(this.input.slice(this.pos, next)) &&
+ this.input.slice(next, next + 8) === "function" &&
+ (next + 8 === this.input.length ||
+ !(isIdentifierChar(after = this.input.charCodeAt(next + 8)) || after > 0xd7ff && after < 0xdc00))
+};
+
+// Parse a single statement.
+//
+// If expecting a statement and finding a slash operator, parse a
+// regular expression literal. This is to handle cases like
+// `if (foo) /blah/.exec(foo)`, where looking at the previous token
+// does not help.
+
+pp$8.parseStatement = function(context, topLevel, exports) {
+ var starttype = this.type, node = this.startNode(), kind;
+
+ if (this.isLet(context)) {
+ starttype = types$1._var;
+ kind = "let";
+ }
+
+ // Most types of statements are recognized by the keyword they
+ // start with. Many are trivial to parse, some require a bit of
+ // complexity.
+
+ switch (starttype) {
+ case types$1._break: case types$1._continue: return this.parseBreakContinueStatement(node, starttype.keyword)
+ case types$1._debugger: return this.parseDebuggerStatement(node)
+ case types$1._do: return this.parseDoStatement(node)
+ case types$1._for: return this.parseForStatement(node)
+ case types$1._function:
+ // Function as sole body of either an if statement or a labeled statement
+ // works, but not when it is part of a labeled statement that is the sole
+ // body of an if statement.
+ if ((context && (this.strict || context !== "if" && context !== "label")) && this.options.ecmaVersion >= 6) { this.unexpected(); }
+ return this.parseFunctionStatement(node, false, !context)
+ case types$1._class:
+ if (context) { this.unexpected(); }
+ return this.parseClass(node, true)
+ case types$1._if: return this.parseIfStatement(node)
+ case types$1._return: return this.parseReturnStatement(node)
+ case types$1._switch: return this.parseSwitchStatement(node)
+ case types$1._throw: return this.parseThrowStatement(node)
+ case types$1._try: return this.parseTryStatement(node)
+ case types$1._const: case types$1._var:
+ kind = kind || this.value;
+ if (context && kind !== "var") { this.unexpected(); }
+ return this.parseVarStatement(node, kind)
+ case types$1._while: return this.parseWhileStatement(node)
+ case types$1._with: return this.parseWithStatement(node)
+ case types$1.braceL: return this.parseBlock(true, node)
+ case types$1.semi: return this.parseEmptyStatement(node)
+ case types$1._export:
+ case types$1._import:
+ if (this.options.ecmaVersion > 10 && starttype === types$1._import) {
+ skipWhiteSpace.lastIndex = this.pos;
+ var skip = skipWhiteSpace.exec(this.input);
+ var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next);
+ if (nextCh === 40 || nextCh === 46) // '(' or '.'
+ { return this.parseExpressionStatement(node, this.parseExpression()) }
+ }
+
+ if (!this.options.allowImportExportEverywhere) {
+ if (!topLevel)
+ { this.raise(this.start, "'import' and 'export' may only appear at the top level"); }
+ if (!this.inModule)
+ { this.raise(this.start, "'import' and 'export' may appear only with 'sourceType: module'"); }
+ }
+ return starttype === types$1._import ? this.parseImport(node) : this.parseExport(node, exports)
+
+ // If the statement does not start with a statement keyword or a
+ // brace, it's an ExpressionStatement or LabeledStatement. We
+ // simply start parsing an expression, and afterwards, if the
+ // next token is a colon and the expression was a simple
+ // Identifier node, we switch to interpreting it as a label.
+ default:
+ if (this.isAsyncFunction()) {
+ if (context) { this.unexpected(); }
+ this.next();
+ return this.parseFunctionStatement(node, true, !context)
+ }
+
+ var maybeName = this.value, expr = this.parseExpression();
+ if (starttype === types$1.name && expr.type === "Identifier" && this.eat(types$1.colon))
+ { return this.parseLabeledStatement(node, maybeName, expr, context) }
+ else { return this.parseExpressionStatement(node, expr) }
+ }
+};
+
+pp$8.parseBreakContinueStatement = function(node, keyword) {
+ var isBreak = keyword === "break";
+ this.next();
+ if (this.eat(types$1.semi) || this.insertSemicolon()) { node.label = null; }
+ else if (this.type !== types$1.name) { this.unexpected(); }
+ else {
+ node.label = this.parseIdent();
+ this.semicolon();
+ }
+
+ // Verify that there is an actual destination to break or
+ // continue to.
+ var i = 0;
+ for (; i < this.labels.length; ++i) {
+ var lab = this.labels[i];
+ if (node.label == null || lab.name === node.label.name) {
+ if (lab.kind != null && (isBreak || lab.kind === "loop")) { break }
+ if (node.label && isBreak) { break }
+ }
+ }
+ if (i === this.labels.length) { this.raise(node.start, "Unsyntactic " + keyword); }
+ return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement")
+};
+
+pp$8.parseDebuggerStatement = function(node) {
+ this.next();
+ this.semicolon();
+ return this.finishNode(node, "DebuggerStatement")
+};
+
+pp$8.parseDoStatement = function(node) {
+ this.next();
+ this.labels.push(loopLabel);
+ node.body = this.parseStatement("do");
+ this.labels.pop();
+ this.expect(types$1._while);
+ node.test = this.parseParenExpression();
+ if (this.options.ecmaVersion >= 6)
+ { this.eat(types$1.semi); }
+ else
+ { this.semicolon(); }
+ return this.finishNode(node, "DoWhileStatement")
+};
+
+// Disambiguating between a `for` and a `for`/`in` or `for`/`of`
+// loop is non-trivial. Basically, we have to parse the init `var`
+// statement or expression, disallowing the `in` operator (see
+// the second parameter to `parseExpression`), and then check
+// whether the next token is `in` or `of`. When there is no init
+// part (semicolon immediately after the opening parenthesis), it
+// is a regular `for` loop.
+
+pp$8.parseForStatement = function(node) {
+ this.next();
+ var awaitAt = (this.options.ecmaVersion >= 9 && this.canAwait && this.eatContextual("await")) ? this.lastTokStart : -1;
+ this.labels.push(loopLabel);
+ this.enterScope(0);
+ this.expect(types$1.parenL);
+ if (this.type === types$1.semi) {
+ if (awaitAt > -1) { this.unexpected(awaitAt); }
+ return this.parseFor(node, null)
+ }
+ var isLet = this.isLet();
+ if (this.type === types$1._var || this.type === types$1._const || isLet) {
+ var init$1 = this.startNode(), kind = isLet ? "let" : this.value;
+ this.next();
+ this.parseVar(init$1, true, kind);
+ this.finishNode(init$1, "VariableDeclaration");
+ if ((this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) && init$1.declarations.length === 1) {
+ if (this.options.ecmaVersion >= 9) {
+ if (this.type === types$1._in) {
+ if (awaitAt > -1) { this.unexpected(awaitAt); }
+ } else { node.await = awaitAt > -1; }
+ }
+ return this.parseForIn(node, init$1)
+ }
+ if (awaitAt > -1) { this.unexpected(awaitAt); }
+ return this.parseFor(node, init$1)
+ }
+ var startsWithLet = this.isContextual("let"), isForOf = false;
+ var refDestructuringErrors = new DestructuringErrors;
+ var init = this.parseExpression(awaitAt > -1 ? "await" : true, refDestructuringErrors);
+ if (this.type === types$1._in || (isForOf = this.options.ecmaVersion >= 6 && this.isContextual("of"))) {
+ if (this.options.ecmaVersion >= 9) {
+ if (this.type === types$1._in) {
+ if (awaitAt > -1) { this.unexpected(awaitAt); }
+ } else { node.await = awaitAt > -1; }
+ }
+ if (startsWithLet && isForOf) { this.raise(init.start, "The left-hand side of a for-of loop may not start with 'let'."); }
+ this.toAssignable(init, false, refDestructuringErrors);
+ this.checkLValPattern(init);
+ return this.parseForIn(node, init)
+ } else {
+ this.checkExpressionErrors(refDestructuringErrors, true);
+ }
+ if (awaitAt > -1) { this.unexpected(awaitAt); }
+ return this.parseFor(node, init)
+};
+
+pp$8.parseFunctionStatement = function(node, isAsync, declarationPosition) {
+ this.next();
+ return this.parseFunction(node, FUNC_STATEMENT | (declarationPosition ? 0 : FUNC_HANGING_STATEMENT), false, isAsync)
+};
+
+pp$8.parseIfStatement = function(node) {
+ this.next();
+ node.test = this.parseParenExpression();
+ // allow function declarations in branches, but only in non-strict mode
+ node.consequent = this.parseStatement("if");
+ node.alternate = this.eat(types$1._else) ? this.parseStatement("if") : null;
+ return this.finishNode(node, "IfStatement")
+};
+
+pp$8.parseReturnStatement = function(node) {
+ if (!this.inFunction && !this.options.allowReturnOutsideFunction)
+ { this.raise(this.start, "'return' outside of function"); }
+ this.next();
+
+ // In `return` (and `break`/`continue`), the keywords with
+ // optional arguments, we eagerly look for a semicolon or the
+ // possibility to insert one.
+
+ if (this.eat(types$1.semi) || this.insertSemicolon()) { node.argument = null; }
+ else { node.argument = this.parseExpression(); this.semicolon(); }
+ return this.finishNode(node, "ReturnStatement")
+};
+
+pp$8.parseSwitchStatement = function(node) {
+ this.next();
+ node.discriminant = this.parseParenExpression();
+ node.cases = [];
+ this.expect(types$1.braceL);
+ this.labels.push(switchLabel);
+ this.enterScope(0);
+
+ // Statements under must be grouped (by label) in SwitchCase
+ // nodes. `cur` is used to keep the node that we are currently
+ // adding statements to.
+
+ var cur;
+ for (var sawDefault = false; this.type !== types$1.braceR;) {
+ if (this.type === types$1._case || this.type === types$1._default) {
+ var isCase = this.type === types$1._case;
+ if (cur) { this.finishNode(cur, "SwitchCase"); }
+ node.cases.push(cur = this.startNode());
+ cur.consequent = [];
+ this.next();
+ if (isCase) {
+ cur.test = this.parseExpression();
+ } else {
+ if (sawDefault) { this.raiseRecoverable(this.lastTokStart, "Multiple default clauses"); }
+ sawDefault = true;
+ cur.test = null;
+ }
+ this.expect(types$1.colon);
+ } else {
+ if (!cur) { this.unexpected(); }
+ cur.consequent.push(this.parseStatement(null));
+ }
+ }
+ this.exitScope();
+ if (cur) { this.finishNode(cur, "SwitchCase"); }
+ this.next(); // Closing brace
+ this.labels.pop();
+ return this.finishNode(node, "SwitchStatement")
+};
+
+pp$8.parseThrowStatement = function(node) {
+ this.next();
+ if (lineBreak.test(this.input.slice(this.lastTokEnd, this.start)))
+ { this.raise(this.lastTokEnd, "Illegal newline after throw"); }
+ node.argument = this.parseExpression();
+ this.semicolon();
+ return this.finishNode(node, "ThrowStatement")
+};
+
+// Reused empty array added for node fields that are always empty.
+
+var empty$1 = [];
+
+pp$8.parseTryStatement = function(node) {
+ this.next();
+ node.block = this.parseBlock();
+ node.handler = null;
+ if (this.type === types$1._catch) {
+ var clause = this.startNode();
+ this.next();
+ if (this.eat(types$1.parenL)) {
+ clause.param = this.parseBindingAtom();
+ var simple = clause.param.type === "Identifier";
+ this.enterScope(simple ? SCOPE_SIMPLE_CATCH : 0);
+ this.checkLValPattern(clause.param, simple ? BIND_SIMPLE_CATCH : BIND_LEXICAL);
+ this.expect(types$1.parenR);
+ } else {
+ if (this.options.ecmaVersion < 10) { this.unexpected(); }
+ clause.param = null;
+ this.enterScope(0);
+ }
+ clause.body = this.parseBlock(false);
+ this.exitScope();
+ node.handler = this.finishNode(clause, "CatchClause");
+ }
+ node.finalizer = this.eat(types$1._finally) ? this.parseBlock() : null;
+ if (!node.handler && !node.finalizer)
+ { this.raise(node.start, "Missing catch or finally clause"); }
+ return this.finishNode(node, "TryStatement")
+};
+
+pp$8.parseVarStatement = function(node, kind) {
+ this.next();
+ this.parseVar(node, false, kind);
+ this.semicolon();
+ return this.finishNode(node, "VariableDeclaration")
+};
+
+pp$8.parseWhileStatement = function(node) {
+ this.next();
+ node.test = this.parseParenExpression();
+ this.labels.push(loopLabel);
+ node.body = this.parseStatement("while");
+ this.labels.pop();
+ return this.finishNode(node, "WhileStatement")
+};
+
+pp$8.parseWithStatement = function(node) {
+ if (this.strict) { this.raise(this.start, "'with' in strict mode"); }
+ this.next();
+ node.object = this.parseParenExpression();
+ node.body = this.parseStatement("with");
+ return this.finishNode(node, "WithStatement")
+};
+
+pp$8.parseEmptyStatement = function(node) {
+ this.next();
+ return this.finishNode(node, "EmptyStatement")
+};
+
+pp$8.parseLabeledStatement = function(node, maybeName, expr, context) {
+ for (var i$1 = 0, list = this.labels; i$1 < list.length; i$1 += 1)
+ {
+ var label = list[i$1];
+
+ if (label.name === maybeName)
+ { this.raise(expr.start, "Label '" + maybeName + "' is already declared");
+ } }
+ var kind = this.type.isLoop ? "loop" : this.type === types$1._switch ? "switch" : null;
+ for (var i = this.labels.length - 1; i >= 0; i--) {
+ var label$1 = this.labels[i];
+ if (label$1.statementStart === node.start) {
+ // Update information about previous labels on this node
+ label$1.statementStart = this.start;
+ label$1.kind = kind;
+ } else { break }
+ }
+ this.labels.push({name: maybeName, kind: kind, statementStart: this.start});
+ node.body = this.parseStatement(context ? context.indexOf("label") === -1 ? context + "label" : context : "label");
+ this.labels.pop();
+ node.label = expr;
+ return this.finishNode(node, "LabeledStatement")
+};
+
+pp$8.parseExpressionStatement = function(node, expr) {
+ node.expression = expr;
+ this.semicolon();
+ return this.finishNode(node, "ExpressionStatement")
+};
+
+// Parse a semicolon-enclosed block of statements, handling `"use
+// strict"` declarations when `allowStrict` is true (used for
+// function bodies).
+
+pp$8.parseBlock = function(createNewLexicalScope, node, exitStrict) {
+ if ( createNewLexicalScope === void 0 ) createNewLexicalScope = true;
+ if ( node === void 0 ) node = this.startNode();
+
+ node.body = [];
+ this.expect(types$1.braceL);
+ if (createNewLexicalScope) { this.enterScope(0); }
+ while (this.type !== types$1.braceR) {
+ var stmt = this.parseStatement(null);
+ node.body.push(stmt);
+ }
+ if (exitStrict) { this.strict = false; }
+ this.next();
+ if (createNewLexicalScope) { this.exitScope(); }
+ return this.finishNode(node, "BlockStatement")
+};
+
+// Parse a regular `for` loop. The disambiguation code in
+// `parseStatement` will already have parsed the init statement or
+// expression.
+
+pp$8.parseFor = function(node, init) {
+ node.init = init;
+ this.expect(types$1.semi);
+ node.test = this.type === types$1.semi ? null : this.parseExpression();
+ this.expect(types$1.semi);
+ node.update = this.type === types$1.parenR ? null : this.parseExpression();
+ this.expect(types$1.parenR);
+ node.body = this.parseStatement("for");
+ this.exitScope();
+ this.labels.pop();
+ return this.finishNode(node, "ForStatement")
+};
+
+// Parse a `for`/`in` and `for`/`of` loop, which are almost
+// same from parser's perspective.
+
+pp$8.parseForIn = function(node, init) {
+ var isForIn = this.type === types$1._in;
+ this.next();
+
+ if (
+ init.type === "VariableDeclaration" &&
+ init.declarations[0].init != null &&
+ (
+ !isForIn ||
+ this.options.ecmaVersion < 8 ||
+ this.strict ||
+ init.kind !== "var" ||
+ init.declarations[0].id.type !== "Identifier"
+ )
+ ) {
+ this.raise(
+ init.start,
+ ((isForIn ? "for-in" : "for-of") + " loop variable declaration may not have an initializer")
+ );
+ }
+ node.left = init;
+ node.right = isForIn ? this.parseExpression() : this.parseMaybeAssign();
+ this.expect(types$1.parenR);
+ node.body = this.parseStatement("for");
+ this.exitScope();
+ this.labels.pop();
+ return this.finishNode(node, isForIn ? "ForInStatement" : "ForOfStatement")
+};
+
+// Parse a list of variable declarations.
+
+pp$8.parseVar = function(node, isFor, kind) {
+ node.declarations = [];
+ node.kind = kind;
+ for (;;) {
+ var decl = this.startNode();
+ this.parseVarId(decl, kind);
+ if (this.eat(types$1.eq)) {
+ decl.init = this.parseMaybeAssign(isFor);
+ } else if (kind === "const" && !(this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual("of")))) {
+ this.unexpected();
+ } else if (decl.id.type !== "Identifier" && !(isFor && (this.type === types$1._in || this.isContextual("of")))) {
+ this.raise(this.lastTokEnd, "Complex binding patterns require an initialization value");
+ } else {
+ decl.init = null;
+ }
+ node.declarations.push(this.finishNode(decl, "VariableDeclarator"));
+ if (!this.eat(types$1.comma)) { break }
+ }
+ return node
+};
+
+pp$8.parseVarId = function(decl, kind) {
+ decl.id = this.parseBindingAtom();
+ this.checkLValPattern(decl.id, kind === "var" ? BIND_VAR : BIND_LEXICAL, false);
+};
+
+var FUNC_STATEMENT = 1, FUNC_HANGING_STATEMENT = 2, FUNC_NULLABLE_ID = 4;
+
+// Parse a function declaration or literal (depending on the
+// `statement & FUNC_STATEMENT`).
+
+// Remove `allowExpressionBody` for 7.0.0, as it is only called with false
+pp$8.parseFunction = function(node, statement, allowExpressionBody, isAsync, forInit) {
+ this.initFunction(node);
+ if (this.options.ecmaVersion >= 9 || this.options.ecmaVersion >= 6 && !isAsync) {
+ if (this.type === types$1.star && (statement & FUNC_HANGING_STATEMENT))
+ { this.unexpected(); }
+ node.generator = this.eat(types$1.star);
+ }
+ if (this.options.ecmaVersion >= 8)
+ { node.async = !!isAsync; }
+
+ if (statement & FUNC_STATEMENT) {
+ node.id = (statement & FUNC_NULLABLE_ID) && this.type !== types$1.name ? null : this.parseIdent();
+ if (node.id && !(statement & FUNC_HANGING_STATEMENT))
+ // If it is a regular function declaration in sloppy mode, then it is
+ // subject to Annex B semantics (BIND_FUNCTION). Otherwise, the binding
+ // mode depends on properties of the current scope (see
+ // treatFunctionsAsVar).
+ { this.checkLValSimple(node.id, (this.strict || node.generator || node.async) ? this.treatFunctionsAsVar ? BIND_VAR : BIND_LEXICAL : BIND_FUNCTION); }
+ }
+
+ var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;
+ this.yieldPos = 0;
+ this.awaitPos = 0;
+ this.awaitIdentPos = 0;
+ this.enterScope(functionFlags(node.async, node.generator));
+
+ if (!(statement & FUNC_STATEMENT))
+ { node.id = this.type === types$1.name ? this.parseIdent() : null; }
+
+ this.parseFunctionParams(node);
+ this.parseFunctionBody(node, allowExpressionBody, false, forInit);
+
+ this.yieldPos = oldYieldPos;
+ this.awaitPos = oldAwaitPos;
+ this.awaitIdentPos = oldAwaitIdentPos;
+ return this.finishNode(node, (statement & FUNC_STATEMENT) ? "FunctionDeclaration" : "FunctionExpression")
+};
+
+pp$8.parseFunctionParams = function(node) {
+ this.expect(types$1.parenL);
+ node.params = this.parseBindingList(types$1.parenR, false, this.options.ecmaVersion >= 8);
+ this.checkYieldAwaitInDefaultParams();
+};
+
+// Parse a class declaration or literal (depending on the
+// `isStatement` parameter).
+
+pp$8.parseClass = function(node, isStatement) {
+ this.next();
+
+ // ecma-262 14.6 Class Definitions
+ // A class definition is always strict mode code.
+ var oldStrict = this.strict;
+ this.strict = true;
+
+ this.parseClassId(node, isStatement);
+ this.parseClassSuper(node);
+ var privateNameMap = this.enterClassBody();
+ var classBody = this.startNode();
+ var hadConstructor = false;
+ classBody.body = [];
+ this.expect(types$1.braceL);
+ while (this.type !== types$1.braceR) {
+ var element = this.parseClassElement(node.superClass !== null);
+ if (element) {
+ classBody.body.push(element);
+ if (element.type === "MethodDefinition" && element.kind === "constructor") {
+ if (hadConstructor) { this.raise(element.start, "Duplicate constructor in the same class"); }
+ hadConstructor = true;
+ } else if (element.key && element.key.type === "PrivateIdentifier" && isPrivateNameConflicted(privateNameMap, element)) {
+ this.raiseRecoverable(element.key.start, ("Identifier '#" + (element.key.name) + "' has already been declared"));
+ }
+ }
+ }
+ this.strict = oldStrict;
+ this.next();
+ node.body = this.finishNode(classBody, "ClassBody");
+ this.exitClassBody();
+ return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression")
+};
+
+pp$8.parseClassElement = function(constructorAllowsSuper) {
+ if (this.eat(types$1.semi)) { return null }
+
+ var ecmaVersion = this.options.ecmaVersion;
+ var node = this.startNode();
+ var keyName = "";
+ var isGenerator = false;
+ var isAsync = false;
+ var kind = "method";
+ var isStatic = false;
+
+ if (this.eatContextual("static")) {
+ // Parse static init block
+ if (ecmaVersion >= 13 && this.eat(types$1.braceL)) {
+ this.parseClassStaticBlock(node);
+ return node
+ }
+ if (this.isClassElementNameStart() || this.type === types$1.star) {
+ isStatic = true;
+ } else {
+ keyName = "static";
+ }
+ }
+ node.static = isStatic;
+ if (!keyName && ecmaVersion >= 8 && this.eatContextual("async")) {
+ if ((this.isClassElementNameStart() || this.type === types$1.star) && !this.canInsertSemicolon()) {
+ isAsync = true;
+ } else {
+ keyName = "async";
+ }
+ }
+ if (!keyName && (ecmaVersion >= 9 || !isAsync) && this.eat(types$1.star)) {
+ isGenerator = true;
+ }
+ if (!keyName && !isAsync && !isGenerator) {
+ var lastValue = this.value;
+ if (this.eatContextual("get") || this.eatContextual("set")) {
+ if (this.isClassElementNameStart()) {
+ kind = lastValue;
+ } else {
+ keyName = lastValue;
+ }
+ }
+ }
+
+ // Parse element name
+ if (keyName) {
+ // 'async', 'get', 'set', or 'static' were not a keyword contextually.
+ // The last token is any of those. Make it the element name.
+ node.computed = false;
+ node.key = this.startNodeAt(this.lastTokStart, this.lastTokStartLoc);
+ node.key.name = keyName;
+ this.finishNode(node.key, "Identifier");
+ } else {
+ this.parseClassElementName(node);
+ }
+
+ // Parse element value
+ if (ecmaVersion < 13 || this.type === types$1.parenL || kind !== "method" || isGenerator || isAsync) {
+ var isConstructor = !node.static && checkKeyName(node, "constructor");
+ var allowsDirectSuper = isConstructor && constructorAllowsSuper;
+ // Couldn't move this check into the 'parseClassMethod' method for backward compatibility.
+ if (isConstructor && kind !== "method") { this.raise(node.key.start, "Constructor can't have get/set modifier"); }
+ node.kind = isConstructor ? "constructor" : kind;
+ this.parseClassMethod(node, isGenerator, isAsync, allowsDirectSuper);
+ } else {
+ this.parseClassField(node);
+ }
+
+ return node
+};
+
+pp$8.isClassElementNameStart = function() {
+ return (
+ this.type === types$1.name ||
+ this.type === types$1.privateId ||
+ this.type === types$1.num ||
+ this.type === types$1.string ||
+ this.type === types$1.bracketL ||
+ this.type.keyword
+ )
+};
+
+pp$8.parseClassElementName = function(element) {
+ if (this.type === types$1.privateId) {
+ if (this.value === "constructor") {
+ this.raise(this.start, "Classes can't have an element named '#constructor'");
+ }
+ element.computed = false;
+ element.key = this.parsePrivateIdent();
+ } else {
+ this.parsePropertyName(element);
+ }
+};
+
+pp$8.parseClassMethod = function(method, isGenerator, isAsync, allowsDirectSuper) {
+ // Check key and flags
+ var key = method.key;
+ if (method.kind === "constructor") {
+ if (isGenerator) { this.raise(key.start, "Constructor can't be a generator"); }
+ if (isAsync) { this.raise(key.start, "Constructor can't be an async method"); }
+ } else if (method.static && checkKeyName(method, "prototype")) {
+ this.raise(key.start, "Classes may not have a static property named prototype");
+ }
+
+ // Parse value
+ var value = method.value = this.parseMethod(isGenerator, isAsync, allowsDirectSuper);
+
+ // Check value
+ if (method.kind === "get" && value.params.length !== 0)
+ { this.raiseRecoverable(value.start, "getter should have no params"); }
+ if (method.kind === "set" && value.params.length !== 1)
+ { this.raiseRecoverable(value.start, "setter should have exactly one param"); }
+ if (method.kind === "set" && value.params[0].type === "RestElement")
+ { this.raiseRecoverable(value.params[0].start, "Setter cannot use rest params"); }
+
+ return this.finishNode(method, "MethodDefinition")
+};
+
+pp$8.parseClassField = function(field) {
+ if (checkKeyName(field, "constructor")) {
+ this.raise(field.key.start, "Classes can't have a field named 'constructor'");
+ } else if (field.static && checkKeyName(field, "prototype")) {
+ this.raise(field.key.start, "Classes can't have a static field named 'prototype'");
+ }
+
+ if (this.eat(types$1.eq)) {
+ // To raise SyntaxError if 'arguments' exists in the initializer.
+ var scope = this.currentThisScope();
+ var inClassFieldInit = scope.inClassFieldInit;
+ scope.inClassFieldInit = true;
+ field.value = this.parseMaybeAssign();
+ scope.inClassFieldInit = inClassFieldInit;
+ } else {
+ field.value = null;
+ }
+ this.semicolon();
+
+ return this.finishNode(field, "PropertyDefinition")
+};
+
+pp$8.parseClassStaticBlock = function(node) {
+ node.body = [];
+
+ var oldLabels = this.labels;
+ this.labels = [];
+ this.enterScope(SCOPE_CLASS_STATIC_BLOCK | SCOPE_SUPER);
+ while (this.type !== types$1.braceR) {
+ var stmt = this.parseStatement(null);
+ node.body.push(stmt);
+ }
+ this.next();
+ this.exitScope();
+ this.labels = oldLabels;
+
+ return this.finishNode(node, "StaticBlock")
+};
+
+pp$8.parseClassId = function(node, isStatement) {
+ if (this.type === types$1.name) {
+ node.id = this.parseIdent();
+ if (isStatement)
+ { this.checkLValSimple(node.id, BIND_LEXICAL, false); }
+ } else {
+ if (isStatement === true)
+ { this.unexpected(); }
+ node.id = null;
+ }
+};
+
+pp$8.parseClassSuper = function(node) {
+ node.superClass = this.eat(types$1._extends) ? this.parseExprSubscripts(false) : null;
+};
+
+pp$8.enterClassBody = function() {
+ var element = {declared: Object.create(null), used: []};
+ this.privateNameStack.push(element);
+ return element.declared
+};
+
+pp$8.exitClassBody = function() {
+ var ref = this.privateNameStack.pop();
+ var declared = ref.declared;
+ var used = ref.used;
+ var len = this.privateNameStack.length;
+ var parent = len === 0 ? null : this.privateNameStack[len - 1];
+ for (var i = 0; i < used.length; ++i) {
+ var id = used[i];
+ if (!hasOwn(declared, id.name)) {
+ if (parent) {
+ parent.used.push(id);
+ } else {
+ this.raiseRecoverable(id.start, ("Private field '#" + (id.name) + "' must be declared in an enclosing class"));
+ }
+ }
+ }
+};
+
+function isPrivateNameConflicted(privateNameMap, element) {
+ var name = element.key.name;
+ var curr = privateNameMap[name];
+
+ var next = "true";
+ if (element.type === "MethodDefinition" && (element.kind === "get" || element.kind === "set")) {
+ next = (element.static ? "s" : "i") + element.kind;
+ }
+
+ // `class { get #a(){}; static set #a(_){} }` is also conflict.
+ if (
+ curr === "iget" && next === "iset" ||
+ curr === "iset" && next === "iget" ||
+ curr === "sget" && next === "sset" ||
+ curr === "sset" && next === "sget"
+ ) {
+ privateNameMap[name] = "true";
+ return false
+ } else if (!curr) {
+ privateNameMap[name] = next;
+ return false
+ } else {
+ return true
+ }
+}
+
+function checkKeyName(node, name) {
+ var computed = node.computed;
+ var key = node.key;
+ return !computed && (
+ key.type === "Identifier" && key.name === name ||
+ key.type === "Literal" && key.value === name
+ )
+}
+
+// Parses module export declaration.
+
+pp$8.parseExport = function(node, exports) {
+ this.next();
+ // export * from '...'
+ if (this.eat(types$1.star)) {
+ if (this.options.ecmaVersion >= 11) {
+ if (this.eatContextual("as")) {
+ node.exported = this.parseModuleExportName();
+ this.checkExport(exports, node.exported, this.lastTokStart);
+ } else {
+ node.exported = null;
+ }
+ }
+ this.expectContextual("from");
+ if (this.type !== types$1.string) { this.unexpected(); }
+ node.source = this.parseExprAtom();
+ this.semicolon();
+ return this.finishNode(node, "ExportAllDeclaration")
+ }
+ if (this.eat(types$1._default)) { // export default ...
+ this.checkExport(exports, "default", this.lastTokStart);
+ var isAsync;
+ if (this.type === types$1._function || (isAsync = this.isAsyncFunction())) {
+ var fNode = this.startNode();
+ this.next();
+ if (isAsync) { this.next(); }
+ node.declaration = this.parseFunction(fNode, FUNC_STATEMENT | FUNC_NULLABLE_ID, false, isAsync);
+ } else if (this.type === types$1._class) {
+ var cNode = this.startNode();
+ node.declaration = this.parseClass(cNode, "nullableID");
+ } else {
+ node.declaration = this.parseMaybeAssign();
+ this.semicolon();
+ }
+ return this.finishNode(node, "ExportDefaultDeclaration")
+ }
+ // export var|const|let|function|class ...
+ if (this.shouldParseExportStatement()) {
+ node.declaration = this.parseStatement(null);
+ if (node.declaration.type === "VariableDeclaration")
+ { this.checkVariableExport(exports, node.declaration.declarations); }
+ else
+ { this.checkExport(exports, node.declaration.id, node.declaration.id.start); }
+ node.specifiers = [];
+ node.source = null;
+ } else { // export { x, y as z } [from '...']
+ node.declaration = null;
+ node.specifiers = this.parseExportSpecifiers(exports);
+ if (this.eatContextual("from")) {
+ if (this.type !== types$1.string) { this.unexpected(); }
+ node.source = this.parseExprAtom();
+ } else {
+ for (var i = 0, list = node.specifiers; i < list.length; i += 1) {
+ // check for keywords used as local names
+ var spec = list[i];
+
+ this.checkUnreserved(spec.local);
+ // check if export is defined
+ this.checkLocalExport(spec.local);
+
+ if (spec.local.type === "Literal") {
+ this.raise(spec.local.start, "A string literal cannot be used as an exported binding without `from`.");
+ }
+ }
+
+ node.source = null;
+ }
+ this.semicolon();
+ }
+ return this.finishNode(node, "ExportNamedDeclaration")
+};
+
+pp$8.checkExport = function(exports, name, pos) {
+ if (!exports) { return }
+ if (typeof name !== "string")
+ { name = name.type === "Identifier" ? name.name : name.value; }
+ if (hasOwn(exports, name))
+ { this.raiseRecoverable(pos, "Duplicate export '" + name + "'"); }
+ exports[name] = true;
+};
+
+pp$8.checkPatternExport = function(exports, pat) {
+ var type = pat.type;
+ if (type === "Identifier")
+ { this.checkExport(exports, pat, pat.start); }
+ else if (type === "ObjectPattern")
+ { for (var i = 0, list = pat.properties; i < list.length; i += 1)
+ {
+ var prop = list[i];
+
+ this.checkPatternExport(exports, prop);
+ } }
+ else if (type === "ArrayPattern")
+ { for (var i$1 = 0, list$1 = pat.elements; i$1 < list$1.length; i$1 += 1) {
+ var elt = list$1[i$1];
+
+ if (elt) { this.checkPatternExport(exports, elt); }
+ } }
+ else if (type === "Property")
+ { this.checkPatternExport(exports, pat.value); }
+ else if (type === "AssignmentPattern")
+ { this.checkPatternExport(exports, pat.left); }
+ else if (type === "RestElement")
+ { this.checkPatternExport(exports, pat.argument); }
+ else if (type === "ParenthesizedExpression")
+ { this.checkPatternExport(exports, pat.expression); }
+};
+
+pp$8.checkVariableExport = function(exports, decls) {
+ if (!exports) { return }
+ for (var i = 0, list = decls; i < list.length; i += 1)
+ {
+ var decl = list[i];
+
+ this.checkPatternExport(exports, decl.id);
+ }
+};
+
+pp$8.shouldParseExportStatement = function() {
+ return this.type.keyword === "var" ||
+ this.type.keyword === "const" ||
+ this.type.keyword === "class" ||
+ this.type.keyword === "function" ||
+ this.isLet() ||
+ this.isAsyncFunction()
+};
+
+// Parses a comma-separated list of module exports.
+
+pp$8.parseExportSpecifiers = function(exports) {
+ var nodes = [], first = true;
+ // export { x, y as z } [from '...']
+ this.expect(types$1.braceL);
+ while (!this.eat(types$1.braceR)) {
+ if (!first) {
+ this.expect(types$1.comma);
+ if (this.afterTrailingComma(types$1.braceR)) { break }
+ } else { first = false; }
+
+ var node = this.startNode();
+ node.local = this.parseModuleExportName();
+ node.exported = this.eatContextual("as") ? this.parseModuleExportName() : node.local;
+ this.checkExport(
+ exports,
+ node.exported,
+ node.exported.start
+ );
+ nodes.push(this.finishNode(node, "ExportSpecifier"));
+ }
+ return nodes
+};
+
+// Parses import declaration.
+
+pp$8.parseImport = function(node) {
+ this.next();
+ // import '...'
+ if (this.type === types$1.string) {
+ node.specifiers = empty$1;
+ node.source = this.parseExprAtom();
+ } else {
+ node.specifiers = this.parseImportSpecifiers();
+ this.expectContextual("from");
+ node.source = this.type === types$1.string ? this.parseExprAtom() : this.unexpected();
+ }
+ this.semicolon();
+ return this.finishNode(node, "ImportDeclaration")
+};
+
+// Parses a comma-separated list of module imports.
+
+pp$8.parseImportSpecifiers = function() {
+ var nodes = [], first = true;
+ if (this.type === types$1.name) {
+ // import defaultObj, { x, y as z } from '...'
+ var node = this.startNode();
+ node.local = this.parseIdent();
+ this.checkLValSimple(node.local, BIND_LEXICAL);
+ nodes.push(this.finishNode(node, "ImportDefaultSpecifier"));
+ if (!this.eat(types$1.comma)) { return nodes }
+ }
+ if (this.type === types$1.star) {
+ var node$1 = this.startNode();
+ this.next();
+ this.expectContextual("as");
+ node$1.local = this.parseIdent();
+ this.checkLValSimple(node$1.local, BIND_LEXICAL);
+ nodes.push(this.finishNode(node$1, "ImportNamespaceSpecifier"));
+ return nodes
+ }
+ this.expect(types$1.braceL);
+ while (!this.eat(types$1.braceR)) {
+ if (!first) {
+ this.expect(types$1.comma);
+ if (this.afterTrailingComma(types$1.braceR)) { break }
+ } else { first = false; }
+
+ var node$2 = this.startNode();
+ node$2.imported = this.parseModuleExportName();
+ if (this.eatContextual("as")) {
+ node$2.local = this.parseIdent();
+ } else {
+ this.checkUnreserved(node$2.imported);
+ node$2.local = node$2.imported;
+ }
+ this.checkLValSimple(node$2.local, BIND_LEXICAL);
+ nodes.push(this.finishNode(node$2, "ImportSpecifier"));
+ }
+ return nodes
+};
+
+pp$8.parseModuleExportName = function() {
+ if (this.options.ecmaVersion >= 13 && this.type === types$1.string) {
+ var stringLiteral = this.parseLiteral(this.value);
+ if (loneSurrogate.test(stringLiteral.value)) {
+ this.raise(stringLiteral.start, "An export name cannot include a lone surrogate.");
+ }
+ return stringLiteral
+ }
+ return this.parseIdent(true)
+};
+
+// Set `ExpressionStatement#directive` property for directive prologues.
+pp$8.adaptDirectivePrologue = function(statements) {
+ for (var i = 0; i < statements.length && this.isDirectiveCandidate(statements[i]); ++i) {
+ statements[i].directive = statements[i].expression.raw.slice(1, -1);
+ }
+};
+pp$8.isDirectiveCandidate = function(statement) {
+ return (
+ statement.type === "ExpressionStatement" &&
+ statement.expression.type === "Literal" &&
+ typeof statement.expression.value === "string" &&
+ // Reject parenthesized strings.
+ (this.input[statement.start] === "\"" || this.input[statement.start] === "'")
+ )
+};
+
+var pp$7 = Parser.prototype;
+
+// Convert existing expression atom to assignable pattern
+// if possible.
+
+pp$7.toAssignable = function(node, isBinding, refDestructuringErrors) {
+ if (this.options.ecmaVersion >= 6 && node) {
+ switch (node.type) {
+ case "Identifier":
+ if (this.inAsync && node.name === "await")
+ { this.raise(node.start, "Cannot use 'await' as identifier inside an async function"); }
+ break
+
+ case "ObjectPattern":
+ case "ArrayPattern":
+ case "AssignmentPattern":
+ case "RestElement":
+ break
+
+ case "ObjectExpression":
+ node.type = "ObjectPattern";
+ if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }
+ for (var i = 0, list = node.properties; i < list.length; i += 1) {
+ var prop = list[i];
+
+ this.toAssignable(prop, isBinding);
+ // Early error:
+ // AssignmentRestProperty[Yield, Await] :
+ // `...` DestructuringAssignmentTarget[Yield, Await]
+ //
+ // It is a Syntax Error if |DestructuringAssignmentTarget| is an |ArrayLiteral| or an |ObjectLiteral|.
+ if (
+ prop.type === "RestElement" &&
+ (prop.argument.type === "ArrayPattern" || prop.argument.type === "ObjectPattern")
+ ) {
+ this.raise(prop.argument.start, "Unexpected token");
+ }
+ }
+ break
+
+ case "Property":
+ // AssignmentProperty has type === "Property"
+ if (node.kind !== "init") { this.raise(node.key.start, "Object pattern can't contain getter or setter"); }
+ this.toAssignable(node.value, isBinding);
+ break
+
+ case "ArrayExpression":
+ node.type = "ArrayPattern";
+ if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }
+ this.toAssignableList(node.elements, isBinding);
+ break
+
+ case "SpreadElement":
+ node.type = "RestElement";
+ this.toAssignable(node.argument, isBinding);
+ if (node.argument.type === "AssignmentPattern")
+ { this.raise(node.argument.start, "Rest elements cannot have a default value"); }
+ break
+
+ case "AssignmentExpression":
+ if (node.operator !== "=") { this.raise(node.left.end, "Only '=' operator can be used for specifying default value."); }
+ node.type = "AssignmentPattern";
+ delete node.operator;
+ this.toAssignable(node.left, isBinding);
+ break
+
+ case "ParenthesizedExpression":
+ this.toAssignable(node.expression, isBinding, refDestructuringErrors);
+ break
+
+ case "ChainExpression":
+ this.raiseRecoverable(node.start, "Optional chaining cannot appear in left-hand side");
+ break
+
+ case "MemberExpression":
+ if (!isBinding) { break }
+
+ default:
+ this.raise(node.start, "Assigning to rvalue");
+ }
+ } else if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }
+ return node
+};
+
+// Convert list of expression atoms to binding list.
+
+pp$7.toAssignableList = function(exprList, isBinding) {
+ var end = exprList.length;
+ for (var i = 0; i < end; i++) {
+ var elt = exprList[i];
+ if (elt) { this.toAssignable(elt, isBinding); }
+ }
+ if (end) {
+ var last = exprList[end - 1];
+ if (this.options.ecmaVersion === 6 && isBinding && last && last.type === "RestElement" && last.argument.type !== "Identifier")
+ { this.unexpected(last.argument.start); }
+ }
+ return exprList
+};
+
+// Parses spread element.
+
+pp$7.parseSpread = function(refDestructuringErrors) {
+ var node = this.startNode();
+ this.next();
+ node.argument = this.parseMaybeAssign(false, refDestructuringErrors);
+ return this.finishNode(node, "SpreadElement")
+};
+
+pp$7.parseRestBinding = function() {
+ var node = this.startNode();
+ this.next();
+
+ // RestElement inside of a function parameter must be an identifier
+ if (this.options.ecmaVersion === 6 && this.type !== types$1.name)
+ { this.unexpected(); }
+
+ node.argument = this.parseBindingAtom();
+
+ return this.finishNode(node, "RestElement")
+};
+
+// Parses lvalue (assignable) atom.
+
+pp$7.parseBindingAtom = function() {
+ if (this.options.ecmaVersion >= 6) {
+ switch (this.type) {
+ case types$1.bracketL:
+ var node = this.startNode();
+ this.next();
+ node.elements = this.parseBindingList(types$1.bracketR, true, true);
+ return this.finishNode(node, "ArrayPattern")
+
+ case types$1.braceL:
+ return this.parseObj(true)
+ }
+ }
+ return this.parseIdent()
+};
+
+pp$7.parseBindingList = function(close, allowEmpty, allowTrailingComma) {
+ var elts = [], first = true;
+ while (!this.eat(close)) {
+ if (first) { first = false; }
+ else { this.expect(types$1.comma); }
+ if (allowEmpty && this.type === types$1.comma) {
+ elts.push(null);
+ } else if (allowTrailingComma && this.afterTrailingComma(close)) {
+ break
+ } else if (this.type === types$1.ellipsis) {
+ var rest = this.parseRestBinding();
+ this.parseBindingListItem(rest);
+ elts.push(rest);
+ if (this.type === types$1.comma) { this.raise(this.start, "Comma is not permitted after the rest element"); }
+ this.expect(close);
+ break
+ } else {
+ var elem = this.parseMaybeDefault(this.start, this.startLoc);
+ this.parseBindingListItem(elem);
+ elts.push(elem);
+ }
+ }
+ return elts
+};
+
+pp$7.parseBindingListItem = function(param) {
+ return param
+};
+
+// Parses assignment pattern around given atom if possible.
+
+pp$7.parseMaybeDefault = function(startPos, startLoc, left) {
+ left = left || this.parseBindingAtom();
+ if (this.options.ecmaVersion < 6 || !this.eat(types$1.eq)) { return left }
+ var node = this.startNodeAt(startPos, startLoc);
+ node.left = left;
+ node.right = this.parseMaybeAssign();
+ return this.finishNode(node, "AssignmentPattern")
+};
+
+// The following three functions all verify that a node is an lvalue —
+// something that can be bound, or assigned to. In order to do so, they perform
+// a variety of checks:
+//
+// - Check that none of the bound/assigned-to identifiers are reserved words.
+// - Record name declarations for bindings in the appropriate scope.
+// - Check duplicate argument names, if checkClashes is set.
+//
+// If a complex binding pattern is encountered (e.g., object and array
+// destructuring), the entire pattern is recursively checked.
+//
+// There are three versions of checkLVal*() appropriate for different
+// circumstances:
+//
+// - checkLValSimple() shall be used if the syntactic construct supports
+// nothing other than identifiers and member expressions. Parenthesized
+// expressions are also correctly handled. This is generally appropriate for
+// constructs for which the spec says
+//
+// > It is a Syntax Error if AssignmentTargetType of [the production] is not
+// > simple.
+//
+// It is also appropriate for checking if an identifier is valid and not
+// defined elsewhere, like import declarations or function/class identifiers.
+//
+// Examples where this is used include:
+// a += …;
+// import a from '…';
+// where a is the node to be checked.
+//
+// - checkLValPattern() shall be used if the syntactic construct supports
+// anything checkLValSimple() supports, as well as object and array
+// destructuring patterns. This is generally appropriate for constructs for
+// which the spec says
+//
+// > It is a Syntax Error if [the production] is neither an ObjectLiteral nor
+// > an ArrayLiteral and AssignmentTargetType of [the production] is not
+// > simple.
+//
+// Examples where this is used include:
+// (a = …);
+// const a = …;
+// try { … } catch (a) { … }
+// where a is the node to be checked.
+//
+// - checkLValInnerPattern() shall be used if the syntactic construct supports
+// anything checkLValPattern() supports, as well as default assignment
+// patterns, rest elements, and other constructs that may appear within an
+// object or array destructuring pattern.
+//
+// As a special case, function parameters also use checkLValInnerPattern(),
+// as they also support defaults and rest constructs.
+//
+// These functions deliberately support both assignment and binding constructs,
+// as the logic for both is exceedingly similar. If the node is the target of
+// an assignment, then bindingType should be set to BIND_NONE. Otherwise, it
+// should be set to the appropriate BIND_* constant, like BIND_VAR or
+// BIND_LEXICAL.
+//
+// If the function is called with a non-BIND_NONE bindingType, then
+// additionally a checkClashes object may be specified to allow checking for
+// duplicate argument names. checkClashes is ignored if the provided construct
+// is an assignment (i.e., bindingType is BIND_NONE).
+
+pp$7.checkLValSimple = function(expr, bindingType, checkClashes) {
+ if ( bindingType === void 0 ) bindingType = BIND_NONE;
+
+ var isBind = bindingType !== BIND_NONE;
+
+ switch (expr.type) {
+ case "Identifier":
+ if (this.strict && this.reservedWordsStrictBind.test(expr.name))
+ { this.raiseRecoverable(expr.start, (isBind ? "Binding " : "Assigning to ") + expr.name + " in strict mode"); }
+ if (isBind) {
+ if (bindingType === BIND_LEXICAL && expr.name === "let")
+ { this.raiseRecoverable(expr.start, "let is disallowed as a lexically bound name"); }
+ if (checkClashes) {
+ if (hasOwn(checkClashes, expr.name))
+ { this.raiseRecoverable(expr.start, "Argument name clash"); }
+ checkClashes[expr.name] = true;
+ }
+ if (bindingType !== BIND_OUTSIDE) { this.declareName(expr.name, bindingType, expr.start); }
+ }
+ break
+
+ case "ChainExpression":
+ this.raiseRecoverable(expr.start, "Optional chaining cannot appear in left-hand side");
+ break
+
+ case "MemberExpression":
+ if (isBind) { this.raiseRecoverable(expr.start, "Binding member expression"); }
+ break
+
+ case "ParenthesizedExpression":
+ if (isBind) { this.raiseRecoverable(expr.start, "Binding parenthesized expression"); }
+ return this.checkLValSimple(expr.expression, bindingType, checkClashes)
+
+ default:
+ this.raise(expr.start, (isBind ? "Binding" : "Assigning to") + " rvalue");
+ }
+};
+
+pp$7.checkLValPattern = function(expr, bindingType, checkClashes) {
+ if ( bindingType === void 0 ) bindingType = BIND_NONE;
+
+ switch (expr.type) {
+ case "ObjectPattern":
+ for (var i = 0, list = expr.properties; i < list.length; i += 1) {
+ var prop = list[i];
+
+ this.checkLValInnerPattern(prop, bindingType, checkClashes);
+ }
+ break
+
+ case "ArrayPattern":
+ for (var i$1 = 0, list$1 = expr.elements; i$1 < list$1.length; i$1 += 1) {
+ var elem = list$1[i$1];
+
+ if (elem) { this.checkLValInnerPattern(elem, bindingType, checkClashes); }
+ }
+ break
+
+ default:
+ this.checkLValSimple(expr, bindingType, checkClashes);
+ }
+};
+
+pp$7.checkLValInnerPattern = function(expr, bindingType, checkClashes) {
+ if ( bindingType === void 0 ) bindingType = BIND_NONE;
+
+ switch (expr.type) {
+ case "Property":
+ // AssignmentProperty has type === "Property"
+ this.checkLValInnerPattern(expr.value, bindingType, checkClashes);
+ break
+
+ case "AssignmentPattern":
+ this.checkLValPattern(expr.left, bindingType, checkClashes);
+ break
+
+ case "RestElement":
+ this.checkLValPattern(expr.argument, bindingType, checkClashes);
+ break
+
+ default:
+ this.checkLValPattern(expr, bindingType, checkClashes);
+ }
+};
+
+// The algorithm used to determine whether a regexp can appear at a
+
+var TokContext = function TokContext(token, isExpr, preserveSpace, override, generator) {
+ this.token = token;
+ this.isExpr = !!isExpr;
+ this.preserveSpace = !!preserveSpace;
+ this.override = override;
+ this.generator = !!generator;
+};
+
+var types = {
+ b_stat: new TokContext("{", false),
+ b_expr: new TokContext("{", true),
+ b_tmpl: new TokContext("${", false),
+ p_stat: new TokContext("(", false),
+ p_expr: new TokContext("(", true),
+ q_tmpl: new TokContext("`", true, true, function (p) { return p.tryReadTemplateToken(); }),
+ f_stat: new TokContext("function", false),
+ f_expr: new TokContext("function", true),
+ f_expr_gen: new TokContext("function", true, false, null, true),
+ f_gen: new TokContext("function", false, false, null, true)
+};
+
+var pp$6 = Parser.prototype;
+
+pp$6.initialContext = function() {
+ return [types.b_stat]
+};
+
+pp$6.curContext = function() {
+ return this.context[this.context.length - 1]
+};
+
+pp$6.braceIsBlock = function(prevType) {
+ var parent = this.curContext();
+ if (parent === types.f_expr || parent === types.f_stat)
+ { return true }
+ if (prevType === types$1.colon && (parent === types.b_stat || parent === types.b_expr))
+ { return !parent.isExpr }
+
+ // The check for `tt.name && exprAllowed` detects whether we are
+ // after a `yield` or `of` construct. See the `updateContext` for
+ // `tt.name`.
+ if (prevType === types$1._return || prevType === types$1.name && this.exprAllowed)
+ { return lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) }
+ if (prevType === types$1._else || prevType === types$1.semi || prevType === types$1.eof || prevType === types$1.parenR || prevType === types$1.arrow)
+ { return true }
+ if (prevType === types$1.braceL)
+ { return parent === types.b_stat }
+ if (prevType === types$1._var || prevType === types$1._const || prevType === types$1.name)
+ { return false }
+ return !this.exprAllowed
+};
+
+pp$6.inGeneratorContext = function() {
+ for (var i = this.context.length - 1; i >= 1; i--) {
+ var context = this.context[i];
+ if (context.token === "function")
+ { return context.generator }
+ }
+ return false
+};
+
+pp$6.updateContext = function(prevType) {
+ var update, type = this.type;
+ if (type.keyword && prevType === types$1.dot)
+ { this.exprAllowed = false; }
+ else if (update = type.updateContext)
+ { update.call(this, prevType); }
+ else
+ { this.exprAllowed = type.beforeExpr; }
+};
+
+// Used to handle egde case when token context could not be inferred correctly in tokenize phase
+pp$6.overrideContext = function(tokenCtx) {
+ if (this.curContext() !== tokenCtx) {
+ this.context[this.context.length - 1] = tokenCtx;
+ }
+};
+
+// Token-specific context update code
+
+types$1.parenR.updateContext = types$1.braceR.updateContext = function() {
+ if (this.context.length === 1) {
+ this.exprAllowed = true;
+ return
+ }
+ var out = this.context.pop();
+ if (out === types.b_stat && this.curContext().token === "function") {
+ out = this.context.pop();
+ }
+ this.exprAllowed = !out.isExpr;
+};
+
+types$1.braceL.updateContext = function(prevType) {
+ this.context.push(this.braceIsBlock(prevType) ? types.b_stat : types.b_expr);
+ this.exprAllowed = true;
+};
+
+types$1.dollarBraceL.updateContext = function() {
+ this.context.push(types.b_tmpl);
+ this.exprAllowed = true;
+};
+
+types$1.parenL.updateContext = function(prevType) {
+ var statementParens = prevType === types$1._if || prevType === types$1._for || prevType === types$1._with || prevType === types$1._while;
+ this.context.push(statementParens ? types.p_stat : types.p_expr);
+ this.exprAllowed = true;
+};
+
+types$1.incDec.updateContext = function() {
+ // tokExprAllowed stays unchanged
+};
+
+types$1._function.updateContext = types$1._class.updateContext = function(prevType) {
+ if (prevType.beforeExpr && prevType !== types$1._else &&
+ !(prevType === types$1.semi && this.curContext() !== types.p_stat) &&
+ !(prevType === types$1._return && lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) &&
+ !((prevType === types$1.colon || prevType === types$1.braceL) && this.curContext() === types.b_stat))
+ { this.context.push(types.f_expr); }
+ else
+ { this.context.push(types.f_stat); }
+ this.exprAllowed = false;
+};
+
+types$1.backQuote.updateContext = function() {
+ if (this.curContext() === types.q_tmpl)
+ { this.context.pop(); }
+ else
+ { this.context.push(types.q_tmpl); }
+ this.exprAllowed = false;
+};
+
+types$1.star.updateContext = function(prevType) {
+ if (prevType === types$1._function) {
+ var index = this.context.length - 1;
+ if (this.context[index] === types.f_expr)
+ { this.context[index] = types.f_expr_gen; }
+ else
+ { this.context[index] = types.f_gen; }
+ }
+ this.exprAllowed = true;
+};
+
+types$1.name.updateContext = function(prevType) {
+ var allowed = false;
+ if (this.options.ecmaVersion >= 6 && prevType !== types$1.dot) {
+ if (this.value === "of" && !this.exprAllowed ||
+ this.value === "yield" && this.inGeneratorContext())
+ { allowed = true; }
+ }
+ this.exprAllowed = allowed;
+};
+
+// A recursive descent parser operates by defining functions for all
+
+var pp$5 = Parser.prototype;
+
+// Check if property name clashes with already added.
+// Object/class getters and setters are not allowed to clash —
+// either with each other or with an init property — and in
+// strict mode, init properties are also not allowed to be repeated.
+
+pp$5.checkPropClash = function(prop, propHash, refDestructuringErrors) {
+ if (this.options.ecmaVersion >= 9 && prop.type === "SpreadElement")
+ { return }
+ if (this.options.ecmaVersion >= 6 && (prop.computed || prop.method || prop.shorthand))
+ { return }
+ var key = prop.key;
+ var name;
+ switch (key.type) {
+ case "Identifier": name = key.name; break
+ case "Literal": name = String(key.value); break
+ default: return
+ }
+ var kind = prop.kind;
+ if (this.options.ecmaVersion >= 6) {
+ if (name === "__proto__" && kind === "init") {
+ if (propHash.proto) {
+ if (refDestructuringErrors) {
+ if (refDestructuringErrors.doubleProto < 0) {
+ refDestructuringErrors.doubleProto = key.start;
+ }
+ } else {
+ this.raiseRecoverable(key.start, "Redefinition of __proto__ property");
+ }
+ }
+ propHash.proto = true;
+ }
+ return
+ }
+ name = "$" + name;
+ var other = propHash[name];
+ if (other) {
+ var redefinition;
+ if (kind === "init") {
+ redefinition = this.strict && other.init || other.get || other.set;
+ } else {
+ redefinition = other.init || other[kind];
+ }
+ if (redefinition)
+ { this.raiseRecoverable(key.start, "Redefinition of property"); }
+ } else {
+ other = propHash[name] = {
+ init: false,
+ get: false,
+ set: false
+ };
+ }
+ other[kind] = true;
+};
+
+// ### Expression parsing
+
+// These nest, from the most general expression type at the top to
+// 'atomic', nondivisible expression types at the bottom. Most of
+// the functions will simply let the function(s) below them parse,
+// and, *if* the syntactic construct they handle is present, wrap
+// the AST node that the inner parser gave them in another node.
+
+// Parse a full expression. The optional arguments are used to
+// forbid the `in` operator (in for loops initalization expressions)
+// and provide reference for storing '=' operator inside shorthand
+// property assignment in contexts where both object expression
+// and object pattern might appear (so it's possible to raise
+// delayed syntax error at correct position).
+
+pp$5.parseExpression = function(forInit, refDestructuringErrors) {
+ var startPos = this.start, startLoc = this.startLoc;
+ var expr = this.parseMaybeAssign(forInit, refDestructuringErrors);
+ if (this.type === types$1.comma) {
+ var node = this.startNodeAt(startPos, startLoc);
+ node.expressions = [expr];
+ while (this.eat(types$1.comma)) { node.expressions.push(this.parseMaybeAssign(forInit, refDestructuringErrors)); }
+ return this.finishNode(node, "SequenceExpression")
+ }
+ return expr
+};
+
+// Parse an assignment expression. This includes applications of
+// operators like `+=`.
+
+pp$5.parseMaybeAssign = function(forInit, refDestructuringErrors, afterLeftParse) {
+ if (this.isContextual("yield")) {
+ if (this.inGenerator) { return this.parseYield(forInit) }
+ // The tokenizer will assume an expression is allowed after
+ // `yield`, but this isn't that kind of yield
+ else { this.exprAllowed = false; }
+ }
+
+ var ownDestructuringErrors = false, oldParenAssign = -1, oldTrailingComma = -1, oldDoubleProto = -1;
+ if (refDestructuringErrors) {
+ oldParenAssign = refDestructuringErrors.parenthesizedAssign;
+ oldTrailingComma = refDestructuringErrors.trailingComma;
+ oldDoubleProto = refDestructuringErrors.doubleProto;
+ refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = -1;
+ } else {
+ refDestructuringErrors = new DestructuringErrors;
+ ownDestructuringErrors = true;
+ }
+
+ var startPos = this.start, startLoc = this.startLoc;
+ if (this.type === types$1.parenL || this.type === types$1.name) {
+ this.potentialArrowAt = this.start;
+ this.potentialArrowInForAwait = forInit === "await";
+ }
+ var left = this.parseMaybeConditional(forInit, refDestructuringErrors);
+ if (afterLeftParse) { left = afterLeftParse.call(this, left, startPos, startLoc); }
+ if (this.type.isAssign) {
+ var node = this.startNodeAt(startPos, startLoc);
+ node.operator = this.value;
+ if (this.type === types$1.eq)
+ { left = this.toAssignable(left, false, refDestructuringErrors); }
+ if (!ownDestructuringErrors) {
+ refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = refDestructuringErrors.doubleProto = -1;
+ }
+ if (refDestructuringErrors.shorthandAssign >= left.start)
+ { refDestructuringErrors.shorthandAssign = -1; } // reset because shorthand default was used correctly
+ if (this.type === types$1.eq)
+ { this.checkLValPattern(left); }
+ else
+ { this.checkLValSimple(left); }
+ node.left = left;
+ this.next();
+ node.right = this.parseMaybeAssign(forInit);
+ if (oldDoubleProto > -1) { refDestructuringErrors.doubleProto = oldDoubleProto; }
+ return this.finishNode(node, "AssignmentExpression")
+ } else {
+ if (ownDestructuringErrors) { this.checkExpressionErrors(refDestructuringErrors, true); }
+ }
+ if (oldParenAssign > -1) { refDestructuringErrors.parenthesizedAssign = oldParenAssign; }
+ if (oldTrailingComma > -1) { refDestructuringErrors.trailingComma = oldTrailingComma; }
+ return left
+};
+
+// Parse a ternary conditional (`?:`) operator.
+
+pp$5.parseMaybeConditional = function(forInit, refDestructuringErrors) {
+ var startPos = this.start, startLoc = this.startLoc;
+ var expr = this.parseExprOps(forInit, refDestructuringErrors);
+ if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }
+ if (this.eat(types$1.question)) {
+ var node = this.startNodeAt(startPos, startLoc);
+ node.test = expr;
+ node.consequent = this.parseMaybeAssign();
+ this.expect(types$1.colon);
+ node.alternate = this.parseMaybeAssign(forInit);
+ return this.finishNode(node, "ConditionalExpression")
+ }
+ return expr
+};
+
+// Start the precedence parser.
+
+pp$5.parseExprOps = function(forInit, refDestructuringErrors) {
+ var startPos = this.start, startLoc = this.startLoc;
+ var expr = this.parseMaybeUnary(refDestructuringErrors, false, false, forInit);
+ if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }
+ return expr.start === startPos && expr.type === "ArrowFunctionExpression" ? expr : this.parseExprOp(expr, startPos, startLoc, -1, forInit)
+};
+
+// Parse binary operators with the operator precedence parsing
+// algorithm. `left` is the left-hand side of the operator.
+// `minPrec` provides context that allows the function to stop and
+// defer further parser to one of its callers when it encounters an
+// operator that has a lower precedence than the set it is parsing.
+
+pp$5.parseExprOp = function(left, leftStartPos, leftStartLoc, minPrec, forInit) {
+ var prec = this.type.binop;
+ if (prec != null && (!forInit || this.type !== types$1._in)) {
+ if (prec > minPrec) {
+ var logical = this.type === types$1.logicalOR || this.type === types$1.logicalAND;
+ var coalesce = this.type === types$1.coalesce;
+ if (coalesce) {
+ // Handle the precedence of `tt.coalesce` as equal to the range of logical expressions.
+ // In other words, `node.right` shouldn't contain logical expressions in order to check the mixed error.
+ prec = types$1.logicalAND.binop;
+ }
+ var op = this.value;
+ this.next();
+ var startPos = this.start, startLoc = this.startLoc;
+ var right = this.parseExprOp(this.parseMaybeUnary(null, false, false, forInit), startPos, startLoc, prec, forInit);
+ var node = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical || coalesce);
+ if ((logical && this.type === types$1.coalesce) || (coalesce && (this.type === types$1.logicalOR || this.type === types$1.logicalAND))) {
+ this.raiseRecoverable(this.start, "Logical expressions and coalesce expressions cannot be mixed. Wrap either by parentheses");
+ }
+ return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, forInit)
+ }
+ }
+ return left
+};
+
+pp$5.buildBinary = function(startPos, startLoc, left, right, op, logical) {
+ if (right.type === "PrivateIdentifier") { this.raise(right.start, "Private identifier can only be left side of binary expression"); }
+ var node = this.startNodeAt(startPos, startLoc);
+ node.left = left;
+ node.operator = op;
+ node.right = right;
+ return this.finishNode(node, logical ? "LogicalExpression" : "BinaryExpression")
+};
+
+// Parse unary operators, both prefix and postfix.
+
+pp$5.parseMaybeUnary = function(refDestructuringErrors, sawUnary, incDec, forInit) {
+ var startPos = this.start, startLoc = this.startLoc, expr;
+ if (this.isContextual("await") && this.canAwait) {
+ expr = this.parseAwait(forInit);
+ sawUnary = true;
+ } else if (this.type.prefix) {
+ var node = this.startNode(), update = this.type === types$1.incDec;
+ node.operator = this.value;
+ node.prefix = true;
+ this.next();
+ node.argument = this.parseMaybeUnary(null, true, update, forInit);
+ this.checkExpressionErrors(refDestructuringErrors, true);
+ if (update) { this.checkLValSimple(node.argument); }
+ else if (this.strict && node.operator === "delete" &&
+ node.argument.type === "Identifier")
+ { this.raiseRecoverable(node.start, "Deleting local variable in strict mode"); }
+ else if (node.operator === "delete" && isPrivateFieldAccess(node.argument))
+ { this.raiseRecoverable(node.start, "Private fields can not be deleted"); }
+ else { sawUnary = true; }
+ expr = this.finishNode(node, update ? "UpdateExpression" : "UnaryExpression");
+ } else if (!sawUnary && this.type === types$1.privateId) {
+ if (forInit || this.privateNameStack.length === 0) { this.unexpected(); }
+ expr = this.parsePrivateIdent();
+ // only could be private fields in 'in', such as #x in obj
+ if (this.type !== types$1._in) { this.unexpected(); }
+ } else {
+ expr = this.parseExprSubscripts(refDestructuringErrors, forInit);
+ if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }
+ while (this.type.postfix && !this.canInsertSemicolon()) {
+ var node$1 = this.startNodeAt(startPos, startLoc);
+ node$1.operator = this.value;
+ node$1.prefix = false;
+ node$1.argument = expr;
+ this.checkLValSimple(expr);
+ this.next();
+ expr = this.finishNode(node$1, "UpdateExpression");
+ }
+ }
+
+ if (!incDec && this.eat(types$1.starstar)) {
+ if (sawUnary)
+ { this.unexpected(this.lastTokStart); }
+ else
+ { return this.buildBinary(startPos, startLoc, expr, this.parseMaybeUnary(null, false, false, forInit), "**", false) }
+ } else {
+ return expr
+ }
+};
+
+function isPrivateFieldAccess(node) {
+ return (
+ node.type === "MemberExpression" && node.property.type === "PrivateIdentifier" ||
+ node.type === "ChainExpression" && isPrivateFieldAccess(node.expression)
+ )
+}
+
+// Parse call, dot, and `[]`-subscript expressions.
+
+pp$5.parseExprSubscripts = function(refDestructuringErrors, forInit) {
+ var startPos = this.start, startLoc = this.startLoc;
+ var expr = this.parseExprAtom(refDestructuringErrors, forInit);
+ if (expr.type === "ArrowFunctionExpression" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== ")")
+ { return expr }
+ var result = this.parseSubscripts(expr, startPos, startLoc, false, forInit);
+ if (refDestructuringErrors && result.type === "MemberExpression") {
+ if (refDestructuringErrors.parenthesizedAssign >= result.start) { refDestructuringErrors.parenthesizedAssign = -1; }
+ if (refDestructuringErrors.parenthesizedBind >= result.start) { refDestructuringErrors.parenthesizedBind = -1; }
+ if (refDestructuringErrors.trailingComma >= result.start) { refDestructuringErrors.trailingComma = -1; }
+ }
+ return result
+};
+
+pp$5.parseSubscripts = function(base, startPos, startLoc, noCalls, forInit) {
+ var maybeAsyncArrow = this.options.ecmaVersion >= 8 && base.type === "Identifier" && base.name === "async" &&
+ this.lastTokEnd === base.end && !this.canInsertSemicolon() && base.end - base.start === 5 &&
+ this.potentialArrowAt === base.start;
+ var optionalChained = false;
+
+ while (true) {
+ var element = this.parseSubscript(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit);
+
+ if (element.optional) { optionalChained = true; }
+ if (element === base || element.type === "ArrowFunctionExpression") {
+ if (optionalChained) {
+ var chainNode = this.startNodeAt(startPos, startLoc);
+ chainNode.expression = element;
+ element = this.finishNode(chainNode, "ChainExpression");
+ }
+ return element
+ }
+
+ base = element;
+ }
+};
+
+pp$5.parseSubscript = function(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit) {
+ var optionalSupported = this.options.ecmaVersion >= 11;
+ var optional = optionalSupported && this.eat(types$1.questionDot);
+ if (noCalls && optional) { this.raise(this.lastTokStart, "Optional chaining cannot appear in the callee of new expressions"); }
+
+ var computed = this.eat(types$1.bracketL);
+ if (computed || (optional && this.type !== types$1.parenL && this.type !== types$1.backQuote) || this.eat(types$1.dot)) {
+ var node = this.startNodeAt(startPos, startLoc);
+ node.object = base;
+ if (computed) {
+ node.property = this.parseExpression();
+ this.expect(types$1.bracketR);
+ } else if (this.type === types$1.privateId && base.type !== "Super") {
+ node.property = this.parsePrivateIdent();
+ } else {
+ node.property = this.parseIdent(this.options.allowReserved !== "never");
+ }
+ node.computed = !!computed;
+ if (optionalSupported) {
+ node.optional = optional;
+ }
+ base = this.finishNode(node, "MemberExpression");
+ } else if (!noCalls && this.eat(types$1.parenL)) {
+ var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;
+ this.yieldPos = 0;
+ this.awaitPos = 0;
+ this.awaitIdentPos = 0;
+ var exprList = this.parseExprList(types$1.parenR, this.options.ecmaVersion >= 8, false, refDestructuringErrors);
+ if (maybeAsyncArrow && !optional && !this.canInsertSemicolon() && this.eat(types$1.arrow)) {
+ this.checkPatternErrors(refDestructuringErrors, false);
+ this.checkYieldAwaitInDefaultParams();
+ if (this.awaitIdentPos > 0)
+ { this.raise(this.awaitIdentPos, "Cannot use 'await' as identifier inside an async function"); }
+ this.yieldPos = oldYieldPos;
+ this.awaitPos = oldAwaitPos;
+ this.awaitIdentPos = oldAwaitIdentPos;
+ return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, true, forInit)
+ }
+ this.checkExpressionErrors(refDestructuringErrors, true);
+ this.yieldPos = oldYieldPos || this.yieldPos;
+ this.awaitPos = oldAwaitPos || this.awaitPos;
+ this.awaitIdentPos = oldAwaitIdentPos || this.awaitIdentPos;
+ var node$1 = this.startNodeAt(startPos, startLoc);
+ node$1.callee = base;
+ node$1.arguments = exprList;
+ if (optionalSupported) {
+ node$1.optional = optional;
+ }
+ base = this.finishNode(node$1, "CallExpression");
+ } else if (this.type === types$1.backQuote) {
+ if (optional || optionalChained) {
+ this.raise(this.start, "Optional chaining cannot appear in the tag of tagged template expressions");
+ }
+ var node$2 = this.startNodeAt(startPos, startLoc);
+ node$2.tag = base;
+ node$2.quasi = this.parseTemplate({isTagged: true});
+ base = this.finishNode(node$2, "TaggedTemplateExpression");
+ }
+ return base
+};
+
+// Parse an atomic expression — either a single token that is an
+// expression, an expression started by a keyword like `function` or
+// `new`, or an expression wrapped in punctuation like `()`, `[]`,
+// or `{}`.
+
+pp$5.parseExprAtom = function(refDestructuringErrors, forInit) {
+ // If a division operator appears in an expression position, the
+ // tokenizer got confused, and we force it to read a regexp instead.
+ if (this.type === types$1.slash) { this.readRegexp(); }
+
+ var node, canBeArrow = this.potentialArrowAt === this.start;
+ switch (this.type) {
+ case types$1._super:
+ if (!this.allowSuper)
+ { this.raise(this.start, "'super' keyword outside a method"); }
+ node = this.startNode();
+ this.next();
+ if (this.type === types$1.parenL && !this.allowDirectSuper)
+ { this.raise(node.start, "super() call outside constructor of a subclass"); }
+ // The `super` keyword can appear at below:
+ // SuperProperty:
+ // super [ Expression ]
+ // super . IdentifierName
+ // SuperCall:
+ // super ( Arguments )
+ if (this.type !== types$1.dot && this.type !== types$1.bracketL && this.type !== types$1.parenL)
+ { this.unexpected(); }
+ return this.finishNode(node, "Super")
+
+ case types$1._this:
+ node = this.startNode();
+ this.next();
+ return this.finishNode(node, "ThisExpression")
+
+ case types$1.name:
+ var startPos = this.start, startLoc = this.startLoc, containsEsc = this.containsEsc;
+ var id = this.parseIdent(false);
+ if (this.options.ecmaVersion >= 8 && !containsEsc && id.name === "async" && !this.canInsertSemicolon() && this.eat(types$1._function)) {
+ this.overrideContext(types.f_expr);
+ return this.parseFunction(this.startNodeAt(startPos, startLoc), 0, false, true, forInit)
+ }
+ if (canBeArrow && !this.canInsertSemicolon()) {
+ if (this.eat(types$1.arrow))
+ { return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], false, forInit) }
+ if (this.options.ecmaVersion >= 8 && id.name === "async" && this.type === types$1.name && !containsEsc &&
+ (!this.potentialArrowInForAwait || this.value !== "of" || this.containsEsc)) {
+ id = this.parseIdent(false);
+ if (this.canInsertSemicolon() || !this.eat(types$1.arrow))
+ { this.unexpected(); }
+ return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], true, forInit)
+ }
+ }
+ return id
+
+ case types$1.regexp:
+ var value = this.value;
+ node = this.parseLiteral(value.value);
+ node.regex = {pattern: value.pattern, flags: value.flags};
+ return node
+
+ case types$1.num: case types$1.string:
+ return this.parseLiteral(this.value)
+
+ case types$1._null: case types$1._true: case types$1._false:
+ node = this.startNode();
+ node.value = this.type === types$1._null ? null : this.type === types$1._true;
+ node.raw = this.type.keyword;
+ this.next();
+ return this.finishNode(node, "Literal")
+
+ case types$1.parenL:
+ var start = this.start, expr = this.parseParenAndDistinguishExpression(canBeArrow, forInit);
+ if (refDestructuringErrors) {
+ if (refDestructuringErrors.parenthesizedAssign < 0 && !this.isSimpleAssignTarget(expr))
+ { refDestructuringErrors.parenthesizedAssign = start; }
+ if (refDestructuringErrors.parenthesizedBind < 0)
+ { refDestructuringErrors.parenthesizedBind = start; }
+ }
+ return expr
+
+ case types$1.bracketL:
+ node = this.startNode();
+ this.next();
+ node.elements = this.parseExprList(types$1.bracketR, true, true, refDestructuringErrors);
+ return this.finishNode(node, "ArrayExpression")
+
+ case types$1.braceL:
+ this.overrideContext(types.b_expr);
+ return this.parseObj(false, refDestructuringErrors)
+
+ case types$1._function:
+ node = this.startNode();
+ this.next();
+ return this.parseFunction(node, 0)
+
+ case types$1._class:
+ return this.parseClass(this.startNode(), false)
+
+ case types$1._new:
+ return this.parseNew()
+
+ case types$1.backQuote:
+ return this.parseTemplate()
+
+ case types$1._import:
+ if (this.options.ecmaVersion >= 11) {
+ return this.parseExprImport()
+ } else {
+ return this.unexpected()
+ }
+
+ default:
+ this.unexpected();
+ }
+};
+
+pp$5.parseExprImport = function() {
+ var node = this.startNode();
+
+ // Consume `import` as an identifier for `import.meta`.
+ // Because `this.parseIdent(true)` doesn't check escape sequences, it needs the check of `this.containsEsc`.
+ if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword import"); }
+ var meta = this.parseIdent(true);
+
+ switch (this.type) {
+ case types$1.parenL:
+ return this.parseDynamicImport(node)
+ case types$1.dot:
+ node.meta = meta;
+ return this.parseImportMeta(node)
+ default:
+ this.unexpected();
+ }
+};
+
+pp$5.parseDynamicImport = function(node) {
+ this.next(); // skip `(`
+
+ // Parse node.source.
+ node.source = this.parseMaybeAssign();
+
+ // Verify ending.
+ if (!this.eat(types$1.parenR)) {
+ var errorPos = this.start;
+ if (this.eat(types$1.comma) && this.eat(types$1.parenR)) {
+ this.raiseRecoverable(errorPos, "Trailing comma is not allowed in import()");
+ } else {
+ this.unexpected(errorPos);
+ }
+ }
+
+ return this.finishNode(node, "ImportExpression")
+};
+
+pp$5.parseImportMeta = function(node) {
+ this.next(); // skip `.`
+
+ var containsEsc = this.containsEsc;
+ node.property = this.parseIdent(true);
+
+ if (node.property.name !== "meta")
+ { this.raiseRecoverable(node.property.start, "The only valid meta property for import is 'import.meta'"); }
+ if (containsEsc)
+ { this.raiseRecoverable(node.start, "'import.meta' must not contain escaped characters"); }
+ if (this.options.sourceType !== "module" && !this.options.allowImportExportEverywhere)
+ { this.raiseRecoverable(node.start, "Cannot use 'import.meta' outside a module"); }
+
+ return this.finishNode(node, "MetaProperty")
+};
+
+pp$5.parseLiteral = function(value) {
+ var node = this.startNode();
+ node.value = value;
+ node.raw = this.input.slice(this.start, this.end);
+ if (node.raw.charCodeAt(node.raw.length - 1) === 110) { node.bigint = node.raw.slice(0, -1).replace(/_/g, ""); }
+ this.next();
+ return this.finishNode(node, "Literal")
+};
+
+pp$5.parseParenExpression = function() {
+ this.expect(types$1.parenL);
+ var val = this.parseExpression();
+ this.expect(types$1.parenR);
+ return val
+};
+
+pp$5.parseParenAndDistinguishExpression = function(canBeArrow, forInit) {
+ var startPos = this.start, startLoc = this.startLoc, val, allowTrailingComma = this.options.ecmaVersion >= 8;
+ if (this.options.ecmaVersion >= 6) {
+ this.next();
+
+ var innerStartPos = this.start, innerStartLoc = this.startLoc;
+ var exprList = [], first = true, lastIsComma = false;
+ var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, spreadStart;
+ this.yieldPos = 0;
+ this.awaitPos = 0;
+ // Do not save awaitIdentPos to allow checking awaits nested in parameters
+ while (this.type !== types$1.parenR) {
+ first ? first = false : this.expect(types$1.comma);
+ if (allowTrailingComma && this.afterTrailingComma(types$1.parenR, true)) {
+ lastIsComma = true;
+ break
+ } else if (this.type === types$1.ellipsis) {
+ spreadStart = this.start;
+ exprList.push(this.parseParenItem(this.parseRestBinding()));
+ if (this.type === types$1.comma) { this.raise(this.start, "Comma is not permitted after the rest element"); }
+ break
+ } else {
+ exprList.push(this.parseMaybeAssign(false, refDestructuringErrors, this.parseParenItem));
+ }
+ }
+ var innerEndPos = this.lastTokEnd, innerEndLoc = this.lastTokEndLoc;
+ this.expect(types$1.parenR);
+
+ if (canBeArrow && !this.canInsertSemicolon() && this.eat(types$1.arrow)) {
+ this.checkPatternErrors(refDestructuringErrors, false);
+ this.checkYieldAwaitInDefaultParams();
+ this.yieldPos = oldYieldPos;
+ this.awaitPos = oldAwaitPos;
+ return this.parseParenArrowList(startPos, startLoc, exprList, forInit)
+ }
+
+ if (!exprList.length || lastIsComma) { this.unexpected(this.lastTokStart); }
+ if (spreadStart) { this.unexpected(spreadStart); }
+ this.checkExpressionErrors(refDestructuringErrors, true);
+ this.yieldPos = oldYieldPos || this.yieldPos;
+ this.awaitPos = oldAwaitPos || this.awaitPos;
+
+ if (exprList.length > 1) {
+ val = this.startNodeAt(innerStartPos, innerStartLoc);
+ val.expressions = exprList;
+ this.finishNodeAt(val, "SequenceExpression", innerEndPos, innerEndLoc);
+ } else {
+ val = exprList[0];
+ }
+ } else {
+ val = this.parseParenExpression();
+ }
+
+ if (this.options.preserveParens) {
+ var par = this.startNodeAt(startPos, startLoc);
+ par.expression = val;
+ return this.finishNode(par, "ParenthesizedExpression")
+ } else {
+ return val
+ }
+};
+
+pp$5.parseParenItem = function(item) {
+ return item
+};
+
+pp$5.parseParenArrowList = function(startPos, startLoc, exprList, forInit) {
+ return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, false, forInit)
+};
+
+// New's precedence is slightly tricky. It must allow its argument to
+// be a `[]` or dot subscript expression, but not a call — at least,
+// not without wrapping it in parentheses. Thus, it uses the noCalls
+// argument to parseSubscripts to prevent it from consuming the
+// argument list.
+
+var empty = [];
+
+pp$5.parseNew = function() {
+ if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword new"); }
+ var node = this.startNode();
+ var meta = this.parseIdent(true);
+ if (this.options.ecmaVersion >= 6 && this.eat(types$1.dot)) {
+ node.meta = meta;
+ var containsEsc = this.containsEsc;
+ node.property = this.parseIdent(true);
+ if (node.property.name !== "target")
+ { this.raiseRecoverable(node.property.start, "The only valid meta property for new is 'new.target'"); }
+ if (containsEsc)
+ { this.raiseRecoverable(node.start, "'new.target' must not contain escaped characters"); }
+ if (!this.allowNewDotTarget)
+ { this.raiseRecoverable(node.start, "'new.target' can only be used in functions and class static block"); }
+ return this.finishNode(node, "MetaProperty")
+ }
+ var startPos = this.start, startLoc = this.startLoc, isImport = this.type === types$1._import;
+ node.callee = this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true, false);
+ if (isImport && node.callee.type === "ImportExpression") {
+ this.raise(startPos, "Cannot use new with import()");
+ }
+ if (this.eat(types$1.parenL)) { node.arguments = this.parseExprList(types$1.parenR, this.options.ecmaVersion >= 8, false); }
+ else { node.arguments = empty; }
+ return this.finishNode(node, "NewExpression")
+};
+
+// Parse template expression.
+
+pp$5.parseTemplateElement = function(ref) {
+ var isTagged = ref.isTagged;
+
+ var elem = this.startNode();
+ if (this.type === types$1.invalidTemplate) {
+ if (!isTagged) {
+ this.raiseRecoverable(this.start, "Bad escape sequence in untagged template literal");
+ }
+ elem.value = {
+ raw: this.value,
+ cooked: null
+ };
+ } else {
+ elem.value = {
+ raw: this.input.slice(this.start, this.end).replace(/\r\n?/g, "\n"),
+ cooked: this.value
+ };
+ }
+ this.next();
+ elem.tail = this.type === types$1.backQuote;
+ return this.finishNode(elem, "TemplateElement")
+};
+
+pp$5.parseTemplate = function(ref) {
+ if ( ref === void 0 ) ref = {};
+ var isTagged = ref.isTagged; if ( isTagged === void 0 ) isTagged = false;
+
+ var node = this.startNode();
+ this.next();
+ node.expressions = [];
+ var curElt = this.parseTemplateElement({isTagged: isTagged});
+ node.quasis = [curElt];
+ while (!curElt.tail) {
+ if (this.type === types$1.eof) { this.raise(this.pos, "Unterminated template literal"); }
+ this.expect(types$1.dollarBraceL);
+ node.expressions.push(this.parseExpression());
+ this.expect(types$1.braceR);
+ node.quasis.push(curElt = this.parseTemplateElement({isTagged: isTagged}));
+ }
+ this.next();
+ return this.finishNode(node, "TemplateLiteral")
+};
+
+pp$5.isAsyncProp = function(prop) {
+ return !prop.computed && prop.key.type === "Identifier" && prop.key.name === "async" &&
+ (this.type === types$1.name || this.type === types$1.num || this.type === types$1.string || this.type === types$1.bracketL || this.type.keyword || (this.options.ecmaVersion >= 9 && this.type === types$1.star)) &&
+ !lineBreak.test(this.input.slice(this.lastTokEnd, this.start))
+};
+
+// Parse an object literal or binding pattern.
+
+pp$5.parseObj = function(isPattern, refDestructuringErrors) {
+ var node = this.startNode(), first = true, propHash = {};
+ node.properties = [];
+ this.next();
+ while (!this.eat(types$1.braceR)) {
+ if (!first) {
+ this.expect(types$1.comma);
+ if (this.options.ecmaVersion >= 5 && this.afterTrailingComma(types$1.braceR)) { break }
+ } else { first = false; }
+
+ var prop = this.parseProperty(isPattern, refDestructuringErrors);
+ if (!isPattern) { this.checkPropClash(prop, propHash, refDestructuringErrors); }
+ node.properties.push(prop);
+ }
+ return this.finishNode(node, isPattern ? "ObjectPattern" : "ObjectExpression")
+};
+
+pp$5.parseProperty = function(isPattern, refDestructuringErrors) {
+ var prop = this.startNode(), isGenerator, isAsync, startPos, startLoc;
+ if (this.options.ecmaVersion >= 9 && this.eat(types$1.ellipsis)) {
+ if (isPattern) {
+ prop.argument = this.parseIdent(false);
+ if (this.type === types$1.comma) {
+ this.raise(this.start, "Comma is not permitted after the rest element");
+ }
+ return this.finishNode(prop, "RestElement")
+ }
+ // To disallow parenthesized identifier via `this.toAssignable()`.
+ if (this.type === types$1.parenL && refDestructuringErrors) {
+ if (refDestructuringErrors.parenthesizedAssign < 0) {
+ refDestructuringErrors.parenthesizedAssign = this.start;
+ }
+ if (refDestructuringErrors.parenthesizedBind < 0) {
+ refDestructuringErrors.parenthesizedBind = this.start;
+ }
+ }
+ // Parse argument.
+ prop.argument = this.parseMaybeAssign(false, refDestructuringErrors);
+ // To disallow trailing comma via `this.toAssignable()`.
+ if (this.type === types$1.comma && refDestructuringErrors && refDestructuringErrors.trailingComma < 0) {
+ refDestructuringErrors.trailingComma = this.start;
+ }
+ // Finish
+ return this.finishNode(prop, "SpreadElement")
+ }
+ if (this.options.ecmaVersion >= 6) {
+ prop.method = false;
+ prop.shorthand = false;
+ if (isPattern || refDestructuringErrors) {
+ startPos = this.start;
+ startLoc = this.startLoc;
+ }
+ if (!isPattern)
+ { isGenerator = this.eat(types$1.star); }
+ }
+ var containsEsc = this.containsEsc;
+ this.parsePropertyName(prop);
+ if (!isPattern && !containsEsc && this.options.ecmaVersion >= 8 && !isGenerator && this.isAsyncProp(prop)) {
+ isAsync = true;
+ isGenerator = this.options.ecmaVersion >= 9 && this.eat(types$1.star);
+ this.parsePropertyName(prop, refDestructuringErrors);
+ } else {
+ isAsync = false;
+ }
+ this.parsePropertyValue(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc);
+ return this.finishNode(prop, "Property")
+};
+
+pp$5.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc) {
+ if ((isGenerator || isAsync) && this.type === types$1.colon)
+ { this.unexpected(); }
+
+ if (this.eat(types$1.colon)) {
+ prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors);
+ prop.kind = "init";
+ } else if (this.options.ecmaVersion >= 6 && this.type === types$1.parenL) {
+ if (isPattern) { this.unexpected(); }
+ prop.kind = "init";
+ prop.method = true;
+ prop.value = this.parseMethod(isGenerator, isAsync);
+ } else if (!isPattern && !containsEsc &&
+ this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === "Identifier" &&
+ (prop.key.name === "get" || prop.key.name === "set") &&
+ (this.type !== types$1.comma && this.type !== types$1.braceR && this.type !== types$1.eq)) {
+ if (isGenerator || isAsync) { this.unexpected(); }
+ prop.kind = prop.key.name;
+ this.parsePropertyName(prop);
+ prop.value = this.parseMethod(false);
+ var paramCount = prop.kind === "get" ? 0 : 1;
+ if (prop.value.params.length !== paramCount) {
+ var start = prop.value.start;
+ if (prop.kind === "get")
+ { this.raiseRecoverable(start, "getter should have no params"); }
+ else
+ { this.raiseRecoverable(start, "setter should have exactly one param"); }
+ } else {
+ if (prop.kind === "set" && prop.value.params[0].type === "RestElement")
+ { this.raiseRecoverable(prop.value.params[0].start, "Setter cannot use rest params"); }
+ }
+ } else if (this.options.ecmaVersion >= 6 && !prop.computed && prop.key.type === "Identifier") {
+ if (isGenerator || isAsync) { this.unexpected(); }
+ this.checkUnreserved(prop.key);
+ if (prop.key.name === "await" && !this.awaitIdentPos)
+ { this.awaitIdentPos = startPos; }
+ prop.kind = "init";
+ if (isPattern) {
+ prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key));
+ } else if (this.type === types$1.eq && refDestructuringErrors) {
+ if (refDestructuringErrors.shorthandAssign < 0)
+ { refDestructuringErrors.shorthandAssign = this.start; }
+ prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key));
+ } else {
+ prop.value = this.copyNode(prop.key);
+ }
+ prop.shorthand = true;
+ } else { this.unexpected(); }
+};
+
+pp$5.parsePropertyName = function(prop) {
+ if (this.options.ecmaVersion >= 6) {
+ if (this.eat(types$1.bracketL)) {
+ prop.computed = true;
+ prop.key = this.parseMaybeAssign();
+ this.expect(types$1.bracketR);
+ return prop.key
+ } else {
+ prop.computed = false;
+ }
+ }
+ return prop.key = this.type === types$1.num || this.type === types$1.string ? this.parseExprAtom() : this.parseIdent(this.options.allowReserved !== "never")
+};
+
+// Initialize empty function node.
+
+pp$5.initFunction = function(node) {
+ node.id = null;
+ if (this.options.ecmaVersion >= 6) { node.generator = node.expression = false; }
+ if (this.options.ecmaVersion >= 8) { node.async = false; }
+};
+
+// Parse object or class method.
+
+pp$5.parseMethod = function(isGenerator, isAsync, allowDirectSuper) {
+ var node = this.startNode(), oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;
+
+ this.initFunction(node);
+ if (this.options.ecmaVersion >= 6)
+ { node.generator = isGenerator; }
+ if (this.options.ecmaVersion >= 8)
+ { node.async = !!isAsync; }
+
+ this.yieldPos = 0;
+ this.awaitPos = 0;
+ this.awaitIdentPos = 0;
+ this.enterScope(functionFlags(isAsync, node.generator) | SCOPE_SUPER | (allowDirectSuper ? SCOPE_DIRECT_SUPER : 0));
+
+ this.expect(types$1.parenL);
+ node.params = this.parseBindingList(types$1.parenR, false, this.options.ecmaVersion >= 8);
+ this.checkYieldAwaitInDefaultParams();
+ this.parseFunctionBody(node, false, true, false);
+
+ this.yieldPos = oldYieldPos;
+ this.awaitPos = oldAwaitPos;
+ this.awaitIdentPos = oldAwaitIdentPos;
+ return this.finishNode(node, "FunctionExpression")
+};
+
+// Parse arrow function expression with given parameters.
+
+pp$5.parseArrowExpression = function(node, params, isAsync, forInit) {
+ var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;
+
+ this.enterScope(functionFlags(isAsync, false) | SCOPE_ARROW);
+ this.initFunction(node);
+ if (this.options.ecmaVersion >= 8) { node.async = !!isAsync; }
+
+ this.yieldPos = 0;
+ this.awaitPos = 0;
+ this.awaitIdentPos = 0;
+
+ node.params = this.toAssignableList(params, true);
+ this.parseFunctionBody(node, true, false, forInit);
+
+ this.yieldPos = oldYieldPos;
+ this.awaitPos = oldAwaitPos;
+ this.awaitIdentPos = oldAwaitIdentPos;
+ return this.finishNode(node, "ArrowFunctionExpression")
+};
+
+// Parse function body and check parameters.
+
+pp$5.parseFunctionBody = function(node, isArrowFunction, isMethod, forInit) {
+ var isExpression = isArrowFunction && this.type !== types$1.braceL;
+ var oldStrict = this.strict, useStrict = false;
+
+ if (isExpression) {
+ node.body = this.parseMaybeAssign(forInit);
+ node.expression = true;
+ this.checkParams(node, false);
+ } else {
+ var nonSimple = this.options.ecmaVersion >= 7 && !this.isSimpleParamList(node.params);
+ if (!oldStrict || nonSimple) {
+ useStrict = this.strictDirective(this.end);
+ // If this is a strict mode function, verify that argument names
+ // are not repeated, and it does not try to bind the words `eval`
+ // or `arguments`.
+ if (useStrict && nonSimple)
+ { this.raiseRecoverable(node.start, "Illegal 'use strict' directive in function with non-simple parameter list"); }
+ }
+ // Start a new scope with regard to labels and the `inFunction`
+ // flag (restore them to their old value afterwards).
+ var oldLabels = this.labels;
+ this.labels = [];
+ if (useStrict) { this.strict = true; }
+
+ // Add the params to varDeclaredNames to ensure that an error is thrown
+ // if a let/const declaration in the function clashes with one of the params.
+ this.checkParams(node, !oldStrict && !useStrict && !isArrowFunction && !isMethod && this.isSimpleParamList(node.params));
+ // Ensure the function name isn't a forbidden identifier in strict mode, e.g. 'eval'
+ if (this.strict && node.id) { this.checkLValSimple(node.id, BIND_OUTSIDE); }
+ node.body = this.parseBlock(false, undefined, useStrict && !oldStrict);
+ node.expression = false;
+ this.adaptDirectivePrologue(node.body.body);
+ this.labels = oldLabels;
+ }
+ this.exitScope();
+};
+
+pp$5.isSimpleParamList = function(params) {
+ for (var i = 0, list = params; i < list.length; i += 1)
+ {
+ var param = list[i];
+
+ if (param.type !== "Identifier") { return false
+ } }
+ return true
+};
+
+// Checks function params for various disallowed patterns such as using "eval"
+// or "arguments" and duplicate parameters.
+
+pp$5.checkParams = function(node, allowDuplicates) {
+ var nameHash = Object.create(null);
+ for (var i = 0, list = node.params; i < list.length; i += 1)
+ {
+ var param = list[i];
+
+ this.checkLValInnerPattern(param, BIND_VAR, allowDuplicates ? null : nameHash);
+ }
+};
+
+// Parses a comma-separated list of expressions, and returns them as
+// an array. `close` is the token type that ends the list, and
+// `allowEmpty` can be turned on to allow subsequent commas with
+// nothing in between them to be parsed as `null` (which is needed
+// for array literals).
+
+pp$5.parseExprList = function(close, allowTrailingComma, allowEmpty, refDestructuringErrors) {
+ var elts = [], first = true;
+ while (!this.eat(close)) {
+ if (!first) {
+ this.expect(types$1.comma);
+ if (allowTrailingComma && this.afterTrailingComma(close)) { break }
+ } else { first = false; }
+
+ var elt = (void 0);
+ if (allowEmpty && this.type === types$1.comma)
+ { elt = null; }
+ else if (this.type === types$1.ellipsis) {
+ elt = this.parseSpread(refDestructuringErrors);
+ if (refDestructuringErrors && this.type === types$1.comma && refDestructuringErrors.trailingComma < 0)
+ { refDestructuringErrors.trailingComma = this.start; }
+ } else {
+ elt = this.parseMaybeAssign(false, refDestructuringErrors);
+ }
+ elts.push(elt);
+ }
+ return elts
+};
+
+pp$5.checkUnreserved = function(ref) {
+ var start = ref.start;
+ var end = ref.end;
+ var name = ref.name;
+
+ if (this.inGenerator && name === "yield")
+ { this.raiseRecoverable(start, "Cannot use 'yield' as identifier inside a generator"); }
+ if (this.inAsync && name === "await")
+ { this.raiseRecoverable(start, "Cannot use 'await' as identifier inside an async function"); }
+ if (this.currentThisScope().inClassFieldInit && name === "arguments")
+ { this.raiseRecoverable(start, "Cannot use 'arguments' in class field initializer"); }
+ if (this.inClassStaticBlock && (name === "arguments" || name === "await"))
+ { this.raise(start, ("Cannot use " + name + " in class static initialization block")); }
+ if (this.keywords.test(name))
+ { this.raise(start, ("Unexpected keyword '" + name + "'")); }
+ if (this.options.ecmaVersion < 6 &&
+ this.input.slice(start, end).indexOf("\\") !== -1) { return }
+ var re = this.strict ? this.reservedWordsStrict : this.reservedWords;
+ if (re.test(name)) {
+ if (!this.inAsync && name === "await")
+ { this.raiseRecoverable(start, "Cannot use keyword 'await' outside an async function"); }
+ this.raiseRecoverable(start, ("The keyword '" + name + "' is reserved"));
+ }
+};
+
+// Parse the next token as an identifier. If `liberal` is true (used
+// when parsing properties), it will also convert keywords into
+// identifiers.
+
+pp$5.parseIdent = function(liberal, isBinding) {
+ var node = this.startNode();
+ if (this.type === types$1.name) {
+ node.name = this.value;
+ } else if (this.type.keyword) {
+ node.name = this.type.keyword;
+
+ // To fix https://github.com/acornjs/acorn/issues/575
+ // `class` and `function` keywords push new context into this.context.
+ // But there is no chance to pop the context if the keyword is consumed as an identifier such as a property name.
+ // If the previous token is a dot, this does not apply because the context-managing code already ignored the keyword
+ if ((node.name === "class" || node.name === "function") &&
+ (this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) {
+ this.context.pop();
+ }
+ } else {
+ this.unexpected();
+ }
+ this.next(!!liberal);
+ this.finishNode(node, "Identifier");
+ if (!liberal) {
+ this.checkUnreserved(node);
+ if (node.name === "await" && !this.awaitIdentPos)
+ { this.awaitIdentPos = node.start; }
+ }
+ return node
+};
+
+pp$5.parsePrivateIdent = function() {
+ var node = this.startNode();
+ if (this.type === types$1.privateId) {
+ node.name = this.value;
+ } else {
+ this.unexpected();
+ }
+ this.next();
+ this.finishNode(node, "PrivateIdentifier");
+
+ // For validating existence
+ if (this.privateNameStack.length === 0) {
+ this.raise(node.start, ("Private field '#" + (node.name) + "' must be declared in an enclosing class"));
+ } else {
+ this.privateNameStack[this.privateNameStack.length - 1].used.push(node);
+ }
+
+ return node
+};
+
+// Parses yield expression inside generator.
+
+pp$5.parseYield = function(forInit) {
+ if (!this.yieldPos) { this.yieldPos = this.start; }
+
+ var node = this.startNode();
+ this.next();
+ if (this.type === types$1.semi || this.canInsertSemicolon() || (this.type !== types$1.star && !this.type.startsExpr)) {
+ node.delegate = false;
+ node.argument = null;
+ } else {
+ node.delegate = this.eat(types$1.star);
+ node.argument = this.parseMaybeAssign(forInit);
+ }
+ return this.finishNode(node, "YieldExpression")
+};
+
+pp$5.parseAwait = function(forInit) {
+ if (!this.awaitPos) { this.awaitPos = this.start; }
+
+ var node = this.startNode();
+ this.next();
+ node.argument = this.parseMaybeUnary(null, true, false, forInit);
+ return this.finishNode(node, "AwaitExpression")
+};
+
+var pp$4 = Parser.prototype;
+
+// This function is used to raise exceptions on parse errors. It
+// takes an offset integer (into the current `input`) to indicate
+// the location of the error, attaches the position to the end
+// of the error message, and then raises a `SyntaxError` with that
+// message.
+
+pp$4.raise = function(pos, message) {
+ var loc = getLineInfo(this.input, pos);
+ message += " (" + loc.line + ":" + loc.column + ")";
+ var err = new SyntaxError(message);
+ err.pos = pos; err.loc = loc; err.raisedAt = this.pos;
+ throw err
+};
+
+pp$4.raiseRecoverable = pp$4.raise;
+
+pp$4.curPosition = function() {
+ if (this.options.locations) {
+ return new Position(this.curLine, this.pos - this.lineStart)
+ }
+};
+
+var pp$3 = Parser.prototype;
+
+var Scope = function Scope(flags) {
+ this.flags = flags;
+ // A list of var-declared names in the current lexical scope
+ this.var = [];
+ // A list of lexically-declared names in the current lexical scope
+ this.lexical = [];
+ // A list of lexically-declared FunctionDeclaration names in the current lexical scope
+ this.functions = [];
+ // A switch to disallow the identifier reference 'arguments'
+ this.inClassFieldInit = false;
+};
+
+// The functions in this module keep track of declared variables in the current scope in order to detect duplicate variable names.
+
+pp$3.enterScope = function(flags) {
+ this.scopeStack.push(new Scope(flags));
+};
+
+pp$3.exitScope = function() {
+ this.scopeStack.pop();
+};
+
+// The spec says:
+// > At the top level of a function, or script, function declarations are
+// > treated like var declarations rather than like lexical declarations.
+pp$3.treatFunctionsAsVarInScope = function(scope) {
+ return (scope.flags & SCOPE_FUNCTION) || !this.inModule && (scope.flags & SCOPE_TOP)
+};
+
+pp$3.declareName = function(name, bindingType, pos) {
+ var redeclared = false;
+ if (bindingType === BIND_LEXICAL) {
+ var scope = this.currentScope();
+ redeclared = scope.lexical.indexOf(name) > -1 || scope.functions.indexOf(name) > -1 || scope.var.indexOf(name) > -1;
+ scope.lexical.push(name);
+ if (this.inModule && (scope.flags & SCOPE_TOP))
+ { delete this.undefinedExports[name]; }
+ } else if (bindingType === BIND_SIMPLE_CATCH) {
+ var scope$1 = this.currentScope();
+ scope$1.lexical.push(name);
+ } else if (bindingType === BIND_FUNCTION) {
+ var scope$2 = this.currentScope();
+ if (this.treatFunctionsAsVar)
+ { redeclared = scope$2.lexical.indexOf(name) > -1; }
+ else
+ { redeclared = scope$2.lexical.indexOf(name) > -1 || scope$2.var.indexOf(name) > -1; }
+ scope$2.functions.push(name);
+ } else {
+ for (var i = this.scopeStack.length - 1; i >= 0; --i) {
+ var scope$3 = this.scopeStack[i];
+ if (scope$3.lexical.indexOf(name) > -1 && !((scope$3.flags & SCOPE_SIMPLE_CATCH) && scope$3.lexical[0] === name) ||
+ !this.treatFunctionsAsVarInScope(scope$3) && scope$3.functions.indexOf(name) > -1) {
+ redeclared = true;
+ break
+ }
+ scope$3.var.push(name);
+ if (this.inModule && (scope$3.flags & SCOPE_TOP))
+ { delete this.undefinedExports[name]; }
+ if (scope$3.flags & SCOPE_VAR) { break }
+ }
+ }
+ if (redeclared) { this.raiseRecoverable(pos, ("Identifier '" + name + "' has already been declared")); }
+};
+
+pp$3.checkLocalExport = function(id) {
+ // scope.functions must be empty as Module code is always strict.
+ if (this.scopeStack[0].lexical.indexOf(id.name) === -1 &&
+ this.scopeStack[0].var.indexOf(id.name) === -1) {
+ this.undefinedExports[id.name] = id;
+ }
+};
+
+pp$3.currentScope = function() {
+ return this.scopeStack[this.scopeStack.length - 1]
+};
+
+pp$3.currentVarScope = function() {
+ for (var i = this.scopeStack.length - 1;; i--) {
+ var scope = this.scopeStack[i];
+ if (scope.flags & SCOPE_VAR) { return scope }
+ }
+};
+
+// Could be useful for `this`, `new.target`, `super()`, `super.property`, and `super[property]`.
+pp$3.currentThisScope = function() {
+ for (var i = this.scopeStack.length - 1;; i--) {
+ var scope = this.scopeStack[i];
+ if (scope.flags & SCOPE_VAR && !(scope.flags & SCOPE_ARROW)) { return scope }
+ }
+};
+
+var Node = function Node(parser, pos, loc) {
+ this.type = "";
+ this.start = pos;
+ this.end = 0;
+ if (parser.options.locations)
+ { this.loc = new SourceLocation(parser, loc); }
+ if (parser.options.directSourceFile)
+ { this.sourceFile = parser.options.directSourceFile; }
+ if (parser.options.ranges)
+ { this.range = [pos, 0]; }
+};
+
+// Start an AST node, attaching a start offset.
+
+var pp$2 = Parser.prototype;
+
+pp$2.startNode = function() {
+ return new Node(this, this.start, this.startLoc)
+};
+
+pp$2.startNodeAt = function(pos, loc) {
+ return new Node(this, pos, loc)
+};
+
+// Finish an AST node, adding `type` and `end` properties.
+
+function finishNodeAt(node, type, pos, loc) {
+ node.type = type;
+ node.end = pos;
+ if (this.options.locations)
+ { node.loc.end = loc; }
+ if (this.options.ranges)
+ { node.range[1] = pos; }
+ return node
+}
+
+pp$2.finishNode = function(node, type) {
+ return finishNodeAt.call(this, node, type, this.lastTokEnd, this.lastTokEndLoc)
+};
+
+// Finish node at given position
+
+pp$2.finishNodeAt = function(node, type, pos, loc) {
+ return finishNodeAt.call(this, node, type, pos, loc)
+};
+
+pp$2.copyNode = function(node) {
+ var newNode = new Node(this, node.start, this.startLoc);
+ for (var prop in node) { newNode[prop] = node[prop]; }
+ return newNode
+};
+
+// This file contains Unicode properties extracted from the ECMAScript
+// specification. The lists are extracted like so:
+// $$('#table-binary-unicode-properties > figure > table > tbody > tr > td:nth-child(1) code').map(el => el.innerText)
+
+// #table-binary-unicode-properties
+var ecma9BinaryProperties = "ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS";
+var ecma10BinaryProperties = ecma9BinaryProperties + " Extended_Pictographic";
+var ecma11BinaryProperties = ecma10BinaryProperties;
+var ecma12BinaryProperties = ecma11BinaryProperties + " EBase EComp EMod EPres ExtPict";
+var ecma13BinaryProperties = ecma12BinaryProperties;
+var unicodeBinaryProperties = {
+ 9: ecma9BinaryProperties,
+ 10: ecma10BinaryProperties,
+ 11: ecma11BinaryProperties,
+ 12: ecma12BinaryProperties,
+ 13: ecma13BinaryProperties
+};
+
+// #table-unicode-general-category-values
+var unicodeGeneralCategoryValues = "Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu";
+
+// #table-unicode-script-values
+var ecma9ScriptValues = "Adlam Adlm Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb";
+var ecma10ScriptValues = ecma9ScriptValues + " Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd";
+var ecma11ScriptValues = ecma10ScriptValues + " Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho";
+var ecma12ScriptValues = ecma11ScriptValues + " Chorasmian Chrs Diak Dives_Akuru Khitan_Small_Script Kits Yezi Yezidi";
+var ecma13ScriptValues = ecma12ScriptValues + " Cypro_Minoan Cpmn Old_Uyghur Ougr Tangsa Tnsa Toto Vithkuqi Vith";
+var unicodeScriptValues = {
+ 9: ecma9ScriptValues,
+ 10: ecma10ScriptValues,
+ 11: ecma11ScriptValues,
+ 12: ecma12ScriptValues,
+ 13: ecma13ScriptValues
+};
+
+var data = {};
+function buildUnicodeData(ecmaVersion) {
+ var d = data[ecmaVersion] = {
+ binary: wordsRegexp(unicodeBinaryProperties[ecmaVersion] + " " + unicodeGeneralCategoryValues),
+ nonBinary: {
+ General_Category: wordsRegexp(unicodeGeneralCategoryValues),
+ Script: wordsRegexp(unicodeScriptValues[ecmaVersion])
+ }
+ };
+ d.nonBinary.Script_Extensions = d.nonBinary.Script;
+
+ d.nonBinary.gc = d.nonBinary.General_Category;
+ d.nonBinary.sc = d.nonBinary.Script;
+ d.nonBinary.scx = d.nonBinary.Script_Extensions;
+}
+
+for (var i$1 = 0, list = [9, 10, 11, 12, 13]; i$1 < list.length; i$1 += 1) {
+ var ecmaVersion = list[i$1];
+
+ buildUnicodeData(ecmaVersion);
+}
+
+var pp$1 = Parser.prototype;
+
+var RegExpValidationState = function RegExpValidationState(parser) {
+ this.parser = parser;
+ this.validFlags = "gim" + (parser.options.ecmaVersion >= 6 ? "uy" : "") + (parser.options.ecmaVersion >= 9 ? "s" : "") + (parser.options.ecmaVersion >= 13 ? "d" : "");
+ this.unicodeProperties = data[parser.options.ecmaVersion >= 13 ? 13 : parser.options.ecmaVersion];
+ this.source = "";
+ this.flags = "";
+ this.start = 0;
+ this.switchU = false;
+ this.switchN = false;
+ this.pos = 0;
+ this.lastIntValue = 0;
+ this.lastStringValue = "";
+ this.lastAssertionIsQuantifiable = false;
+ this.numCapturingParens = 0;
+ this.maxBackReference = 0;
+ this.groupNames = [];
+ this.backReferenceNames = [];
+};
+
+RegExpValidationState.prototype.reset = function reset (start, pattern, flags) {
+ var unicode = flags.indexOf("u") !== -1;
+ this.start = start | 0;
+ this.source = pattern + "";
+ this.flags = flags;
+ this.switchU = unicode && this.parser.options.ecmaVersion >= 6;
+ this.switchN = unicode && this.parser.options.ecmaVersion >= 9;
+};
+
+RegExpValidationState.prototype.raise = function raise (message) {
+ this.parser.raiseRecoverable(this.start, ("Invalid regular expression: /" + (this.source) + "/: " + message));
+};
+
+// If u flag is given, this returns the code point at the index (it combines a surrogate pair).
+// Otherwise, this returns the code unit of the index (can be a part of a surrogate pair).
+RegExpValidationState.prototype.at = function at (i, forceU) {
+ if ( forceU === void 0 ) forceU = false;
+
+ var s = this.source;
+ var l = s.length;
+ if (i >= l) {
+ return -1
+ }
+ var c = s.charCodeAt(i);
+ if (!(forceU || this.switchU) || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l) {
+ return c
+ }
+ var next = s.charCodeAt(i + 1);
+ return next >= 0xDC00 && next <= 0xDFFF ? (c << 10) + next - 0x35FDC00 : c
+};
+
+RegExpValidationState.prototype.nextIndex = function nextIndex (i, forceU) {
+ if ( forceU === void 0 ) forceU = false;
+
+ var s = this.source;
+ var l = s.length;
+ if (i >= l) {
+ return l
+ }
+ var c = s.charCodeAt(i), next;
+ if (!(forceU || this.switchU) || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l ||
+ (next = s.charCodeAt(i + 1)) < 0xDC00 || next > 0xDFFF) {
+ return i + 1
+ }
+ return i + 2
+};
+
+RegExpValidationState.prototype.current = function current (forceU) {
+ if ( forceU === void 0 ) forceU = false;
+
+ return this.at(this.pos, forceU)
+};
+
+RegExpValidationState.prototype.lookahead = function lookahead (forceU) {
+ if ( forceU === void 0 ) forceU = false;
+
+ return this.at(this.nextIndex(this.pos, forceU), forceU)
+};
+
+RegExpValidationState.prototype.advance = function advance (forceU) {
+ if ( forceU === void 0 ) forceU = false;
+
+ this.pos = this.nextIndex(this.pos, forceU);
+};
+
+RegExpValidationState.prototype.eat = function eat (ch, forceU) {
+ if ( forceU === void 0 ) forceU = false;
+
+ if (this.current(forceU) === ch) {
+ this.advance(forceU);
+ return true
+ }
+ return false
+};
+
+/**
+ * Validate the flags part of a given RegExpLiteral.
+ *
+ * @param {RegExpValidationState} state The state to validate RegExp.
+ * @returns {void}
+ */
+pp$1.validateRegExpFlags = function(state) {
+ var validFlags = state.validFlags;
+ var flags = state.flags;
+
+ for (var i = 0; i < flags.length; i++) {
+ var flag = flags.charAt(i);
+ if (validFlags.indexOf(flag) === -1) {
+ this.raise(state.start, "Invalid regular expression flag");
+ }
+ if (flags.indexOf(flag, i + 1) > -1) {
+ this.raise(state.start, "Duplicate regular expression flag");
+ }
+ }
+};
+
+/**
+ * Validate the pattern part of a given RegExpLiteral.
+ *
+ * @param {RegExpValidationState} state The state to validate RegExp.
+ * @returns {void}
+ */
+pp$1.validateRegExpPattern = function(state) {
+ this.regexp_pattern(state);
+
+ // The goal symbol for the parse is |Pattern[~U, ~N]|. If the result of
+ // parsing contains a |GroupName|, reparse with the goal symbol
+ // |Pattern[~U, +N]| and use this result instead. Throw a *SyntaxError*
+ // exception if _P_ did not conform to the grammar, if any elements of _P_
+ // were not matched by the parse, or if any Early Error conditions exist.
+ if (!state.switchN && this.options.ecmaVersion >= 9 && state.groupNames.length > 0) {
+ state.switchN = true;
+ this.regexp_pattern(state);
+ }
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-Pattern
+pp$1.regexp_pattern = function(state) {
+ state.pos = 0;
+ state.lastIntValue = 0;
+ state.lastStringValue = "";
+ state.lastAssertionIsQuantifiable = false;
+ state.numCapturingParens = 0;
+ state.maxBackReference = 0;
+ state.groupNames.length = 0;
+ state.backReferenceNames.length = 0;
+
+ this.regexp_disjunction(state);
+
+ if (state.pos !== state.source.length) {
+ // Make the same messages as V8.
+ if (state.eat(0x29 /* ) */)) {
+ state.raise("Unmatched ')'");
+ }
+ if (state.eat(0x5D /* ] */) || state.eat(0x7D /* } */)) {
+ state.raise("Lone quantifier brackets");
+ }
+ }
+ if (state.maxBackReference > state.numCapturingParens) {
+ state.raise("Invalid escape");
+ }
+ for (var i = 0, list = state.backReferenceNames; i < list.length; i += 1) {
+ var name = list[i];
+
+ if (state.groupNames.indexOf(name) === -1) {
+ state.raise("Invalid named capture referenced");
+ }
+ }
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-Disjunction
+pp$1.regexp_disjunction = function(state) {
+ this.regexp_alternative(state);
+ while (state.eat(0x7C /* | */)) {
+ this.regexp_alternative(state);
+ }
+
+ // Make the same message as V8.
+ if (this.regexp_eatQuantifier(state, true)) {
+ state.raise("Nothing to repeat");
+ }
+ if (state.eat(0x7B /* { */)) {
+ state.raise("Lone quantifier brackets");
+ }
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-Alternative
+pp$1.regexp_alternative = function(state) {
+ while (state.pos < state.source.length && this.regexp_eatTerm(state))
+ { }
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Term
+pp$1.regexp_eatTerm = function(state) {
+ if (this.regexp_eatAssertion(state)) {
+ // Handle `QuantifiableAssertion Quantifier` alternative.
+ // `state.lastAssertionIsQuantifiable` is true if the last eaten Assertion
+ // is a QuantifiableAssertion.
+ if (state.lastAssertionIsQuantifiable && this.regexp_eatQuantifier(state)) {
+ // Make the same message as V8.
+ if (state.switchU) {
+ state.raise("Invalid quantifier");
+ }
+ }
+ return true
+ }
+
+ if (state.switchU ? this.regexp_eatAtom(state) : this.regexp_eatExtendedAtom(state)) {
+ this.regexp_eatQuantifier(state);
+ return true
+ }
+
+ return false
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Assertion
+pp$1.regexp_eatAssertion = function(state) {
+ var start = state.pos;
+ state.lastAssertionIsQuantifiable = false;
+
+ // ^, $
+ if (state.eat(0x5E /* ^ */) || state.eat(0x24 /* $ */)) {
+ return true
+ }
+
+ // \b \B
+ if (state.eat(0x5C /* \ */)) {
+ if (state.eat(0x42 /* B */) || state.eat(0x62 /* b */)) {
+ return true
+ }
+ state.pos = start;
+ }
+
+ // Lookahead / Lookbehind
+ if (state.eat(0x28 /* ( */) && state.eat(0x3F /* ? */)) {
+ var lookbehind = false;
+ if (this.options.ecmaVersion >= 9) {
+ lookbehind = state.eat(0x3C /* < */);
+ }
+ if (state.eat(0x3D /* = */) || state.eat(0x21 /* ! */)) {
+ this.regexp_disjunction(state);
+ if (!state.eat(0x29 /* ) */)) {
+ state.raise("Unterminated group");
+ }
+ state.lastAssertionIsQuantifiable = !lookbehind;
+ return true
+ }
+ }
+
+ state.pos = start;
+ return false
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-Quantifier
+pp$1.regexp_eatQuantifier = function(state, noError) {
+ if ( noError === void 0 ) noError = false;
+
+ if (this.regexp_eatQuantifierPrefix(state, noError)) {
+ state.eat(0x3F /* ? */);
+ return true
+ }
+ return false
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-QuantifierPrefix
+pp$1.regexp_eatQuantifierPrefix = function(state, noError) {
+ return (
+ state.eat(0x2A /* * */) ||
+ state.eat(0x2B /* + */) ||
+ state.eat(0x3F /* ? */) ||
+ this.regexp_eatBracedQuantifier(state, noError)
+ )
+};
+pp$1.regexp_eatBracedQuantifier = function(state, noError) {
+ var start = state.pos;
+ if (state.eat(0x7B /* { */)) {
+ var min = 0, max = -1;
+ if (this.regexp_eatDecimalDigits(state)) {
+ min = state.lastIntValue;
+ if (state.eat(0x2C /* , */) && this.regexp_eatDecimalDigits(state)) {
+ max = state.lastIntValue;
+ }
+ if (state.eat(0x7D /* } */)) {
+ // SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-term
+ if (max !== -1 && max < min && !noError) {
+ state.raise("numbers out of order in {} quantifier");
+ }
+ return true
+ }
+ }
+ if (state.switchU && !noError) {
+ state.raise("Incomplete quantifier");
+ }
+ state.pos = start;
+ }
+ return false
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-Atom
+pp$1.regexp_eatAtom = function(state) {
+ return (
+ this.regexp_eatPatternCharacters(state) ||
+ state.eat(0x2E /* . */) ||
+ this.regexp_eatReverseSolidusAtomEscape(state) ||
+ this.regexp_eatCharacterClass(state) ||
+ this.regexp_eatUncapturingGroup(state) ||
+ this.regexp_eatCapturingGroup(state)
+ )
+};
+pp$1.regexp_eatReverseSolidusAtomEscape = function(state) {
+ var start = state.pos;
+ if (state.eat(0x5C /* \ */)) {
+ if (this.regexp_eatAtomEscape(state)) {
+ return true
+ }
+ state.pos = start;
+ }
+ return false
+};
+pp$1.regexp_eatUncapturingGroup = function(state) {
+ var start = state.pos;
+ if (state.eat(0x28 /* ( */)) {
+ if (state.eat(0x3F /* ? */) && state.eat(0x3A /* : */)) {
+ this.regexp_disjunction(state);
+ if (state.eat(0x29 /* ) */)) {
+ return true
+ }
+ state.raise("Unterminated group");
+ }
+ state.pos = start;
+ }
+ return false
+};
+pp$1.regexp_eatCapturingGroup = function(state) {
+ if (state.eat(0x28 /* ( */)) {
+ if (this.options.ecmaVersion >= 9) {
+ this.regexp_groupSpecifier(state);
+ } else if (state.current() === 0x3F /* ? */) {
+ state.raise("Invalid group");
+ }
+ this.regexp_disjunction(state);
+ if (state.eat(0x29 /* ) */)) {
+ state.numCapturingParens += 1;
+ return true
+ }
+ state.raise("Unterminated group");
+ }
+ return false
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedAtom
+pp$1.regexp_eatExtendedAtom = function(state) {
+ return (
+ state.eat(0x2E /* . */) ||
+ this.regexp_eatReverseSolidusAtomEscape(state) ||
+ this.regexp_eatCharacterClass(state) ||
+ this.regexp_eatUncapturingGroup(state) ||
+ this.regexp_eatCapturingGroup(state) ||
+ this.regexp_eatInvalidBracedQuantifier(state) ||
+ this.regexp_eatExtendedPatternCharacter(state)
+ )
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-InvalidBracedQuantifier
+pp$1.regexp_eatInvalidBracedQuantifier = function(state) {
+ if (this.regexp_eatBracedQuantifier(state, true)) {
+ state.raise("Nothing to repeat");
+ }
+ return false
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-SyntaxCharacter
+pp$1.regexp_eatSyntaxCharacter = function(state) {
+ var ch = state.current();
+ if (isSyntaxCharacter(ch)) {
+ state.lastIntValue = ch;
+ state.advance();
+ return true
+ }
+ return false
+};
+function isSyntaxCharacter(ch) {
+ return (
+ ch === 0x24 /* $ */ ||
+ ch >= 0x28 /* ( */ && ch <= 0x2B /* + */ ||
+ ch === 0x2E /* . */ ||
+ ch === 0x3F /* ? */ ||
+ ch >= 0x5B /* [ */ && ch <= 0x5E /* ^ */ ||
+ ch >= 0x7B /* { */ && ch <= 0x7D /* } */
+ )
+}
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-PatternCharacter
+// But eat eager.
+pp$1.regexp_eatPatternCharacters = function(state) {
+ var start = state.pos;
+ var ch = 0;
+ while ((ch = state.current()) !== -1 && !isSyntaxCharacter(ch)) {
+ state.advance();
+ }
+ return state.pos !== start
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedPatternCharacter
+pp$1.regexp_eatExtendedPatternCharacter = function(state) {
+ var ch = state.current();
+ if (
+ ch !== -1 &&
+ ch !== 0x24 /* $ */ &&
+ !(ch >= 0x28 /* ( */ && ch <= 0x2B /* + */) &&
+ ch !== 0x2E /* . */ &&
+ ch !== 0x3F /* ? */ &&
+ ch !== 0x5B /* [ */ &&
+ ch !== 0x5E /* ^ */ &&
+ ch !== 0x7C /* | */
+ ) {
+ state.advance();
+ return true
+ }
+ return false
+};
+
+// GroupSpecifier ::
+// [empty]
+// `?` GroupName
+pp$1.regexp_groupSpecifier = function(state) {
+ if (state.eat(0x3F /* ? */)) {
+ if (this.regexp_eatGroupName(state)) {
+ if (state.groupNames.indexOf(state.lastStringValue) !== -1) {
+ state.raise("Duplicate capture group name");
+ }
+ state.groupNames.push(state.lastStringValue);
+ return
+ }
+ state.raise("Invalid group");
+ }
+};
+
+// GroupName ::
+// `<` RegExpIdentifierName `>`
+// Note: this updates `state.lastStringValue` property with the eaten name.
+pp$1.regexp_eatGroupName = function(state) {
+ state.lastStringValue = "";
+ if (state.eat(0x3C /* < */)) {
+ if (this.regexp_eatRegExpIdentifierName(state) && state.eat(0x3E /* > */)) {
+ return true
+ }
+ state.raise("Invalid capture group name");
+ }
+ return false
+};
+
+// RegExpIdentifierName ::
+// RegExpIdentifierStart
+// RegExpIdentifierName RegExpIdentifierPart
+// Note: this updates `state.lastStringValue` property with the eaten name.
+pp$1.regexp_eatRegExpIdentifierName = function(state) {
+ state.lastStringValue = "";
+ if (this.regexp_eatRegExpIdentifierStart(state)) {
+ state.lastStringValue += codePointToString(state.lastIntValue);
+ while (this.regexp_eatRegExpIdentifierPart(state)) {
+ state.lastStringValue += codePointToString(state.lastIntValue);
+ }
+ return true
+ }
+ return false
+};
+
+// RegExpIdentifierStart ::
+// UnicodeIDStart
+// `$`
+// `_`
+// `\` RegExpUnicodeEscapeSequence[+U]
+pp$1.regexp_eatRegExpIdentifierStart = function(state) {
+ var start = state.pos;
+ var forceU = this.options.ecmaVersion >= 11;
+ var ch = state.current(forceU);
+ state.advance(forceU);
+
+ if (ch === 0x5C /* \ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) {
+ ch = state.lastIntValue;
+ }
+ if (isRegExpIdentifierStart(ch)) {
+ state.lastIntValue = ch;
+ return true
+ }
+
+ state.pos = start;
+ return false
+};
+function isRegExpIdentifierStart(ch) {
+ return isIdentifierStart(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */
+}
+
+// RegExpIdentifierPart ::
+// UnicodeIDContinue
+// `$`
+// `_`
+// `\` RegExpUnicodeEscapeSequence[+U]
+//
+//
+pp$1.regexp_eatRegExpIdentifierPart = function(state) {
+ var start = state.pos;
+ var forceU = this.options.ecmaVersion >= 11;
+ var ch = state.current(forceU);
+ state.advance(forceU);
+
+ if (ch === 0x5C /* \ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) {
+ ch = state.lastIntValue;
+ }
+ if (isRegExpIdentifierPart(ch)) {
+ state.lastIntValue = ch;
+ return true
+ }
+
+ state.pos = start;
+ return false
+};
+function isRegExpIdentifierPart(ch) {
+ return isIdentifierChar(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */ || ch === 0x200C /* */ || ch === 0x200D /* */
+}
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-AtomEscape
+pp$1.regexp_eatAtomEscape = function(state) {
+ if (
+ this.regexp_eatBackReference(state) ||
+ this.regexp_eatCharacterClassEscape(state) ||
+ this.regexp_eatCharacterEscape(state) ||
+ (state.switchN && this.regexp_eatKGroupName(state))
+ ) {
+ return true
+ }
+ if (state.switchU) {
+ // Make the same message as V8.
+ if (state.current() === 0x63 /* c */) {
+ state.raise("Invalid unicode escape");
+ }
+ state.raise("Invalid escape");
+ }
+ return false
+};
+pp$1.regexp_eatBackReference = function(state) {
+ var start = state.pos;
+ if (this.regexp_eatDecimalEscape(state)) {
+ var n = state.lastIntValue;
+ if (state.switchU) {
+ // For SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-atomescape
+ if (n > state.maxBackReference) {
+ state.maxBackReference = n;
+ }
+ return true
+ }
+ if (n <= state.numCapturingParens) {
+ return true
+ }
+ state.pos = start;
+ }
+ return false
+};
+pp$1.regexp_eatKGroupName = function(state) {
+ if (state.eat(0x6B /* k */)) {
+ if (this.regexp_eatGroupName(state)) {
+ state.backReferenceNames.push(state.lastStringValue);
+ return true
+ }
+ state.raise("Invalid named reference");
+ }
+ return false
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-CharacterEscape
+pp$1.regexp_eatCharacterEscape = function(state) {
+ return (
+ this.regexp_eatControlEscape(state) ||
+ this.regexp_eatCControlLetter(state) ||
+ this.regexp_eatZero(state) ||
+ this.regexp_eatHexEscapeSequence(state) ||
+ this.regexp_eatRegExpUnicodeEscapeSequence(state, false) ||
+ (!state.switchU && this.regexp_eatLegacyOctalEscapeSequence(state)) ||
+ this.regexp_eatIdentityEscape(state)
+ )
+};
+pp$1.regexp_eatCControlLetter = function(state) {
+ var start = state.pos;
+ if (state.eat(0x63 /* c */)) {
+ if (this.regexp_eatControlLetter(state)) {
+ return true
+ }
+ state.pos = start;
+ }
+ return false
+};
+pp$1.regexp_eatZero = function(state) {
+ if (state.current() === 0x30 /* 0 */ && !isDecimalDigit(state.lookahead())) {
+ state.lastIntValue = 0;
+ state.advance();
+ return true
+ }
+ return false
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-ControlEscape
+pp$1.regexp_eatControlEscape = function(state) {
+ var ch = state.current();
+ if (ch === 0x74 /* t */) {
+ state.lastIntValue = 0x09; /* \t */
+ state.advance();
+ return true
+ }
+ if (ch === 0x6E /* n */) {
+ state.lastIntValue = 0x0A; /* \n */
+ state.advance();
+ return true
+ }
+ if (ch === 0x76 /* v */) {
+ state.lastIntValue = 0x0B; /* \v */
+ state.advance();
+ return true
+ }
+ if (ch === 0x66 /* f */) {
+ state.lastIntValue = 0x0C; /* \f */
+ state.advance();
+ return true
+ }
+ if (ch === 0x72 /* r */) {
+ state.lastIntValue = 0x0D; /* \r */
+ state.advance();
+ return true
+ }
+ return false
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-ControlLetter
+pp$1.regexp_eatControlLetter = function(state) {
+ var ch = state.current();
+ if (isControlLetter(ch)) {
+ state.lastIntValue = ch % 0x20;
+ state.advance();
+ return true
+ }
+ return false
+};
+function isControlLetter(ch) {
+ return (
+ (ch >= 0x41 /* A */ && ch <= 0x5A /* Z */) ||
+ (ch >= 0x61 /* a */ && ch <= 0x7A /* z */)
+ )
+}
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-RegExpUnicodeEscapeSequence
+pp$1.regexp_eatRegExpUnicodeEscapeSequence = function(state, forceU) {
+ if ( forceU === void 0 ) forceU = false;
+
+ var start = state.pos;
+ var switchU = forceU || state.switchU;
+
+ if (state.eat(0x75 /* u */)) {
+ if (this.regexp_eatFixedHexDigits(state, 4)) {
+ var lead = state.lastIntValue;
+ if (switchU && lead >= 0xD800 && lead <= 0xDBFF) {
+ var leadSurrogateEnd = state.pos;
+ if (state.eat(0x5C /* \ */) && state.eat(0x75 /* u */) && this.regexp_eatFixedHexDigits(state, 4)) {
+ var trail = state.lastIntValue;
+ if (trail >= 0xDC00 && trail <= 0xDFFF) {
+ state.lastIntValue = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
+ return true
+ }
+ }
+ state.pos = leadSurrogateEnd;
+ state.lastIntValue = lead;
+ }
+ return true
+ }
+ if (
+ switchU &&
+ state.eat(0x7B /* { */) &&
+ this.regexp_eatHexDigits(state) &&
+ state.eat(0x7D /* } */) &&
+ isValidUnicode(state.lastIntValue)
+ ) {
+ return true
+ }
+ if (switchU) {
+ state.raise("Invalid unicode escape");
+ }
+ state.pos = start;
+ }
+
+ return false
+};
+function isValidUnicode(ch) {
+ return ch >= 0 && ch <= 0x10FFFF
+}
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-IdentityEscape
+pp$1.regexp_eatIdentityEscape = function(state) {
+ if (state.switchU) {
+ if (this.regexp_eatSyntaxCharacter(state)) {
+ return true
+ }
+ if (state.eat(0x2F /* / */)) {
+ state.lastIntValue = 0x2F; /* / */
+ return true
+ }
+ return false
+ }
+
+ var ch = state.current();
+ if (ch !== 0x63 /* c */ && (!state.switchN || ch !== 0x6B /* k */)) {
+ state.lastIntValue = ch;
+ state.advance();
+ return true
+ }
+
+ return false
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalEscape
+pp$1.regexp_eatDecimalEscape = function(state) {
+ state.lastIntValue = 0;
+ var ch = state.current();
+ if (ch >= 0x31 /* 1 */ && ch <= 0x39 /* 9 */) {
+ do {
+ state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */);
+ state.advance();
+ } while ((ch = state.current()) >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */)
+ return true
+ }
+ return false
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClassEscape
+pp$1.regexp_eatCharacterClassEscape = function(state) {
+ var ch = state.current();
+
+ if (isCharacterClassEscape(ch)) {
+ state.lastIntValue = -1;
+ state.advance();
+ return true
+ }
+
+ if (
+ state.switchU &&
+ this.options.ecmaVersion >= 9 &&
+ (ch === 0x50 /* P */ || ch === 0x70 /* p */)
+ ) {
+ state.lastIntValue = -1;
+ state.advance();
+ if (
+ state.eat(0x7B /* { */) &&
+ this.regexp_eatUnicodePropertyValueExpression(state) &&
+ state.eat(0x7D /* } */)
+ ) {
+ return true
+ }
+ state.raise("Invalid property name");
+ }
+
+ return false
+};
+function isCharacterClassEscape(ch) {
+ return (
+ ch === 0x64 /* d */ ||
+ ch === 0x44 /* D */ ||
+ ch === 0x73 /* s */ ||
+ ch === 0x53 /* S */ ||
+ ch === 0x77 /* w */ ||
+ ch === 0x57 /* W */
+ )
+}
+
+// UnicodePropertyValueExpression ::
+// UnicodePropertyName `=` UnicodePropertyValue
+// LoneUnicodePropertyNameOrValue
+pp$1.regexp_eatUnicodePropertyValueExpression = function(state) {
+ var start = state.pos;
+
+ // UnicodePropertyName `=` UnicodePropertyValue
+ if (this.regexp_eatUnicodePropertyName(state) && state.eat(0x3D /* = */)) {
+ var name = state.lastStringValue;
+ if (this.regexp_eatUnicodePropertyValue(state)) {
+ var value = state.lastStringValue;
+ this.regexp_validateUnicodePropertyNameAndValue(state, name, value);
+ return true
+ }
+ }
+ state.pos = start;
+
+ // LoneUnicodePropertyNameOrValue
+ if (this.regexp_eatLoneUnicodePropertyNameOrValue(state)) {
+ var nameOrValue = state.lastStringValue;
+ this.regexp_validateUnicodePropertyNameOrValue(state, nameOrValue);
+ return true
+ }
+ return false
+};
+pp$1.regexp_validateUnicodePropertyNameAndValue = function(state, name, value) {
+ if (!hasOwn(state.unicodeProperties.nonBinary, name))
+ { state.raise("Invalid property name"); }
+ if (!state.unicodeProperties.nonBinary[name].test(value))
+ { state.raise("Invalid property value"); }
+};
+pp$1.regexp_validateUnicodePropertyNameOrValue = function(state, nameOrValue) {
+ if (!state.unicodeProperties.binary.test(nameOrValue))
+ { state.raise("Invalid property name"); }
+};
+
+// UnicodePropertyName ::
+// UnicodePropertyNameCharacters
+pp$1.regexp_eatUnicodePropertyName = function(state) {
+ var ch = 0;
+ state.lastStringValue = "";
+ while (isUnicodePropertyNameCharacter(ch = state.current())) {
+ state.lastStringValue += codePointToString(ch);
+ state.advance();
+ }
+ return state.lastStringValue !== ""
+};
+function isUnicodePropertyNameCharacter(ch) {
+ return isControlLetter(ch) || ch === 0x5F /* _ */
+}
+
+// UnicodePropertyValue ::
+// UnicodePropertyValueCharacters
+pp$1.regexp_eatUnicodePropertyValue = function(state) {
+ var ch = 0;
+ state.lastStringValue = "";
+ while (isUnicodePropertyValueCharacter(ch = state.current())) {
+ state.lastStringValue += codePointToString(ch);
+ state.advance();
+ }
+ return state.lastStringValue !== ""
+};
+function isUnicodePropertyValueCharacter(ch) {
+ return isUnicodePropertyNameCharacter(ch) || isDecimalDigit(ch)
+}
+
+// LoneUnicodePropertyNameOrValue ::
+// UnicodePropertyValueCharacters
+pp$1.regexp_eatLoneUnicodePropertyNameOrValue = function(state) {
+ return this.regexp_eatUnicodePropertyValue(state)
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClass
+pp$1.regexp_eatCharacterClass = function(state) {
+ if (state.eat(0x5B /* [ */)) {
+ state.eat(0x5E /* ^ */);
+ this.regexp_classRanges(state);
+ if (state.eat(0x5D /* ] */)) {
+ return true
+ }
+ // Unreachable since it threw "unterminated regular expression" error before.
+ state.raise("Unterminated character class");
+ }
+ return false
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-ClassRanges
+// https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRanges
+// https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRangesNoDash
+pp$1.regexp_classRanges = function(state) {
+ while (this.regexp_eatClassAtom(state)) {
+ var left = state.lastIntValue;
+ if (state.eat(0x2D /* - */) && this.regexp_eatClassAtom(state)) {
+ var right = state.lastIntValue;
+ if (state.switchU && (left === -1 || right === -1)) {
+ state.raise("Invalid character class");
+ }
+ if (left !== -1 && right !== -1 && left > right) {
+ state.raise("Range out of order in character class");
+ }
+ }
+ }
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtom
+// https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtomNoDash
+pp$1.regexp_eatClassAtom = function(state) {
+ var start = state.pos;
+
+ if (state.eat(0x5C /* \ */)) {
+ if (this.regexp_eatClassEscape(state)) {
+ return true
+ }
+ if (state.switchU) {
+ // Make the same message as V8.
+ var ch$1 = state.current();
+ if (ch$1 === 0x63 /* c */ || isOctalDigit(ch$1)) {
+ state.raise("Invalid class escape");
+ }
+ state.raise("Invalid escape");
+ }
+ state.pos = start;
+ }
+
+ var ch = state.current();
+ if (ch !== 0x5D /* ] */) {
+ state.lastIntValue = ch;
+ state.advance();
+ return true
+ }
+
+ return false
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassEscape
+pp$1.regexp_eatClassEscape = function(state) {
+ var start = state.pos;
+
+ if (state.eat(0x62 /* b */)) {
+ state.lastIntValue = 0x08; /* */
+ return true
+ }
+
+ if (state.switchU && state.eat(0x2D /* - */)) {
+ state.lastIntValue = 0x2D; /* - */
+ return true
+ }
+
+ if (!state.switchU && state.eat(0x63 /* c */)) {
+ if (this.regexp_eatClassControlLetter(state)) {
+ return true
+ }
+ state.pos = start;
+ }
+
+ return (
+ this.regexp_eatCharacterClassEscape(state) ||
+ this.regexp_eatCharacterEscape(state)
+ )
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassControlLetter
+pp$1.regexp_eatClassControlLetter = function(state) {
+ var ch = state.current();
+ if (isDecimalDigit(ch) || ch === 0x5F /* _ */) {
+ state.lastIntValue = ch % 0x20;
+ state.advance();
+ return true
+ }
+ return false
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence
+pp$1.regexp_eatHexEscapeSequence = function(state) {
+ var start = state.pos;
+ if (state.eat(0x78 /* x */)) {
+ if (this.regexp_eatFixedHexDigits(state, 2)) {
+ return true
+ }
+ if (state.switchU) {
+ state.raise("Invalid escape");
+ }
+ state.pos = start;
+ }
+ return false
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalDigits
+pp$1.regexp_eatDecimalDigits = function(state) {
+ var start = state.pos;
+ var ch = 0;
+ state.lastIntValue = 0;
+ while (isDecimalDigit(ch = state.current())) {
+ state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */);
+ state.advance();
+ }
+ return state.pos !== start
+};
+function isDecimalDigit(ch) {
+ return ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */
+}
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigits
+pp$1.regexp_eatHexDigits = function(state) {
+ var start = state.pos;
+ var ch = 0;
+ state.lastIntValue = 0;
+ while (isHexDigit(ch = state.current())) {
+ state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch);
+ state.advance();
+ }
+ return state.pos !== start
+};
+function isHexDigit(ch) {
+ return (
+ (ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */) ||
+ (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) ||
+ (ch >= 0x61 /* a */ && ch <= 0x66 /* f */)
+ )
+}
+function hexToInt(ch) {
+ if (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) {
+ return 10 + (ch - 0x41 /* A */)
+ }
+ if (ch >= 0x61 /* a */ && ch <= 0x66 /* f */) {
+ return 10 + (ch - 0x61 /* a */)
+ }
+ return ch - 0x30 /* 0 */
+}
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-LegacyOctalEscapeSequence
+// Allows only 0-377(octal) i.e. 0-255(decimal).
+pp$1.regexp_eatLegacyOctalEscapeSequence = function(state) {
+ if (this.regexp_eatOctalDigit(state)) {
+ var n1 = state.lastIntValue;
+ if (this.regexp_eatOctalDigit(state)) {
+ var n2 = state.lastIntValue;
+ if (n1 <= 3 && this.regexp_eatOctalDigit(state)) {
+ state.lastIntValue = n1 * 64 + n2 * 8 + state.lastIntValue;
+ } else {
+ state.lastIntValue = n1 * 8 + n2;
+ }
+ } else {
+ state.lastIntValue = n1;
+ }
+ return true
+ }
+ return false
+};
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-OctalDigit
+pp$1.regexp_eatOctalDigit = function(state) {
+ var ch = state.current();
+ if (isOctalDigit(ch)) {
+ state.lastIntValue = ch - 0x30; /* 0 */
+ state.advance();
+ return true
+ }
+ state.lastIntValue = 0;
+ return false
+};
+function isOctalDigit(ch) {
+ return ch >= 0x30 /* 0 */ && ch <= 0x37 /* 7 */
+}
+
+// https://www.ecma-international.org/ecma-262/8.0/#prod-Hex4Digits
+// https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigit
+// And HexDigit HexDigit in https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence
+pp$1.regexp_eatFixedHexDigits = function(state, length) {
+ var start = state.pos;
+ state.lastIntValue = 0;
+ for (var i = 0; i < length; ++i) {
+ var ch = state.current();
+ if (!isHexDigit(ch)) {
+ state.pos = start;
+ return false
+ }
+ state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch);
+ state.advance();
+ }
+ return true
+};
+
+// Object type used to represent tokens. Note that normally, tokens
+// simply exist as properties on the parser object. This is only
+// used for the onToken callback and the external tokenizer.
+
+var Token = function Token(p) {
+ this.type = p.type;
+ this.value = p.value;
+ this.start = p.start;
+ this.end = p.end;
+ if (p.options.locations)
+ { this.loc = new SourceLocation(p, p.startLoc, p.endLoc); }
+ if (p.options.ranges)
+ { this.range = [p.start, p.end]; }
+};
+
+// ## Tokenizer
+
+var pp = Parser.prototype;
+
+// Move to the next token
+
+pp.next = function(ignoreEscapeSequenceInKeyword) {
+ if (!ignoreEscapeSequenceInKeyword && this.type.keyword && this.containsEsc)
+ { this.raiseRecoverable(this.start, "Escape sequence in keyword " + this.type.keyword); }
+ if (this.options.onToken)
+ { this.options.onToken(new Token(this)); }
+
+ this.lastTokEnd = this.end;
+ this.lastTokStart = this.start;
+ this.lastTokEndLoc = this.endLoc;
+ this.lastTokStartLoc = this.startLoc;
+ this.nextToken();
+};
+
+pp.getToken = function() {
+ this.next();
+ return new Token(this)
+};
+
+// If we're in an ES6 environment, make parsers iterable
+if (typeof Symbol !== "undefined")
+ { pp[Symbol.iterator] = function() {
+ var this$1$1 = this;
+
+ return {
+ next: function () {
+ var token = this$1$1.getToken();
+ return {
+ done: token.type === types$1.eof,
+ value: token
+ }
+ }
+ }
+ }; }
+
+// Toggle strict mode. Re-reads the next number or string to please
+// pedantic tests (`"use strict"; 010;` should fail).
+
+// Read a single token, updating the parser object's token-related
+// properties.
+
+pp.nextToken = function() {
+ var curContext = this.curContext();
+ if (!curContext || !curContext.preserveSpace) { this.skipSpace(); }
+
+ this.start = this.pos;
+ if (this.options.locations) { this.startLoc = this.curPosition(); }
+ if (this.pos >= this.input.length) { return this.finishToken(types$1.eof) }
+
+ if (curContext.override) { return curContext.override(this) }
+ else { this.readToken(this.fullCharCodeAtPos()); }
+};
+
+pp.readToken = function(code) {
+ // Identifier or keyword. '\uXXXX' sequences are allowed in
+ // identifiers, so '\' also dispatches to that.
+ if (isIdentifierStart(code, this.options.ecmaVersion >= 6) || code === 92 /* '\' */)
+ { return this.readWord() }
+
+ return this.getTokenFromCode(code)
+};
+
+pp.fullCharCodeAtPos = function() {
+ var code = this.input.charCodeAt(this.pos);
+ if (code <= 0xd7ff || code >= 0xdc00) { return code }
+ var next = this.input.charCodeAt(this.pos + 1);
+ return next <= 0xdbff || next >= 0xe000 ? code : (code << 10) + next - 0x35fdc00
+};
+
+pp.skipBlockComment = function() {
+ var startLoc = this.options.onComment && this.curPosition();
+ var start = this.pos, end = this.input.indexOf("*/", this.pos += 2);
+ if (end === -1) { this.raise(this.pos - 2, "Unterminated comment"); }
+ this.pos = end + 2;
+ if (this.options.locations) {
+ for (var nextBreak = (void 0), pos = start; (nextBreak = nextLineBreak(this.input, pos, this.pos)) > -1;) {
+ ++this.curLine;
+ pos = this.lineStart = nextBreak;
+ }
+ }
+ if (this.options.onComment)
+ { this.options.onComment(true, this.input.slice(start + 2, end), start, this.pos,
+ startLoc, this.curPosition()); }
+};
+
+pp.skipLineComment = function(startSkip) {
+ var start = this.pos;
+ var startLoc = this.options.onComment && this.curPosition();
+ var ch = this.input.charCodeAt(this.pos += startSkip);
+ while (this.pos < this.input.length && !isNewLine(ch)) {
+ ch = this.input.charCodeAt(++this.pos);
+ }
+ if (this.options.onComment)
+ { this.options.onComment(false, this.input.slice(start + startSkip, this.pos), start, this.pos,
+ startLoc, this.curPosition()); }
+};
+
+// Called at the start of the parse and after every token. Skips
+// whitespace and comments, and.
+
+pp.skipSpace = function() {
+ loop: while (this.pos < this.input.length) {
+ var ch = this.input.charCodeAt(this.pos);
+ switch (ch) {
+ case 32: case 160: // ' '
+ ++this.pos;
+ break
+ case 13:
+ if (this.input.charCodeAt(this.pos + 1) === 10) {
+ ++this.pos;
+ }
+ case 10: case 8232: case 8233:
+ ++this.pos;
+ if (this.options.locations) {
+ ++this.curLine;
+ this.lineStart = this.pos;
+ }
+ break
+ case 47: // '/'
+ switch (this.input.charCodeAt(this.pos + 1)) {
+ case 42: // '*'
+ this.skipBlockComment();
+ break
+ case 47:
+ this.skipLineComment(2);
+ break
+ default:
+ break loop
+ }
+ break
+ default:
+ if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) {
+ ++this.pos;
+ } else {
+ break loop
+ }
+ }
+ }
+};
+
+// Called at the end of every token. Sets `end`, `val`, and
+// maintains `context` and `exprAllowed`, and skips the space after
+// the token, so that the next one's `start` will point at the
+// right position.
+
+pp.finishToken = function(type, val) {
+ this.end = this.pos;
+ if (this.options.locations) { this.endLoc = this.curPosition(); }
+ var prevType = this.type;
+ this.type = type;
+ this.value = val;
+
+ this.updateContext(prevType);
+};
+
+// ### Token reading
+
+// This is the function that is called to fetch the next token. It
+// is somewhat obscure, because it works in character codes rather
+// than characters, and because operator parsing has been inlined
+// into it.
+//
+// All in the name of speed.
+//
+pp.readToken_dot = function() {
+ var next = this.input.charCodeAt(this.pos + 1);
+ if (next >= 48 && next <= 57) { return this.readNumber(true) }
+ var next2 = this.input.charCodeAt(this.pos + 2);
+ if (this.options.ecmaVersion >= 6 && next === 46 && next2 === 46) { // 46 = dot '.'
+ this.pos += 3;
+ return this.finishToken(types$1.ellipsis)
+ } else {
+ ++this.pos;
+ return this.finishToken(types$1.dot)
+ }
+};
+
+pp.readToken_slash = function() { // '/'
+ var next = this.input.charCodeAt(this.pos + 1);
+ if (this.exprAllowed) { ++this.pos; return this.readRegexp() }
+ if (next === 61) { return this.finishOp(types$1.assign, 2) }
+ return this.finishOp(types$1.slash, 1)
+};
+
+pp.readToken_mult_modulo_exp = function(code) { // '%*'
+ var next = this.input.charCodeAt(this.pos + 1);
+ var size = 1;
+ var tokentype = code === 42 ? types$1.star : types$1.modulo;
+
+ // exponentiation operator ** and **=
+ if (this.options.ecmaVersion >= 7 && code === 42 && next === 42) {
+ ++size;
+ tokentype = types$1.starstar;
+ next = this.input.charCodeAt(this.pos + 2);
+ }
+
+ if (next === 61) { return this.finishOp(types$1.assign, size + 1) }
+ return this.finishOp(tokentype, size)
+};
+
+pp.readToken_pipe_amp = function(code) { // '|&'
+ var next = this.input.charCodeAt(this.pos + 1);
+ if (next === code) {
+ if (this.options.ecmaVersion >= 12) {
+ var next2 = this.input.charCodeAt(this.pos + 2);
+ if (next2 === 61) { return this.finishOp(types$1.assign, 3) }
+ }
+ return this.finishOp(code === 124 ? types$1.logicalOR : types$1.logicalAND, 2)
+ }
+ if (next === 61) { return this.finishOp(types$1.assign, 2) }
+ return this.finishOp(code === 124 ? types$1.bitwiseOR : types$1.bitwiseAND, 1)
+};
+
+pp.readToken_caret = function() { // '^'
+ var next = this.input.charCodeAt(this.pos + 1);
+ if (next === 61) { return this.finishOp(types$1.assign, 2) }
+ return this.finishOp(types$1.bitwiseXOR, 1)
+};
+
+pp.readToken_plus_min = function(code) { // '+-'
+ var next = this.input.charCodeAt(this.pos + 1);
+ if (next === code) {
+ if (next === 45 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 62 &&
+ (this.lastTokEnd === 0 || lineBreak.test(this.input.slice(this.lastTokEnd, this.pos)))) {
+ // A `-->` line comment
+ this.skipLineComment(3);
+ this.skipSpace();
+ return this.nextToken()
+ }
+ return this.finishOp(types$1.incDec, 2)
+ }
+ if (next === 61) { return this.finishOp(types$1.assign, 2) }
+ return this.finishOp(types$1.plusMin, 1)
+};
+
+pp.readToken_lt_gt = function(code) { // '<>'
+ var next = this.input.charCodeAt(this.pos + 1);
+ var size = 1;
+ if (next === code) {
+ size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2;
+ if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types$1.assign, size + 1) }
+ return this.finishOp(types$1.bitShift, size)
+ }
+ if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 &&
+ this.input.charCodeAt(this.pos + 3) === 45) {
+ // `/gs;
+const srcRE = /\bsrc\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s'">]+))/im;
+const typeRE = /\btype\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s'">]+))/im;
+const langRE = /\blang\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s'">]+))/im;
+const contextRE = /\bcontext\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s'">]+))/im;
+function esbuildScanPlugin(config, container, depImports, missing, entries) {
+ var _a, _b;
+ const seen = new Map();
+ const resolve = async (id, importer) => {
+ const key = id + (importer && path__default.dirname(importer));
+ if (seen.has(key)) {
+ return seen.get(key);
+ }
+ const resolved = await container.resolveId(id, importer && normalizePath$3(importer), {
+ scan: true
+ });
+ const res = resolved === null || resolved === void 0 ? void 0 : resolved.id;
+ seen.set(key, res);
+ return res;
+ };
+ const include = (_a = config.optimizeDeps) === null || _a === void 0 ? void 0 : _a.include;
+ const exclude = [
+ ...(((_b = config.optimizeDeps) === null || _b === void 0 ? void 0 : _b.exclude) || []),
+ '@vite/client',
+ '@vite/env'
+ ];
+ const isOptimizable = (id) => {
+ var _a;
+ return OPTIMIZABLE_ENTRY_RE.test(id) ||
+ !!((_a = config.optimizeDeps.extensions) === null || _a === void 0 ? void 0 : _a.some((ext) => id.endsWith(ext)));
+ };
+ const externalUnlessEntry = ({ path }) => ({
+ path,
+ external: !entries.includes(path)
+ });
+ return {
+ name: 'vite:dep-scan',
+ setup(build) {
+ const scripts = {};
+ // external urls
+ build.onResolve({ filter: externalRE }, ({ path }) => ({
+ path,
+ external: true
+ }));
+ // data urls
+ build.onResolve({ filter: dataUrlRE }, ({ path }) => ({
+ path,
+ external: true
+ }));
+ // local scripts (``, { contentOnly: true });
+ };
+ await traverseHtml(html, htmlPath, (node) => {
+ if (node.type !== 1 /* ELEMENT */) {
+ return;
+ }
+ // script tags
+ if (node.tag === 'script') {
+ const { src, isModule } = getScriptInfo(node);
+ if (src) {
+ processNodeUrl(src, s, config, htmlPath, originalUrl, moduleGraph);
+ }
+ else if (isModule && node.children.length) {
+ addInlineModule(node, 'js');
+ }
+ }
+ if (node.tag === 'style' && node.children.length) {
+ const children = node.children[0];
+ styleUrl.push({
+ start: children.loc.start.offset,
+ end: children.loc.end.offset,
+ code: children.content
+ });
+ }
+ // elements with [href/src] attrs
+ const assetAttrs = assetAttrsConfig[node.tag];
+ if (assetAttrs) {
+ for (const p of node.props) {
+ if (p.type === 6 /* ATTRIBUTE */ &&
+ p.value &&
+ assetAttrs.includes(p.name)) {
+ processNodeUrl(p, s, config, htmlPath, originalUrl);
+ }
+ }
+ }
+ });
+ await Promise.all(styleUrl.map(async ({ start, end, code }, index) => {
+ const url = `${proxyModulePath}?html-proxy&direct&index=${index}.css`;
+ // ensure module in graph after successful load
+ const mod = await moduleGraph.ensureEntryFromUrl(url, false);
+ ensureWatchedFile(watcher, mod.file, config.root);
+ const result = await server.pluginContainer.transform(code, mod.id);
+ s.overwrite(start, end, (result === null || result === void 0 ? void 0 : result.code) || '');
+ }));
+ html = s.toString();
+ return {
+ html,
+ tags: [
+ {
+ tag: 'script',
+ attrs: {
+ type: 'module',
+ src: path__default.posix.join(base, CLIENT_PUBLIC_PATH)
+ },
+ injectTo: 'head-prepend'
+ }
+ ]
+ };
+};
+function indexHtmlMiddleware(server) {
+ // Keep the named function. The name is visible in debug logs via `DEBUG=connect:dispatcher ...`
+ return async function viteIndexHtmlMiddleware(req, res, next) {
+ if (res.writableEnded) {
+ return next();
+ }
+ const url = req.url && cleanUrl(req.url);
+ // spa-fallback always redirects to /index.html
+ if ((url === null || url === void 0 ? void 0 : url.endsWith('.html')) && req.headers['sec-fetch-dest'] !== 'script') {
+ const filename = getHtmlFilename(url, server);
+ if (fs__default.existsSync(filename)) {
+ try {
+ let html = fs__default.readFileSync(filename, 'utf-8');
+ html = await server.transformIndexHtml(url, html, req.originalUrl);
+ return send(req, res, html, 'html', {
+ headers: server.config.server.headers
+ });
+ }
+ catch (e) {
+ return next(e);
+ }
+ }
+ }
+ next();
+ };
+}
+
+const logTime = createDebugger('vite:time');
+function timeMiddleware(root) {
+ // Keep the named function. The name is visible in debug logs via `DEBUG=connect:dispatcher ...`
+ return function viteTimeMiddleware(req, res, next) {
+ const start = perf_hooks.performance.now();
+ const end = res.end;
+ res.end = (...args) => {
+ logTime(`${timeFrom(start)} ${prettifyUrl(req.url, root)}`);
+ // @ts-ignore
+ return end.call(res, ...args);
+ };
+ next();
+ };
+}
+
+const debugHmr = createDebugger('vite:hmr');
+const normalizedClientDir = normalizePath$3(CLIENT_DIR);
+function getShortName(file, root) {
+ return file.startsWith(root + '/') ? path__default.posix.relative(root, file) : file;
+}
+async function handleHMRUpdate(file, server) {
+ const { ws, config, moduleGraph } = server;
+ const shortFile = getShortName(file, config.root);
+ const fileName = path__default.basename(file);
+ const isConfig = file === config.configFile;
+ const isConfigDependency = config.configFileDependencies.some((name) => file === name);
+ const isEnv = config.inlineConfig.envFile !== false &&
+ (fileName === '.env' || fileName.startsWith('.env.'));
+ if (isConfig || isConfigDependency || isEnv) {
+ // auto restart server
+ debugHmr(`[config change] ${colors$1.dim(shortFile)}`);
+ config.logger.info(colors$1.green(`${path__default.relative(process.cwd(), file)} changed, restarting server...`), { clear: true, timestamp: true });
+ try {
+ await server.restart();
+ }
+ catch (e) {
+ config.logger.error(colors$1.red(e));
+ }
+ return;
+ }
+ debugHmr(`[file change] ${colors$1.dim(shortFile)}`);
+ // (dev only) the client itself cannot be hot updated.
+ if (file.startsWith(normalizedClientDir)) {
+ ws.send({
+ type: 'full-reload',
+ path: '*'
+ });
+ return;
+ }
+ const mods = moduleGraph.getModulesByFile(file);
+ // check if any plugin wants to perform custom HMR handling
+ const timestamp = Date.now();
+ const hmrContext = {
+ file,
+ timestamp,
+ modules: mods ? [...mods] : [],
+ read: () => readModifiedFile(file),
+ server
+ };
+ for (const plugin of config.plugins) {
+ if (plugin.handleHotUpdate) {
+ const filteredModules = await plugin.handleHotUpdate(hmrContext);
+ if (filteredModules) {
+ hmrContext.modules = filteredModules;
+ }
+ }
+ }
+ if (!hmrContext.modules.length) {
+ // html file cannot be hot updated
+ if (file.endsWith('.html')) {
+ config.logger.info(colors$1.green(`page reload `) + colors$1.dim(shortFile), {
+ clear: true,
+ timestamp: true
+ });
+ ws.send({
+ type: 'full-reload',
+ path: config.server.middlewareMode
+ ? '*'
+ : '/' + normalizePath$3(path__default.relative(config.root, file))
+ });
+ }
+ else {
+ // loaded but not in the module graph, probably not js
+ debugHmr(`[no modules matched] ${colors$1.dim(shortFile)}`);
+ }
+ return;
+ }
+ updateModules(shortFile, hmrContext.modules, timestamp, server);
+}
+function updateModules(file, modules, timestamp, { config, ws }) {
+ const updates = [];
+ const invalidatedModules = new Set();
+ let needFullReload = false;
+ for (const mod of modules) {
+ invalidate(mod, timestamp, invalidatedModules);
+ if (needFullReload) {
+ continue;
+ }
+ const boundaries = new Set();
+ const hasDeadEnd = propagateUpdate(mod, boundaries);
+ if (hasDeadEnd) {
+ needFullReload = true;
+ continue;
+ }
+ updates.push(...[...boundaries].map(({ boundary, acceptedVia }) => ({
+ type: `${boundary.type}-update`,
+ timestamp,
+ path: boundary.url,
+ acceptedPath: acceptedVia.url
+ })));
+ }
+ if (needFullReload) {
+ config.logger.info(colors$1.green(`page reload `) + colors$1.dim(file), {
+ clear: true,
+ timestamp: true
+ });
+ ws.send({
+ type: 'full-reload'
+ });
+ }
+ else {
+ config.logger.info(updates
+ .map(({ path }) => colors$1.green(`hmr update `) + colors$1.dim(path))
+ .join('\n'), { clear: true, timestamp: true });
+ ws.send({
+ type: 'update',
+ updates
+ });
+ }
+}
+async function handleFileAddUnlink(file, server, isUnlink = false) {
+ var _a;
+ const modules = [...((_a = server.moduleGraph.getModulesByFile(file)) !== null && _a !== void 0 ? _a : [])];
+ if (isUnlink && file in server._globImporters) {
+ delete server._globImporters[file];
+ }
+ else {
+ for (const i in server._globImporters) {
+ const { module, importGlobs } = server._globImporters[i];
+ for (const { base, pattern } of importGlobs) {
+ if (micromatch_1.isMatch(file, pattern) ||
+ micromatch_1.isMatch(path__default.relative(base, file), pattern)) {
+ modules.push(module);
+ // We use `onFileChange` to invalidate `module.file` so that subsequent `ssrLoadModule()`
+ // calls get fresh glob import results with(out) the newly added(/removed) `file`.
+ server.moduleGraph.onFileChange(module.file);
+ break;
+ }
+ }
+ }
+ }
+ if (modules.length > 0) {
+ updateModules(getShortName(file, server.config.root), modules, Date.now(), server);
+ }
+}
+function propagateUpdate(node, boundaries, currentChain = [node]) {
+ // #7561
+ // if the imports of `node` have not been analyzed, then `node` has not
+ // been loaded in the browser and we should stop propagation.
+ if (node.id && node.isSelfAccepting === undefined) {
+ return false;
+ }
+ if (node.isSelfAccepting) {
+ boundaries.add({
+ boundary: node,
+ acceptedVia: node
+ });
+ // additionally check for CSS importers, since a PostCSS plugin like
+ // Tailwind JIT may register any file as a dependency to a CSS file.
+ for (const importer of node.importers) {
+ if (isCSSRequest(importer.url) && !currentChain.includes(importer)) {
+ propagateUpdate(importer, boundaries, currentChain.concat(importer));
+ }
+ }
+ return false;
+ }
+ if (!node.importers.size) {
+ return true;
+ }
+ // #3716, #3913
+ // For a non-CSS file, if all of its importers are CSS files (registered via
+ // PostCSS plugins) it should be considered a dead end and force full reload.
+ if (!isCSSRequest(node.url) &&
+ [...node.importers].every((i) => isCSSRequest(i.url))) {
+ return true;
+ }
+ for (const importer of node.importers) {
+ const subChain = currentChain.concat(importer);
+ if (importer.acceptedHmrDeps.has(node)) {
+ boundaries.add({
+ boundary: importer,
+ acceptedVia: node
+ });
+ continue;
+ }
+ if (currentChain.includes(importer)) {
+ // circular deps is considered dead end
+ return true;
+ }
+ if (propagateUpdate(importer, boundaries, subChain)) {
+ return true;
+ }
+ }
+ return false;
+}
+function invalidate(mod, timestamp, seen) {
+ if (seen.has(mod)) {
+ return;
+ }
+ seen.add(mod);
+ mod.lastHMRTimestamp = timestamp;
+ mod.transformResult = null;
+ mod.ssrModule = null;
+ mod.ssrError = null;
+ mod.ssrTransformResult = null;
+ mod.importers.forEach((importer) => {
+ if (!importer.acceptedHmrDeps.has(mod)) {
+ invalidate(importer, timestamp, seen);
+ }
+ });
+}
+function handlePrunedModules(mods, { ws }) {
+ // update the disposed modules' hmr timestamp
+ // since if it's re-imported, it should re-apply side effects
+ // and without the timestamp the browser will not re-import it!
+ const t = Date.now();
+ mods.forEach((mod) => {
+ mod.lastHMRTimestamp = t;
+ debugHmr(`[dispose] ${colors$1.dim(mod.file)}`);
+ });
+ ws.send({
+ type: 'prune',
+ paths: [...mods].map((m) => m.url)
+ });
+}
+/**
+ * Lex import.meta.hot.accept() for accepted deps.
+ * Since hot.accept() can only accept string literals or array of string
+ * literals, we don't really need a heavy @babel/parse call on the entire source.
+ *
+ * @returns selfAccepts
+ */
+function lexAcceptedHmrDeps(code, start, urls) {
+ let state = 0 /* inCall */;
+ // the state can only be 2 levels deep so no need for a stack
+ let prevState = 0 /* inCall */;
+ let currentDep = '';
+ function addDep(index) {
+ urls.add({
+ url: currentDep,
+ start: index - currentDep.length - 1,
+ end: index + 1
+ });
+ currentDep = '';
+ }
+ for (let i = start; i < code.length; i++) {
+ const char = code.charAt(i);
+ switch (state) {
+ case 0 /* inCall */:
+ case 4 /* inArray */:
+ if (char === `'`) {
+ prevState = state;
+ state = 1 /* inSingleQuoteString */;
+ }
+ else if (char === `"`) {
+ prevState = state;
+ state = 2 /* inDoubleQuoteString */;
+ }
+ else if (char === '`') {
+ prevState = state;
+ state = 3 /* inTemplateString */;
+ }
+ else if (/\s/.test(char)) {
+ continue;
+ }
+ else {
+ if (state === 0 /* inCall */) {
+ if (char === `[`) {
+ state = 4 /* inArray */;
+ }
+ else {
+ // reaching here means the first arg is neither a string literal
+ // nor an Array literal (direct callback) or there is no arg
+ // in both case this indicates a self-accepting module
+ return true; // done
+ }
+ }
+ else if (state === 4 /* inArray */) {
+ if (char === `]`) {
+ return false; // done
+ }
+ else if (char === ',') {
+ continue;
+ }
+ else {
+ error(i);
+ }
+ }
+ }
+ break;
+ case 1 /* inSingleQuoteString */:
+ if (char === `'`) {
+ addDep(i);
+ if (prevState === 0 /* inCall */) {
+ // accept('foo', ...)
+ return false;
+ }
+ else {
+ state = prevState;
+ }
+ }
+ else {
+ currentDep += char;
+ }
+ break;
+ case 2 /* inDoubleQuoteString */:
+ if (char === `"`) {
+ addDep(i);
+ if (prevState === 0 /* inCall */) {
+ // accept('foo', ...)
+ return false;
+ }
+ else {
+ state = prevState;
+ }
+ }
+ else {
+ currentDep += char;
+ }
+ break;
+ case 3 /* inTemplateString */:
+ if (char === '`') {
+ addDep(i);
+ if (prevState === 0 /* inCall */) {
+ // accept('foo', ...)
+ return false;
+ }
+ else {
+ state = prevState;
+ }
+ }
+ else if (char === '$' && code.charAt(i + 1) === '{') {
+ error(i);
+ }
+ else {
+ currentDep += char;
+ }
+ break;
+ default:
+ throw new Error('unknown import.meta.hot lexer state');
+ }
+ }
+ return false;
+}
+function error(pos) {
+ const err = new Error(`import.meta.accept() can only accept string literals or an ` +
+ `Array of string literals.`);
+ err.pos = pos;
+ throw err;
+}
+// vitejs/vite#610 when hot-reloading Vue files, we read immediately on file
+// change event and sometimes this can be too early and get an empty buffer.
+// Poll until the file's modified time has changed before reading again.
+async function readModifiedFile(file) {
+ const content = fs__default.readFileSync(file, 'utf-8');
+ if (!content) {
+ const mtime = fs__default.statSync(file).mtimeMs;
+ await new Promise((r) => {
+ let n = 0;
+ const poll = async () => {
+ n++;
+ const newMtime = fs__default.statSync(file).mtimeMs;
+ if (newMtime !== mtime || n > 10) {
+ r(0);
+ }
+ else {
+ setTimeout(poll, 10);
+ }
+ };
+ setTimeout(poll, 10);
+ });
+ return fs__default.readFileSync(file, 'utf-8');
+ }
+ else {
+ return content;
+ }
+}
+
+const isDebug = !!process.env.DEBUG;
+const debug$1 = createDebugger('vite:import-analysis');
+const clientDir = normalizePath$3(CLIENT_DIR);
+const skipRE = /\.(map|json)$/;
+const canSkipImportAnalysis = (id) => skipRE.test(id) || isDirectCSSRequest(id);
+const optimizedDepChunkRE = /\/chunk-[A-Z0-9]{8}\.js/;
+const optimizedDepDynamicRE = /-[A-Z0-9]{8}\.js/;
+function isExplicitImportRequired(url) {
+ return !isJSRequest(cleanUrl(url)) && !isCSSRequest(url);
+}
+function markExplicitImport(url) {
+ if (isExplicitImportRequired(url)) {
+ return injectQuery(url, 'import');
+ }
+ return url;
+}
+/**
+ * Server-only plugin that lexes, resolves, rewrites and analyzes url imports.
+ *
+ * - Imports are resolved to ensure they exist on disk
+ *
+ * - Lexes HMR accept calls and updates import relationships in the module graph
+ *
+ * - Bare module imports are resolved (by @rollup-plugin/node-resolve) to
+ * absolute file paths, e.g.
+ *
+ * ```js
+ * import 'foo'
+ * ```
+ * is rewritten to
+ * ```js
+ * import '/@fs//project/node_modules/foo/dist/foo.js'
+ * ```
+ *
+ * - CSS imports are appended with `.js` since both the js module and the actual
+ * css (referenced via ) may go through the transform pipeline:
+ *
+ * ```js
+ * import './style.css'
+ * ```
+ * is rewritten to
+ * ```js
+ * import './style.css.js'
+ * ```
+ */
+function importAnalysisPlugin(config) {
+ const { root, base } = config;
+ const clientPublicPath = path__default.posix.join(base, CLIENT_PUBLIC_PATH);
+ const resolve = config.createResolver({
+ preferRelative: true,
+ tryIndex: false,
+ extensions: []
+ });
+ let server;
+ return {
+ name: 'vite:import-analysis',
+ configureServer(_server) {
+ server = _server;
+ },
+ async transform(source, importer, options) {
+ // In a real app `server` is always defined, but it is undefined when
+ // running src/node/server/__tests__/pluginContainer.spec.ts
+ if (!server) {
+ return null;
+ }
+ const ssr = (options === null || options === void 0 ? void 0 : options.ssr) === true;
+ const prettyImporter = prettifyUrl(importer, root);
+ if (canSkipImportAnalysis(importer)) {
+ isDebug && debug$1(colors$1.dim(`[skipped] ${prettyImporter}`));
+ return null;
+ }
+ const start = perf_hooks.performance.now();
+ await init;
+ let imports = [];
+ // strip UTF-8 BOM
+ if (source.charCodeAt(0) === 0xfeff) {
+ source = source.slice(1);
+ }
+ try {
+ imports = parse$e(source)[0];
+ }
+ catch (e) {
+ const isVue = importer.endsWith('.vue');
+ const maybeJSX = !isVue && isJSRequest(importer);
+ const msg = isVue
+ ? `Install @vitejs/plugin-vue to handle .vue files.`
+ : maybeJSX
+ ? `If you are using JSX, make sure to name the file with the .jsx or .tsx extension.`
+ : `You may need to install appropriate plugins to handle the ${path__default.extname(importer)} file format.`;
+ this.error(`Failed to parse source for import analysis because the content ` +
+ `contains invalid JS syntax. ` +
+ msg, e.idx);
+ }
+ const { moduleGraph } = server;
+ // since we are already in the transform phase of the importer, it must
+ // have been loaded so its entry is guaranteed in the module graph.
+ const importerModule = moduleGraph.getModuleById(importer);
+ if (!importerModule && isOptimizedDepFile(importer, config)) {
+ // Ids of optimized deps could be invalidated and removed from the graph
+ // Return without transforming, this request is no longer valid, a full reload
+ // is going to request this id again. Throwing an outdated error so we
+ // properly finish the request with a 504 sent to the browser.
+ throwOutdatedRequest(importer);
+ }
+ if (!imports.length) {
+ importerModule.isSelfAccepting = false;
+ isDebug &&
+ debug$1(`${timeFrom(start)} ${colors$1.dim(`[no imports] ${prettyImporter}`)}`);
+ return source;
+ }
+ let hasHMR = false;
+ let isSelfAccepting = false;
+ let hasEnv = false;
+ let needQueryInjectHelper = false;
+ let s;
+ const str = () => s || (s = new MagicString(source));
+ const importedUrls = new Set();
+ const staticImportedUrls = new Set();
+ const acceptedUrls = new Set();
+ const toAbsoluteUrl = (url) => path__default.posix.resolve(path__default.posix.dirname(importerModule.url), url);
+ const normalizeUrl = async (url, pos) => {
+ var _a;
+ if (base !== '/' && url.startsWith(base)) {
+ url = url.replace(base, '/');
+ }
+ let importerFile = importer;
+ if (moduleListContains((_a = config.optimizeDeps) === null || _a === void 0 ? void 0 : _a.exclude, url)) {
+ const optimizedDeps = server._optimizedDeps;
+ if (optimizedDeps) {
+ await optimizedDeps.scanProcessing;
+ // if the dependency encountered in the optimized file was excluded from the optimization
+ // the dependency needs to be resolved starting from the original source location of the optimized file
+ // because starting from node_modules/.vite will not find the dependency if it was not hoisted
+ // (that is, if it is under node_modules directory in the package source of the optimized file)
+ for (const optimizedModule of optimizedDeps.metadata.depInfoList) {
+ if (!optimizedModule.src)
+ continue; // Ignore chunks
+ if (optimizedModule.file === importerModule.file) {
+ importerFile = optimizedModule.src;
+ }
+ }
+ }
+ }
+ const resolved = await this.resolve(url, importerFile);
+ if (!resolved) {
+ // in ssr, we should let node handle the missing modules
+ if (ssr) {
+ return [url, url];
+ }
+ this.error(`Failed to resolve import "${url}" from "${path__default.relative(process.cwd(), importerFile)}". Does the file exist?`, pos);
+ }
+ const isRelative = url.startsWith('.');
+ const isSelfImport = !isRelative && cleanUrl(url) === cleanUrl(importer);
+ // normalize all imports into resolved URLs
+ // e.g. `import 'foo'` -> `import '/@fs/.../node_modules/foo/index.js'`
+ if (resolved.id.startsWith(root + '/')) {
+ // in root: infer short absolute path from root
+ url = resolved.id.slice(root.length);
+ }
+ else if (resolved.id.startsWith(getDepsCacheDir(config)) ||
+ fs__default.existsSync(cleanUrl(resolved.id))) {
+ // an optimized deps may not yet exists in the filesystem, or
+ // a regular file exists but is out of root: rewrite to absolute /@fs/ paths
+ url = path__default.posix.join(FS_PREFIX + resolved.id);
+ }
+ else {
+ url = resolved.id;
+ }
+ if (isExternalUrl(url)) {
+ return [url, url];
+ }
+ // if the resolved id is not a valid browser import specifier,
+ // prefix it to make it valid. We will strip this before feeding it
+ // back into the transform pipeline
+ if (!url.startsWith('.') && !url.startsWith('/')) {
+ url =
+ VALID_ID_PREFIX + resolved.id.replace('\0', NULL_BYTE_PLACEHOLDER);
+ }
+ // make the URL browser-valid if not SSR
+ if (!ssr) {
+ // mark non-js/css imports with `?import`
+ url = markExplicitImport(url);
+ // If the url isn't a request for a pre-bundled common chunk,
+ // for relative js/css imports, or self-module virtual imports
+ // (e.g. vue blocks), inherit importer's version query
+ // do not do this for unknown type imports, otherwise the appended
+ // query can break 3rd party plugin's extension checks.
+ if ((isRelative || isSelfImport) &&
+ !/[\?&]import=?\b/.test(url) &&
+ !url.match(DEP_VERSION_RE)) {
+ const versionMatch = importer.match(DEP_VERSION_RE);
+ if (versionMatch) {
+ url = injectQuery(url, versionMatch[1]);
+ }
+ }
+ // check if the dep has been hmr updated. If yes, we need to attach
+ // its last updated timestamp to force the browser to fetch the most
+ // up-to-date version of this module.
+ try {
+ const depModule = await moduleGraph.ensureEntryFromUrl(url, ssr);
+ if (depModule.lastHMRTimestamp > 0) {
+ url = injectQuery(url, `t=${depModule.lastHMRTimestamp}`);
+ }
+ }
+ catch (e) {
+ // it's possible that the dep fails to resolve (non-existent import)
+ // attach location to the missing import
+ e.pos = pos;
+ throw e;
+ }
+ // prepend base (dev base is guaranteed to have ending slash)
+ url = base + url.replace(/^\//, '');
+ }
+ return [url, resolved.id];
+ };
+ // Import rewrites, we do them after all the URLs have been resolved
+ // to help with the discovery of new dependencies. If we need to wait
+ // for each dependency there could be one reload per import
+ const importRewrites = [];
+ for (let index = 0; index < imports.length; index++) {
+ const { s: start, e: end, ss: expStart, se: expEnd, d: dynamicIndex,
+ // #2083 User may use escape path,
+ // so use imports[index].n to get the unescaped string
+ // @ts-ignore
+ n: specifier } = imports[index];
+ const rawUrl = source.slice(start, end);
+ // check import.meta usage
+ if (rawUrl === 'import.meta') {
+ const prop = source.slice(end, end + 4);
+ if (prop === '.hot') {
+ hasHMR = true;
+ if (source.slice(end + 4, end + 11) === '.accept') {
+ // further analyze accepted modules
+ if (lexAcceptedHmrDeps(source, source.indexOf('(', end + 11) + 1, acceptedUrls)) {
+ isSelfAccepting = true;
+ }
+ }
+ }
+ else if (prop === '.env') {
+ hasEnv = true;
+ }
+ else if (prop === '.glo' && source[end + 4] === 'b') {
+ // transform import.meta.glob()
+ // e.g. `import.meta.glob('glob:./dir/*.js')`
+ const { imports, importsString, exp, endIndex, base, pattern, isEager } = await transformImportGlob(source, start, importer, index, root, config.logger, normalizeUrl, resolve);
+ str().prepend(importsString);
+ str().overwrite(expStart, endIndex, exp, { contentOnly: true });
+ imports.forEach((url) => {
+ url = url.replace(base, '/');
+ importedUrls.add(url);
+ if (isEager)
+ staticImportedUrls.add(url);
+ });
+ if (!(importerModule.file in server._globImporters)) {
+ server._globImporters[importerModule.file] = {
+ module: importerModule,
+ importGlobs: []
+ };
+ }
+ server._globImporters[importerModule.file].importGlobs.push({
+ base,
+ pattern
+ });
+ }
+ continue;
+ }
+ const isDynamicImport = dynamicIndex > -1;
+ // static import or valid string in dynamic import
+ // If resolvable, let's resolve it
+ if (specifier) {
+ // skip external / data uri
+ if (isExternalUrl(specifier) || isDataUrl(specifier)) {
+ continue;
+ }
+ // skip ssr external
+ if (ssr) {
+ if (server._ssrExternals &&
+ shouldExternalizeForSSR(specifier, server._ssrExternals)) {
+ continue;
+ }
+ if (isBuiltin(specifier)) {
+ continue;
+ }
+ }
+ // skip client
+ if (specifier === clientPublicPath) {
+ continue;
+ }
+ // warn imports to non-asset /public files
+ if (specifier.startsWith('/') &&
+ !config.assetsInclude(cleanUrl(specifier)) &&
+ !specifier.endsWith('.json') &&
+ checkPublicFile(specifier, config)) {
+ throw new Error(`Cannot import non-asset file ${specifier} which is inside /public.` +
+ `JS/CSS files inside /public are copied as-is on build and ` +
+ `can only be referenced via