diff --git a/.gitignore b/.gitignore index 4396e4ad..7027013f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,4 @@ tmp/* package-lock.json .vscode /dist -/bin \ No newline at end of file +/bin diff --git a/.prettierrc b/.prettierrc index d8c96bcc..dbac2a04 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,8 +1,9 @@ -printWidth: 100 -tabWidth: 4 -useTabs: true -bracketSpacing: false -trailingComma: es5 -singleQuote: true -arrowParens: "avoid" - +{ + "printWidth": 100, + "tabWidth": 4, + "useTabs": true, + "bracketSpacing": false, + "trailingComma": "es5", + "singleQuote": true, + "arrowParens": "avoid" +} \ No newline at end of file diff --git a/README.md b/README.md index c7c86a76..42e6a720 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,20 @@ +

+
+RexReplace mascot Benny on the RexReplace logo +
+
+

- +# RexReplace [![CI-test](https://github.com/mathiasrw/rexreplace/workflows/CI-test/badge.svg)](https://github.com/mathiasrw/rexreplace/actions) -[![NPM downloads](https://img.shields.io/npm/dm/rexreplace.svg?style=flat&label=npm%20downloads)](https://npm-stat.com/charts.html?package=rexreplace) +[![NPM downloads](https://img.shields.io/npm/dm/rexreplace.svg?style=flat&label=npm%20downloads)](https://npm-stat.com/charts.html?package=rexreplace) [![npm version](https://badge.fury.io/js/rexreplace.svg)](https://www.npmjs.com/package/rexreplace) [![FOSSA Status](https://img.shields.io/badge/license-MIT-brightgreen.svg)](https://app.fossa.io/projects/git%2Bgithub.com%2Fmathiasrw%2Frexreplace?ref=badge_shield) [![OPEN open source software](https://img.shields.io/badge/Open--OSS-%E2%9C%94-brightgreen.svg)](http://open-oss.com) - - - -# RexReplace - -

RexReplace mascot Benny as the RexReplace logo -

- - - - - -RexReplace is a versatile tool to search and replace text in files from the command line. Its inspired by how developers often need to do quick fixes or one-liners for build scripts. +> RexReplace is a versatile tool to search and replace text in files from the command line. It's inspired by how developers often need to do quick fixes or one-liners for build scripts. **Key features**: @@ -29,9 +23,8 @@ RexReplace is a versatile tool to search and replace text in files from the comm - Pinpoint the exact files with [glob notation](https://www.tcl.tk/man/tcl8.5/tutorial/Tcl16a.html) (`docs/*.md` represents each markdown file in `docs/`) - No more brute-forcing the right combination of `find`, `cat`, `sed`, `tr`, and `awk` to replace a text pattern in the right files - - ## Install + To use RexReplace from your command line ```bash @@ -40,18 +33,15 @@ To use RexReplace from your command line To use RexReplace from an npm build script: - ```bash > yarn add rexreplace --dev # or > npm install rexreplace --save-dev ``` - - ## Examples -Let 'foobar' become 'xxxbar' in myfile.md +Let 'foobar' become 'xxxbar' in myfile.md ```bash > rexreplace 'Foo' 'xxx' myfile.md @@ -63,68 +53,61 @@ Hard for your fingers to write on your keyboard? We got you covered with the `rr > rr Foo xxx myfile.md ``` +--- ----- - -#### Catch the beginning +#### Catch the beginning Let all markdown files in the `docs/` dir get headlines moved one level deeper ```bash -> rexreplace '^#' '##' docs/*.md +> rexreplace '^#' '##' docs/*.md ``` - - ---- + +--- #### Using glob notation to pinpoint files -Fix a spell error in all javascript and typescript files in the folders `src/` and `test/` recursively. +Fix a spell error in all javascript and typescript files in the folders `src/` and `test/` recursively. ```bash > rexreplace 'foubar' 'foobar' '{src,test}/**/*.{js,ts}' ``` - ----- - +--- #### Dynamically generated content Let the version number from package.json get into your distribution js files (use the string `VERSION` in your source files). - + ```bash -> rexreplace 'VERSION' 'require("./package.json").version' -j dist/*.js +> rexreplace 'VERSION' 'require("./package.json").version' -j dist/*.js ``` -Require have been given the alias `r` and both are expanded to understand relative paths even without `./` prepended. As the file extension is not needed eighter you will get the same result writing: +Require have been given the alias `r` and both are expanded to understand relative paths even without `./` prepended. As the file extension is not needed eighter you will get the same result writing: ```bash -> rexreplace 'VERSION' 'r("package").version' -j dist/*.js +> rexreplace 'VERSION' 'r("package").version' -j dist/*.js ``` - #### Reference a matching group -Let 'foobar' become 'barfoo' in myfile.md +Let 'foobar' become 'barfoo' in myfile.md ```bash > rexreplace '(foo)(.*)' '$2$1' myfile.md ``` - RexReplace defaults to treating `€` as an alias for `$` so the following will do the same as the previous example ```bash -> rexreplace '(foo)(.*)' '€2€1' myfile.md +> rexreplace '(foo)(.*)' '€2€1' myfile.md ``` - - ----- +--- #### Surviving backslash-escape hell -Let `foo[bar]` become `foo.0.[bar]` in myfile.md +Let `foo[bar]` become `foo.0.[bar]` in myfile.md ```bash > rexreplace '\[' '.0.[' myfile.md @@ -138,7 +121,6 @@ The `[` as a literate char must be escaped according to regex. If you run the co } ``` - RexReplace defaults to treating `§` as an alias for `\` so the following give same result: ```bash @@ -151,19 +133,16 @@ RexReplace defaults to treating `§` as an alias for `\` so the following give s } ``` +--- - ----- - - -#### More relevant examples +#### More relevant examples **Per file info** Add creation time, name of the file and human readable file size as the first line in each file in `test-run` recursively. ```bash -> rexreplace '^' 'ctime_ + name_ + size + nl' -j -M 'dist/**/*.*' +> rexreplace '^' 'ctime_ + name_ + size + nl' -j -M 'dist/**/*.*' ``` **Matching pairs** @@ -174,125 +153,120 @@ Let both `"foo 'is' bar"` and `' foo "was" bar'` ' become `» foo ... bar «` in > rexreplace '(['"])([^\1]+)\1' '» $2 «' myfile.md ``` +--- ----- +## Usage - -## Usage ```bash > rexreplace pattern replacement [fileGlob|option]+ ``` - -Flag | Effect ----- | ---- -`-v` | **`--version`** Print rexreplace version (can be given as only argument) [boolean] -`-V` | **`--verbose`** More chatty output [boolean] -`-L` | **`--literal`** Literal string search (no regex used when searching) [boolean] -`-I` | **`--void-ignore-case`** Void case insensitive search pattern. [boolean] -`-G` | **`--void-global`** Void global search (stop looking after the first match). [boolean] -`-s` | **`--dot-all`** Have `.` also match newline. [boolean] -`-M` | **`--void-multiline`** Void multiline search pattern. Makes ^ and $ match start/end of whole content rather than each line. [boolean] -`-u` | **`--unicode`** Treat pattern as a sequence of unicode code points. [boolean] -`-e` | **`--encoding`** Encoding of files/piped data. [default: "utf8"] -`-E` | **`--engine`** What regex engine to use: [choices: "V8"] [default: "V8"] -`-q` | **`--quiet`** Only display errors (no other info) [boolean] -`-Q` | **`--quiet-total`** Never display errors or info [boolean] -`-H` | **`--halt`** Halt on first error [boolean] [default: false] -`-d` | **`--debug`** Print debug info [boolean] -`-€` | **`--void-euro`** Void having `€` as alias for `$` in pattern and replacement parameters [boolean] -`-§` | **`--void-section`** Void having `§` as alias for `\` in pattern and replacement parameters [boolean] -`-o` | **`--output`** Output the final result instead of saving to file. Will also output content even if no replacement has taken place. [boolean] -`-A` | **`--void-async`** Handle files in a synchronous flow. Good to limit memory usage when handling large files. [boolean] -`-B` | **`--void-backup`** Avoid temporary backing up file. Works async (independent of -A flag) and will speed up things but at one point data lives only in memory, and you will lose the content if the process is abrupted. [boolean] -`-b` | **`--keep-backup`** Keep a backup file of the original content. [boolean] -`-m` | **`--output-match`** Output each match on a new line. Will not replace any content but you still need to provide a dummy value (like `_`) as replacement parameter. If search pattern does not contain matching groups the full match will be outputted. If search pattern does contain matching groups only matching groups will be outputted (same line with no delimiter). [boolean] -`-T` | **`--trim-pipe`** Trim piped data before processing. If piped data only consists of chars that can be trimmed (new line, space, tabs...) it will become an empty string. [boolean] -`-R` | **`--replacement-pipe`** Replacement will be piped in. You still need to provide a dummy value (like `_`) as replacement parameter. [boolean] -`-j` | **`--replacement-js`** Treat replacement as javascript source code. The statement from the last expression will become the replacement string. Purposefully implemented the most insecure way possible to remove _any_ incentive to consider running code from an untrusted part. The full match will be available as a javascript variable named $0 while each captured group will be available as $1, $2, $3, ... and so on. At some point, the $ char _will_ give you a headache when used from the command line, so use €0, €1, €2, €3... instead. If the javascript source code references to the full match or a captured group the code will run once per match. Otherwise, it will run once per file. The code has access to the following variables: `r` as an alias for `require` with both expanded to understand a relative path even if it is not starting with `./`, `fs` from node, `path` from node, `globs` from npm, `pipe`: the data piped into the command (null if no piped data), `find`: pattern searched for (the needle), `text`: full text being searched i.e. file content or piped data (the haystack), `bytes`: total size of the haystack in bytes, `size`: human-friendly representation of the total size of the haystack, `time`: String representing the local time when the command was invoked, `time_obj`: date object representing `time`, `now`: alias for `time`, `cwd`: current process working dir, `nl`: a new-line char, `_`: a single space char (for easy string concatenation). The following values defaults to `❌` if haystack does not originate from a file: `file`: contains the full path of the active file being searched (including full filename), `file_rel`: contains `file` relative to current process working dir, `dirpath`: contains the full path without filename of the active file being searched, `dirpath_rel`: contains `dirpath` relative to current process working dir, `filename`: is the full filename of the active file being searched without path, `name`: filename of the active file being searched with no extension, `ext`: extension of the filename including leading dot, `mtime`: ISO inspired representation of the last local modification time of the current file, `ctime`: ISO representation of the local creation time of the current file. `mtime_obj`: date object representing `mtime`, `ctime_obj`: date object representing `ctime`. All variables, except from module, date objects, `nl` and `_`, has a corresponding variable name followed by `_` where the content has an extra space at the end (for easy concatenation). [boolean] -`-x` | **`--exclude-re`** Exclude files with a path that matches this regular expression. Will follow same regex flags and setup as the main search. Can be used multiple times. [string] -`-X` | **`--exclude-glob`** Exclude files found with this glob. Can be used multiple times. [string] -`-h` | **`--help`** Display help. [boolean] - -## Good to know - -### Features +| Flag | Effect | +| ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `-v` | **`--version`** Print rexreplace version (can be given as only argument) [boolean] | +| `-V` | **`--verbose`** More chatty output [boolean] | +| `-L` | **`--literal`** Literal string search (no regex used when searching) [boolean] | +| `-I` | **`--void-ignore-case`** Void case insensitive search pattern. [boolean] | +| `-G` | **`--void-global`** Void global search (stop looking after the first match). [boolean] | +| `-s` | **`--dot-all`** Have `.` also match newline. [boolean] | +| `-M` | **`--void-multiline`** Void multiline search pattern. Makes ^ and $ match start/end of whole content rather than each line. [boolean] | +| `-u` | **`--unicode`** Treat pattern as a sequence of unicode code points. [boolean] | +| `-e` | **`--encoding`** Encoding of files/piped data. [default: "utf8"] | +| `-E` | **`--engine`** What regex engine to use: [choices: "V8"] [default: "V8"] | +| `-q` | **`--quiet`** Only display errors (no other info) [boolean] | +| `-Q` | **`--quiet-total`** Never display errors or info [boolean] | +| `-H` | **`--halt`** Halt on first error [boolean] [default: false] | +| `-d` | **`--debug`** Print debug info [boolean] | +| `-€` | **`--void-euro`** Void having `€` as alias for `$` in pattern and replacement parameters [boolean] | +| `-§` | **`--void-section`** Void having `§` as alias for `\` in pattern and replacement parameters [boolean] | +| `-o` | **`--output`** Output the final result instead of saving to file. Will also output content even if no replacement has taken place. [boolean] | +| `-A` | **`--void-async`** Handle files in a synchronous flow. Good to limit memory usage when handling large files. [boolean] | +| `-B` | **`--void-backup`** Avoid temporary backing up file. Works async (independent of -A flag) and will speed up things but at one point data lives only in memory, and you will lose the content if the process is abrupted. [boolean] | +| `-b` | **`--keep-backup`** Keep a backup file of the original content. [boolean] | +| `-m` | **`--output-match`** Output each match on a new line. Will not replace any content but you still need to provide a dummy value (like `_`) as replacement parameter. If search pattern does not contain matching groups the full match will be outputted. If search pattern does contain matching groups only matching groups will be outputted (same line with no delimiter). [boolean] | +| `-T` | **`--trim-pipe`** Trim piped data before processing. If piped data only consists of chars that can be trimmed (new line, space, tabs...) it will become an empty string. [boolean] | +| `-R` | **`--replacement-pipe`** Replacement will be piped in. You still need to provide a dummy value (like `_`) as replacement parameter. [boolean] | +| `-j` | **`--replacement-js`** Treat replacement as javascript source code. The statement from the last expression will become the replacement string. Purposefully implemented the most insecure way possible to remove _any_ incentive to consider running code from an untrusted part. The full match will be available as a javascript variable named $0 while each captured group will be available as $1, $2, $3, ... and so on. At some point, the $ char _will_ give you a headache when used from the command line, so use €0, €1, €2, €3... instead. If the javascript source code references to the full match or a captured group the code will run once per match. Otherwise, it will run once per file. The code has access to the following variables: `r` as an alias for `require` with both expanded to understand a relative path even if it is not starting with `./`, `fs` from node, `path` from node, `globs` from npm, `pipe`: the data piped into the command (null if no piped data), `find`: pattern searched for (the needle), `text`: full text being searched i.e. file content or piped data (the haystack), `bytes`: total size of the haystack in bytes, `size`: human-friendly representation of the total size of the haystack, `time`: String representing the local time when the command was invoked, `time_obj`: date object representing `time`, `now`: alias for `time`, `cwd`: current process working dir, `nl`: a new-line char, `_`: a single space char (for easy string concatenation). The following values defaults to `❌` if haystack does not originate from a file: `file`: contains the full path of the active file being searched (including full filename), `file_rel`: contains `file` relative to current process working dir, `dirpath`: contains the full path without filename of the active file being searched, `dirpath_rel`: contains `dirpath` relative to current process working dir, `filename`: is the full filename of the active file being searched without path, `name`: filename of the active file being searched with no extension, `ext`: extension of the filename including leading dot, `mtime`: ISO inspired representation of the last local modification time of the current file, `ctime`: ISO representation of the local creation time of the current file. `mtime_obj`: date object representing `mtime`, `ctime_obj`: date object representing `ctime`. All variables, except from module, date objects, `nl` and `_`, has a corresponding variable name followed by `_` where the content has an extra space at the end (for easy concatenation). [boolean] | +| `-x` | **`--exclude-re`** Exclude files with a path that matches this regular expression. Will follow same regex flags and setup as the main search. Can be used multiple times. [string] | +| `-X` | **`--exclude-glob`** Exclude files found with this glob. Can be used multiple times. [string] | +| `-h` | **`--help`** Display help. [boolean] | + +## Good to know + +### Features - Patterns are described as javascript notation regex - Pattern defaults to global multiline case-insensitive search -- Supports regex lookaheads in the pattern -- Supports backreference to matching groups in the replacement -- Data to be treated can be piped in -- See the [release note](https://github.com/mathiasrw/rexreplace/releases) for a log of changes. Descriptions are given in latest patch version. - +- Supports regex lookaheads in the pattern +- Supports backreference to matching groups in the replacement +- Data to be treated can be piped in +- See the [release note](https://github.com/mathiasrw/rexreplace/releases) for a log of changes. Descriptions are given in latest patch version. ### Quirks -- Options can only be set after the replacement parameter. "_But I like to put my options as the first thing, so I know what I am doing_" I agree, but we must sometimes sacrifice habits for consistency. -- Per default `€` is treated as an alias for `$` in the CLI input. The main reason is for you not to worry about how command line tools often have a special relationship with the `$` char. You can escape your way out of this old love story, but it often pops up in unexpected ways. Use the `-€` flag if you need to search or replace the actual euro char. +- Options can only be set after the replacement parameter. "_But I like to put my options as the first thing, so I know what I am doing_" I agree, but we must sometimes sacrifice habits for consistency. -- Per default `§` is treated as an alias for `\` in the CLI input. The main reason is for you not to worry about escaping the escape of an escape. Use the `-§` flag if you need to search or replace the actual section char. +- Per default `€` is treated as an alias for `$` in the CLI input. The main reason is for you not to worry about how command line tools often have a special relationship with the `$` char. You can escape your way out of this old love story, but it often pops up in unexpected ways. Use the `-€` flag if you need to search or replace the actual euro char. +- Per default `§` is treated as an alias for `\` in the CLI input. The main reason is for you not to worry about escaping the escape of an escape. Use the `-§` flag if you need to search or replace the actual section char. ### Limitations + - RexReplace reads each file fully into memory, so working on your 8Gb log files will probably not be ideal. - For versions of Node prior to 6, please use version 2.2.x. For versions of Node prior to 0.12, please use [the legacy version of RexReplace called rreplace](https://www.npmjs.com/package/rreplace) - - ### Priorities -- Flexibility regarding text pattern matching + +- Flexibility regarding text pattern matching - Easy to filter what files to be treated - Helpful interface - Tests (if you know how to do a test cover report on javascript code ran via the command line, please let me know) - ### Not a priority -- Speed. Well... obviously, speed is important, but to what extent does a 29 millisecond command really satisfy the user compared to a 294 millisecond command? See _test->speed_ for more info. + +- Speed. Well... obviously, speed is important, but to what extent does a 29 millisecond command really satisfy the user compared to a 294 millisecond command? See _test->speed_ for more info. ```bash > time cat README.md | sed 's/a/x/g' > /dev/null cat myfile 0,00s user 0,00s system 45% cpu 0,011 total sed 's/a/x/g' > /dev/null 0,00s user 0,00s system 43% cpu 0,029 total -> time rr a x README.md -o > /dev/null +> time rr a x README.md -o > /dev/null rr x y myfile -o > /dev/null 0,21s user 0,04s system 86% cpu 0,294 total ``` - - - -## Test +## Test ### Regression + All CLI end to end tests are defined in [test/cli/run.sh](https://github.com/mathiasrw/rexreplace/blob/main/test/cli/run.sh) and all unit test are described in [`test/*.js`](https://github.com/mathiasrw/rexreplace/tree/main/test). After `git clone`'ing the repo and `npm install`'ing you can invoke them with: ```bash > npm test ``` -### Speed +## Performance -_**tl;dr**:_ +_**tl;dr**:_ _Files over 5 Mb are faster with `rr` than with `sed` - but - it does not matter as any file under 25 Mb has less than 0.7 seconds in difference._ -The speed test is initiated by `npm run test-speed`. The test takes files in different sizes and compares the processing time for RexReplace (`rr`) and the Unix tool `sed`. The test uses the sources of a website displaying [the book _1984_ by George Orwell](http://1984.surge.sh). The task for the tests is to remove all HTML tags by search-and-replace, so only the final text is left. The source is 888Kb, so all files up to 500Kb are generated directly from the source, while larger files are created by combining the first 500Kb several times. Each test runs 10 times to even out any temporary workload fluctuations. -Results from the latest speed test can always be seen in the [speed test log](https://github.com/mathiasrw/rexreplace/blob/main/test/speed/testlog.speed.md). +The speed test is initiated by `npm run test-speed`. The test takes files in different sizes and compares the processing time for RexReplace (`rr`) and the Unix tool `sed`. The test uses the sources of a website displaying [the book _1984_ by George Orwell](http://1984.surge.sh). The task for the tests is to remove all HTML tags by search-and-replace, so only the final text is left. The source is 888Kb, so all files up to 500Kb are generated directly from the source, while larger files are created by combining the first 500Kb several times. Each test runs 10 times to even out any temporary workload fluctuations. +Results from the latest speed test can always be seen in the [speed test log](https://github.com/mathiasrw/rexreplace/blob/main/test/speed/testlog.speed.md).

-The graph visualises speed as relative to fastest overall run (`sed` on a 1kb file). This chart also has [an interactive version in log scale](https://plot.ly/~mathiasrw/1.embed), so the details in the low end can be studied better. Interestingly files of 1Kb, 5Kb takes longer for `rr` than 10Kb files. +The graph visualises speed as relative to fastest overall run (`sed` on a 1kb file). This chart also has [an interactive version in log scale](https://plot.ly/~mathiasrw/1.embed), so the details in the low end can be studied better. Interestingly files of 1Kb, 5Kb takes longer for `rr` than 10Kb files. -Now, what is relevant to notice is how `sed` only takes 4.9 seconds longer for the 100Mb file - even if the difference looks drastic on the graph. +Now, what is relevant to notice is how `sed` only takes 4.9 seconds longer for the 100Mb file - even if the difference looks drastic on the graph. ``` Speed relative to fastest tool for each file size --------------------------------------------------- Bytes sed rr Time it took longer (seconds) -1 1 39 0,5 <= sed is 39x faster -5 1 32 0,4 +1 1 39 0,5 <= sed is 39x faster +5 1 32 0,4 10 1 27 0,4 100 1 19 0,3 500 1 7 0,3 @@ -306,7 +280,41 @@ Bytes sed rr Time it took longer (seconds) So even though the speed evolves very differently, there is only little practical use of the focus on speed for most use cases. Replacing in 10.000 small files? Use RexReplace and get yourself a cup of coffee - or spend half an hour getting `sed` to work as you want it to and enjoy the thrilling few seconds it takes to do its magic. -Please note that speeds might look very different when files get as large as the memory available. +Please note that speeds might look very different when files get as large as the memory available. + +Sure, I can help sharpen up the text for better clarity and impact. While I don't have specific knowledge about the rexreplace project, I understand the general idea conveyed in the text. Here's a revised version: + +--- + +Here's an improved version of the text for your README: + +### Tips and Tricks for Performance + +Reading many files multiple times is far more time-consuming than creating a complex regex and reading each file once. + +> **Anecdote time** +> +> Imagine you need to duplicate a set of files, but each duplicate must have unique keys. To achieve this, you can append `_v2` to each key in the duplicated files. Running a separate `rexreplace` command for each key is a reasoable approach. +> +> However, in a real-world scenario with 5,000 keys across 10,000 files, this approach took **57 minutes**. The bottleneck was identifying the 10,000 files 5,000 times, open + read each file 5000 times and the startup time of node x 5,000. +> +> Seeking to optimize performance we bundled all keys into a single regex search pattern like `(key1|key2|key3|...)'`. This resulted in a nasty 300KB one-line command but it reduced the runtime to **2.14 seconds**! +> +> ```sh +> # Separate commands for each key +> rexreplace key1 key1_v2 src/v2/**/*.* +> rexreplace key2 key2_v2 src/v2/**/*.* +> rexreplace key3 key3_v2 src/v2/**/*.* +> ... +> rexreplace key5000 key5000_v2 src/v2/**/*.* +> # Total time: 57 minutes +> +> # Single command for all keys +> rexreplace '(key1|key2|key3|...|key5000)' '$1_v2' src/v2/**/*.* +> # Total time: 2.14 seconds +> ``` +> +> Look, not all problems can be solved like this, but the moral is stil valid: Choosing the right approach can save you a significant amount of time. ## Rumours @@ -314,7 +322,6 @@ Please note that speeds might look very different when files get as large as the _.oO(What should "sed" have looked like by now?)_ - ### Future ideas - Default to RegExmoji lax syntax @@ -324,42 +331,40 @@ _.oO(What should "sed" have looked like by now?)_ - Let search and replace be within the names of the files (ask for overwriting. -Y = no questions) - Let search and replace be within the path of the files (ask for overwriting. -Y = no questions) - Let pattern and globs be piped +- Let pipe be placed into search or replace. - Let Pattern, replacement, and globs come from a file - Let pattern and glob be javascript code returning a string as the result - Auto string search / replace if no regex magic is used (and verify that speed is better) - Error != warning - Flag for String-literal (no regex, no special chars, no escape chars) to avoid backslashes or remembering which characters needs to be escaped - Check if https://github.com/eugeneware/replacestream is good to rely on -- Check if regex engine from spider monkey can be wrapped in something that does not need node +- Check if regex engine from spider monkey can be wrapped in something that does not need node - Check if sd can be wrapped in a WASM module - Set engine to RE2 https://www.npmjs.com/package/re2 - Set engine to run on streams with https://www.npmjs.com/package/replacestream - Implement in go so that all platforms can be supported with no need for node (might be based on) - Let https://github.com/dthree/vorpal deal with the interface? Or maybe https://www.npmjs.com/package/pretty-cli - ## Related projects Many projects are seeking to solve the same problem as RexReplace. I my oppinion they all lack the flexibility of the RexReplace CLI interface and diverse the replacement can be, but have other strong features. If our way does not suit you, we suggest you have a look at: - [sd](https://github.com/chmln/sd) - Blazingly fast! 5.9x **faster** than RexReplace. Almost perfect. Using _"Good ol' unix philosophy to the rescue."_ for pinpointing files so not always easy. Get it via cargo for Rust. -- [replace-in-file](https://www.npmjs.com/package/replace-in-file) - same speed as RexReplace. Very good support to be used as a module for a node application. A bit cumbersome CLI notation for pinpointing files. Get via npm. +- [replace-in-file](https://www.npmjs.com/package/replace-in-file) - same speed as RexReplace. Very good support to be used as a module for a node application. A bit cumbersome CLI notation for pinpointing files. Get via npm. - [replace-x](https://www.npmjs.com/package/replace-x) - 3.8x slower than RexReplace. A bit cumbersome CLI notation for pinpointing files. Get it via npm. - [replace](https://www.npmjs.com/package/replace) - 2.6x slower than RexReplace. Very chatty default output. A bit more cumbersome CLI notation for pinpointing files. Get it via npm. - ----- - +--- RexReplace mascot Benny on the RexReplace logBo -Please note that RexReplace is an [OPEN open source software](http://open-oss.com) project. +Please note that RexReplace is an [OPEN open source software](http://open-oss.com) project. This means that individuals making significant and valuable contributions are given commit access to the project to contribute as they see fit. This project is more like an open wiki than a standard guarded open source project. -[![OPEN open source software](https://img.shields.io/badge/Open--OSS-%E2%9C%94-brightgreen.svg)](http://open-oss.com) - +[![OPEN open source software](https://img.shields.io/badge/Open--OSS-%E2%9C%94-brightgreen.svg)](http://open-oss.com) _Icon inspired by Freepik from www.flaticon.com_ ## License + [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fmathiasrw%2Frexreplace.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fmathiasrw%2Frexreplace?ref=badge_large) diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 00000000..0ffc3afc Binary files /dev/null and b/bun.lockb differ diff --git a/legacy/.gitignore b/legacy/.gitignore deleted file mode 100644 index 1a58a1f0..00000000 --- a/legacy/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -myfile diff --git a/legacy/README.md b/legacy/README.md deleted file mode 100644 index f73da6a9..00000000 --- a/legacy/README.md +++ /dev/null @@ -1,39 +0,0 @@ -_This is the legacy version of [RexReplace](https://www.npmjs.com/package/rexreplace)_ - -# rreplace - -Regex replace in files from your CLI - with a tiny footprint. - -### Installation -```bash -> npm install -g rreplace -``` - -Works on any version of Node.js since 0.6 - -### Usage -```bash -> rreplace pattern replace filepath [regexFlags [encoding]] -``` - -- Pattern is a regex and may capture groups - -- Replacement may refer to captured groups. The first group is named `$1` - -- Filepath can only contain a path to one particular file (no globs) - -- Default is global case-insensitive multiline search (regexFlags is default `gmi`) - -- Default file encoding is `utf8` - -### Example - -```bash -> rreplace '(foo)(.*)' '$2$1' myfile.md - # 'foobar' is now 'barfoo' in myfile.md -``` - - ---- -MIT License - diff --git a/legacy/package.json b/legacy/package.json deleted file mode 100644 index aff4d55d..00000000 --- a/legacy/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "rreplace", - "version": "2.0.1", - "description": "Regex replace in a file from CLI.", - "main": "rreplace.js", - "scripts": { - "test": "npm install -g ./ && bash test.sh" - }, - "bin": { - "rreplace": "rreplace.js" - }, - "keywords": [ - "replace", - "in", - "files" - ], - "author": "MRW", - "license": "MIT" -} diff --git a/legacy/rreplace.js b/legacy/rreplace.js deleted file mode 100644 index ec3d6099..00000000 --- a/legacy/rreplace.js +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env node - -// This file must only be edited with 'vim' - -fs = require('fs'); - -var usage = "\n\n> " - + process.argv[1].split('/').pop() - + " pattern replace filepath [regexFlags [encoding]]" - + "\n" - + "\nDefault regexFlags is gmi" - + "\nDefault encoding is utf8" - ; - - -if(process.argv.length<5) - throw 'Too few arguments given.' + usage; - -if(7 myfile -rreplace '(F?(O))O(.*)' '$3$1$2' myfile -grep -q 'barfoo' myfile || exit 101 - -echo 'foobar' > myfile -rreplace '(F?(O))O(.*)' '$3$1$2' myfile gm utf8 -grep -q 'foobar' myfile || exit 102 diff --git a/package.json b/package.json index 999a129b..6209da04 100644 --- a/package.json +++ b/package.json @@ -1,35 +1,36 @@ { "name": "rexreplace", - "version": "7.1.4", - "description": "Smooth search & replace across files from the CLI | 🔎 🔃 📄", + "version": "8.0.0-dev", + "description": "Search & replace across files with a CLI tool that makes you trust what you are doing.", "author": "Mathias Rangel Wulff", "license": "MIT", + "type": "module", "main": "src/engine.js", "repository": { "type": "git", "url": "git+https://github.com/mathiasrw/rexreplace.git" }, "bin": { - "rr": "bin/rexreplace.cli.js", - "rexreplace": "bin/rexreplace.cli.js" + "rr": "src/env/bun.ts", + "rexreplace_node": "bin/rexreplace.cli.js", + "rexreplace": "src/env/bun.ts" }, "scripts": { "test": "yarn build && yarn test-cli && yarn test-js", - "postbuild": "cp bin/rexreplace.cli.js bin/rexreplace.cli.min.js", "version": "yarn build-minify", "build": "yarn build-only", - "build-only": "tsc src/cli --outDir bin/ES6 -t ES6 && rollup -c", - "build-minify": "yarn build && yarn minify", - "minify": "# echo '#!/usr/bin/env node' > bin/rexreplace.cli.min.js && npx google-closure-compiler --js=bin/rexreplace.cli.js >> bin/rexreplace.cli.min.js", - "prebuild": "rm -fr bin && yarn format", + "postbuild": "npx rexreplace@7 '^(#!.+\\n)?' '$1import { createRequire as createImportMetaRequire } from 'module'; import.meta.require ||= (id) => createImportMetaRequire(import.meta.url)(id);\\n' -GM bin/rexreplace.cli.js && cp bin/rexreplace.cli.js bin/rexreplace.cli.min.js", + "build-only": "swc src/ -d dist/ && bun build --target node src/env/node.ts --outfile bin/rexreplace.cli.js ", + "build-minify": "bun build --target node src/env/node.ts --outfile bin/rexreplace.cli.min.js --minify", + "prebuild": "rm -fr bin dist # && yarn format", "test-js": "echo todo: async mocha", "test-minify": "yarn build-minify && yarn test-cli && yarn test-js", - "test-cli": "npm uninstall -g rexreplace && npm -g install ./ && yarn test-cli-only", + "test-cli": "(true || (npm uninstall -g rexreplace && npm -g install ./)) && yarn test-cli-only", "test-cli-only": "bash test/cli/run.sh", "test-speed": "bash test/speed/run.sh", "prepublishOnly": "yarn is-git-clean && git fetch && git rebase origin/main && yarn test-minify && yarn load-options && yarn bump", "postpublish": "git push --tag && git push && (open https://github.com/mathiasrw/rexreplace/releases || 1)", - "load-options": "rr -h | rr 'Options:(.+)Examples:' _ -ms | rr '\\n {26,}|\\n\\n *' ' ' | rr \"'\" '`' | rr '^ (-.+?), (--[^ ]+) *' '`€1` | **`€2`** ' | rr '(^---- . ----).+?(## Good to know)' '€1 + nl + pipe + nl + nl + €2' readme.md -jsT", + "load-options": "rr -h | rr 'Options:(.+)Examples:' _ -ms | rr '§n {26,}|§n§n *' ' ' | rr \"'\" '`' | rr '^ (-.+?), (--[^ ]+) *' '`€1` | **`€2`** ' | rr '(^---- . ----).+?(## Good to know)' '€1 + nl + pipe + nl + nl + €2' readme.md -jsT", "test-format": "yarn prettier --list-different || (echo 'Please correct file formatting using `yarn format` and try again.' && exit 1)", "format": "yarn prettier --write", "prettier": "prettier '{src,test}/**/*.{scss,css,js,ts}'", @@ -46,22 +47,19 @@ "sed" ], "devDependencies": { - "@rollup/plugin-commonjs": "26.0.1", - "@rollup/plugin-node-resolve": "15.2.3", - "@rollup/plugin-replace": "5.0.7", - "@rollup/plugin-swc": "^0.3.1", - "@swc/core": "^1.7.11", - "@types/node": "20.8.3", + "@swc/cli": "^0.1.62", + "@swc/core": "^1.3.90", + "@types/node": "^20.6.2", + "@types/yargs": "^17.0.24", "assert": "^2.0.0", - "mocha": "10.7.3", - "prettier": "3.3.3", - "rollup": "2.79.1", - "rollup-plugin-closure-compiler-js": "^1.0.6", - "rollup-plugin-progress": "1.1.2", - "rollup-plugin-typescript3": "3.0.5", - "typescript": "5.5.4", + "bun-types": "^1.0.2", + "magic-string": "0.30.3", + "mocha": "10.2.0", + "prettier": "3.0.3", + "ts-node": "^10.9.1", + "typescript": "5.2.2", "version-bump-prompt": "6.1.0", - "yarn": "1.22.22" + "yarn": "1.22.19" }, "resolutions": { "ansi-regex": "6", @@ -72,9 +70,11 @@ "test": "test" }, "dependencies": { + "argmate": "^0.6.0", + "chalk": "^5.3.0", + "fast-glob": "^3.3.1", "fs-extra": "^11.1.1", - "globs": "0.1.4", - "yargs": "16.2.0" + "globs": "0.1.4" }, "prettier": { "useTabs": true, diff --git a/rollup.config.js b/rollup.config.js index 46d2955d..6363dbd1 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -21,7 +21,7 @@ import resolve from '@rollup/plugin-node-resolve'; export default [ { // input: 'src/cli.ts', - input: 'bin/ES6/cli.js', + input: 'bin/ES6/env/node.js', output: { name: 'rexreplace', file: 'bin/rexreplace.cli.js', diff --git a/src/cli.ts b/src/cli.ts index 10e66506..033e0f89 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,216 +1,230 @@ -// CLI interface for rexreplace +/// -import * as rexreplace from './engine'; +import yargs from 'yargs'; +import argMate /*paramInfo*/ from 'argmate'; +import * as rexreplace from './engine.ts'; -let pattern, replacement; +import {chat, debug, die, warn, info, outputConfig, step} from './output.ts'; -// To avoid problems with patterns or replacements starting with '-' the two first arguments can not contain flags and are removed before yargs does it magic - but we still need to handle -version and -help -let needHelp = 0; -if (process.argv.length < 4) { - if (/-v|--?version$/i.test(process.argv[process.argv.length - 1])) { - console.log(rexreplace.version); - process.exitCode = 0; - process.exit(); - } else if (/-h|--?help$/i.test(process.argv[process.argv.length - 1])) { - needHelp = 1; +const re = { + nl: /\r?\n/, + + unescape: /'/g, +}; + +//executeReplacement(cli2conf(process.argv.slice(2)), null); + +export function cli2conf(runtime: Runtime, args: string[]) { + let pattern, replacement; + + // To avoid problems with patterns or replacements starting with '-' so the two first arguments can not contain flags and are removed before yargs does it magic - but we still need to handle -version and -help + let needHelp = 0; + if (args.length < 2) { + if (/-v|--?version$/i.test(args.slice(-1)[0])) { + console.log(rexreplace.version); + runtime.exit(0); + } else if (/-h|--?help$/i.test(args.slice(-1)[0])) { + needHelp = 1; + } else { + needHelp = 2; + } } else { - needHelp = 2; + [pattern, replacement] = args.splice(0, 2); } -} else { - [pattern, replacement] = process.argv.splice(2, 2); -} -const yargs = require('yargs') - .strict() - - .usage( - 'RexReplace ' + - rexreplace.version + - ': Regexp search and replace for files using lookahead and backreference to matching groups in the replacement. Defaults to global multiline case-insensitive search.\n\n' + - '> rexreplace pattern replacement [fileGlob|option]+' - ) - - .example(`> rexreplace 'Foo' 'xxx' myfile.md`, `'foobar' in myfile.md will become 'xxxbar'`) - .example('') - .example(`> rr xxx Foo myfile.md`, `The alias 'rr' can be used instead of 'rexreplace'`) - .example('') - - .example( - `> rexreplace '(f?(o))o(.*)' '$3$1€2' myfile.md`, - `'foobar' in myfile.md will become 'barfoo'` - ) - .example('') - .example( - `> rexreplace '^#' '##' *.md`, - `All markdown files in this dir got all headlines moved one level deeper` - ) - .example('') - .example( - `> rexreplace 'a' 'b' 'myfile.md' 'src/**/*.*' `, - `Provide multiple files or glob if needed` - ) - .version('v', 'Print rexreplace version (can be given as only argument)', rexreplace.version) - .alias('v', 'version') - - .boolean('V') - .describe('V', 'More chatty output') - .alias('V', 'verbose') - //.conflicts('V', 'q') - //.conflicts('V', 'Q') - - .boolean('L') - .describe('L', 'Literal string search (no regex used when searching)') - .alias('L', 'literal') - - .boolean('I') - .describe('I', 'Void case insensitive search pattern.') - .alias('I', 'void-ignore-case') - - .boolean('G') - .describe('G', 'Void global search (stop looking after the first match).') - .alias('G', 'void-global') - - .boolean('s') - .describe('s', 'Have `.` also match newline.') - .alias('s', 'dot-all') - - .boolean('M') - .describe( - 'M', - 'Void multiline search pattern. Makes ^ and $ match start/end of whole content rather than each line.' - ) - .alias('M', 'void-multiline') - - .boolean('u') - .describe('u', 'Treat pattern as a sequence of unicode code points.') - .alias('u', 'unicode') - - .default('e', 'utf8') - .alias('e', 'encoding') - .describe('e', 'Encoding of files/piped data.') - - .alias('E', 'engine') - .describe('E', 'What regex engine to use:') - .choices('E', ['V8' /*'RE2' /*'sd', 'stream'*/]) - .default('E', 'V8') - - .boolean('q') - .describe('q', 'Only display errors (no other info)') - .alias('q', 'quiet') - - .boolean('Q') - .describe('Q', 'Never display errors or info') - .alias('Q', 'quiet-total') - - .boolean('H') - .describe('H', 'Halt on first error') - .alias('H', 'halt') - .default('H', false) - - .boolean('d') - .describe('d', 'Print debug info') - .alias('d', 'debug') - - .boolean('€') - .describe('€', "Void having '€' as alias for '$' in pattern and replacement parameters") - .alias('€', 'void-euro') - - .boolean('§') - .describe('§', "Void having '§' as alias for '\\' in pattern and replacement parameters") - .alias('§', 'void-section') - - .boolean('o') - .describe( - 'o', - 'Output the final result instead of saving to file. Will also output content even if no replacement has taken place.' - ) - .alias('o', 'output') - //.conflicts('o','O') - - .boolean('A') - .alias('A', 'void-async') - .describe( - 'A', - `Handle files in a synchronous flow. Good to limit memory usage when handling large files. ` + - '' - ) - - .boolean('B') - .describe( - 'B', - 'Avoid temporary backing up file. Works async (independent of -A flag) and will speed up things but at one point data lives only in memory, and you might lose data if the process is halted.' - ) - .alias('B', 'void-backup') - - .boolean('b') - .describe('b', 'Keep a backup file of the original content.') - .alias('b', 'keep-backup') - - .boolean('m') - .describe( - 'm', - `Output each match on a new line. ` + - `Will not replace any content but you still need to provide a dummy value (like \`_\`) as replacement parameter. ` + - `If search pattern does not contain matching groups the full match will be outputted. ` + - `If search pattern _does_ contain matching groups only matching groups will be outputted (same line with no delimiter). ` + - `` - ) - .alias('m', 'output-match') - - .boolean('T') - .alias('T', 'trim-pipe') - .describe( - 'T', - `Trim piped data before processing. ` + - `If piped data only consists of chars that can be trimmed (new line, space, tabs...) it will become an empty string. ` + - '' - ) - - .boolean('R') - .alias('R', 'replacement-pipe') - .describe( - 'R', - `Replacement will be piped in. You still need to provide a dummy value (like \`_\`) as replacement parameter.` + - '' - ) - - .string('x') - .describe( - 'x', - 'Exclude files with a path that matches this regular expression. Will follow same regex flags and setup as the main search. Can be used multiple times.' - ) - .alias('x', 'exclude-re') - - .string('X') - .describe('X', 'Exclude files found with this glob. Can be used multiple times.') - .alias('X', 'exclude-glob') - - /* - - + const argv = argMate( + args, + { + version: { + describe: 'Print rexreplace version (can be given as only argument)', + alias: 'v', + }, + + voidIgnoreCase: { + describe: 'Void case insensitive search pattern.', + alias: 'I', + }, + + voidGlobal: { + describe: 'Void global search (stop looking after the first match).', + alias: 'G', + }, + + voidMultiline: { + describe: + 'Void multiline search pattern. Makes ^ and $ match start/end of whole content rather than each line.', + alias: 'M', + }, + + dotAll: { + alias: 's', + describe: 'Have `.` also match newline.', + }, + + unicode: { + describe: 'Treat pattern as a sequence of unicode code points.', + alias: 'u', + }, + + encoding: { + default: 'utf8', + alias: 'e', + describe: 'Encoding of files/piped data.', + }, + + engine: { + alias: 'E', + describe: 'What regex engine to use:', + default: 'V8', + valid: ['V8' /*'RE2' /*'sd', 'stream'*/], + }, + + literal: { + alias: 'L', + describe: 'Literal string search (no regex used when searching)', + }, + + voidEuro: { + alias: '€', + describe: "Void having '€' as alias for '$' in pattern and replacement parameters", + }, + + voidSection: { + alias: '§', + describe: "Void having '§' as alias for '\\' in pattern and replacement parameters", + }, + + voidAsync: { + alias: 'A', + describe: `Handle files in a synchronous flow. Good to limit memory usage when handling large files. `, + }, + + halt: { + alias: ['H', 'bail'], + describe: 'Halt on first error', + default: false, + }, + + quiet: { + alias: 'q', + describe: 'Only display errors (no other info)', + }, + + quietTotal: { + alias: 'Q', + describe: 'Never display any errors or info', + }, + + voidBackup: { + alias: 'B', + describe: + 'Avoid temporary backing up files. Works async (independent of -A flag) and will speed up things but at one point data lives only in memory, and you might lose data if the process is forced closed.', + }, + + keepBackup: { + describe: 'Keep the backup file with the original content.', + alias: 'b', + }, + + output: { + alias: 'o', + describe: + 'Output the final result instead of saving to file. Will output the full content even if no replacement has taken place.', + //conflict:'O' + }, + + outputMatch: { + alias: 'm', + describe: + `Output each match on a new line. ` + + `Will not replace any content but you still need to provide a dummy value (like \`_\`) as replacement parameter. ` + + `If search pattern does not contain matching groups the full match will be outputted. ` + + `If search pattern _does_ contain matching groups only matching groups will be outputted (same line with no delimiter). ` + + ``, + }, + + trimPipe: { + alias: 'T', + describe: + `Trim piped data before processing. ` + + `If piped data only consists of chars that can be trimmed (new line, space, tabs...) it will become an empty string. ` + + '', + }, + + replacementPipe: { + alias: 'R', + describe: `Replacement is being piped in. You still need to provide a dummy value (like \`_\`) as replacement parameter.`, + conflict: ['g', 'G'], + }, + + globPipe: { + alias: 'g', + describe: + 'Filename/globs will be piped in. If filename/globs are provided in command (-X flags are ok) the execution will halt', + conflict: ['G'], + }, + + /* .boolean('G') + .describe('G', "filename/globs provided are to files containing one target filename/glob per line") + .alias('G', 'glob-file') + .conflicts('G','g')*/ + + simulate: { + alias: 'S', + describe: 'Simulate output without changing any files', + }, + + excludeRe: { + alias: 'x', + decsribe: + 'Exclude files with a path that matches this regular expression. Will follow same regex flags and setup as the main search. Can be used multiple times.', + type: 'string[]', + }, + + excludeGlob: { + alias: 'X', + decsribe: 'Exclude files found with this glob. Can be used multiple times.', + type: 'string[]', + }, + + verbose: { + alias: 'V', + descrube: 'More chatty output', + }, + + debug: { + alias: 'd', + describe: 'Print debug info', + //.conflicts('V', 'q') + //.conflicts('V', 'Q') + }, + + /* + + -T (Expect no match in any file and return exit 1 if found) -t (Expect a match in each file and return exit 1 if not found) - + .boolean('N') .alias('N', 'void-newline') - .describe('N', + .describe('N', `Avoid having newline when outputting data (or when piping). `+ `Normally . `+ '' ) - - + + .boolean('p') .describe('p', "Pattern is the path to a filename containing the pattern. If more than one line is found in the file the pattern will be defined by each line trimmed and having newlines removed followed by other all rules (like -€).)") .alias('p', 'pattern-file') - - .boolean('R') - .alias('R', 'replacement-file') - .describe('R', - `Replacement is the path to a filename containing the replacement`.`Will be followed by other all rules (like -€)` + + .boolean('r') + .alias('r', 'replacement-file') + .describe('r', + `Replacement is the path to a filename containing the replacement`.`Will run before any other rules (like -€)` ) @@ -226,14 +240,7 @@ const yargs = require('yargs') .default('M', false) - - .boolean('G') - .describe('G', "filename/globas are filename(s) for files containing one filename/globs on each line to be search/replaced") - .alias('G', 'globs-file') - .boolean('g') - .describe('g', "filename/globs will be piped in. If any filename/globs are given in command the piped data will be prepened") - .alias('g', 'glob-pipe') .boolean('J') @@ -247,129 +254,168 @@ const yargs = require('yargs') */ - .boolean('j') - .alias('j', 'replacement-js') - .describe( - 'j', - `Treat replacement as javascript source code. - The statement from the last expression will become the replacement string. - Purposefully implemented the most insecure way possible to remove _any_ incentive to consider running code from an untrusted part. - The full match will be available as a javascript variable named $0 while each captured group will be available as $1, $2, $3, ... and so on. - At some point, the $ char _will_ give you a headache when used from the command line, so use €0, €1, €2, €3... instead. - If the javascript source code references to the full match or a captured group the code will run once per match. Otherwise, it will run once per file. - - The code has access to the following variables: - \`r\` as an alias for \`require\` with both expanded to understand a relative path even if it is not starting with \`./\`, - \`fs\` from node, - \`path\` from node, - \`globs\` from npm, - \`pipe\`: the data piped into the command (null if no piped data), - \`find\`: pattern searched for (the needle), - \`text\`: full text being searched i.e. file content or piped data (the haystack), - \`bytes\`: total size of the haystack in bytes, - \`size\`: human-friendly representation of the total size of the haystack, - \`time\`: String representing the local time when the command was invoked, - \`time_obj\`: date object representing \`time\`, - \`now\`: alias for \`time\`, - \`cwd\`: current process working dir, - \`nl\`: a new-line char, - \`_\`: a single space char (for easy string concatenation). - - The following values defaults to \`❌\` if haystack does not originate from a file: - \`file\`: contains the full path of the active file being searched (including full filename), - \`file_rel\`: contains \`file\` relative to current process working dir, - \`dirpath\`: contains the full path without filename of the active file being searched, - \`dirpath_rel\`: contains \`dirpath\` relative to current process working dir, - \`filename\`: is the full filename of the active file being searched without path, - \`name\`: filename of the active file being searched with no extension, - \`ext\`: extension of the filename including leading dot, - \`mtime\`: ISO inspired representation of the last local modification time of the current file, - \`ctime\`: ISO representation of the local creation time of the current file. - \`mtime_obj\`: date object representing \`mtime\`, - \`ctime_obj\`: date object representing \`ctime\`. - - All variables, except from module, date objects, \`nl\` and \`_\`, has a corresponding variable name followed by \`_\` where the content has an extra space at the end (for easy concatenation). - ` - ) - .help('h') - .describe('h', 'Display help.') - .alias('h', 'help') - - .epilog(`Inspiration: .oO(What should 'sed' have been by now?)`); - -function backOut(exitcode = 1) { - const help = yargs.showHelp(); - const io = exitcode ? console.error : console.log; - //io(help); - process.exitCode = exitcode; - process.exit(); + replacementJs: { + alias: ['j', 'js'], + + describe: `Treat replacement as javascript source code. + The statement from the last expression will become the replacement string. + Purposefully implemented the most insecure way possible to remove _any_ incentive to consider running code from an untrusted party. + The full match will be available as a javascript variable named $0 while each captured group will be available as $1, $2, $3, ... and so on. + At some point, the $ char _will_ give you a headache when used from the command line, so use €0, €1, €2, €3... instead. + If the javascript source code references to the full match or a captured group the code will run once per match. Otherwise, it will run once per file. + + The code has access to the following variables: + \`r\` as an alias for \`require\` with both expanded to understand a relative path even if it is not starting with \`./\`, + \`fs\` from node, + \`path\` from node, + \`glob\` proxy name for the .sync function of fast-glob from npm, + \`pipe\`: the data piped into the command (null if no piped data), + \`find\`: pattern searched for (the needle), + \`text\`: full text being searched i.e. file content or piped data (the haystack), + \`bytes\`: total size of the haystack in bytes, + \`size\`: human-friendly representation of the total size of the haystack, + \`time\`: String representing the local time when the command was invoked, + \`time_obj\`: date object representing \`time\`, + \`now\`: alias for \`time\`, + \`cwd\`: current process working dir, + \`nl\`: a new-line char, + \`_\`: a single space char (for easy string concatenation). + + The following values defaults to \`❌\` if haystack does not originate from a file: + \`file\`: contains the full path of the active file being searched (including full filename), + \`file_rel\`: contains \`file\` relative to current process working dir, + \`dirpath\`: contains the full path without filename of the active file being searched, + \`dirpath_rel\`: contains \`dirpath\` relative to current process working dir, + \`filename\`: is the full filename of the active file being searched without path, + \`name\`: filename of the active file being searched with no extension, + \`ext\`: extension of the filename including leading dot, + \`mtime\`: ISO inspired representation of the last local modification time of the current file, + \`ctime\`: ISO representation of the local creation time of the current file. + \`mtime_obj\`: date object representing \`mtime\`, + \`ctime_obj\`: date object representing \`ctime\`. + + All variables, except from module, date objects, \`nl\` and \`_\`, has a corresponding variable name followed by \`_\` where the content has an extra space at the end (for easy concatenation). + `.replaceAll(/\s+/g, ' '), + }, + + help: { + alias: 'h', + descriubie: 'Display help.', + }, + }, + { + /* +intro: usage( + '$0 v' + + rexreplace.version + + '\n\nRegexp search and replace for files using lookahead and backreference to matching groups in the replacement. Defaults to global multiline case-insensitive search.\n\n' + + '> rexreplace pattern replacement [fileGlob|option]+' + )*/ + /* + +outro: + .example(`> rexreplace 'Foo' 'xxx' myfile.md`, `'foobar' in myfile.md will become 'xxxbar'`) + .example(`> rr xxx Foo myfile.md`, `The alias 'rr' can be used instead of 'rexreplace'`) + + .example( + `> rexreplace '(f?(o))o(.*)' '$3$1€2' myfile.md`, + `'foobar' in myfile.md will become 'barfoo'` + ) + .example( + `> rexreplace '^#' '##' *.md`, + `All markdown files in this dir got all headlines moved one level deeper` + ) + .example( + `> rexreplace 'a' 'b' 'myfile.md' 'src/** /*.*' `, + `Provide multiple files or globs if needed` + ) + + .epilog(`Inspiration: .oO(What should 'sed' have been by now?)`) + +*/ + } + ); + + // All options into one big config object for the rexreplace engine + let conf: any = argv; + + conf.showHelp = () => { + console.log('helpText()'); + process.exit(); + }; + conf.needHelp = needHelp; + conf.pattern = pattern; + conf.replacement = replacement; + conf.includeGlob = argv._; + conf.excludeGlob = argv.excludeGlob.filter(Boolean); + conf.excludeRe = argv.excludeRe.filter(Boolean); + + if (!conf.replacementJs) { + conf.replacement = unescapeString(conf.replacement); + } + + return conf; } function unescapeString(str = '') { - return new Function(`return '${str.replace(/'/g, "\\'")}'`)(); + return new Function(`return '${str.replace(re.unescape, "\\'")}'`)(); } -(function () { - if (0 < needHelp) { - return backOut(needHelp - 1); +export function executeReplacement(runtime: Runtime, conf, pipeData: string = null) { + if (0 < conf.needHelp) { + conf.showHelp(); + runtime.exit(conf.needHelp - 1); } - // All options into one big config object for the rexreplace core - let config: any = {}; + if (null === pipeData) return rexreplace.engine(runtime, conf); - // Use only camelCase full lenght version of settings so we make sure the core can be documented propperly - Object.keys(yargs.argv).forEach((key) => { - if (1 < key.length && key.indexOf('-') < 0) { - config[key] = yargs.argv[key]; + if (conf.trimPipe) { + pipeData = pipeData.trim(); + } + + if (conf.replacementPipe) { + step('Replacement from pipe'); + + if (null === pipeData) { + return die('You asked the piped data to be used as replacement - but no data arrived.'); } - }); - - let pipeInUse = false; - let pipeData = ''; - - config.pipedData = null; - config.showHelp = yargs.showHelp; - config.pattern = pattern; - config.includeGlob = yargs.argv._; - config.excludeGlob = [...yargs.argv.excludeGlob].filter(Boolean); - config.excludeRe = [...yargs.argv.excludeRe].filter(Boolean); - if (config.replacementJs) { - config.replacement = replacement; - } else { - config.replacement = unescapeString(replacement); + + conf.replacement = pipeData; + + if (conf.replacementJs) conf.pipeData = pipeData; + + return rexreplace.engine(runtime, conf); } - /*if(Boolean(process.stdout.isTTY)){ - config.output = true; - }*/ - if (Boolean(process.stdin.isTTY)) { - if (config.replacementPipe) { - return backOut(); + if (conf.globPipe) { + step('globs from pipe'); + + if (null === conf.pipeData) { + return die( + 'You asked the piped data to be use as files/globs to include - but no data arrived.' + ); } - rexreplace.engine(config); - } else { - process.stdin.setEncoding(config.encoding); - - process.stdin.on('readable', () => { - let chunk = process.stdin.read(); - - if (null !== chunk) { - pipeInUse = true; - pipeData += chunk; - while ((chunk = process.stdin.read())) { - pipeData += chunk; - } - } - }); - - process.stdin.on('end', () => { - if (pipeInUse) { - if (yargs.argv.trimPipe) { - pipeData = pipeData.trim(); - } - config.pipedData = pipeData; - } - rexreplace.engine(config); - }); + + if (conf.includeGlob.length) { + return die('Please pipe file/globs to include OR provide them as as parameters. Not both.'); + } + + conf.globs = pipeData.split(re.nl).filter(Boolean); + + if (conf.replacementJs) conf.pipeData = pipeData; + + return rexreplace.engine(runtime, conf); } -})(); + + if (conf.includeGlob.length && !conf.replacementJs && '' !== pipeData && '\n' !== pipeData) { + return warn( + `${conf.includeGlob.length} file paths / globs provided. \n Data is also being piped in, but with no flags indicating how to deal with it.\n Pipe data will be ignored for now, but check if this is actually what you intended to do.` + ); + } + + step('Content being piped'); + conf.pipeData = pipeData; + conf.output = true; + process.stdout.setDefaultEncoding(conf.encoding); + return rexreplace.engine(runtime, conf); +} diff --git a/src/engine.ts b/src/engine.ts index 4c81b773..0783ce79 100644 --- a/src/engine.ts +++ b/src/engine.ts @@ -2,11 +2,12 @@ const fs = require('fs-extra'); const path = require('path'); +const fGlob = require('fast-glob'); const globs = require('globs'); const now = new Date(); -import {outputConfig, step, debug, chat, info, error, die} from './output'; +import {chat, debug, die, error, info, outputConfig, step} from './output.ts'; const re = { euro: /€/g, @@ -21,122 +22,134 @@ const re = { export const version = 'PACKAGE_VERSION'; -export function engine(config: any = {engine: 'V8'}) { - outputConfig(config); +let runtime: Runtime; + +export function engine(_runtime: Runtime, conf: any = {engine: 'V8'}) { + runtime = _runtime; + + outputConfig(conf); step('Displaying steps for:'); - step(config); + step(conf); - config.pattern = getFinalPattern(config.pattern, config) || ''; + conf.pattern = getPattern(conf.pattern, conf) || ''; - config.replacement = getFinalReplacement(config.replacement, config) || ''; + conf.replacement = getReplacement(conf.replacement, conf) || ''; - config.replacementOri = config.replacement; + if (conf.replacementJs) conf.replacementOri = conf.replacement; - config.regex = getFinalRegex(config.pattern, config) || ''; + conf.regex = getRegex(conf.pattern, conf) || ''; - step(config); + step(conf); - if (handlePipedData(config)) { - return doReplacement('Piped data', config, config.pipedData); - } + conf.files = getFilePaths(conf); - config.files = getFilePaths(config); + if (!conf.files.length) { + if (null !== conf.pipeData) { + return doReplacement('[pipe-data]', conf, conf.pipeData); + } - if (!config.files.length) { - return error(config.files.length + ' files found'); + return error(conf.files.length + ' files found'); } - chat(config.files.length + ' files found'); + chat(conf.files.length + ' files found'); - step(config); + step(conf); - config.files - // Correct filepath - //.map(filepath=>path.normalize(process.cwd()+'/'+filepath)) + conf.files // Find out if any filepaths are invalid - .filter((filepath) => (fs.existsSync(filepath) ? true : error('File not found:', filepath))) + .filter((filepath) => { + if (fs.statSync(filepath).isFile()) { + return true; + } + debug('Not a valid file:', filepath); + return false; + }) // Do the replacement - .forEach((filepath) => openFile(filepath, config)); + .forEach((filepath) => openFile(filepath, conf)); } -function openFile(file, config) { - if (config.voidAsync) { +function openFile(file, conf) { + if (conf.voidAsync) { chat('Open sync: ' + file); - var data = fs.readFileSync(file, config.encoding); - return doReplacement(file, config, data); - } else { - chat('Open async: ' + file); - fs.readFile(file, config.encoding, function (err, data) { - if (err) { - return error(err); - } - - return doReplacement(file, config, data); - }); + var data = runtime.fileReadSync(file, conf.encoding); + return doReplacement(file, conf, data); } + + chat('Open async: ' + file); + + fs.readFile(file, conf.encoding, function (err, data) { + if (err) { + return error(err); + } + return doReplacement(file, conf, data); + }); } // postfix argument names to limit the probabillity of user inputted javascript accidently using same values -function doReplacement(_file_rr: string, _config_rr: any, _data_rr: string) { - debug('Work on content from: ' + _file_rr); +function doReplacement(filePath: string, conf: any, content: string) { + debug('Work on content from: ' + filePath); // Variables to be accessible from js. - if (_config_rr.replacementJs) { - _config_rr.replacement = dynamicReplacement(_file_rr, _config_rr, _data_rr); + if (conf.replacementJs) { + conf.replacement = dynamicReplacement(filePath, conf, content); } - // Main regexp of the whole thing - const result = _data_rr.replace(_config_rr.regex, _config_rr.replacement); + // Main regexp doing the replacement + const result = content.replace(conf.regex, conf.replacement); // The output of matched strings is done from the replacement, so no need to continue - if (_config_rr.outputMatch) { + if (conf.outputMatch) { return; } - if (_config_rr.output) { - debug('Output result from: ' + _file_rr); + if (conf.output) { + if (conf.verbose || conf.debug) { + console.error(filePath); + } return process.stdout.write(result); } // Nothing replaced = no need for writing file again - if (result === _data_rr) { - chat('Nothing changed in: ' + _file_rr); + if (result === content) { + debug('Nothing changed in: ' + filePath); return; } // Release the memory while storing files - _data_rr = ''; + content = ''; - debug('Write new content to: ' + _file_rr); + if (conf.simulate) return info(filePath); + + debug('Write updated content to: ' + filePath); // Write directly to the same file (if the process is killed all new and old data is lost) - if (_config_rr.voidBackup) { - return fs.writeFile(_file_rr, result, _config_rr.encoding, function (err) { + if (conf.voidBackup) { + return fs.writeFile(filePath, result, conf.encoding, function (err) { if (err) { return error(err); } - info(_file_rr); + return info(filePath); }); } //Make sure data is always on disk - const oriFile = path.normalize(path.join(process.cwd(), _file_rr)); + const oriFile = path.normalize(path.join(process.cwd(), filePath)); const salt = new Date().toISOString().replace(re.colon, '_').replace('Z', ''); const backupFile = oriFile + '.' + salt + '.backup'; - if (_config_rr.voidAsync) { + if (conf.voidAsync) { try { fs.renameSync(oriFile, backupFile); - fs.writeFileSync(oriFile, result, _config_rr.encoding); - if (!_config_rr.keepBackup) { + fs.writeFileSync(oriFile, result, conf.encoding); + if (!conf.keepBackup) { fs.unlinkSync(backupFile); } } catch (e) { return error(e); } - return info(_file_rr); + return info(filePath); } // Let me know when fs gets promise'fied @@ -145,46 +158,26 @@ function doReplacement(_file_rr: string, _config_rr: any, _data_rr: string) { return error(err); } - fs.writeFile(oriFile, result, _config_rr.encoding, (err) => { + fs.writeFile(oriFile, result, conf.encoding, (err) => { if (err) { return error(err); } - if (!_config_rr.keepBackup) { - fs.unlink(backupFile, (err) => { + if (!conf.keepBackup) { + return fs.unlink(backupFile, (err) => { if (err) { return error(err); } - info(_file_rr); + return info(filePath); }); - } else { - info(_file_rr); } + + return info(filePath); }); }); } -function handlePipedData(config) { - step('Check Piped Data'); - - if (config.includeGlob.length) { - if (!config.replacementJs && config.pipedData) { - chat('Piped data never used.'); - } - - return false; - } - - if (null !== config.pipedData && !config.pipedDataUsed) { - config.dataIsPiped = true; - config.output = true; - return true; - } - - return false; -} - -function getFinalPattern(pattern, conf: any) { +function getPattern(pattern, conf: any) { step('Get final pattern'); pattern = replacePlaceholders(pattern, conf); @@ -194,14 +187,14 @@ function getFinalPattern(pattern, conf: any) { /*if (config.patternFile) { pattern = fs.readFileSync(pattern, 'utf8'); - pattern = new Function('return '+pattern)(); + pattern = new Function('return '+pattern)(); // js code?!? }*/ step(pattern); return pattern; } -function getFinalReplacement(replacement, conf: any) { +function getReplacement(replacement, conf: any) { step('Get final replacement'); /*if(config.replacementFile){ return oneLinerFromFile(fs.readFileSync(replacement,'utf8')); @@ -209,15 +202,6 @@ function getFinalReplacement(replacement, conf: any) { replacement = replacePlaceholders(replacement, conf); - if (conf.replacementPipe) { - step('Piping replacement'); - conf.pipedDataUsed = true; - if (null === conf.pipedData) { - return die('No data piped into replacement'); - } - replacement = conf.pipedData; - } - if (conf.outputMatch) { step('Output match'); @@ -243,7 +227,6 @@ function getFinalReplacement(replacement, conf: any) { } // If captured groups then run dynamicly - //console.log(process); if ( conf.replacementJs && re.capturedGroupRef.test(conf.replacement) && @@ -267,19 +250,19 @@ function getFinalReplacement(replacement, conf: any) { }).join(' '); }*/ -function getFinalRegex(pattern, config) { - step('Get final regex with engine: ' + config.engine); +function getRegex(pattern, conf) { + step('Get final regex with engine: ' + conf.engine); let regex; - let flags = getFlags(config); + let flags = getFlags(conf); - switch (config.engine) { + switch (conf.engine) { case 'V8': try { regex = new RegExp(pattern, flags); } catch (e) { - if (config.debug) throw new Error(e); + if (conf.debug) throw new Error(e); die(e.message); } break; @@ -288,12 +271,12 @@ function getFinalRegex(pattern, config) { const RE2 = require('re2'); regex = new RE2(pattern, flags); } catch (e) { - if (config.debug) throw new Error(e); + if (conf.debug) throw new Error(e); die(e.message); } break; default: - die(`Engine ${config.engine} not supported`); + die(`Engine ${conf.engine} not supported`); } step(regex); @@ -301,28 +284,28 @@ function getFinalRegex(pattern, config) { return regex; } -function getFlags(config) { +function getFlags(conf) { step('Get flags'); let flags = ''; - if (!config.voidGlobal) { + if (!conf.voidGlobal) { flags += 'g'; } - if (!config.voidIgnoreCase) { + if (!conf.voidIgnoreCase) { flags += 'i'; } - if (!config.voidMultiline) { + if (!conf.voidMultiline) { flags += 'm'; } - if (config.dotAll) { + if (conf.dotAll) { flags += 's'; } - if (config.unicode) { + if (conf.unicode) { flags += 'u'; } @@ -344,7 +327,7 @@ function readableSize(size) { function dynamicReplacement(_file_rr, _config_rr, _data_rr) { const _time_obj = now; const _time = localTimeString(_time_obj); - const _pipe = _config_rr.pipedData, + const _pipe = _config_rr.pipeData, _text = _data_rr, _find = _config_rr.pattern, code_rr = _config_rr.replacementOri, @@ -373,25 +356,20 @@ function dynamicReplacement(_file_rr, _config_rr, _data_rr) { 'fs', 'globs', 'path', - 'pipe', 'pipe_', - 'find', 'find_', 'text', 'text_', - 'file', 'file_', 'file_rel', 'file_rel_', - 'dirpath', 'dirpath_', 'dirpath_rel', 'dirpath_rel_', - 'dirname', 'dirname_', 'filename', @@ -402,7 +380,6 @@ function dynamicReplacement(_file_rr, _config_rr, _data_rr) { 'ext_', 'cwd', 'cwd_', - 'now', 'now_', 'time_obj', @@ -414,7 +391,6 @@ function dynamicReplacement(_file_rr, _config_rr, _data_rr) { 'ctime_obj', 'ctime', 'ctime_', - 'bytes', 'bytes_', 'size', @@ -423,25 +399,25 @@ function dynamicReplacement(_file_rr, _config_rr, _data_rr) { '_', '__code_rr', 'var path = require("path");' + - 'var __require_ = require;' + - 'var r = function(file){' + - 'var result = null;' + - 'try{' + - 'result = __require_(file);' + - '} catch (e){' + - 'var dir = /^[\\\/]/.test(file) ? "" : cwd;' + - 'result = __require_(path.resolve(dir, file));' + - '};' + - 'return result;' + - '};' + - 'require = r;' + - 'return eval(__code_rr);' + 'var __require_ = require;' + + 'var r = function(file){' + + 'var result = null;' + + 'try{' + + 'result = __require_(file);' + + '} catch (e){' + + 'var dir = /^[\\\/]/.test(file) ? "" : cwd;' + + 'result = __require_(path.resolve(dir, file));' + + '};' + + 'return result;' + + '};' + + 'require = r;' + + 'return eval(__code_rr);', ); const needsByteOrSize = re.byteOrSize.test(_config_rr.replacement); const betterToReadfromFile = needsByteOrSize && 50000000 < _text.length; // around 50 Mb will lead to reading filezise from file instead of copying into buffer - if (!_config_rr.dataIsPiped) { + if (!_config_rr.contentWasPiped) { _file = path.normalize(path.join(_cwd, _file_rr)); _file_rel = path.relative(_cwd, _file); const pathInfo = path.parse(_file); @@ -460,9 +436,6 @@ function dynamicReplacement(_file_rr, _config_rr, _data_rr) { _ctime_obj = fileStats.ctime; _mtime = localTimeString(_mtime_obj); _ctime = localTimeString(_ctime_obj); - - //console.log('filesize: ', fileStats.size); - //console.log('dataSize: ', _bytes); } } @@ -471,12 +444,20 @@ function dynamicReplacement(_file_rr, _config_rr, _data_rr) { _size = readableSize(_bytes); } + const glob = (a, b) => + fGlob.sync(a, { + unique: true, + caseSensitiveMatch: !_config_rr.voidIgnoreCase, + dot: true, + ...b, + }); + // Run only once if no captured groups (replacement cant change) if (!/\$\d/.test(_config_rr.replacement)) { return dynamicContent( require, fs, - globs, + glob, path, _pipe, _pipe + _, @@ -559,27 +540,22 @@ function dynamicReplacement(_file_rr, _config_rr, _data_rr) { return dynamicContent( require, fs, - globs, + glob, path, - __pipe, __pipe + __, - __find, __find + __, __text, __text + __, - __file, __file + __, __file_rel, __file_rel + __, - __dirpath, __dirpath + __, __dirpath_rel, __dirpath_rel + __, - __dirname, __dirname + __, __filename, @@ -590,7 +566,6 @@ function dynamicReplacement(_file_rr, _config_rr, _data_rr) { __ext + __, __cwd, __cwd + __, - __now, __now + _, __time_obj, @@ -602,7 +577,6 @@ function dynamicReplacement(_file_rr, _config_rr, _data_rr) { __ctime_obj, __ctime, __ctime + _, - __bytes, __bytes + __, __size, @@ -635,22 +609,23 @@ function replacePlaceholders(str = '', conf: any) { } function getFilePaths(conf) { - let {includeGlob, excludeGlob, excludeRe} = conf; - - let filesToInclude = globs.sync(includeGlob); + const {includeGlob, excludeGlob, excludeRe, voidIgnoreCase} = conf; + + let filesToInclude: string[] = fGlob.sync(includeGlob, { + ignore: excludeGlob, + onlyFiles: true, + unique: true, + caseSensitiveMatch: !voidIgnoreCase, + dot: true, + }); - if (excludeRe.length) { + if (excludeRe) { excludeRe - .map((el) => getFinalPattern(el, conf)) + .map((el) => getRegex(getPattern(el, conf), conf)) .forEach((re) => { filesToInclude = filesToInclude.filter((el) => !el.match(re)); }); } - if (excludeGlob.length) { - const filesToExclude = globs.sync(excludeGlob); - filesToInclude = filesToInclude.filter((el) => !filesToExclude.includes(el)); - } - return filesToInclude; } diff --git a/src/env/bun.ts b/src/env/bun.ts new file mode 100755 index 00000000..f37cd879 --- /dev/null +++ b/src/env/bun.ts @@ -0,0 +1,62 @@ +#!/usr/bin/env bun + +/// + +import {cli2conf, executeReplacement} from '../cli.js'; + +import fs from 'fs-extra'; + +export const runtime: Runtime = { + fileReadSync: (path, encoding = 'utf8') => fs.readFileSync(path, {encoding}), + + fileReadAsync: async (path, encoding = 'utf8') => { + const file = Bun.file(path); + return file.text(); + }, + + fileWriteSync: async (path, data, encoding = 'utf8') => { + await Bun.write(path, data); + }, + fileWriteAsync: (path, data, encoding = 'utf8') => { + return Bun.write(path, data); + }, + + fileDeleteSync: (path) => fs.unlinkSync(path), + fileDeleteAsync: (path) => fs.unlink(path), + + fileCopySync: async (originalPath, destinationPath) => { + const input = Bun.file(originalPath); + const output = Bun.file(destinationPath); + await Bun.write(output, input); + }, + fileCopyAsync: (originalPath, destinationPath) => { + const input = Bun.file(originalPath); + const output = Bun.file(destinationPath); + return Bun.write(output, input); + }, + exit: process.exit, +}; + +(() => { + let conf = cli2conf(runtime, process.argv.slice(2)); + + if (Boolean(process.stdin.isTTY)) return executeReplacement(runtime, conf); + + process.stdin.setEncoding(conf.encoding); + + let pipeData = null; + process.stdin.on('readable', () => { + let chunk = process.stdin.read(); + + if (null !== chunk) { + pipeData = chunk; + while ((chunk = process.stdin.read())) { + pipeData += chunk; + } + } + }); + + process.stdin.on('end', () => { + return executeReplacement(runtime, conf, pipeData); + }); +})(); diff --git a/src/env/deno.ts b/src/env/deno.ts new file mode 100644 index 00000000..7fc51dc8 --- /dev/null +++ b/src/env/deno.ts @@ -0,0 +1,48 @@ +#!/usr/bin/env deno + +/// + +import yargs from 'https://deno.land/x/yargs/deno.ts'; + +import fs from 'fs-extra'; + +import {cli2conf, executeReplacement} from '../cli.ts'; + +export const runtime: Runtime = { + fileReadSync: (path, encoding = 'utf8') => fs.readFileSync(path, {encoding}), + + async fileReadAsync(path, encoding = 'utf8') { + const data = await fs.readFile(path, {encoding}); + return data; + }, + + fileWriteSync: (path, data, encoding = 'utf8') => fs.writeFileSync(path, data, {encoding}), + + async fileWriteAsync(path, data, encoding = 'utf8') { + return fs.writeFile(path, data, {encoding}); + }, + + fileDeleteSync: (path) => fs.unlinkSync(path), + + async fileDeleteAsync(path) { + return fs.unlink(path); + }, + + fileCopySync: (originalPath, destinationPath) => fs.copyFileSync(originalPath, destinationPath), + + async fileCopyAsync(originalPath, destinationPath) { + return fs.copyFile(originalPath, destinationPath); + }, + + exit: (c) => Deno.exit(c), +}; + +async function getPipeData() { + const stdinContent = await Deno.readAll(Deno.stdin); + const text = new TextDecoder().decode(stdinContent); + return text; +} + +let conf = cli2conf(Deno.args, {runtime, yargs}); + +executeReplacement(conf, {runtime, yargs, pipeData: getPipeData()}); diff --git a/src/env/node.ts b/src/env/node.ts new file mode 100644 index 00000000..ef994342 --- /dev/null +++ b/src/env/node.ts @@ -0,0 +1,48 @@ +#!/usr/bin/env node + +/// + +import {cli2conf, executeReplacement} from '../cli.js'; +import fs from 'fs-extra'; + +export const runtime: Runtime = { + fileReadSync: (path, encoding = 'utf8') => fs.readFileSync(path, {encoding}), + fileReadAsync: (path, encoding = 'utf8') => fs.readFile(path, {encoding}), + + fileWriteSync: (path, data, encoding = 'utf8') => fs.writeFileSync(path, data, {encoding}), + fileWriteAsync: (path, data, encoding = 'utf8') => fs.writeFile(path, data, {encoding}), + + fileDeleteSync: (path) => fs.unlinkSync(path), + fileDeleteAsync: (path) => fs.unlink(path), + fileCopySync: (originalPath, destinationPath) => { + fs.copySync(originalPath, destinationPath); + }, + fileCopyAsync: async (originalPath, destinationPath) => { + return fs.copy(originalPath, destinationPath); + }, + exit: process.exit, +}; + +(() => { + let conf = cli2conf(runtime, process.argv.slice(2)); + + if (Boolean(process.stdin.isTTY)) return executeReplacement(runtime, conf); + + process.stdin.setEncoding(conf.encoding); + + let pipeData = null; + process.stdin.on('readable', () => { + let chunk = process.stdin.read(); + + if (null !== chunk) { + pipeData = chunk; + while ((chunk = process.stdin.read())) { + pipeData += chunk; + } + } + }); + + process.stdin.on('end', () => { + return executeReplacement(runtime, conf, pipeData); + }); +})(); diff --git a/src/multiversion.cli.js b/src/multiversion.cli.js deleted file mode 100644 index 9dd6cb75..00000000 --- a/src/multiversion.cli.js +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env node - -if ('6' <= process.versions.node) { - require('./ES6/rexreplace.cli.bundle.js'); -} else if ('0.12' <= process.versions.node) { - require('./ES5/rexreplace.cli.bundle.js'); -} else { - console.error( - 'Your Node is old so this will run on a legacy version of RexReplace only supporting one single file per replacement and no options allowed. See https://www.npmjs.com/package/rreplace for more info.' - ); - require('../legacy/rreplace.js'); -} diff --git a/src/output.ts b/src/output.ts index ee0a49ff..c481bb8a 100644 --- a/src/output.ts +++ b/src/output.ts @@ -1,60 +1,74 @@ let font: any = {}; -font.red = font.green = font.gray = (str) => str; +font.yellow = font.red = font.green = font.gray = (str) => str; // check for node version supporting chalk - if so overwrite `font` -//const font = import('chalk'); +//font = import('chalk'); -let config: any = null; +let conf: any = null; -export const outputConfig = function (_config) { - config = _config; +export const outputConfig = function (_conf) { + conf = _conf; }; export const info = function (msg, data = '') { - if (config.quiet || config.quietTotal) { + if (conf?.quiet || conf?.quietTotal) { return; } - console.error(font.gray(msg), data); + if (conf?.output || conf?.outputMatch) { + return console.error.apply(this, [font.gray(msg), data].filter(Boolean)); + } + console.log.apply(this, [msg, data].filter(Boolean)); }; export const chat = function (msg, data = '') { - if (config.verbose) { + if (conf?.verbose && !(conf?.output || conf?.outputMatch)) { info(msg, data); } else { - debug(msg + ' ' + data); + debug([msg, data].filter(Boolean).join(' ')); } }; -export const die = function (msg = '', data = '', displayHelp = false) { - if (displayHelp && !config.quietTotal) { - config.showHelp(); +export const error = function (msg, data = '') { + if (!conf?.quietTotal) { + console.error.apply(this, [' ❌', font.red(msg), data].filter(Boolean)); } - msg && error(' ❌ ' + msg, data); - kill(); + if (conf?.bail) { + return kill(); + } + + return false; }; -export const error = function (msg, data = '') { - if (!config.quiet && !config.quietTotal) { - console.error(font.red(msg), data); - } - if (config.halt) { - kill(msg); +export const warn = function (msg, data = '') { + if (!conf?.quiet && !conf?.quietTotal) { + console.warn.apply(this, [' 🟡', font.yellow(msg), data].filter(Boolean)); } + return false; }; -export function debug(data) { - if (config.debug) { +export const die = function (msg = '', data = '', displayHelp = false) { + if (displayHelp && !conf?.quietTotal) { + conf?.showHelp(); + } + msg && error(msg, data); + kill(); +}; + +export function debug(...data) { + if (conf?.debug) { console.error(font.gray(JSON.stringify(data, null, 4))); } } export function step(data) { - if (config.verbose) { - debug(data); + if (conf?.verbose && !(conf?.output || conf?.quiet || !conf?.quiet || !conf?.quietTotal)) { + console.error(font.gray(data)); } } function kill(error = 1, msg = '') { - msg && console.error(+msg); - process.exit(error); + if (!conf?.quietTotal && msg) { + console.error(+msg); + } + process.exit(+error); } diff --git a/test/cli/aserta.sh b/test/cli/aserta.sh index bf0b0066..4a6951c3 100644 --- a/test/cli/aserta.sh +++ b/test/cli/aserta.sh @@ -433,7 +433,7 @@ assert() { # shellcheck disable=SC2059 expected=$(printf "${2:-}") # shellcheck disable=SC2059 - result=$(printf "$(eval 2>/dev/null "$1" <<< "${3:-}")") + [[ -n "$DEBUG" ]] && result=$(printf "$(eval "$1" <<< "${3:-}")") || result=$(printf "$(eval 2>/dev/null "$1" <<< "${3:-}")") if [[ "$result" == "$expected" ]]; then [[ -z "$DEBUG" ]] || printf '.' return diff --git a/test/cli/run.sh b/test/cli/run.sh index 9ae216f3..8c048386 100644 --- a/test/cli/run.sh +++ b/test/cli/run.sh @@ -1,9 +1,24 @@ #!/usr/bin/env bash +#rexreplace() { + # node dist/env/node.js "$@" + #npx node-ts src/env/node.ts "$@" + # npx ts-node src/env/node.ts "$@" + # bun src/env/bun.ts "$@" +#} + +echo RexReplace v$(rexreplace -v) +# where rexreplace + DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +export STOP=1 +#export DEBUG=1 source $DIR/aserta.sh + + + # # Command exit codes # assert_success "true" # assert_failure "false" @@ -19,143 +34,300 @@ source $DIR/aserta.sh # # assert_end "example" +counter=0 + reset() { - echo 'Resetting testdata' + counter=$((counter + 1)) + echo "$counter: Reset test data" echo 'foobar' > my.file echo 'abc123' > your.file + echo -n > stdout.log + echo -n > stderr.log } -# Plain usage +echo +echo '>' Plain reset rexreplace x x my.file assert "cat my.file" "foobar" + +reset +rr x x my.file +assert "cat my.file" "foobar" + + reset rexreplace o x my.file assert "cat my.file" "fxxbar" + reset rexreplace "b" "\n" my.file assert "cat my.file" "foo\nar" -# rr can handle a pattern and replcaement starting with '-' + + +echo +echo '>' rr can handle a pattern and replcaement starting with '-' reset rexreplace '^(.+)$' '- $1' my.file rexreplace '- f' '_' my.file assert "cat my.file" "_oobar" -# Piped data + + +echo +echo '>' Piped data reset assert "cat my.file | rexreplace foo xxx" "xxxbar" -# -v + +echo +echo '>' --version reset assert_success "rexreplace -version" +assert_success "rexreplace --version" +assert_success "rexreplace -v" + + -# -h +echo +echo '>' --help reset assert_success "rexreplace -help" +assert_success "rexreplace --help" +assert_success "rexreplace -h" + + + + +echo +echo '>' --output +reset +assert "rexreplace x x my.file --output --verbose --debug" "foobar" +assert "rexreplace x x my.file -o" "foobar" + + +reset +assert "rexreplace o x my.file --output" "fxxbar" + + +reset +assert "rexreplace 'b' '*+*' my.file -o" 'foo*+*ar' -# -o + + +echo +echo '>' --output to pipe output reset -assert "rexreplace x x my.file --output" "foobar" +rexreplace o x my.file --output > stdout.log 2> stderr.log +assert "cat my.file" "foobar" +assert "cat stdout.log" "fxxbar" +assert "cat stderr.log" "" + reset -assert "rexreplace o x my.file --output" "fxxbar" +rexreplace o x my.file --output --verbose > stdout.log 2> stderr.log +assert "cat my.file" "foobar" +assert "cat stdout.log" "fxxbar" +assert "cat stderr.log" "my.file" -# -E reset +rexreplace o x my.file > stdout.log 2> stderr.log +assert "cat my.file" "fxxbar" +assert "cat stdout.log" "my.file" +assert "cat stderr.log" "" + + + + +echo +echo '>' --engine +#reset # assert "rexreplace o x my.file --output --engine RE2" "fxxbar" # RE2 depricated + + +reset assert "rexreplace o x my.file --output --engine V8" "fxxbar" -# -b +reset +assert "rexreplace o x my.file --output -E V8" "fxxbar" + + +reset +assert_failure "rexreplace o x my.file --output -E xxxyyyzzz" + + + + +echo +echo '>' --keep-backup reset rexreplace o x my.file --keep-backup assert "cat my.file" "fxxbar" assert "cat my.file.*" "foobar" rm my.file.* -# -I + +reset +rexreplace o x my.file -b +assert "cat my.file" "fxxbar" +assert "cat my.file.*" "foobar" +rm my.file.* + + + + +echo +echo '>' --void-ignore-case reset assert "rexreplace Foo xxx my.file -o" "xxxbar" + reset assert "rexreplace Foo xxx my.file -o --void-ignore-case" "foobar" -# -G +reset +assert "rexreplace Foo xxx my.file -o --I" "foobar" + + + + +echo +echo '>' --void-global +reset +assert "rexreplace o x my.file -o " "fxxbar" + + reset assert "rexreplace o x my.file -o --void-global" "fxobar" -# -O +reset +assert "rexreplace o x my.file -o -G" "fxobar" + + + + +echo +echo '>' --output-match reset assert "rexreplace [fb]. _ my.file --output-match" "fo\\nba" + +reset +assert "rexreplace [fb]. _ my.file -O" "fo\\nba" + + reset assert "rexreplace '([fb](.))' _ my.file --output-match" "foo\\nbaa" -# -GO + + + +echo +echo ": Combine multiple flags (-GO)" reset assert "rexreplace [fb]. _ my.file --output-match --voidGlobal" "fo" +reset +assert "rexreplace [fb]. _ my.file -GO" "fo" + -# -s + + +echo +echo '>' --dot-all reset echo foobar >> my.file assert "rexreplace ar.foo _ my.file -o --dot-all " "foob_bar" +reset +echo foobar >> my.file +assert "rexreplace ar.foo _ my.file -o -s" "foob_bar" + + -# -M +echo +echo '>' --void-multiline reset echo foobar >> my.file assert "rexreplace '^.' 'x' my.file -o" "xoobar\nxoobar" + reset echo foobar >> my.file assert "rexreplace '^.' 'x' my.file -o --void-multiline" "xoobar\nfoobar" -# back reference +reset +echo foobar >> my.file +assert "rexreplace '^.' 'x' my.file -o" "xoobar\nxoobar" +echo foobar >> my.file +assert "rexreplace '^.' 'x' my.file -o -M" "xoobar\nfoobar" + + + + +echo Reference groups in replcaement reset assert "rexreplace '(f?(o))o(.*)' '\$3\$1\$2' my.file -o" "barfoo" + reset assert "rexreplace '(f?(o))o(.*)' '€3€1€2' my.file -o" "barfoo" -# globs + + +echo +echo '>' Globs reset -echo foobar >> my_file -assert "rexreplace o x my*le -o" "fxxbar\nfxxbar" + echo foobar > my_file +assert "rexreplace o x my*file -o" "fxxbar\nfxxbar" +assert "cat my.file" "foobar" rm my_file -# -€ + + +echo +echo '>' --void-euro reset assert "rexreplace '.$' '$' my.file -o" 'fooba$' + reset assert "rexreplace '.€' '€' my.file -o" 'fooba$' + reset assert "rexreplace '.€' '€' my.file -o --void-euro" 'foobar' -# -§ +reset +assert "rexreplace '.€' '€' my.file -o -€" 'foobar' + + + + +echo +echo '>' --void-section reset echo foo[bar] > my.file assert "rexreplace '[\]]' '[' my.file -o" 'foo[bar[' @@ -165,96 +337,234 @@ reset echo foo[bar] > my.file assert "rexreplace '[§]]' '[' my.file -o" 'foo[bar[' + reset echo foo[bar] > my.file assert "rexreplace '[§]]' '[' my.file -o --void-section" 'foo[bar]' -# -j +reset +echo foo[bar] > my.file +assert "rexreplace '[§]]' '[' my.file -o -§" 'foo[bar]' + + + + +echo +echo '>' --replacement-js reset assert "rexreplace 'foo' '2+2' my.file -o --replacement-js" '4bar' + +reset +assert "rexreplace 'foo' '2+2' my.file -o -j" '4bar' + + +reset +assert "rexreplace 'foo' '2+2' my.file -o --js" '4bar' + + reset assert "rexreplace 'foo' 'var i = 2; i + 2' my.file -o --replacement-js" '4bar' + reset #assert "rexreplace '[fb](.)' '€1.toUpperCase();' my.file -o --replacement-js" 'OoAr' +echo +echo '>' require from JS +reset +echo '{versions:999, version:'v1.2.3'}' > my.json +assert "echo VERSION | rexreplace 'VERSION' 'require(`my.json`).version' -j" "v1.2.3" +assert "echo VERSION | rr 'VERSION' 'r(`my.json`).version' -j" "v1.2.3" +rm my.json + + -# Access to js variables +echo +echo '>' Access to js variables reset assert "rexreplace 'fo(o)bar' '[!!fs,!!globs,find,text.trim()].join(\":\")' my.file -o --replacement-js" 'true:true:fo(o)bar:foobar' reset -assert "printf foobar | rexreplace 'foobar' \"['file:'+file,'dirpath:'+dirpath,'filename:'+filename,'name:'+name,'ext:'+ext,'text:'+text].join(':')\" -o --replacement-js" 'file:❌:dirpath:❌:filename:❌:name:❌:ext:❌:text:foobar' +assert "printf foobar | rexreplace 'foobar' \"['file:'+file,'dirpath:'+dirpath,'filename:'+filename,'name:'+name,'ext:'+ext,'text:'+text].join('|')\" -o --replacement-js" 'file:❌|dirpath:❌|filename:❌|name:❌|ext:❌|text:foobar' reset -assert "rexreplace 'foobar' \"['filename:'+filename,'name:'+name,'ext:'+ext,'text:'+text].join(':')\" my.file -o --replacement-js" 'filename:my.file:name:my:ext:.file:text:foobar' +assert "rexreplace 'foobar' \"['filename:'+filename,'name:'+name,'ext:'+ext,'text:'+text].join('|')\" my.file -o --replacement-js" 'filename:my.file|name:my|ext:.file|text:foobar' + reset assert "rexreplace 'foo((b)ar)' '€1+€2' my.file -o --replacement-js" 'barb' -# Content manually testes + +echo +echo '>' Content manually testes # todo: automate test of content reset assert "rexreplace 'foobar' '[require, fs, globs, path, pipe, pipe_, find, find_, text, text_, file, file_, file_rel, file_rel_, dirpath, dirpath_, dirpath_rel, dirpath_rel_, dirname, dirname_, filename, filename_, name, name_, ext, ext_, cwd, cwd_, now, now_, time_obj, time, time_, mtime_obj, mtime, mtime_, ctime_obj, ctime, ctime_, bytes, bytes_, size, size_, _].length' my.file -o --replacement-js" '44' -# -R + + +echo '>' --replacement-pipe reset assert "printf x | rexreplace 'b' _ my.file -o --replacement-pipe" 'fooxar' +reset +assert "printf x | rexreplace 'b' _ my.file -o -R" 'fooxar' + -# -L + +echo +echo '>' --literal reset -assert "rexreplace 'b' '*+*' my.file -o" 'foo*+*ar' -assert "rexreplace '*+*' 'b' my.file -o --literal" 'foobar' +assert "rexreplace 'b' '*+*' my.file -o" 'foo*+*ar' +assert "rexreplace '*+*' 'b' my.file -o --literal" 'foobar' +reset + rexreplace 'b' '*+*' my.file +assert "cat my.file" 'foo*+*ar' +assert "rexreplace '*+*' 'b' my.file -o -L" 'foobar' -# -x + + + +echo +echo '>' --exclude-re reset rexreplace 'b' '*+*' my.file assert "cat my.file" 'foo*+*ar' assert "cat your.file" 'abc123' + + reset rexreplace 'b' '*+*' '*.file' assert "cat my.file" 'foo*+*ar' assert "cat your.file" 'a*+*c123' + + reset rexreplace 'b' '*+*' '*.file' -x y -assert "cat my.file" 'foobar' +assert "cat my.file" 'foo*+*ar' assert "cat your.file" 'abc123' + + reset rexreplace 'b' '*+*' '*.file' -x ^y assert "cat my.file" 'foo*+*ar' assert "cat your.file" 'abc123' -# -X +reset + rexreplace 'b' '*+*' '*.file' --exclude-re ^y +assert "cat my.file" 'foo*+*ar' +assert "cat your.file" 'abc123' + + +reset + rexreplace 'b' '*+*' '*.file' -x=^y +assert "cat my.file" 'foo*+*ar' +assert "cat your.file" 'abc123' + + +reset + rexreplace 'b' '*+*' '*.file' --exclude-re=^y +assert "cat my.file" 'foo*+*ar' +assert "cat your.file" 'abc123' + + + + +echo +echo '>' --exclude-glob reset rexreplace 'b' '*+*' '*.file' -X '*.file' assert "cat my.file" 'foobar' assert "cat your.file" 'abc123' + + reset rexreplace 'b' '*+*' '*.file' -X 'y*' assert "cat my.file" 'foo*+*ar' assert "cat your.file" 'abc123' +reset + rexreplace 'b' '*+*' '*.file' -X='y*' +assert "cat my.file" 'foo*+*ar' +assert "cat your.file" 'abc123' + + +reset + rexreplace 'b' '*+*' '*.file' --exclude-glob '*.file' +assert "cat my.file" 'foobar' +assert "cat your.file" 'abc123' + + +reset + rexreplace 'b' '*+*' '*.file' --exclude-glob 'y*' +assert "cat my.file" 'foo*+*ar' +assert "cat your.file" 'abc123' + + + + +echo +echo '>' --simulate +reset + rexreplace 'b' '_' 'my.file' -S &> 'your.file' +assert "cat your.file" 'my.file' +assert "cat 'my.file'" 'foobar' + + +reset + rexreplace 'b' '_' 'my.file' --simulate &> 'your.file' +assert "cat your.file" 'my.file' +assert "cat 'my.file'" 'foobar' + + + + +echo +echo +echo "# Edge Cases" + +echo +echo '>' Invalid File Paths +reset +rexreplace 'foo' 'bar' invalidfile.md -o > stdout.log 2>stderr.log +assert "cat stdout.log" "" +assert_startswith "cat stderr.log" "0 files found" +echo +echo '>' Illegal Regex + +reset +assert_failure "rexreplace '*foo' 'bar' my.file" + + + +# non existent flag +# missspelled flag +# Multiple Files in 1 glob +# Multiple globs +# Multiple globs picking up the same file + + + # # -P # reset @@ -293,6 +603,10 @@ assert "cat your.file" 'abc123' # assert "rexreplace ??? ??? my.file -q" "foobar" # reset +# Todo: test -Q +# assert "rexreplace ??? ??? my.file -q" "" +# reset + # Todo: test -Q # assert "rexreplace ??? ??? my.file -Q" "foobar" # reset @@ -305,8 +619,12 @@ assert "cat your.file" 'abc123' # assert "rexreplace ??? ??? my.file -d" "foobar" # reset +reset rm my.file rm your.file +rm stdout.log +rm stderr.log + assert_end "rexreplace" diff --git a/test/manual.js b/test/manual.js new file mode 100644 index 00000000..b92e4e00 --- /dev/null +++ b/test/manual.js @@ -0,0 +1,10 @@ +// https://bun.sh/docs/test/writing + +// @ts-ignore +import {expect, test, describe} from 'bun:test'; + +import {cli2conf, executeReplacement} from '../src/cli.ts'; + +import {runtime} from '../src/env/deno.ts'; + +executeReplacement(runtime, conf, pipeData); diff --git a/test/plain.test.js b/test/plain.test.js new file mode 100644 index 00000000..3799d8e3 --- /dev/null +++ b/test/plain.test.js @@ -0,0 +1,16 @@ +// https://bun.sh/docs/test/writing + +// @ts-ignore +import {expect, test, describe} from 'bun:test'; + +import {cli2conf, executeReplacement} from '../src/cli.ts'; + +import {runtime} from '../src/env/bun.ts'; + +executeReplacement(runtime, conf, pipeData); + +describe('Plain', () => { + test('Happy path', () => { + expect(1).toBe(1); + }); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..91547a9b --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "typeRoots": ["./types", "./node_modules/@types", "./node_modules/bun-types"], + "outDir": "bin/ES6", + "target": "ES6", + "lib": ["es6", "esnext"], + "types": ["node"], + "moduleResolution": "node", + "module": "commonjs", + "allowImportingTsExtensions": true, + "noEmit": true, + "esModuleInterop": true + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"], + "ts-node": { + "esm": true + } +} diff --git a/magic-string.d.ts b/types/magic-string.d.ts similarity index 100% rename from magic-string.d.ts rename to types/magic-string.d.ts diff --git a/types/rexreplace.d.ts b/types/rexreplace.d.ts new file mode 100644 index 00000000..2c8ebc3b --- /dev/null +++ b/types/rexreplace.d.ts @@ -0,0 +1,11 @@ +interface Runtime { + fileReadSync: (path: string, encoding?: string) => string; + fileReadAsync: (path: string, encoding?: string) => Promise; + fileWriteSync: (path: string, data: string, encoding?: string) => void; + fileWriteAsync: (path: string, data: string, encoding?: string) => Promise; + fileDeleteSync: (path: string) => void; + fileDeleteAsync: (path: string) => Promise; + fileCopySync: (originalPath: string, destinationPath: string) => void; + fileCopyAsync: (originalPath: string, destinationPath: string) => Promise; + exit: (errorCode: number) => null; +} diff --git a/yarn.lock b/yarn.lock index 7670952d..460eb011 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,11 +2,31 @@ # yarn lockfile v1 -"@jridgewell/sourcemap-codec@^1.5.0": +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.15": version "1.5.0" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jsdevtools/ez-spawn@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@jsdevtools/ez-spawn/-/ez-spawn-3.0.4.tgz#5641eb26fee6d31ec29f6788eba849470c52c7ff" @@ -31,6 +51,20 @@ log-symbols "^4.0.0" semver "^7.3.2" +"@mole-inc/bin-wrapper@^8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@mole-inc/bin-wrapper/-/bin-wrapper-8.0.1.tgz#d7fd0ceb1cfa8a855293a3ed9d7d135f4d442f0e" + integrity sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA== + dependencies: + bin-check "^4.1.0" + bin-version-check "^5.0.0" + content-disposition "^0.5.4" + ext-name "^5.0.0" + file-type "^17.1.6" + filenamify "^5.0.2" + got "^11.8.5" + os-filter-obj "^2.0.0" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -52,54 +86,23 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@rollup/plugin-commonjs@26.0.1": - version "26.0.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-26.0.1.tgz#16d4d6e54fa63021249a292b50f27c0b0f1a30d8" - integrity sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ== - dependencies: - "@rollup/pluginutils" "^5.0.1" - commondir "^1.0.1" - estree-walker "^2.0.2" - glob "^10.4.1" - is-reference "1.2.1" - magic-string "^0.30.3" - -"@rollup/plugin-node-resolve@15.2.3": - version "15.2.3" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz#e5e0b059bd85ca57489492f295ce88c2d4b0daf9" - integrity sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ== - dependencies: - "@rollup/pluginutils" "^5.0.1" - "@types/resolve" "1.20.2" - deepmerge "^4.2.2" - is-builtin-module "^3.2.1" - is-module "^1.0.0" - resolve "^1.22.1" - -"@rollup/plugin-replace@5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-5.0.7.tgz#150c9ee9db8031d9e4580a61a0edeaaed3d37687" - integrity sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ== - dependencies: - "@rollup/pluginutils" "^5.0.1" - magic-string "^0.30.3" - -"@rollup/plugin-swc@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-swc/-/plugin-swc-0.3.1.tgz#aa22c5d4e5ed29d06ed5c3e4daded0037ad7044f" - integrity sha512-oqHt6W2J3CoIrdWpbLiRXdRkepEv+qwCgHMnSmh7waPFxaEeO3tocA1xy2p2qoJmk1zygDoxtPeP95z8bsJ+fA== - dependencies: - "@rollup/pluginutils" "^5.0.1" - smob "^1.4.0" - -"@rollup/pluginutils@^5.0.1": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" - integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== +"@sindresorhus/is@^4.0.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + +"@swc/cli@^0.1.62": + version "0.1.65" + resolved "https://registry.yarnpkg.com/@swc/cli/-/cli-0.1.65.tgz#bb51ce6f088a78ac99a07507c15a8d74c9336ecb" + integrity sha512-4NcgsvJVHhA7trDnMmkGLLvWMHu2kSy+qHx6QwRhhJhdiYdNUrhdp+ERxen73sYtaeEOYeLJcWrQ60nzKi6rpg== dependencies: - "@types/estree" "^1.0.0" - estree-walker "^2.0.2" - picomatch "^2.3.1" + "@mole-inc/bin-wrapper" "^8.0.1" + commander "^7.1.0" + fast-glob "^3.2.5" + minimatch "^9.0.3" + semver "^7.3.8" + slash "3.0.0" + source-map "^0.7.3" "@swc/core-darwin-arm64@1.7.11": version "1.7.11" @@ -151,7 +154,7 @@ resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.11.tgz#433bac0a04a0a49c9d9c8f1fe45f5555c88deca7" integrity sha512-IUohZedSJyDu/ReEBG/mqX6uG29uA7zZ9z6dIAF+p6eFxjXmh9MuHryyM+H8ebUyoq/Ad3rL+rUCksnuYNnI0w== -"@swc/core@^1.7.11": +"@swc/core@^1.3.90": version "1.7.11" resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.7.11.tgz#167f46ee64f7fdd0eb58e62d0a5643fa65b86559" integrity sha512-AB+qc45UrJrDfbhPKcUXk+9z/NmFfYYwJT6G7/iur0fCse9kXjx45gi40+u/O2zgarG/30/zV6E3ps8fUvjh7g== @@ -182,25 +185,123 @@ dependencies: "@swc/counter" "^0.1.3" -"@types/estree@*", "@types/estree@^1.0.0": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" -"@types/node@20.8.3": - version "20.8.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.3.tgz#c4ae2bb1cfab2999ed441a95c122bbbe1567a66d" - integrity sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw== +"@tokenizer/token@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" + integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== -"@types/resolve@1.20.2": - version "1.20.2" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" - integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== -ansi-colors@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/cacheable-request@^6.0.1": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" + "@types/node" "*" + "@types/responselike" "^1.0.0" + +"@types/http-cache-semantics@*": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "22.3.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.3.0.tgz#7f8da0e2b72c27c4f9bd3cb5ef805209d04d4f9e" + integrity sha512-nrWpWVaDZuaVc5X84xJ0vNrLvomM205oQyLsRt7OHNZbSHslcWsvgFR7O7hire2ZonjLrWBbedmotmIlJDVd6g== + dependencies: + undici-types "~6.18.2" + +"@types/node@^20.6.2": + version "20.14.15" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.15.tgz#e59477ab7bc7db1f80c85540bfd192a0becc588b" + integrity sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw== + dependencies: + undici-types "~5.26.4" + +"@types/node@~20.12.8": + version "20.12.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.14.tgz#0c5cf7ef26aedfd64b0539bba9380ed1f57dcc77" + integrity sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg== + dependencies: + undici-types "~5.26.4" + +"@types/responselike@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" + integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== + dependencies: + "@types/node" "*" + +"@types/ws@~8.5.10": + version "8.5.12" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" + integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.24": + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== + dependencies: + "@types/yargs-parser" "*" + +acorn-walk@^8.1.1: + version "8.3.3" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" + integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.4.1: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== ansi-escapes@^4.2.1: version "4.3.2" @@ -214,13 +315,6 @@ ansi-regex@6, ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -236,6 +330,21 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +arch@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argmate@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/argmate/-/argmate-0.6.0.tgz#321b24c9d7f90896b3002fe8376a4de65de714eb" + integrity sha512-DhQzTqQ+N2m4+arJjGsNTevTr2Uyl4S2xljq4icMlhoZILR+LMh3bnRxP8dfaeKurTPVjs9dMTA41WzIp1pAwQ== + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -274,6 +383,31 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +bin-check@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-4.1.0.tgz#fc495970bdc88bb1d5a35fc17e65c4a149fc4a49" + integrity sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA== + dependencies: + execa "^0.7.0" + executable "^4.1.0" + +bin-version-check@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-5.1.0.tgz#788e80e036a87313f8be7908bc20e5abe43f0837" + integrity sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g== + dependencies: + bin-version "^6.0.0" + semver "^7.5.3" + semver-truncate "^3.0.0" + +bin-version@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-6.0.0.tgz#08ecbe5fc87898b441425e145f9e105064d00315" + integrity sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw== + dependencies: + execa "^5.0.0" + find-versions "^5.0.0" + binary-extensions@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" @@ -293,15 +427,36 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browser-stdout@^1.3.1: +browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -builtin-modules@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" - integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== +bun-types@^1.0.2: + version "1.1.24" + resolved "https://registry.yarnpkg.com/bun-types/-/bun-types-1.1.24.tgz#406ece69f5b762d8467a74d618eecee05aaead81" + integrity sha512-UNEcYawHWOVw9GYQdOgjJvTQduYlPckmRMqpBqfkWpUzeK2CZfEP/JOYBH6SMypyfkNg/Zsqf0olN6vMrSPg3w== + dependencies: + "@types/node" "~20.12.8" + "@types/ws" "~8.5.10" + +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-request@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.7: version "1.0.7" @@ -324,15 +479,6 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -341,15 +487,20 @@ chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== +chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -382,12 +533,12 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== dependencies: - color-name "1.1.3" + mimic-response "^1.0.0" color-convert@^2.0.1: version "2.0.1" @@ -396,11 +547,6 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" @@ -416,10 +562,31 @@ command-line-args@^5.1.1: lodash.camelcase "^4.3.0" typical "^4.0.0" -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== +commander@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +content-disposition@^0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" cross-spawn@^7.0.3: version "7.0.3" @@ -430,10 +597,10 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -debug@^4.3.5: - version "4.3.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== +debug@4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" @@ -442,10 +609,17 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +defer-to-connect@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" @@ -475,10 +649,15 @@ detect-newline@^3.1.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -diff@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" - integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== dir-glob@^3.0.1: version "3.0.1" @@ -492,6 +671,13 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + es-define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" @@ -509,20 +695,70 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== -estree-walker@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw== + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +executable@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + +ext-list@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37" + integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA== + dependencies: + mime-db "^1.28.0" + +ext-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6" + integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ== + dependencies: + ext-list "^2.0.0" + sort-keys-length "^1.0.0" external-editor@^3.0.3: version "3.1.0" @@ -533,7 +769,7 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -fast-glob@^3.2.9: +fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -558,6 +794,29 @@ figures@^3.0.0: dependencies: escape-string-regexp "^1.0.5" +file-type@^17.1.6: + version "17.1.6" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-17.1.6.tgz#18669e0577a4849ef6e73a41f8bdf1ab5ae21023" + integrity sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw== + dependencies: + readable-web-to-node-stream "^3.0.2" + strtok3 "^7.0.0-alpha.9" + token-types "^5.0.0-alpha.2" + +filename-reserved-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz#3d5dd6d4e2d73a3fed2ebc4cd0b3448869a081f7" + integrity sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw== + +filenamify@^5.0.2: + version "5.1.1" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-5.1.1.tgz#a1ccc5ae678a5e34f578afcb9b72898264d166d2" + integrity sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA== + dependencies: + filename-reserved-regex "^3.0.0" + strip-outer "^2.0.0" + trim-repeated "^2.0.0" + fill-range@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" @@ -572,7 +831,7 @@ find-replace@^3.0.0: dependencies: array-back "^3.0.1" -find-up@^5.0.0: +find-up@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== @@ -580,6 +839,13 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find-versions@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-5.1.0.tgz#973f6739ce20f5e439a27eba8542a4b236c8e685" + integrity sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg== + dependencies: + semver-regex "^4.0.5" + flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" @@ -632,6 +898,23 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: has-symbols "^1.0.3" hasown "^2.0.0" +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -639,7 +922,7 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob@9, glob@^10.4.1, glob@^10.4.2, glob@^7.1.1, glob@^8.1.0: +glob@7.2.0, glob@9, glob@^7.1.1: version "9.3.5" resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== @@ -668,11 +951,6 @@ globs@0.1.4: dependencies: glob "^7.1.1" -google-closure-compiler-js@>20170000: - version "20200719.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler-js/-/google-closure-compiler-js-20200719.0.0.tgz#a7ce8f0a450973018d91fa2b377a3906ce0f7da9" - integrity sha512-cuowL5A4VOx9yxxMc3sSiqcj/d9aYjnHgFDvDB/dpMMOhlUMN1MDsVubuEc32tut7k/FTYFZY114CLH4r2q9/A== - gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -680,16 +958,28 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" +got@^11.8.5: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -719,18 +1009,36 @@ has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: dependencies: has-symbols "^1.0.3" -hasown@^2.0.0, hasown@^2.0.2: +hasown@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" -he@^1.2.0: +he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +http-cache-semantics@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -738,6 +1046,11 @@ iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.2.0: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" @@ -782,25 +1095,11 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-builtin-module@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" - integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== - dependencies: - builtin-modules "^3.3.0" - is-callable@^1.1.3: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.13.0: - version "2.15.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.0.tgz#71c72ec5442ace7e76b306e9d48db361f22699ea" - integrity sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA== - dependencies: - hasown "^2.0.2" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -825,11 +1124,6 @@ is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== - is-nan@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" @@ -843,17 +1137,25 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + is-plain-obj@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-reference@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" - integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== - dependencies: - "@types/estree" "*" +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-typed-array@^1.1.3: version "1.1.13" @@ -872,13 +1174,18 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -js-yaml@^4.1.0: +js-yaml@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -888,6 +1195,13 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +keyv@^4.0.0: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -905,7 +1219,7 @@ lodash@^4.17.19: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^4.0.0, log-symbols@^4.1.0: +log-symbols@4.1.0, log-symbols@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -913,17 +1227,40 @@ log-symbols@^4.0.0, log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + lru-cache@^10.2.0: version "10.4.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== -magic-string@^0.30.3: - version "0.30.11" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.11.tgz#301a6f93b3e8c2cb13ac1a7a673492c0dfd12954" - integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +magic-string@0.30.3: + version "0.30.3" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.3.tgz#403755dfd9d6b398dfa40635d52e96c5ac095b85" + integrity sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw== dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/sourcemap-codec" "^1.4.15" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" @@ -938,15 +1275,30 @@ micromatch@^4.0.4: braces "^3.0.3" picomatch "^2.3.1" +mime-db@^1.28.0: + version "1.53.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447" + integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== dependencies: brace-expansion "^2.0.1" @@ -957,6 +1309,13 @@ minimatch@^8.0.2: dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.3: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minipass@^4.2.4: version "4.2.8" resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" @@ -967,38 +1326,39 @@ minipass@^4.2.4: resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -mocha@10.7.3: - version "10.7.3" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.7.3.tgz#ae32003cabbd52b59aece17846056a68eb4b0752" - integrity sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A== - dependencies: - ansi-colors "^4.1.3" - browser-stdout "^1.3.1" - chokidar "^3.5.3" - debug "^4.3.5" - diff "^5.2.0" - escape-string-regexp "^4.0.0" - find-up "^5.0.0" - glob "^8.1.0" - he "^1.2.0" - js-yaml "^4.1.0" - log-symbols "^4.1.0" - minimatch "^5.1.6" - ms "^2.1.3" - serialize-javascript "^6.0.2" - strip-json-comments "^3.1.1" - supports-color "^8.1.1" - workerpool "^6.5.1" - yargs "^16.2.0" - yargs-parser "^20.2.9" - yargs-unparser "^2.0.0" +mocha@10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== + dependencies: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.3: +ms@2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -1008,11 +1368,35 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + object-is@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" @@ -1036,18 +1420,42 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" -onetime@^5.1.0: +once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" +os-filter-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-2.0.0.tgz#1c0b62d5f3a2442749a2d139e6dddee6e81d8d16" + integrity sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg== + dependencies: + arch "^2.1.0" + os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -1067,16 +1475,16 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-key@^3.1.0: +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - path-scurry@^1.6.1: version "1.11.1" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" @@ -1090,26 +1498,49 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +peek-readable@^5.1.3: + version "5.1.4" + resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-5.1.4.tgz#a5ae52f8770a602e7cc80867dd9f5cc5237c8508" + integrity sha512-E7mY2VmKqw9jYuXrSWGHFuPCW2SLQenzXLF3amGaY6lXXg4/b3gj5HVM7h8ZjCO/nZS9ICs0Cz285+32FvNd/A== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pify@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + possible-typed-array-names@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== -prettier@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" - integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== +prettier@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" + integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -1125,6 +1556,11 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -1132,6 +1568,22 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-web-to-node-stream@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz#5d52bb5df7b54861fd48d015e93a2cb87b3ee0bb" + integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== + dependencies: + readable-stream "^3.6.0" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -1149,14 +1601,17 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -resolve@^1.22.1: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== +resolve-alpn@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" + lowercase-keys "^2.0.0" restore-cursor@^3.1.0: version "3.1.0" @@ -1171,35 +1626,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rollup-plugin-closure-compiler-js@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/rollup-plugin-closure-compiler-js/-/rollup-plugin-closure-compiler-js-1.0.6.tgz#58e3e31297ad1a532d9114108bc06f2756d72c3d" - integrity sha512-fgTlW26jOg5Mkm5+mDr/xst1ZyuH7JBU7KvJfys4C7wU7ymPyaofZsNpBeDnHzE7MVD2YcDjZbOU+M8dUJjG2A== - dependencies: - google-closure-compiler-js ">20170000" - -rollup-plugin-progress@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-progress/-/rollup-plugin-progress-1.1.2.tgz#5c1dfe7c50f654906bc34d167d5512ee1a4b72d5" - integrity sha512-6ehSZOMTZdAlRpe45kf56BnIOsDYC2GKWhGlK/Dh/Ae/AMUneMDyKdiv9ZlRrW/HVc986frTZcc2Zka+oF6W7Q== - dependencies: - chalk "^2.4.2" - -rollup-plugin-typescript3@3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/rollup-plugin-typescript3/-/rollup-plugin-typescript3-3.0.5.tgz#ddab0de4b81f7d104e76fc3695a7c387a5c58658" - integrity sha512-BWmj3OzLPUaJnb3laE0nx6JjpqYwzcmG0nwidcW3SjHWVZSLMoDsM1lWK31ljTUCqY6tZRRuUrvzfW2/pqUHLA== - dependencies: - glob "^10.4.2" - tslib "^2.6.3" - -rollup@2.79.1: - version "2.79.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" - integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== - optionalDependencies: - fsevents "~2.3.2" - run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -1219,7 +1645,7 @@ rxjs@^6.6.0: dependencies: tslib "^1.9.0" -safe-buffer@^5.1.0: +safe-buffer@5.2.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -1229,15 +1655,27 @@ safe-buffer@^5.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -semver@^7.3.2: +semver-regex@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-4.0.5.tgz#fbfa36c7ba70461311f5debcb3928821eb4f9180" + integrity sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw== + +semver-truncate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-3.0.0.tgz#0e3b4825d4a4225d8ae6e7c72231182b42edba40" + integrity sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg== + dependencies: + semver "^7.3.5" + +semver@^7.3.2, semver@^7.3.5, semver@^7.3.8, semver@^7.5.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== dependencies: randombytes "^2.1.0" @@ -1253,6 +1691,13 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.2" +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -1260,25 +1705,44 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -signal-exit@^3.0.2: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -slash@^3.0.0: +slash@3.0.0, slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -smob@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/smob/-/smob-1.5.0.tgz#85d79a1403abf128d24d3ebc1cdc5e1a9548d3ab" - integrity sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig== +sort-keys-length@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188" + integrity sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw== + dependencies: + sort-keys "^1.0.0" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg== + dependencies: + is-plain-obj "^1.0.0" + +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== string-argv@^0.3.1: version "0.3.2" @@ -1294,6 +1758,13 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -1301,36 +1772,47 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-json-comments@^3.1.1: +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" +strip-outer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-2.0.0.tgz#c45c724ed9b1ff6be5f660503791404f4714084b" + integrity sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg== -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== +strtok3@^7.0.0-alpha.9: + version "7.1.1" + resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-7.1.1.tgz#f548fd9dc59d0a76d5567ff8c16be31221f29dfc" + integrity sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg== dependencies: - has-flag "^4.0.0" + "@tokenizer/token" "^0.3.0" + peek-readable "^5.1.3" -supports-color@^8.1.1: +supports-color@8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" through@^2.3.6: version "2.3.8" @@ -1351,6 +1833,14 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +token-types@^5.0.0-alpha.2: + version "5.0.1" + resolved "https://registry.yarnpkg.com/token-types/-/token-types-5.0.1.tgz#aa9d9e6b23c420a675e55413b180635b86a093b4" + integrity sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg== + dependencies: + "@tokenizer/token" "^0.3.0" + ieee754 "^1.2.1" + tough-cookie@4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" @@ -1361,16 +1851,37 @@ tough-cookie@4.1.4: universalify "^0.2.0" url-parse "^1.5.3" +trim-repeated@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-2.0.0.tgz#5d60556d6d40d9461b7c7e06c3ac20b6b1d50090" + integrity sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg== + dependencies: + escape-string-regexp "^5.0.0" + +ts-node@^10.9.1: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== - type-detect@^4.0.8: version "4.1.0" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" @@ -1381,16 +1892,26 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -typescript@5.5.4: - version "5.5.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" - integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== +typescript@5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== typical@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici-types@~6.18.2: + version "6.18.2" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.18.2.tgz#8b678cf939d4fc9ec56be3c68ed69c619dee28b0" + integrity sha512-5ruQbENj95yDYJNS3TvcaxPMshV7aizdv/hWYjGIKoANWKjhWNBsr2YEuYZKodQulB1b8l7ILOuDQep3afowQQ== + universalify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" @@ -1409,6 +1930,11 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + util@^0.12.5: version "0.12.5" resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" @@ -1420,6 +1946,11 @@ util@^0.12.5: is-typed-array "^1.1.3" which-typed-array "^1.1.2" +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + version-bump-prompt@6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/version-bump-prompt/-/version-bump-prompt-6.1.0.tgz#9f57b9bf3e57ee87f43929ff4f3f2123be07ccdb" @@ -1438,6 +1969,13 @@ which-typed-array@^1.1.14, which-typed-array@^1.1.2: gopd "^1.0.1" has-tostringtag "^1.0.2" +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -1445,10 +1983,10 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -workerpool@^6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" - integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== wrap-ansi@^7.0.0: version "7.0.0" @@ -1459,17 +1997,32 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yargs-parser@^20.2.2, yargs-parser@^20.2.9: +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-unparser@^2.0.0: +yargs-unparser@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== @@ -1479,7 +2032,7 @@ yargs-unparser@^2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@16.2.0, yargs@^16.2.0: +yargs@16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== @@ -1492,10 +2045,15 @@ yargs@16.2.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yarn@1.22.22: - version "1.22.22" - resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.22.tgz#ac34549e6aa8e7ead463a7407e1c7390f61a6610" - integrity sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg== +yarn@1.22.19: + version "1.22.19" + resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.19.tgz#4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447" + integrity sha512-/0V5q0WbslqnwP91tirOvldvYISzaqhClxzyUKXYxs07yUILIs5jx/k6CFe8bvKSkds5w+eiOqta39Wk3WxdcQ== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yocto-queue@^0.1.0: version "0.1.0"