From b0948c4a8e1768312ceebccf587e8c8b694d6e6f Mon Sep 17 00:00:00 2001 From: Colin Diesh Date: Mon, 17 Jun 2024 07:55:39 -0400 Subject: [PATCH] Update oclif/test and oclif/core (#4445) --- package.json | 6 +- products/jbrowse-cli/README.md | 12 +- products/jbrowse-cli/package.json | 2 +- .../__snapshots__/add-assembly.test.ts.snap | 558 +++++++ .../__snapshots__/add-connection.test.ts.snap | 71 + .../__snapshots__/add-track.test.ts.snap | 672 ++++++++ .../__snapshots__/admin-server.test.ts.snap | 44 + .../__snapshots__/create.test.ts.snap | 21 + .../__snapshots__/make-pif.test.ts.snap | 2 +- .../set-default-session.test.ts.snap | 72 + .../__snapshots__/text-index.test.ts.snap | 133 +- .../__snapshots__/upgrade.test.ts.snap | 21 + .../src/commands/add-assembly.test.ts | 887 ++++------ .../src/commands/add-connection.test.ts | 229 +-- .../src/commands/add-track.test.ts | 1166 +++++-------- .../src/commands/admin-server.test.ts | 274 ++-- .../jbrowse-cli/src/commands/create.test.ts | 229 ++- .../jbrowse-cli/src/commands/make-pif.test.ts | 25 +- .../src/commands/remove-track.test.ts | 29 +- .../src/commands/set-default-session.test.ts | 224 +-- .../src/commands/text-index.test.ts | 347 ++-- .../jbrowse-cli/src/commands/upgrade.test.ts | 179 +- products/jbrowse-cli/src/testUtil.ts | 37 +- yarn.lock | 1442 +++++++---------- 24 files changed, 3480 insertions(+), 3202 deletions(-) create mode 100644 products/jbrowse-cli/src/commands/__snapshots__/add-assembly.test.ts.snap create mode 100644 products/jbrowse-cli/src/commands/__snapshots__/add-connection.test.ts.snap create mode 100644 products/jbrowse-cli/src/commands/__snapshots__/add-track.test.ts.snap create mode 100644 products/jbrowse-cli/src/commands/__snapshots__/admin-server.test.ts.snap create mode 100644 products/jbrowse-cli/src/commands/__snapshots__/create.test.ts.snap create mode 100644 products/jbrowse-cli/src/commands/__snapshots__/set-default-session.test.ts.snap create mode 100644 products/jbrowse-cli/src/commands/__snapshots__/upgrade.test.ts.snap diff --git a/package.json b/package.json index a0d3770075..9d9ea5850d 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,8 @@ "@mui/system": "^5.14.4", "@mui/x-data-grid": "^7.0.0", "@node-oauth/express-oauth-server": "^4.0.0", - "@oclif/test": "^3.2.1", + "@oclif/core": "^4.0.0", + "@oclif/test": "^4.0.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", "@r2wc/react-to-web-component": "^2.0.3", "@storybook/addon-essentials": "^8.0.0", @@ -91,7 +92,6 @@ "browserslist": "^4.18.1", "canvas": "^2.9.1", "case-sensitive-paths-webpack-plugin": "^2.4.0", - "chai": "^4.3.4", "cors": "^2.8.5", "cross-env": "^7.0.2", "cross-spawn": "^7.0.1", @@ -129,7 +129,7 @@ "mobx": "^6.0.0", "mobx-react": "^9.0.0", "mobx-state-tree": "^5.1.7", - "nock": "^13.2.1", + "nock": "^13.5.4", "npm-run-all": "^4.1.5", "oclif": "^4.0.0", "prettier": "^3.2.5", diff --git a/products/jbrowse-cli/README.md b/products/jbrowse-cli/README.md index bb93174d7b..12b9431db1 100644 --- a/products/jbrowse-cli/README.md +++ b/products/jbrowse-cli/README.md @@ -67,9 +67,9 @@ Add an assembly to a JBrowse 2 configuration ``` USAGE - $ jbrowse add-assembly SEQUENCE [-t indexedFasta|bgzipFasta|twoBit|chromSizes|custom] [-n ] [-a ] - [--displayName ] [--faiLocation ] [--gziLocation ] [--refNameAliasesType aliases|custom - --refNameAliases ] [--refNameColors ] [--target ] [--out ] [-h] [-l + $ jbrowse add-assembly SEQUENCE [-t indexedFasta|bgzipFasta|twoBit|chromSizes|custom] [-n ] [-a + ...] [--displayName ] [--faiLocation ] [--gziLocation ] [--refNameAliasesType + aliases|custom --refNameAliases ] [--refNameColors ] [--target ] [--out ] [-h] [-l copy|symlink|move|inPlace] [--skipCheck] [--overwrite] [-f] ARGUMENTS @@ -477,7 +477,7 @@ DESCRIPTION ``` _See code: -[@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v6.0.22/src/commands/help.ts)_ +[@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v6.2.3/src/commands/help.ts)_ ## `jbrowse make-pif FILE` @@ -608,8 +608,8 @@ Make a text-indexing file for any given track(s). ``` USAGE $ jbrowse text-index [-h] [--tracks ] [--target ] [--out ] [--attributes ] [-a - ] [--force] [-q] [--perTrack] [--exclude ] [--prefixSize ] [--file ] [--fileId ] - [--dryrun] + ] [--force] [-q] [--perTrack] [--exclude ] [--prefixSize ] [--file ...] [--fileId + ...] [--dryrun] FLAGS -a, --assemblies= Specify the assembl(ies) to create an index for. If unspecified, creates an index for each diff --git a/products/jbrowse-cli/package.json b/products/jbrowse-cli/package.json index 371b03cd83..f72dcdfa22 100644 --- a/products/jbrowse-cli/package.json +++ b/products/jbrowse-cli/package.json @@ -45,7 +45,7 @@ "docs:version:add": "git add README.md" }, "dependencies": { - "@oclif/core": "^3.22.0", + "@oclif/core": "^4.0.6", "@oclif/plugin-help": "^6.0.15", "boxen": "^4.2.0", "chalk": "^4.1.0", diff --git a/products/jbrowse-cli/src/commands/__snapshots__/add-assembly.test.ts.snap b/products/jbrowse-cli/src/commands/__snapshots__/add-assembly.test.ts.snap new file mode 100644 index 0000000000..5912a0fcba --- /dev/null +++ b/products/jbrowse-cli/src/commands/__snapshots__/add-assembly.test.ts.snap @@ -0,0 +1,558 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`add-assembly no load flag 1`] = `"Please specify the loading operation for this file with --load copy|symlink|move|inPlace"`; + +exports[`adds an assembly from a 2bit 1`] = ` +{ + "assemblies": [ + { + "name": "simple", + "sequence": { + "adapter": { + "twoBitLocation": { + "locationType": "UriLocation", + "uri": "simple.2bit", + }, + "type": "TwoBitAdapter", + }, + "trackId": "simple-ReferenceSequenceTrack", + "type": "ReferenceSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`adds an assembly from a FASTA (.fa extension) 1`] = ` +{ + "assemblies": [ + { + "name": "simple", + "sequence": { + "adapter": { + "faiLocation": { + "locationType": "UriLocation", + "uri": "simple.fa.fai", + }, + "fastaLocation": { + "locationType": "UriLocation", + "uri": "simple.fa", + }, + "type": "IndexedFastaAdapter", + }, + "trackId": "simple-ReferenceSequenceTrack", + "type": "ReferenceSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`adds an assembly from a FASTA (bgzip) 1`] = ` +{ + "assemblies": [ + { + "name": "simple", + "sequence": { + "adapter": { + "faiLocation": { + "locationType": "UriLocation", + "uri": "simple.fasta.gz.fai", + }, + "fastaLocation": { + "locationType": "UriLocation", + "uri": "simple.fasta.gz", + }, + "gziLocation": { + "locationType": "UriLocation", + "uri": "simple.fasta.gz.gzi", + }, + "type": "BgzipFastaAdapter", + }, + "trackId": "simple-ReferenceSequenceTrack", + "type": "ReferenceSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`adds an assembly from a FASTA 1`] = ` +{ + "assemblies": [ + { + "name": "simple", + "sequence": { + "adapter": { + "faiLocation": { + "locationType": "UriLocation", + "uri": "simple.fasta.fai", + }, + "fastaLocation": { + "locationType": "UriLocation", + "uri": "simple.fasta", + }, + "type": "IndexedFastaAdapter", + }, + "trackId": "simple-ReferenceSequenceTrack", + "type": "ReferenceSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`adds an assembly from a URL 1`] = ` +{ + "assemblies": [ + { + "name": "simple", + "sequence": { + "adapter": { + "twoBitLocation": { + "locationType": "UriLocation", + "uri": "https://mysite.com/data/simple.2bit", + }, + "type": "TwoBitAdapter", + }, + "trackId": "simple-ReferenceSequenceTrack", + "type": "ReferenceSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`adds an assembly from a custom adapter JSON file 1`] = ` +{ + "assemblies": [ + { + "name": "simple", + "sequence": { + "adapter": { + "features": [ + { + "end": 233, + "refName": "SEQUENCE_1", + "seq": "CCAAGATCTAAGATGTCAACACCTATCTGCTCAAGGTGGTTTTTATAAGGAGTCGCATCGAGGTAAGACATTTTAGAAGTATTTCTCAAGCGTGGGGCAGTTCGCCAAGTTACATCGCTCAGCCCAGGTTCCCTGATTCGAGAACATATCGGTGCTGGGTATTTGTTGGGTTGGTTGATTTGCACCGTAGTTTACACCTTACGACACTACCTATCCAAACAATTGTGTGATAG", + "start": 0, + "uniqueId": "firstId", + }, + { + "end": 120, + "refName": "SEQUENCE_2", + "seq": "CCGAACCACAGGCCTATGTTACCATTGGAAAGCTCACCTTCCCGAAGGATTGGGACTCCACTAGTCGAAGCCTCAATTCGCCGCGATTAGATAGGGGGCAAGTGGAGATTGATGTTTGGT", + "start": 0, + "uniqueId": "secondId", + }, + ], + "type": "FromConfigSequenceAdapter", + }, + "trackId": "simple-ReferenceSequenceTrack", + "type": "ReferenceSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`adds an assembly from a custom adapter inline JSON 1`] = ` +{ + "assemblies": [ + { + "name": "simple", + "sequence": { + "adapter": { + "features": [ + { + "end": 233, + "refName": "SEQUENCE_1", + "start": 0, + "uniqueId": "firstId", + }, + { + "end": 120, + "refName": "SEQUENCE_2", + "start": 0, + "uniqueId": "secondId", + }, + ], + "type": "FromConfigRegionsAdapter", + }, + "trackId": "simple-ReferenceSequenceTrack", + "type": "ReferenceSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`adds an assembly from chrom.sizes 1`] = ` +{ + "assemblies": [ + { + "name": "simple", + "sequence": { + "adapter": { + "chromSizesLocation": { + "locationType": "UriLocation", + "uri": "simple.chrom.sizes", + }, + "type": "ChromSizesAdapter", + }, + "trackId": "simple-ReferenceSequenceTrack", + "type": "ReferenceSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`can specify --type when the type can't be inferred from the extension 1`] = ` +{ + "assemblies": [ + { + "name": "simple.2bit.xyz", + "sequence": { + "adapter": { + "twoBitLocation": { + "locationType": "UriLocation", + "uri": "simple.2bit.xyz", + }, + "type": "TwoBitAdapter", + }, + "trackId": "simple.2bit.xyz-ReferenceSequenceTrack", + "type": "ReferenceSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`can specify a custom faiLocation and gziLocation 1`] = ` +{ + "assemblies": [ + { + "name": "simple", + "sequence": { + "adapter": { + "faiLocation": { + "locationType": "UriLocation", + "uri": "simple.fasta.gz.fai.abc", + }, + "fastaLocation": { + "locationType": "UriLocation", + "uri": "simple.fasta.gz", + }, + "gziLocation": { + "locationType": "UriLocation", + "uri": "simple.fasta.gz.gzi.def", + }, + "type": "BgzipFastaAdapter", + }, + "trackId": "simple-ReferenceSequenceTrack", + "type": "ReferenceSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`can specify a custom name and alias 1`] = ` +{ + "assemblies": [ + { + "aliases": [ + "customAlias", + ], + "name": "customName", + "sequence": { + "adapter": { + "type": "CustomAdapter", + }, + "trackId": "customName-ReferenceSequenceTrack", + "type": "ReferenceSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`can specify a custom name and alias and refNameColors 1`] = ` +{ + "assemblies": [ + { + "name": "simple", + "refNameColors": [ + "red", + "orange", + "yellow", + "green", + "blue", + "purple", + ], + "sequence": { + "adapter": { + "type": "CustomAdapter", + }, + "trackId": "simple-ReferenceSequenceTrack", + "type": "ReferenceSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`can specify a multiple aliases 1`] = ` +{ + "assemblies": [ + { + "aliases": [ + "firstAlias", + "secondAlias", + ], + "name": "simple", + "sequence": { + "adapter": { + "type": "CustomAdapter", + }, + "trackId": "simple-ReferenceSequenceTrack", + "type": "ReferenceSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`can specify a refNameAliases file 1`] = ` +{ + "assemblies": [ + { + "name": "simple", + "refNameAliases": { + "adapter": { + "location": { + "locationType": "UriLocation", + "uri": "simple.aliases", + }, + "type": "RefNameAliasAdapter", + }, + }, + "sequence": { + "adapter": { + "type": "CustomAdapter", + }, + "trackId": "simple-ReferenceSequenceTrack", + "type": "ReferenceSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`can specify a refNameAliases file type custom 1`] = ` +{ + "assemblies": [ + { + "name": "simple", + "refNameAliases": { + "adapter": { + "type": "CustomAdapter", + }, + }, + "sequence": { + "adapter": { + "type": "CustomAdapter", + }, + "trackId": "simple-ReferenceSequenceTrack", + "type": "ReferenceSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`can use --overwrite to replace an existing assembly 1`] = ` +{ + "assemblies": [ + { + "name": "simple", + "sequence": { + "adapter": { + "twoBitLocation": { + "locationType": "UriLocation", + "uri": "simple.2bit", + }, + "type": "TwoBitAdapter", + }, + "trackId": "simple-ReferenceSequenceTrack", + "type": "ReferenceSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`can use an existing config file 1`] = ` +{ + "assemblies": [ + { + "name": "simple", + "sequence": { + "adapter": { + "type": "CustomAdapter", + }, + "trackId": "simple-ReferenceSequenceTrack", + "type": "ReferenceSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`fails if custom refNameAliases adapter has no type 1`] = `"No "type" specified in refNameAliases adapter "{}""`; + +exports[`fails if custom refNameAliases adapter has no type 2`] = `"No "type" specified in refNameAliases adapter "{}""`; + +exports[`fails if custom sequence adapter has no type 1`] = `"No "type" specified in sequence adapter "{}""`; + +exports[`fails if it cannot find a file 1`] = `"Could not resolve to a file or a URL: "simple.doesNotExist.fasta""`; + +exports[`fails if it cannot guess the sequence type 1`] = `"Could not determine sequence type automatically, add --type to specify it"`; + +exports[`fails if load flag is passed with a URL 1`] = `"URL detected with --load flag. Please rerun the function without the --load flag"`; + +exports[`fails if trying to add an assembly with a name that already exists 1`] = `"Cannot add assembly with name simple, an assembly with that name already exists"`; + +exports[`fails if using inline JSON sequence custom with no --name 1`] = `"Must provide --name when using custom inline JSON sequence"`; + +exports[`fails if using invalid inline JSON 1`] = `"Error: ENOENT: no such file or directory, open 'notValidJSON'"`; + +exports[`relative path 1`] = ` +{ + "assemblies": [ + { + "name": "simple", + "sequence": { + "adapter": { + "twoBitLocation": { + "locationType": "UriLocation", + "uri": "../simple.2bit", + }, + "type": "TwoBitAdapter", + }, + "trackId": "simple-ReferenceSequenceTrack", + "type": "ReferenceSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; diff --git a/products/jbrowse-cli/src/commands/__snapshots__/add-connection.test.ts.snap b/products/jbrowse-cli/src/commands/__snapshots__/add-connection.test.ts.snap new file mode 100644 index 0000000000..23158fbde4 --- /dev/null +++ b/products/jbrowse-cli/src/commands/__snapshots__/add-connection.test.ts.snap @@ -0,0 +1,71 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`adds JBrowse1 connection from a url 1`] = ` +[ + { + "connectionId": "JBrowse1Connection-1", + "dataDirLocation": { + "locationType": "UriLocation", + "uri": "https://mysite.com/jbrowse/data", + }, + "name": "JBrowse1Connection-1", + "type": "JBrowse1Connection", + }, +] +`; + +exports[`adds a custom connection with user set fields 1`] = ` +[ + { + "assemblyNames": [ + "testAssembly", + ], + "connectionId": "newConnectionId", + "locationType": "UriLocation", + "name": "newName", + "type": "newType", + "url": { + "uri": "https://mysite.com/custom", + }, + }, +] +`; + +exports[`adds an UCSCTrackHubConnection connection from a url 1`] = ` +[ + { + "connectionId": "UCSCTrackHubConnection-1", + "hubTxtLocation": { + "locationType": "UriLocation", + "uri": "https://mysite.com/data/hub.txt", + }, + "name": "UCSCTrackHubConnection-1", + "type": "UCSCTrackHubConnection", + }, +] +`; + +exports[`fails if data directory is not an url 1`] = `"The location provided is not a valid URL"`; + +exports[`fails if no config file 1`] = `"Error: ENOENT: no such file or directory, open './config.json'"`; + +exports[`fails to add a duplicate connection 1`] = ` +"Cannot add connection with id newConnectionId, a connection with that id already exists. +Use --overwrite if you would like to replace the existing connection" +`; + +exports[`fails when fetching from url fails 1`] = `"Unable to fetch from URL, Error: Response returned with code 500"`; + +exports[`overwrites an existing custom connection and does not check URL 1`] = ` +[ + { + "connectionId": "newConnectionId", + "locationType": "UriLocation", + "name": "newConnectionId", + "type": "custom", + "url": { + "uri": "https://mysite.com/custom", + }, + }, +] +`; diff --git a/products/jbrowse-cli/src/commands/__snapshots__/add-track.test.ts.snap b/products/jbrowse-cli/src/commands/__snapshots__/add-track.test.ts.snap new file mode 100644 index 0000000000..07be5e7e57 --- /dev/null +++ b/products/jbrowse-cli/src/commands/__snapshots__/add-track.test.ts.snap @@ -0,0 +1,672 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`adds a bam track from a url 1`] = ` +[ + { + "adapter": { + "bamLocation": { + "locationType": "UriLocation", + "uri": "https://mysite.com/data/simple.bam", + }, + "index": { + "indexType": "BAI", + "location": { + "locationType": "UriLocation", + "uri": "https://mysite.com/data/simple.bam.bai", + }, + }, + "sequenceAdapter": { + "twoBitLocation": { + "locationType": "UriLocation", + "uri": "test.2bit", + }, + "type": "testSeqAdapter", + }, + "type": "BamAdapter", + }, + "assemblyNames": [ + "testAssembly", + ], + "name": "simple", + "trackId": "simple", + "type": "AlignmentsTrack", + }, +] +`; + +exports[`adds a bam track with all the custom fields 1`] = ` +[ + { + "adapter": { + "bamLocation": { + "locationType": "UriLocation", + "uri": "simple.bam", + }, + "index": { + "indexType": "BAI", + "location": { + "locationType": "UriLocation", + "uri": "simple.bam.bai", + }, + }, + "type": "BamAdapter", + }, + "assemblyNames": [ + "customAssemblyName", + ], + "category": [ + "newcategory", + ], + "defaultRendering": "test", + "description": "new description", + "name": "customName", + "trackId": "customTrackId", + "type": "CustomTrackType", + }, +] +`; + +exports[`adds a bam track with bai 1`] = ` +[ + { + "adapter": { + "bamLocation": { + "locationType": "UriLocation", + "uri": "simple.bam", + }, + "index": { + "indexType": "BAI", + "location": { + "locationType": "UriLocation", + "uri": "simple.bam.bai", + }, + }, + "sequenceAdapter": { + "twoBitLocation": { + "locationType": "UriLocation", + "uri": "test.2bit", + }, + "type": "testSeqAdapter", + }, + "type": "BamAdapter", + }, + "assemblyNames": [ + "testAssembly", + ], + "name": "simple", + "trackId": "simple", + "type": "AlignmentsTrack", + }, +] +`; + +exports[`adds a bam track with csi 1`] = ` +[ + { + "adapter": { + "bamLocation": { + "locationType": "UriLocation", + "uri": "simple.bam", + }, + "index": { + "indexType": "CSI", + "location": { + "locationType": "UriLocation", + "uri": "simple.bam.csi", + }, + }, + "sequenceAdapter": { + "twoBitLocation": { + "locationType": "UriLocation", + "uri": "test.2bit", + }, + "type": "testSeqAdapter", + }, + "type": "BamAdapter", + }, + "assemblyNames": [ + "testAssembly", + ], + "name": "simple", + "trackId": "simple", + "type": "AlignmentsTrack", + }, +] +`; + +exports[`adds a bam track with indexFile for bai 1`] = ` +[ + { + "adapter": { + "bamLocation": { + "locationType": "UriLocation", + "uri": "simple.bam", + }, + "index": { + "indexType": "BAI", + "location": { + "locationType": "UriLocation", + "uri": "simple.bai", + }, + }, + "sequenceAdapter": { + "twoBitLocation": { + "locationType": "UriLocation", + "uri": "test.2bit", + }, + "type": "testSeqAdapter", + }, + "type": "BamAdapter", + }, + "assemblyNames": [ + "testAssembly", + ], + "name": "simple", + "trackId": "simple", + "type": "AlignmentsTrack", + }, +] +`; + +exports[`adds a bam track with load inPlace 1`] = ` +[ + { + "adapter": { + "bamLocation": { + "locationType": "UriLocation", + "uri": "/testing/in/place.bam", + }, + "index": { + "indexType": "BAI", + "location": { + "locationType": "UriLocation", + "uri": "/testing/in/place.bam.bai", + }, + }, + "sequenceAdapter": { + "twoBitLocation": { + "locationType": "UriLocation", + "uri": "test.2bit", + }, + "type": "testSeqAdapter", + }, + "type": "BamAdapter", + }, + "assemblyNames": [ + "testAssembly", + ], + "name": "place", + "trackId": "place", + "type": "AlignmentsTrack", + }, +] +`; + +exports[`adds a bam track with subDir 1`] = ` +[ + { + "adapter": { + "bamLocation": { + "locationType": "UriLocation", + "uri": "bam/simple.bam", + }, + "index": { + "indexType": "BAI", + "location": { + "locationType": "UriLocation", + "uri": "bam/simple.bam.bai", + }, + }, + "sequenceAdapter": { + "twoBitLocation": { + "locationType": "UriLocation", + "uri": "test.2bit", + }, + "type": "testSeqAdapter", + }, + "type": "BamAdapter", + }, + "assemblyNames": [ + "testAssembly", + ], + "name": "simple", + "trackId": "simple", + "type": "AlignmentsTrack", + }, +] +`; + +exports[`adds a bam track with subDir and localPath protocol 1`] = ` +[ + { + "adapter": { + "bamLocation": { + "localPath": "bam/simple.bam", + "locationType": "LocalPathLocation", + }, + "index": { + "indexType": "BAI", + "location": { + "localPath": "bam/simple.bam.bai", + "locationType": "LocalPathLocation", + }, + }, + "sequenceAdapter": { + "twoBitLocation": { + "locationType": "UriLocation", + "uri": "test.2bit", + }, + "type": "testSeqAdapter", + }, + "type": "BamAdapter", + }, + "assemblyNames": [ + "testAssembly", + ], + "name": "simple", + "trackId": "simple", + "type": "AlignmentsTrack", + }, +] +`; + +exports[`adds a bam+bai track with load inPlace 1`] = ` +[ + { + "adapter": { + "bamLocation": { + "locationType": "UriLocation", + "uri": "/testing/in/place.bam", + }, + "index": { + "indexType": "BAI", + "location": { + "locationType": "UriLocation", + "uri": "/something/else/random.bai", + }, + }, + "sequenceAdapter": { + "twoBitLocation": { + "locationType": "UriLocation", + "uri": "test.2bit", + }, + "type": "testSeqAdapter", + }, + "type": "BamAdapter", + }, + "assemblyNames": [ + "testAssembly", + ], + "name": "place", + "trackId": "place", + "type": "AlignmentsTrack", + }, +] +`; + +exports[`adds a chain file 1`] = ` +[ + { + "adapter": { + "assemblyNames": [ + "volvox_random_inv", + "volvox", + ], + "chainLocation": { + "locationType": "UriLocation", + "uri": "volvox_inv_indels.chain", + }, + "type": "ChainAdapter", + }, + "assemblyNames": [ + "volvox_random_inv", + "volvox", + ], + "name": "volvox_inv_indels", + "trackId": "volvox_inv_indels", + "type": "SyntenyTrack", + }, +] +`; + +exports[`adds a delta file 1`] = ` +[ + { + "adapter": { + "assemblyNames": [ + "volvox_random_inv", + "volvox", + ], + "deltaLocation": { + "locationType": "UriLocation", + "uri": "volvox_inv_indels.delta", + }, + "type": "DeltaAdapter", + }, + "assemblyNames": [ + "volvox_random_inv", + "volvox", + ], + "name": "volvox_inv_indels", + "trackId": "volvox_inv_indels", + "type": "SyntenyTrack", + }, +] +`; + +exports[`adds a mashmap file 1`] = ` +[ + { + "adapter": { + "assemblyNames": [ + "volvox_random_inv", + "volvox", + ], + "outLocation": { + "locationType": "UriLocation", + "uri": "volvox_inv_indels.out", + }, + "type": "MashMapAdapter", + }, + "assemblyNames": [ + "volvox_random_inv", + "volvox", + ], + "name": "volvox_inv_indels", + "trackId": "volvox_inv_indels", + "type": "SyntenyTrack", + }, +] +`; + +exports[`adds a mcscan anchors file 1`] = ` +[ + { + "adapter": { + "assemblyNames": [ + "volvox_random_inv", + "volvox", + ], + "bed1Location": { + "locationType": "UriLocation", + "uri": "grape.bed", + }, + "bed2Location": { + "locationType": "UriLocation", + "uri": "peach.bed", + }, + "mcscanAnchorsLocation": { + "locationType": "UriLocation", + "uri": "volvox_inv_indels.anchors", + }, + "type": "MCScanAnchorsAdapter", + }, + "assemblyNames": [ + "volvox_random_inv", + "volvox", + ], + "name": "volvox_inv_indels", + "trackId": "volvox_inv_indels", + "type": "SyntenyTrack", + }, +] +`; + +exports[`adds a mcscan simple anchors file 1`] = ` +[ + { + "adapter": { + "assemblyNames": [ + "volvox_random_inv", + "volvox", + ], + "bed1Location": { + "locationType": "UriLocation", + "uri": "grape.bed", + }, + "bed2Location": { + "locationType": "UriLocation", + "uri": "peach.bed", + }, + "mcscanSimpleAnchorsLocation": { + "locationType": "UriLocation", + "uri": "volvox_inv_indels.anchors.simple", + }, + "type": "MCScanSimpleAnchorsAdapter", + }, + "assemblyNames": [ + "volvox_random_inv", + "volvox", + ], + "name": "volvox_inv_indels.anchors", + "trackId": "volvox_inv_indels.anchors", + "type": "SyntenyTrack", + }, +] +`; + +exports[`adds a paf file 1`] = ` +[ + { + "adapter": { + "assemblyNames": [ + "volvox_random_inv", + "volvox", + ], + "pafLocation": { + "locationType": "UriLocation", + "uri": "volvox_inv_indels.paf", + }, + "type": "PAFAdapter", + }, + "assemblyNames": [ + "volvox_random_inv", + "volvox", + ], + "name": "volvox_inv_indels", + "trackId": "volvox_inv_indels", + "type": "SyntenyTrack", + }, +] +`; + +exports[`adds a paf.gz file 1`] = ` +[ + { + "adapter": { + "assemblyNames": [ + "volvox_random_inv", + "volvox", + ], + "pafLocation": { + "locationType": "UriLocation", + "uri": "volvox_inv_indels.paf.gz", + }, + "type": "PAFAdapter", + }, + "assemblyNames": [ + "volvox_random_inv", + "volvox", + ], + "name": "volvox_inv_indels.paf", + "trackId": "volvox_inv_indels.paf", + "type": "SyntenyTrack", + }, +] +`; + +exports[`adds a plaintext bed 1`] = ` +[ + { + "adapter": { + "bedLocation": { + "locationType": "UriLocation", + "uri": "volvox.bed", + }, + "type": "BedAdapter", + }, + "assemblyNames": [ + "testAssembly", + ], + "name": "volvox", + "trackId": "volvox", + "type": "FeatureTrack", + }, +] +`; + +exports[`adds a plaintext bedpe 1`] = ` +[ + { + "adapter": { + "bedpeLocation": { + "locationType": "UriLocation", + "uri": "volvox.bedpe", + }, + "type": "BedpeAdapter", + }, + "assemblyNames": [ + "testAssembly", + ], + "name": "volvox", + "trackId": "volvox", + "type": "VariantTrack", + }, +] +`; + +exports[`adds a plaintext gff 1`] = ` +[ + { + "adapter": { + "gffLocation": { + "locationType": "UriLocation", + "uri": "volvox.sort.gff3", + }, + "type": "Gff3Adapter", + }, + "assemblyNames": [ + "testAssembly", + ], + "name": "volvox.sort", + "trackId": "volvox.sort", + "type": "FeatureTrack", + }, +] +`; + +exports[`adds a plaintext gtf 1`] = ` +[ + { + "adapter": { + "gtfLocation": { + "locationType": "UriLocation", + "uri": "volvox.sorted.gtf", + }, + "type": "GtfAdapter", + }, + "assemblyNames": [ + "testAssembly", + ], + "name": "volvox.sorted", + "trackId": "volvox.sorted", + "type": "FeatureTrack", + }, +] +`; + +exports[`adds a plaintext vcf 1`] = ` +[ + { + "adapter": { + "type": "VcfAdapter", + "vcfLocation": { + "locationType": "UriLocation", + "uri": "volvox.filtered.vcf", + }, + }, + "assemblyNames": [ + "testAssembly", + ], + "name": "volvox.filtered", + "trackId": "volvox.filtered", + "type": "VariantTrack", + }, +] +`; + +exports[`adds a tabix gff with csi 1`] = ` +[ + { + "adapter": { + "gffGzLocation": { + "locationType": "UriLocation", + "uri": "volvox.sort.gff3.gz", + }, + "index": { + "indexType": "CSI", + "location": { + "locationType": "UriLocation", + "uri": "volvox.sort.gff3.gz.csi", + }, + }, + "type": "Gff3TabixAdapter", + }, + "assemblyNames": [ + "testAssembly", + ], + "name": "volvox.sort.gff3", + "trackId": "volvox.sort.gff3", + "type": "FeatureTrack", + }, +] +`; + +exports[`adds a tabix gff with tbi 1`] = ` +[ + { + "adapter": { + "gffGzLocation": { + "locationType": "UriLocation", + "uri": "volvox.sort.gff3.gz", + }, + "index": { + "indexType": "TBI", + "location": { + "locationType": "UriLocation", + "uri": "volvox.sort.gff3.gz.tbi", + }, + }, + "type": "Gff3TabixAdapter", + }, + "assemblyNames": [ + "testAssembly", + ], + "name": "volvox.sort.gff3", + "trackId": "volvox.sort.gff3", + "type": "FeatureTrack", + }, +] +`; + +exports[`cannot add a track if there is no config file 1`] = `"Error: ENOENT: no such file or directory, open './config.json'"`; + +exports[`cannot add a track with the same track id 1`] = `"Cannot add track with id simple, a track with that id already exists (use --force to override)"`; + +exports[`fails if URL with load flag is passed 1`] = `"The --load flag is used for local files only, but a URL was provided"`; + +exports[`fails if it cannot assume the assemblyname 1`] = `"No assemblies found. Please add one before adding tracks"`; + +exports[`fails if load flag is not passed in for a localFile 1`] = ` +"The --load flag should be used if a local file is used, example --load + copy to copy the file into the config directory. Options for load are + copy/move/symlink/inPlace (inPlace for no file operations)" +`; + +exports[`fails if no track is specified 1`] = ` +"Missing 1 required arg: +track Track file or URL +See more help with --help" +`; + +exports[`fails multiple assemblies exist but no assemblyNames passed 1`] = `"Too many assemblies, cannot default to one. Please specify the assembly with the --assemblyNames flag"`; diff --git a/products/jbrowse-cli/src/commands/__snapshots__/admin-server.test.ts.snap b/products/jbrowse-cli/src/commands/__snapshots__/admin-server.test.ts.snap new file mode 100644 index 0000000000..6e21135b71 --- /dev/null +++ b/products/jbrowse-cli/src/commands/__snapshots__/admin-server.test.ts.snap @@ -0,0 +1,44 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`creates a default config 1`] = ` +{ + "assemblies": [], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`does not overwrite an existing config 1`] = ` +{ + "assemblies": [ + { + "name": "testAssembly", + "sequence": { + "adapter": { + "twoBitLocation": { + "locationType": "UriLocation", + "uri": "test.2bit", + }, + "type": "testSeqAdapter", + }, + "trackId": "", + "type": "testSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "New Session", + }, + "tracks": [], +} +`; + +exports[`throws an error with a negative port 1`] = `"-10 is not a valid port"`; + +exports[`throws an error with a port greater than 65535 1`] = `"66666 is not a valid port"`; diff --git a/products/jbrowse-cli/src/commands/__snapshots__/create.test.ts.snap b/products/jbrowse-cli/src/commands/__snapshots__/create.test.ts.snap new file mode 100644 index 0000000000..03e003233d --- /dev/null +++ b/products/jbrowse-cli/src/commands/__snapshots__/create.test.ts.snap @@ -0,0 +1,21 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`fails because this directory is already set up 1`] = `"jbrowse This directory has existing files and could cause conflicts with create. Please choose another directory or use the force flag to overwrite existing files"`; + +exports[`fails if no path is provided to the command 1`] = ` +"Missing 1 required arg: +localPath Location where JBrowse 2 will be installed +See more help with --help" +`; + +exports[`fails if no path is provided to the command, even with force 1`] = ` +"Missing 1 required arg: +localPath Location where JBrowse 2 will be installed +See more help with --help" +`; + +exports[`fails if the fetch does not return the right file 1`] = `"The URL provided does not seem to be a JBrowse installation URL"`; + +exports[`fails if user selects a directory that already has existing files 1`] = `undefined`; + +exports[`fails to download a version that does not exist 1`] = `"Could not find version: "`; diff --git a/products/jbrowse-cli/src/commands/__snapshots__/make-pif.test.ts.snap b/products/jbrowse-cli/src/commands/__snapshots__/make-pif.test.ts.snap index 4f8b5d1696..f59d0f42c2 100644 --- a/products/jbrowse-cli/src/commands/__snapshots__/make-pif.test.ts.snap +++ b/products/jbrowse-cli/src/commands/__snapshots__/make-pif.test.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`make-pif processes volvox paf 1`] = ` +exports[`make-pif 1`] = ` "qctgA 49186 3 1851 + ctgA 50001 0 1859 1633 2044 60 NM:i:411 ms:i:2207 AS:i:1899 nn:i:0 tp:A:P cm:i:87 s1:i:696 s2:i:212 de:f:0.0908 zd:i:1 rl:i:0 cg:Z:4M1D16M1D5M3D33M1I14M3I7M1I25M2D5M2D4M1I17M3I11M1I5M3I3M1D15M3D1M2D6M1D2M6I6M2I24M1D3M2I29M1D2M1D3M1D6M1D10M2I8M19I33M1I23M2I9M1I11M1D6M1I5M1I28M1D13M1I5M1D2M1D49M5I6M2D21M1I1M2I2M2I4M4D4M1D5M1D3M1I2M1D4M37I17M2D16M6I5M3I3M6I16M5D4M8D5M4D1M1D52M2I2M1D5M28I33M1I17M2D2M2I31M42D5M1D9M1D7M1I8M1D40M1D39M1D2M1I3M2D11M2D6M2D10M1I14M1D12M1D16M1I6M3D6M2D4M1D1M1D27M1D3M10D3M2I11M3I3M1D35M1D1M3I3M2I19M3I9M4I23M1D3M1D28M1D52M1D28M1I20M2D66M1D3M2D7M1I7M2I9M1I11M1I11M1I7M1D3M1D30M1I11M1I15M2D7M3I3M1D12M6D35M1I4M1I17M1I15M1D5M1I4M1D5M1D3M5I10M1I2M1I8M7D13M5D9M1I4M1D45M6D4M1D19M2I16M1I1M2D23M7D11M1D19M1I13M qctgA 49186 1860 2214 - ctgA 50001 1859 2192 321 366 60 NM:i:45 ms:i:501 AS:i:468 nn:i:0 tp:A:I cm:i:0 s1:i:0 s2:i:0 de:f:0.0614 rl:i:0 cg:Z:42M1I6M1D2M1D35M1D2M4D16M2D39M15D6M1D2M1D9M1D30M1D8M1I2M2I7M1D10M1D43M2D20M5I12M1D9M1I3M1I4M1I14M qctgA 49186 2214 15925 + ctgA 50001 2212 16198 12504 15030 60 NM:i:2526 ms:i:17647 AS:i:15934 nn:i:0 tp:A:P cm:i:637 s1:i:5099 s2:i:212 de:f:0.0837 zd:i:3 rl:i:0 cg:Z:10M1D4M2D21M1D10M1D14M1D5M1I29M2I9M1D15M1D27M1D12M1I5M1D11M1I7M2D4M2I9M1I4M6I32M1I13M1D55M1D8M1D1M1D12M1D2M1I22M2D56M1I11M1D5M5D17M3D3M1D13M1I16M1D50M1D2M1D10M1I1M1I42M1I2M2I33M22D3M1D2M1D6M1I8M2I5M1I50M1I6M3I6M2I12M3D13M1I9M5I1M1I10M1D3M1I5M1D3M1D4M1D24M1D5M2I30M1I3M1D15M1I9M1D3M1D18M1D9M1I11M2I6M1D23M4I1M1I22M1D3M1D11M2I1M1I7M1I4M1I18M1D6M1D5M2I5M1D66M2D3M1I8M1D13M1D8M1D3M2I4M1I20M1D5M2D22M1D6M8D14M1D6M1I8M2I5M9I7M2D4M1I11M1D20M2I2M1D33M8D10M2D7M1D18M4D5M1I4M4I1M1I33M3D10M1I20M2I8M1I9M1D10M1I7M1D8M1I6M2D66M1D3M2D2M1D24M1I63M1D14M8D7M1D13M1I31M1D16M4I41M1I3M1I4M23D9M1I2M1I8M1D1M1D12M1D2M1D3M1I33M1D24M2D3M1D4M1D12M122I6M4I2M1I13M1D3M1I35M1D4M1D13M1I32M1I6M1D5M1D5M1I12M1I8M1I48M1D2M1I19M1I9M1D24M1I13M1I8M1D5M7D5M2I10M1D11M3D15M1D6M2D4M1D18M1I14M1I3M1I1M2I17M1I12M4I15M1D3M1I31M1I1M1I1M1I1M1I12M5D2M1I31M2D18M1I5M20I10M1D20M3I11M1D14M1D1M9D4M4D2M4D2M3D4M1I10M1I50M1D14M1D11M8D11M2I9M1D20M3D5M1D27M1I5M3D9M2D9M3I34M1D21M1I15M1D9M1D2M1D2M1D8M1D26M3I4M1I3M1D2M1D25M1D1M1D14M6D45M2D21M1D17M2I23M1I6M2D8M2I20M1D24M1I9M1D1M2I6M1I3M1I9M8D4M2D30M2I8M1I7M1D50M1D3M3D26M3I17M1I17M1I5M1I8M1D29M2I2M1D3M1D6M1I11M3D20M3D19M1D17M2D33M1I35M2I7M2I3M18I1M3I10M5I11M1I8M1I6M1D9M1D4M2I5M1I13M1I22M1I16M14D22M1I3M1D19M1I53M1D13M1D20M8D8M1D6M6I28M3I28M9I23M5I26M1D6M1I5M1I24M1D5M2D13M1D2M4D2M1D4M4D8M1D14M1D12M1D28M1D18M4D10M2I8M1D62M1D14M2D5M1D18M1I1M3D4M1D13M1I4M2D3M1I8M4I2M8I71M1D8M4D23M1D15M5I13M1I6M1I8M7D16M2D13M2I27M1I46M1D20M2I6M1D9M1I4M1D7M1I6M1D2M6D11M4I25M1D22M1I14M2I20M1I30M3D7M3I4M1D22M1I4M1I10M1I20M1D21M3D3M1D8M1I14M1D10M2D45M1I14M1I17M1I27M2I3M1D2M2D4M1I13M1I5M4D6M2D11M1D11M4D6M1D15M1D8M1D6M9D1M1D19M1D4M1D8M2I9M1D7M1I33M1I19M1I3M1I35M3I4M1I6M2I16M3I1M1I30M26I28M1I7M2D12M2I10M1D7M1I16M1I4M1D18M1D33M1D31M1D7M1D12M1I7M1I16M5D3M1D4M1I4M1I28M8I12M1I4M1I7M3I11M1I15M1I12M1D12M3D6M2I4M1I16M1D11M1I5M1I2M2D22M4I14M2D19M1I7M3D17M1D22M5I6M1I14M2I1M1I12M1D11M10D16M1I21M1I24M5I17M1I48M1I3M1I4M1I12M1I13M4I9M1D22M1D21M1D12M1I11M3I2M1I9M1D10M1I4M1D4M1I18M1D3M1I18M2I4M1D21M4I5M3D3M1I21M1D33M1I19M1D38M2D27M1D7M1D15M2D8M5I2M1I15M1D7M2D2M1D11M1I24M1D4M1I14M1D51M1I47M1I3M4I4M3I3M1D3M1I13M1I3M1D13M1D10M3D34M1I3M1D17M1I5M1D8M1I28M1D13M2D2M1D16M1I21M2D22M5D8M1D3M1D9M1I12M2I11M1D7M1D2M2I10M3D26M4I12M1I3M1I12M7D12M1D5M1I5M8I5M1I8M1D31M1I3M1I6M1D12M2I4M1I24M2D10M1D17M1I1M3I11M1I8M2I16M1I18M2I3M6I2M1I6M24I10M2D14M1D11M1D4M1I10M1D34M4D14M1I21M1I6M43I8M4I2M1I12M1I7M5I4M2D15M1I39M1I6M1D9M3I1M3I2M2I4M4I2M3I1M1I2M1I10M1D16M3I17M1D1M1D28M1I10M1I11M1I28M1I11M2D17M1D14M1D7M2I6M1I4M7I3M7I10M1D6M1D57M2I4M1I5M1I18M2D50M5D38M1I6M1I15M1I5M1D58M4D28M1D15M1I14M3D4M2I4M1D11M4I4M1I44M1D25M1D8M2I12M1D7M1I31M1I9M26D5M1D19M1I1M1I9M1I5M1I7M34D1M1D38M1D1M1D21M1I4M11I29M1I11M1I7M3D19M2D36M1I12M1D21M1D2M7D23M2D19M1D6M1D16M2D2M3I10M1I11M10D5M1D15M2I18M1D17M1D7M2I6M2D6M1I27M1D17M1D23M5D29M4I3M1D41M1I33M1I9M1I11M6D25M1I17M3I6M1D8M1D14M1I13M1I12M1D16M1D12M1D3M1I12M1D28M1I32M1I15M1D32M6D2M2D8M1I6M1I23M22D30M1D9M10I58M3D7M1I12M1D10M6D31M1I14M1D38M1D13M3I14M1I23M1D6M1D10M3D22M1D10M1D8M5D67M1D13M4I3M5I6M1D4M1D8M3I8M3D2M1D11M1I11M1D4M2D1M1D2M1D5M3D9M2I1M1I4M1I6M2I5M1I5M1D8M4I8M1D7M2D3M3I15M6I1M1I9M1I4M1I6M1I36M1I7M1I18M1D5M1I3M2D20M1I13M4D7M5D2M2D43M1D5M1I12M1D7M1I31M1D13M1I13M1D6M1I1M1I4M3I7M1I31M2I26M1D7M1D8M1I7M1D17M1I18M1D6M1I4M7I13M1D6M1I7M1D31M1I5M1D15M1I20M1D20M1D26M3D2M3D1M9D5M1D24M2I25M1I14M1I5M3I2M1D7M1D3M1D19M1D17M1D16M2D5M5I8M1D15M1D3M2D5M5D15M1I13M3I7M1I9M5D10M2I5M1D10M2D1M1D2M1D9M8D2M1I5M1D6M6I7M1D13M3D7M1D3M1I15M2I18M1I3M1I2M1I5M1I5M2D9M1D1M1D27M1D11M1I16M8D1M2D8M1D15M1D6M1D10M1I24M1I3M1I19M1D12M1D24M1I8M1I2M1I2M1D6M1I31M2D5M5I16M5D5M1D6M3I11M14I12M3D29M1D12M1D5M23D2M1D4M4D6M1I41M2D21M1I17M1I5M1I25M3D18M1I6M1I5M1I42M1D3M1I31M1D3M1I14M1I21M1D8M3I4M1D19M6I10M2D12M7D32M8D2M1I18M2I31M1I15M1D21M1D6M1D3M1D39M2D1M1I10M1I3M1D36M12I45M1I7M1D4M1D1M3D7M1D3M1I5M1I6M1I14M1I14M1D18M1I1M1I6M1D1M2I1M1I4M2I8M1I27M5D20M12I11M1I9M1I29M3I26M2I4M2I3M1D6M37I1M1I4M5I3M1I3M6I3M4I16M1I27M2I3M1I2M2I60M4I5M4D8M21I26M1I16M1I3M1D8M1I22M1D8M10I3M2I3M3I13M36I4M1I40M1D6M1D5M1D7M2D7M1D13M2D2M1I8M2D6M1D9M1D3M1I4M4D3M1I5M1D11M1I4M4I23M1D21M1D17M1I37M2D10M1I36M1I8M1I1M1I9M1D6M1I1M5I1M7I3M2I2M10I2M2I12M1D27M2D1M1I16M1I18M1I25M1I29M1D12M2D18M1D2M3D3M7D13M1I30M3I2M2I18M1I4M2I36M1D19M1I19M1D6M1D4M3I20M2I13M1D61M1D12M3I1M1I6M2I4M2I3M1D7M1I34M1D9M1I5M5I9M3I11M1I4M1D4M1D3M4I2M3I1M8I22M1D10M1I12M1I57M1I25M1I58M4D26M1D2M1D2M1D7M2D43M1D3M1I6M1I9M2I20M1I5M41I5M1I30M1I32M1I12M2D9M4D17M2I44M1I2M1D29M14D1M1D17M1D8M1I27M4D14M1I9M1I4M1D6M1I12M5I26M3D2M1D2M1D18M diff --git a/products/jbrowse-cli/src/commands/__snapshots__/set-default-session.test.ts.snap b/products/jbrowse-cli/src/commands/__snapshots__/set-default-session.test.ts.snap new file mode 100644 index 0000000000..42b7973bc4 --- /dev/null +++ b/products/jbrowse-cli/src/commands/__snapshots__/set-default-session.test.ts.snap @@ -0,0 +1,72 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`adds a default session from a file 1`] = ` +{ + "assemblies": [ + { + "name": "testAssembly", + "sequence": { + "adapter": { + "twoBitLocation": { + "locationType": "UriLocation", + "uri": "test.2bit", + }, + "type": "testSeqAdapter", + }, + "trackId": "", + "type": "testSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "defaultSession": { + "name": "test new session", + "views": [ + { + "id": "823WX", + "tracks": [ + { + "configuration": "simple", + "type": "AlignmentsTrack", + }, + ], + "type": "LinearGenomeView", + }, + ], + }, + "tracks": [], +} +`; + +exports[`deletes a default session 1`] = ` +{ + "assemblies": [ + { + "name": "testAssembly", + "sequence": { + "adapter": { + "twoBitLocation": { + "locationType": "UriLocation", + "uri": "test.2bit", + }, + "type": "testSeqAdapter", + }, + "trackId": "", + "type": "testSequenceTrack", + }, + }, + ], + "configuration": {}, + "connections": [], + "tracks": [], +} +`; + +exports[`fails when default session is not readable 1`] = `"Could not read the provided file"`; + +exports[`fails when file does not exist 1`] = `"Could not read the provided file"`; + +exports[`fails when file is does not have a default session to read 1`] = `"Could not parse the given default session file"`; + +exports[`fails when no necessary default session information is provided 1`] = `"Please either provide a default session file"`; diff --git a/products/jbrowse-cli/src/commands/__snapshots__/text-index.test.ts.snap b/products/jbrowse-cli/src/commands/__snapshots__/text-index.test.ts.snap index bd834a926a..fcba88c61e 100644 --- a/products/jbrowse-cli/src/commands/__snapshots__/text-index.test.ts.snap +++ b/products/jbrowse-cli/src/commands/__snapshots__/text-index.test.ts.snap @@ -1,6 +1,36 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`text-index Indexes a local non-gz gff3 file 1`] = ` +exports[`fails if no track ids are provided with --tracks flag. 1`] = `"Flag --tracks expects a value"`; + +exports[`fails if there is an invalid flag 1`] = ` +"Nonexistent flag: --Command +See more help with --help" +`; + +exports[`indexes a local gz gff3 file 1`] = ` +"agt221.3 ["ctgA%3A7500..8000"|"gff3tabix_genes"|"agt221.3"|"Match4"],1 +agt221.5 ["ctgA%3A1050..1500"|"gff3tabix_genes"|"agt221.5"],1 ["ctgA%3A1050..7300"|"gff3tabix_genes"|"agt221.5"|"Match3"],2 ["ctgA%3A5000..5500"|"gff3tabix_genes"|"agt221.5"],3 ["ctgA%3A7000..7300"|"gff3tabix_genes"|"agt221.5"],4 +agt767.3 ["ctgA%3A8000..9000"|"gff3tabix_genes"|"agt767.3"|"Match6"],1 +agt767.5 ["ctgA%3A1150..1500"|"gff3tabix_genes"|"agt767.5"],1 ["ctgA%3A1150..7200"|"gff3tabix_genes"|"agt767.5"|"Match5"],2 ["ctgA%3A5000..5500"|"gff3tabix_genes"|"agt767.5"],3 ["ctgA%3A7000..7200"|"gff3tabix_genes"|"agt767.5"],4 +agt830.3 ["ctgA%3A5410..5500"|"gff3tabix_genes"|"agt830.3"],1 ["ctgA%3A5410..7503"|"gff3tabix_genes"|"agt830.3"|"Match2"],2 ["ctgA%3A7000..7503"|"gff3tabix_genes"|"agt830.3"],3 +agt830.5 ["ctgA%3A1050..1500"|"gff3tabix_genes"|"agt830.5"],1 ["ctgA%3A1050..3202"|"gff3tabix_genes"|"agt830.5"|"Match1"],2 ["ctgA%3A3000..3202"|"gff3tabix_genes"|"agt830.5"],3 +apple2 ["ctgA%3A13000..17200"|"gff3tabix_gen" +`; + +exports[`indexes a local gz gff3 file 2`] = ` +"gA%3A46816..46992"|"gff3tabix_genes"|"seg14"],11 ["ctgA%3A47449..47829"|"gff3tabix_genes"|"seg14"],12 +seg15 ["ctgA%3A39265..39361"|"gff3tabix_genes"|"seg15"],1 ["ctgA%3A39753..40034"|"gff3tabix_genes"|"seg15"],2 ["ctgA%3A40515..40954"|"gff3tabix_genes"|"seg15"],3 ["ctgA%3A41252..41365"|"gff3tabix_genes"|"seg15"],4 ["ctgA%3A41492..41504"|"gff3tabix_genes"|"seg15"],5 ["ctgA%3A41941..42377"|"gff3tabix_genes"|"seg15"],6 ["ctgA%3A42748..42954"|"gff3tabix_genes"|"seg15"],7 ["ctgA%3A43401..43897"|"gff3tabix_genes"|"seg15"],8 ["ctgA%3A44043..44113"|"gff3tabix_genes"|"seg15"],9 ["ctgA%3A44399..44888"|"gff3tabix_genes"|"seg15"],10 ["ctgA%3A45281..45375"|"gff3tabix_genes"|"seg15"],11 ["ctgA%3A45711..46041"|"gff3tabix_genes"|"seg15"],12 ["ctgA%3A46425..46564"|"gff3tabix_genes"|"seg15"],13 ["ctgA%3A46738..47087"|"gff3tabix_genes"|"seg15"],14 ["ctgA%3A47329..47595"|"gff3tabix_genes"|"seg15"],15 ["ctgA%3A47858..47979"|"gff3tabix_genes"|"seg15"],16 ["ctgA%3A48169..48453"|"gff3tabix_genes"|"seg15"],17 +" +`; + +exports[`indexes a local gz gff3 file 3`] = `12254`; + +exports[`indexes a local gz gff3 file 4`] = ` +"agt220000000000 +" +`; + +exports[`indexes a local non-gz gff3 file 1`] = ` "au9.g1000 ["Group1.36%3A168255..173951"|"au9_scaffold"|"au9.g1000"|"au9.g1000"],1 au9.g1000.t1 ["Group1.36%3A168255..173951"|"au9_scaffold"|"au9.g1000.t1"|"au9.g1000.t1"],1 au9.g1001 ["Group1.36%3A174364..176304"|"au9_scaffold"|"au9.g1001"|"au9.g1001"],1 @@ -15,7 +45,7 @@ au9.g1004.t2 ["Group1.36%3A187115..195224"|"au9_scaffold"|"au9.g1004.t2"|"au9.g1 au9.g1005 ["Group1.36%3A195248..197254"|"au9" `; -exports[`text-index Indexes a local non-gz gff3 file 2`] = ` +exports[`indexes a local non-gz gff3 file 2`] = ` "9.g994 ["Group1.36%3A135249..142374"|"au9_scaffold"|"au9.g994"|"au9.g994"],1 au9.g994.t1 ["Group1.36%3A135249..142374"|"au9_scaffold"|"au9.g994.t1"|"au9.g994.t1"],1 au9.g995 ["Group1.36%3A147520..150414"|"au9_scaffold"|"au9.g995"|"au9.g995"],1 @@ -31,38 +61,15 @@ au9.g999.t1 ["Group1.36%3A165558..166984"|"au9_scaffold"|"au9.g999.t1"|"au9.g999 " `; -exports[`text-index Indexes a local non-gz gff3 file 3`] = `113448`; +exports[`indexes a local non-gz gff3 file 3`] = `113448`; -exports[`text-index Indexes a local non-gz gff3 file 4`] = ` +exports[`indexes a local non-gz gff3 file 4`] = ` "au9.g10000000000 au9.g8000000BE82 " `; -exports[`text-index tracks Indexes a local gz gff3 file 1`] = ` -"agt221.3 ["ctgA%3A7500..8000"|"gff3tabix_genes"|"agt221.3"|"Match4"],1 -agt221.5 ["ctgA%3A1050..1500"|"gff3tabix_genes"|"agt221.5"],1 ["ctgA%3A1050..7300"|"gff3tabix_genes"|"agt221.5"|"Match3"],2 ["ctgA%3A5000..5500"|"gff3tabix_genes"|"agt221.5"],3 ["ctgA%3A7000..7300"|"gff3tabix_genes"|"agt221.5"],4 -agt767.3 ["ctgA%3A8000..9000"|"gff3tabix_genes"|"agt767.3"|"Match6"],1 -agt767.5 ["ctgA%3A1150..1500"|"gff3tabix_genes"|"agt767.5"],1 ["ctgA%3A1150..7200"|"gff3tabix_genes"|"agt767.5"|"Match5"],2 ["ctgA%3A5000..5500"|"gff3tabix_genes"|"agt767.5"],3 ["ctgA%3A7000..7200"|"gff3tabix_genes"|"agt767.5"],4 -agt830.3 ["ctgA%3A5410..5500"|"gff3tabix_genes"|"agt830.3"],1 ["ctgA%3A5410..7503"|"gff3tabix_genes"|"agt830.3"|"Match2"],2 ["ctgA%3A7000..7503"|"gff3tabix_genes"|"agt830.3"],3 -agt830.5 ["ctgA%3A1050..1500"|"gff3tabix_genes"|"agt830.5"],1 ["ctgA%3A1050..3202"|"gff3tabix_genes"|"agt830.5"|"Match1"],2 ["ctgA%3A3000..3202"|"gff3tabix_genes"|"agt830.5"],3 -apple2 ["ctgA%3A13000..17200"|"gff3tabix_gen" -`; - -exports[`text-index tracks Indexes a local gz gff3 file 2`] = ` -"gA%3A46816..46992"|"gff3tabix_genes"|"seg14"],11 ["ctgA%3A47449..47829"|"gff3tabix_genes"|"seg14"],12 -seg15 ["ctgA%3A39265..39361"|"gff3tabix_genes"|"seg15"],1 ["ctgA%3A39753..40034"|"gff3tabix_genes"|"seg15"],2 ["ctgA%3A40515..40954"|"gff3tabix_genes"|"seg15"],3 ["ctgA%3A41252..41365"|"gff3tabix_genes"|"seg15"],4 ["ctgA%3A41492..41504"|"gff3tabix_genes"|"seg15"],5 ["ctgA%3A41941..42377"|"gff3tabix_genes"|"seg15"],6 ["ctgA%3A42748..42954"|"gff3tabix_genes"|"seg15"],7 ["ctgA%3A43401..43897"|"gff3tabix_genes"|"seg15"],8 ["ctgA%3A44043..44113"|"gff3tabix_genes"|"seg15"],9 ["ctgA%3A44399..44888"|"gff3tabix_genes"|"seg15"],10 ["ctgA%3A45281..45375"|"gff3tabix_genes"|"seg15"],11 ["ctgA%3A45711..46041"|"gff3tabix_genes"|"seg15"],12 ["ctgA%3A46425..46564"|"gff3tabix_genes"|"seg15"],13 ["ctgA%3A46738..47087"|"gff3tabix_genes"|"seg15"],14 ["ctgA%3A47329..47595"|"gff3tabix_genes"|"seg15"],15 ["ctgA%3A47858..47979"|"gff3tabix_genes"|"seg15"],16 ["ctgA%3A48169..48453"|"gff3tabix_genes"|"seg15"],17 -" -`; - -exports[`text-index tracks Indexes a local gz gff3 file 3`] = `12254`; - -exports[`text-index tracks Indexes a local gz gff3 file 4`] = ` -"agt220000000000 -" -`; - -exports[`text-index tracks Indexes a remote and a local file 1`] = ` +exports[`indexes a remote and a local file 1`] = ` "agt221.3 ["ctgA%3A7500..8000"|"gff3tabix_genes"|"agt221.3"|"Match4"],1 agt221.5 ["ctgA%3A1050..1500"|"gff3tabix_genes"|"agt221.5"],1 ["ctgA%3A1050..7300"|"gff3tabix_genes"|"agt221.5"|"Match3"],2 ["ctgA%3A5000..5500"|"gff3tabix_genes"|"agt221.5"],3 ["ctgA%3A7000..7300"|"gff3tabix_genes"|"agt221.5"],4 agt767.3 ["ctgA%3A8000..9000"|"gff3tabix_genes"|"agt767.3"|"Match6"],1 @@ -72,22 +79,22 @@ agt830.5 ["ctgA%3A1050..1500"|"gff3tabix_genes"|"agt830.5"],1 ["ctgA%3A1050..320 apple2 ["ctgA%3A13000..17200"|"gff3tabix_gen" `; -exports[`text-index tracks Indexes a remote and a local file 2`] = ` +exports[`indexes a remote and a local file 2`] = ` "gA%3A46816..46992"|"gff3tabix_genes"|"seg14"],11 ["ctgA%3A47449..47829"|"gff3tabix_genes"|"seg14"],12 seg15 ["ctgA%3A39265..39361"|"gff3tabix_genes"|"seg15"],1 ["ctgA%3A39753..40034"|"gff3tabix_genes"|"seg15"],2 ["ctgA%3A40515..40954"|"gff3tabix_genes"|"seg15"],3 ["ctgA%3A41252..41365"|"gff3tabix_genes"|"seg15"],4 ["ctgA%3A41492..41504"|"gff3tabix_genes"|"seg15"],5 ["ctgA%3A41941..42377"|"gff3tabix_genes"|"seg15"],6 ["ctgA%3A42748..42954"|"gff3tabix_genes"|"seg15"],7 ["ctgA%3A43401..43897"|"gff3tabix_genes"|"seg15"],8 ["ctgA%3A44043..44113"|"gff3tabix_genes"|"seg15"],9 ["ctgA%3A44399..44888"|"gff3tabix_genes"|"seg15"],10 ["ctgA%3A45281..45375"|"gff3tabix_genes"|"seg15"],11 ["ctgA%3A45711..46041"|"gff3tabix_genes"|"seg15"],12 ["ctgA%3A46425..46564"|"gff3tabix_genes"|"seg15"],13 ["ctgA%3A46738..47087"|"gff3tabix_genes"|"seg15"],14 ["ctgA%3A47329..47595"|"gff3tabix_genes"|"seg15"],15 ["ctgA%3A47858..47979"|"gff3tabix_genes"|"seg15"],16 ["ctgA%3A48169..48453"|"gff3tabix_genes"|"seg15"],17 " `; -exports[`text-index tracks Indexes a remote and a local file 3`] = `134774`; +exports[`indexes a remote and a local file 3`] = `134774`; -exports[`text-index tracks Indexes a remote and a local file 4`] = ` +exports[`indexes a remote and a local file 4`] = ` "agt220000000000 au9.g000000044E seg090000020139 " `; -exports[`text-index tracks Indexes a remote gz gff3 file 1`] = ` +exports[`indexes a remote gz gff3 file 1`] = ` "agt221.3 ["ctgA%3A7500..8000"|"online_gff3tabix_genes"|"agt221.3"|"Match4"],1 agt221.5 ["ctgA%3A1050..1500"|"online_gff3tabix_genes"|"agt221.5"],1 ["ctgA%3A1050..7300"|"online_gff3tabix_genes"|"agt221.5"|"Match3"],2 ["ctgA%3A5000..5500"|"online_gff3tabix_genes"|"agt221.5"],3 ["ctgA%3A7000..7300"|"online_gff3tabix_genes"|"agt221.5"],4 agt767.3 ["ctgA%3A8000..9000"|"online_gff3tabix_genes"|"agt767.3"|"Match6"],1 @@ -96,19 +103,19 @@ agt830.3 ["ctgA%3A5410..5500"|"online_gff3tabix_genes"|"agt830.3"],1 ["ctgA%3A54 agt830.5 ["ctgA%3A1050..1500"|"online_gff3tabix_genes"|"agt830.5"],1 ["ctgA%3A1050..3202"|"online_gff3tabix_genes"|"agt830.5"|"Mat" `; -exports[`text-index tracks Indexes a remote gz gff3 file 2`] = ` +exports[`indexes a remote gz gff3 file 2`] = ` "265..39361"|"online_gff3tabix_genes"|"seg15"],1 ["ctgA%3A39753..40034"|"online_gff3tabix_genes"|"seg15"],2 ["ctgA%3A40515..40954"|"online_gff3tabix_genes"|"seg15"],3 ["ctgA%3A41252..41365"|"online_gff3tabix_genes"|"seg15"],4 ["ctgA%3A41492..41504"|"online_gff3tabix_genes"|"seg15"],5 ["ctgA%3A41941..42377"|"online_gff3tabix_genes"|"seg15"],6 ["ctgA%3A42748..42954"|"online_gff3tabix_genes"|"seg15"],7 ["ctgA%3A43401..43897"|"online_gff3tabix_genes"|"seg15"],8 ["ctgA%3A44043..44113"|"online_gff3tabix_genes"|"seg15"],9 ["ctgA%3A44399..44888"|"online_gff3tabix_genes"|"seg15"],10 ["ctgA%3A45281..45375"|"online_gff3tabix_genes"|"seg15"],11 ["ctgA%3A45711..46041"|"online_gff3tabix_genes"|"seg15"],12 ["ctgA%3A46425..46564"|"online_gff3tabix_genes"|"seg15"],13 ["ctgA%3A46738..47087"|"online_gff3tabix_genes"|"seg15"],14 ["ctgA%3A47329..47595"|"online_gff3tabix_genes"|"seg15"],15 ["ctgA%3A47858..47979"|"online_gff3tabix_genes"|"seg15"],16 ["ctgA%3A48169..48453"|"online_gff3tabix_genes"|"seg15"],17 " `; -exports[`text-index tracks Indexes a remote gz gff3 file 3`] = `13815`; +exports[`indexes a remote gz gff3 file 3`] = `13815`; -exports[`text-index tracks Indexes a remote gz gff3 file 4`] = ` +exports[`indexes a remote gz gff3 file 4`] = ` "agt220000000000 " `; -exports[`text-index tracks Indexes a remote non-gz gff3 file 1`] = ` +exports[`indexes a remote non-gz gff3 file 1`] = ` "au9.g1000 ["Group1.36%3A168255..173951"|"online_au9_scaffold"|"au9.g1000"|"au9.g1000"],1 au9.g1000.t1 ["Group1.36%3A168255..173951"|"online_au9_scaffold"|"au9.g1000.t1"|"au9.g1000.t1"],1 au9.g1001 ["Group1.36%3A174364..176304"|"online_au9_scaffold"|"au9.g1001"|"au9.g1001"],1 @@ -122,7 +129,7 @@ au9.g1004.t1 ["Group1.36%3A187115..195224"|"online_au9_scaffold"|"au9.g1004.t1"| au9.g1004.t2 ["Group1.36%3A187115..195224"|"online_au9_scaffold"|" `; -exports[`text-index tracks Indexes a remote non-gz gff3 file 2`] = ` +exports[`indexes a remote non-gz gff3 file 2`] = ` "au9.g994.t1 ["Group1.36%3A135249..142374"|"online_au9_scaffold"|"au9.g994.t1"|"au9.g994.t1"],1 au9.g995 ["Group1.36%3A147520..150414"|"online_au9_scaffold"|"au9.g995"|"au9.g995"],1 au9.g995.t1 ["Group1.36%3A147520..150414"|"online_au9_scaffold"|"au9.g995.t1"|"au9.g995.t1"],1 @@ -137,15 +144,15 @@ au9.g999.t1 ["Group1.36%3A165558..166984"|"online_au9_scaffold"|"au9.g999.t1"|"a " `; -exports[`text-index tracks Indexes a remote non-gz gff3 file 3`] = `122520`; +exports[`indexes a remote non-gz gff3 file 3`] = `122520`; -exports[`text-index tracks Indexes a remote non-gz gff3 file 4`] = ` +exports[`indexes a remote non-gz gff3 file 4`] = ` "au9.g10000000000 au9.g8000000CDF5 " `; -exports[`text-index tracks Indexes a track using only the attributes tag 1`] = ` +exports[`indexes a track using only the attributes tag 1`] = ` "b101.2 ["ctgA%3A1000..20000"|"noAttributes"|"b101.2"],1 cds-apple2 ["ctgA%3A13000..17200"|"noAttributes"|"cds-Apple2"],1 eden ["ctgA%3A1050..9000"|"noAttributes"|"EDEN"],1 @@ -163,7 +170,7 @@ rna-apple3 ["ctgA%3A17400..23000"|"noAttributes"|"rna-Apple3"],1 " `; -exports[`text-index tracks Indexes a track using only the attributes tag 2`] = ` +exports[`indexes a track using only the attributes tag 2`] = ` "b101.2 ["ctgA%3A1000..20000"|"noAttributes"|"b101.2"],1 cds-apple2 ["ctgA%3A13000..17200"|"noAttributes"|"cds-Apple2"],1 eden ["ctgA%3A1050..9000"|"noAttributes"|"EDEN"],1 @@ -181,14 +188,14 @@ rna-apple3 ["ctgA%3A17400..23000"|"noAttributes"|"rna-Apple3"],1 " `; -exports[`text-index tracks Indexes a track using only the attributes tag 3`] = `791`; +exports[`indexes a track using only the attributes tag 3`] = `791`; -exports[`text-index tracks Indexes a track using only the attributes tag 4`] = ` +exports[`indexes a track using only the attributes tag 4`] = ` "b101.0000000000 " `; -exports[`text-index tracks Indexes a track with no attributes in the config 1`] = ` +exports[`indexes a track with no attributes in the config 1`] = ` "agt221.3 ["ctgA%3A7500..8000"|"noAttributes"|"agt221.3"|"Match4"],1 agt221.5 ["ctgA%3A1050..1500"|"noAttributes"|"agt221.5"],1 ["ctgA%3A1050..7300"|"noAttributes"|"agt221.5"|"Match3"],2 ["ctgA%3A5000..5500"|"noAttributes"|"agt221.5"],3 ["ctgA%3A7000..7300"|"noAttributes"|"agt221.5"],4 agt767.3 ["ctgA%3A8000..9000"|"noAttributes"|"agt767.3"|"Match6"],1 @@ -199,20 +206,20 @@ apple2 ["ctgA%3A13000..17200"|"noAttributes"|"Apple2"|"cds-Apple2"],1 apple3 ["ctgA%3A17400." `; -exports[`text-index tracks Indexes a track with no attributes in the config 2`] = ` +exports[`indexes a track with no attributes in the config 2`] = ` ",9 ["ctgA%3A46092..46318"|"noAttributes"|"seg14"],10 ["ctgA%3A46816..46992"|"noAttributes"|"seg14"],11 ["ctgA%3A47449..47829"|"noAttributes"|"seg14"],12 seg15 ["ctgA%3A39265..39361"|"noAttributes"|"seg15"],1 ["ctgA%3A39753..40034"|"noAttributes"|"seg15"],2 ["ctgA%3A40515..40954"|"noAttributes"|"seg15"],3 ["ctgA%3A41252..41365"|"noAttributes"|"seg15"],4 ["ctgA%3A41492..41504"|"noAttributes"|"seg15"],5 ["ctgA%3A41941..42377"|"noAttributes"|"seg15"],6 ["ctgA%3A42748..42954"|"noAttributes"|"seg15"],7 ["ctgA%3A43401..43897"|"noAttributes"|"seg15"],8 ["ctgA%3A44043..44113"|"noAttributes"|"seg15"],9 ["ctgA%3A44399..44888"|"noAttributes"|"seg15"],10 ["ctgA%3A45281..45375"|"noAttributes"|"seg15"],11 ["ctgA%3A45711..46041"|"noAttributes"|"seg15"],12 ["ctgA%3A46425..46564"|"noAttributes"|"seg15"],13 ["ctgA%3A46738..47087"|"noAttributes"|"seg15"],14 ["ctgA%3A47329..47595"|"noAttributes"|"seg15"],15 ["ctgA%3A47858..47979"|"noAttributes"|"seg15"],16 ["ctgA%3A48169..48453"|"noAttributes"|"seg15"],17 " `; -exports[`text-index tracks Indexes a track with no attributes in the config 3`] = `11585`; +exports[`indexes a track with no attributes in the config 3`] = `11585`; -exports[`text-index tracks Indexes a track with no attributes in the config 4`] = ` +exports[`indexes a track with no attributes in the config 4`] = ` "agt220000000000 " `; -exports[`text-index tracks Indexes multiple local gff3 files 1`] = ` +exports[`indexes multiple local gff3 files 1`] = ` "agt221.3 ["ctgA%3A7500..8000"|"gff3tabix_genes"|"agt221.3"|"Match4"],1 agt221.5 ["ctgA%3A1050..1500"|"gff3tabix_genes"|"agt221.5"],1 ["ctgA%3A1050..7300"|"gff3tabix_genes"|"agt221.5"|"Match3"],2 ["ctgA%3A5000..5500"|"gff3tabix_genes"|"agt221.5"],3 ["ctgA%3A7000..7300"|"gff3tabix_genes"|"agt221.5"],4 agt767.3 ["ctgA%3A8000..9000"|"gff3tabix_genes"|"agt767.3"|"Match6"],1 @@ -222,21 +229,21 @@ agt830.5 ["ctgA%3A1050..1500"|"gff3tabix_genes"|"agt830.5"],1 ["ctgA%3A1050..320 apple2 ["ctgA%3A13000..17200"|"gff3tabix_gen" `; -exports[`text-index tracks Indexes multiple local gff3 files 2`] = ` +exports[`indexes multiple local gff3 files 2`] = ` "gA%3A46816..46992"|"gff3tabix_genes"|"seg14"],11 ["ctgA%3A47449..47829"|"gff3tabix_genes"|"seg14"],12 seg15 ["ctgA%3A39265..39361"|"gff3tabix_genes"|"seg15"],1 ["ctgA%3A39753..40034"|"gff3tabix_genes"|"seg15"],2 ["ctgA%3A40515..40954"|"gff3tabix_genes"|"seg15"],3 ["ctgA%3A41252..41365"|"gff3tabix_genes"|"seg15"],4 ["ctgA%3A41492..41504"|"gff3tabix_genes"|"seg15"],5 ["ctgA%3A41941..42377"|"gff3tabix_genes"|"seg15"],6 ["ctgA%3A42748..42954"|"gff3tabix_genes"|"seg15"],7 ["ctgA%3A43401..43897"|"gff3tabix_genes"|"seg15"],8 ["ctgA%3A44043..44113"|"gff3tabix_genes"|"seg15"],9 ["ctgA%3A44399..44888"|"gff3tabix_genes"|"seg15"],10 ["ctgA%3A45281..45375"|"gff3tabix_genes"|"seg15"],11 ["ctgA%3A45711..46041"|"gff3tabix_genes"|"seg15"],12 ["ctgA%3A46425..46564"|"gff3tabix_genes"|"seg15"],13 ["ctgA%3A46738..47087"|"gff3tabix_genes"|"seg15"],14 ["ctgA%3A47329..47595"|"gff3tabix_genes"|"seg15"],15 ["ctgA%3A47858..47979"|"gff3tabix_genes"|"seg15"],16 ["ctgA%3A48169..48453"|"gff3tabix_genes"|"seg15"],17 " `; -exports[`text-index tracks Indexes multiple local gff3 files 3`] = `125702`; +exports[`indexes multiple local gff3 files 3`] = `125702`; -exports[`text-index tracks Indexes multiple local gff3 files 4`] = ` +exports[`indexes multiple local gff3 files 4`] = ` "agt220000000000 au9.g000000044E " `; -exports[`text-index tracks Indexes multiple remote gff3 file 1`] = ` +exports[`indexes multiple remote gff3 file 1`] = ` "agt221.3 ["ctgA%3A7500..8000"|"online_gff3tabix_genes"|"agt221.3"|"Match4"],1 agt221.5 ["ctgA%3A1050..1500"|"online_gff3tabix_genes"|"agt221.5"],1 ["ctgA%3A1050..7300"|"online_gff3tabix_genes"|"agt221.5"|"Match3"],2 ["ctgA%3A5000..5500"|"online_gff3tabix_genes"|"agt221.5"],3 ["ctgA%3A7000..7300"|"online_gff3tabix_genes"|"agt221.5"],4 agt767.3 ["ctgA%3A8000..9000"|"online_gff3tabix_genes"|"agt767.3"|"Match6"],1 @@ -245,21 +252,21 @@ agt830.3 ["ctgA%3A5410..5500"|"online_gff3tabix_genes"|"agt830.3"],1 ["ctgA%3A54 agt830.5 ["ctgA%3A1050..1500"|"online_gff3tabix_genes"|"agt830.5"],1 ["ctgA%3A1050..3202"|"online_gff3tabix_genes"|"agt830.5"|"Mat" `; -exports[`text-index tracks Indexes multiple remote gff3 file 2`] = ` +exports[`indexes multiple remote gff3 file 2`] = ` "265..39361"|"online_gff3tabix_genes"|"seg15"],1 ["ctgA%3A39753..40034"|"online_gff3tabix_genes"|"seg15"],2 ["ctgA%3A40515..40954"|"online_gff3tabix_genes"|"seg15"],3 ["ctgA%3A41252..41365"|"online_gff3tabix_genes"|"seg15"],4 ["ctgA%3A41492..41504"|"online_gff3tabix_genes"|"seg15"],5 ["ctgA%3A41941..42377"|"online_gff3tabix_genes"|"seg15"],6 ["ctgA%3A42748..42954"|"online_gff3tabix_genes"|"seg15"],7 ["ctgA%3A43401..43897"|"online_gff3tabix_genes"|"seg15"],8 ["ctgA%3A44043..44113"|"online_gff3tabix_genes"|"seg15"],9 ["ctgA%3A44399..44888"|"online_gff3tabix_genes"|"seg15"],10 ["ctgA%3A45281..45375"|"online_gff3tabix_genes"|"seg15"],11 ["ctgA%3A45711..46041"|"online_gff3tabix_genes"|"seg15"],12 ["ctgA%3A46425..46564"|"online_gff3tabix_genes"|"seg15"],13 ["ctgA%3A46738..47087"|"online_gff3tabix_genes"|"seg15"],14 ["ctgA%3A47329..47595"|"online_gff3tabix_genes"|"seg15"],15 ["ctgA%3A47858..47979"|"online_gff3tabix_genes"|"seg15"],16 ["ctgA%3A48169..48453"|"online_gff3tabix_genes"|"seg15"],17 " `; -exports[`text-index tracks Indexes multiple remote gff3 file 3`] = `136335`; +exports[`indexes multiple remote gff3 file 3`] = `136335`; -exports[`text-index tracks Indexes multiple remote gff3 file 4`] = ` +exports[`indexes multiple remote gff3 file 4`] = ` "agt220000000000 au9.g00000004CC seg080000020289 " `; -exports[`text-index with multiple per-files Indexes with multiple per-file args 1`] = ` +exports[`indexes with single per-file arg 1`] = ` "agt221.3 ["ctgA%3A7500..8000"|"volvox.sort.gff3.gz"|"agt221.3"|"Match4"],1 agt221.5 ["ctgA%3A1050..1500"|"volvox.sort.gff3.gz"|"agt221.5"],1 ["ctgA%3A1050..7300"|"volvox.sort.gff3.gz"|"agt221.5"|"Match3"],2 ["ctgA%3A5000..5500"|"volvox.sort.gff3.gz"|"agt221.5"],3 ["ctgA%3A7000..7300"|"volvox.sort.gff3.gz"|"agt221.5"],4 agt767.3 ["ctgA%3A8000..9000"|"volvox.sort.gff3.gz"|"agt767.3"|"Match6"],1 @@ -268,20 +275,20 @@ agt830.3 ["ctgA%3A5410..5500"|"volvox.sort.gff3.gz"|"agt830.3"],1 ["ctgA%3A5410. agt830.5 ["ctgA%3A1050..1500"|"volvox.sort.gff3.gz"|"agt830.5"],1 ["ctgA%3A1050..3202"|"volvox.sort.gff3.gz"|"agt830.5"|"Match1"],2 ["ctgA%3A3000..3202"|"volvox.sort.gff" `; -exports[`text-index with multiple per-files Indexes with multiple per-file args 2`] = ` +exports[`indexes with single per-file arg 2`] = ` ""volvox.sort.gff3.gz"|"seg14"],12 seg15 ["ctgA%3A39265..39361"|"volvox.sort.gff3.gz"|"seg15"],1 ["ctgA%3A39753..40034"|"volvox.sort.gff3.gz"|"seg15"],2 ["ctgA%3A40515..40954"|"volvox.sort.gff3.gz"|"seg15"],3 ["ctgA%3A41252..41365"|"volvox.sort.gff3.gz"|"seg15"],4 ["ctgA%3A41492..41504"|"volvox.sort.gff3.gz"|"seg15"],5 ["ctgA%3A41941..42377"|"volvox.sort.gff3.gz"|"seg15"],6 ["ctgA%3A42748..42954"|"volvox.sort.gff3.gz"|"seg15"],7 ["ctgA%3A43401..43897"|"volvox.sort.gff3.gz"|"seg15"],8 ["ctgA%3A44043..44113"|"volvox.sort.gff3.gz"|"seg15"],9 ["ctgA%3A44399..44888"|"volvox.sort.gff3.gz"|"seg15"],10 ["ctgA%3A45281..45375"|"volvox.sort.gff3.gz"|"seg15"],11 ["ctgA%3A45711..46041"|"volvox.sort.gff3.gz"|"seg15"],12 ["ctgA%3A46425..46564"|"volvox.sort.gff3.gz"|"seg15"],13 ["ctgA%3A46738..47087"|"volvox.sort.gff3.gz"|"seg15"],14 ["ctgA%3A47329..47595"|"volvox.sort.gff3.gz"|"seg15"],15 ["ctgA%3A47858..47979"|"volvox.sort.gff3.gz"|"seg15"],16 ["ctgA%3A48169..48453"|"volvox.sort.gff3.gz"|"seg15"],17 " `; -exports[`text-index with multiple per-files Indexes with multiple per-file args 3`] = `13274`; +exports[`indexes with single per-file arg 3`] = `13274`; -exports[`text-index with multiple per-files Indexes with multiple per-file args 4`] = ` +exports[`indexes with single per-file arg 4`] = ` "agt220000000000 " `; -exports[`text-index with single per-file Indexes with single per-file arg 1`] = ` +exports[`indexes with multiple per-file args 1`] = ` "agt221.3 ["ctgA%3A7500..8000"|"volvox.sort.gff3.gz"|"agt221.3"|"Match4"],1 agt221.5 ["ctgA%3A1050..1500"|"volvox.sort.gff3.gz"|"agt221.5"],1 ["ctgA%3A1050..7300"|"volvox.sort.gff3.gz"|"agt221.5"|"Match3"],2 ["ctgA%3A5000..5500"|"volvox.sort.gff3.gz"|"agt221.5"],3 ["ctgA%3A7000..7300"|"volvox.sort.gff3.gz"|"agt221.5"],4 agt767.3 ["ctgA%3A8000..9000"|"volvox.sort.gff3.gz"|"agt767.3"|"Match6"],1 @@ -290,15 +297,15 @@ agt830.3 ["ctgA%3A5410..5500"|"volvox.sort.gff3.gz"|"agt830.3"],1 ["ctgA%3A5410. agt830.5 ["ctgA%3A1050..1500"|"volvox.sort.gff3.gz"|"agt830.5"],1 ["ctgA%3A1050..3202"|"volvox.sort.gff3.gz"|"agt830.5"|"Match1"],2 ["ctgA%3A3000..3202"|"volvox.sort.gff" `; -exports[`text-index with single per-file Indexes with single per-file arg 2`] = ` +exports[`indexes with multiple per-file args 2`] = ` ""volvox.sort.gff3.gz"|"seg14"],12 seg15 ["ctgA%3A39265..39361"|"volvox.sort.gff3.gz"|"seg15"],1 ["ctgA%3A39753..40034"|"volvox.sort.gff3.gz"|"seg15"],2 ["ctgA%3A40515..40954"|"volvox.sort.gff3.gz"|"seg15"],3 ["ctgA%3A41252..41365"|"volvox.sort.gff3.gz"|"seg15"],4 ["ctgA%3A41492..41504"|"volvox.sort.gff3.gz"|"seg15"],5 ["ctgA%3A41941..42377"|"volvox.sort.gff3.gz"|"seg15"],6 ["ctgA%3A42748..42954"|"volvox.sort.gff3.gz"|"seg15"],7 ["ctgA%3A43401..43897"|"volvox.sort.gff3.gz"|"seg15"],8 ["ctgA%3A44043..44113"|"volvox.sort.gff3.gz"|"seg15"],9 ["ctgA%3A44399..44888"|"volvox.sort.gff3.gz"|"seg15"],10 ["ctgA%3A45281..45375"|"volvox.sort.gff3.gz"|"seg15"],11 ["ctgA%3A45711..46041"|"volvox.sort.gff3.gz"|"seg15"],12 ["ctgA%3A46425..46564"|"volvox.sort.gff3.gz"|"seg15"],13 ["ctgA%3A46738..47087"|"volvox.sort.gff3.gz"|"seg15"],14 ["ctgA%3A47329..47595"|"volvox.sort.gff3.gz"|"seg15"],15 ["ctgA%3A47858..47979"|"volvox.sort.gff3.gz"|"seg15"],16 ["ctgA%3A48169..48453"|"volvox.sort.gff3.gz"|"seg15"],17 " `; -exports[`text-index with single per-file Indexes with single per-file arg 3`] = `13274`; +exports[`indexes with multiple per-file args 3`] = `13274`; -exports[`text-index with single per-file Indexes with single per-file arg 4`] = ` +exports[`indexes with multiple per-file args 4`] = ` "agt220000000000 " `; diff --git a/products/jbrowse-cli/src/commands/__snapshots__/upgrade.test.ts.snap b/products/jbrowse-cli/src/commands/__snapshots__/upgrade.test.ts.snap new file mode 100644 index 0000000000..f1d78eccaa --- /dev/null +++ b/products/jbrowse-cli/src/commands/__snapshots__/upgrade.test.ts.snap @@ -0,0 +1,21 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`fails if the fetch does not return the right file 1`] = ` +"No manifest.json found in this directory, are you sure it is an + existing jbrowse 2 installation?" +`; + +exports[`fails if user selects a directory that does not exist 1`] = ` +"No manifest.json found in this directory, are you sure it is an + existing jbrowse 2 installation?" +`; + +exports[`fails if user selects a directory that does not have a installation 1`] = ` +"No manifest.json found in this directory, are you sure it is an + existing jbrowse 2 installation?" +`; + +exports[`fails to upgrade if version does not exist 1`] = ` +"No manifest.json found in this directory, are you sure it is an + existing jbrowse 2 installation?" +`; diff --git a/products/jbrowse-cli/src/commands/add-assembly.test.ts b/products/jbrowse-cli/src/commands/add-assembly.test.ts index fc5313f6de..f64b8a59ae 100644 --- a/products/jbrowse-cli/src/commands/add-assembly.test.ts +++ b/products/jbrowse-cli/src/commands/add-assembly.test.ts @@ -4,320 +4,200 @@ import fs from 'fs' import path from 'path' +import nock from 'nock' -import { setup, ctxDir, dataDir, readConf, readConfAlt } from '../testUtil' +import { + runInTmpDir, + ctxDir, + dataDir, + readConf, + readConfAlt, +} from '../testUtil' +import { runCommand } from '@oclif/test' -const { rename, copyFile, writeFile, mkdir } = fs.promises - -const defaultConfig = { - assemblies: [], - configuration: {}, - connections: [], - defaultSession: { - name: 'New Session', - }, - tracks: [], -} - -const baseAssembly = { name: 'simple', sequence: {} } -const baseSequence = { - type: 'ReferenceSequenceTrack', - trackId: 'simple-ReferenceSequenceTrack', - adapter: {}, -} +const { copyFile, writeFile, mkdir } = fs.promises // Cleaning up exitCode in Node.js 20, xref https://github.com/jestjs/jest/issues/14501 afterAll(() => (process.exitCode = 0)) -describe('add-assembly', () => { - setup - .command(['add-assembly', '{}']) - .exit(110) - .it('fails if no load flag is passed') - - setup - .command(['add-assembly', '{}', '--load', 'copy']) - .catch('Must provide --name when using custom inline JSON sequence') - .it('fails if using inline JSON sequence custom with no --name') - - setup - .command(['add-assembly', '{}', '--name', 'simple', '--load', 'copy']) - .exit(140) - .it('fails if custom sequence adapter has no type') - - setup - .command([ - 'add-assembly', - '{"type":"fromConfigSequenceAdapter"}', - '--name', - 'simple', - '--refNameAliases', - '{}', - '--refNameAliasesType', - 'custom', - '--load', - 'copy', - ]) - .exit(150) - .it('fails if custom refNameAliases adapter has no type') - - setup - .do(async ctx => { - const simple2bit = path.join( - __dirname, - '..', - '..', - 'test', - 'data', - 'simple.2bit', - ) - await copyFile(simple2bit, path.join(ctx.dir, path.basename(simple2bit))) - }) - .command(['add-assembly', 'simple.2bit', '--load', 'copy']) - .command(['add-assembly', 'simple.2bit', '--load', 'copy']) - .exit(160) - .it('fails if trying to add an assembly with a name that already exists') +test('add-assembly no load flag', async () => { + const { error } = await runCommand('add-assembly {}') + expect(error?.message).toMatchSnapshot() +}) - setup - .command(['add-assembly', 'simple.unusual.extension.xyz', '--load', 'copy']) - .exit(170) - .it('fails if it cannot guess the sequence type') +test('fails if using inline JSON sequence custom with no --name', async () => { + const { error } = await runCommand(['add-assembly', '{}', '--load', 'copy']) + expect(error?.message).toMatchSnapshot() +}) +test('fails if custom sequence adapter has no type', async () => { + const { error } = await runCommand([ + 'add-assembly', + '{}', + '--name', + 'simple', + '--load', + 'copy', + ]) + expect(error?.message).toMatchSnapshot() +}) +test('fails if custom refNameAliases adapter has no type', async () => { + const { error } = await runCommand([ + 'add-assembly', + '{"type":"fromConfigSequenceAdapter"}', + '--name', + 'simple', + '--refNameAliases', + '{}', + '--refNameAliasesType', + 'custom', + '--load', + 'copy', + ]) + expect(error?.message).toMatchSnapshot() +}) +test('fails if custom refNameAliases adapter has no type', async () => { + const { error } = await runCommand([ + 'add-assembly', + '{"type":"fromConfigSequenceAdapter"}', + '--name', + 'simple', + '--refNameAliases', + '{}', + '--refNameAliasesType', + 'custom', + '--load', + 'copy', + ]) + expect(error?.message).toMatchSnapshot() +}) - setup - .command(['add-assembly', 'simple.doesNotExist.fasta', '--load', 'copy']) - .catch(/Could not resolve/) - .it('fails if it cannot find a file') +test('fails if trying to add an assembly with a name that already exists', async () => { + await runInTmpDir(async ctx => { + const simple2bit = path.join( + __dirname, + '..', + '..', + 'test', + 'data', + 'simple.2bit', + ) + await copyFile(simple2bit, path.join(ctx.dir, path.basename(simple2bit))) + await runCommand('add-assembly simple.2bit --load copy') + const { error } = await runCommand('add-assembly simple.2bit --load copy') + expect(error?.message).toMatchSnapshot() + }) +}) +test('fails if it cannot guess the sequence type', async () => { + const { error } = await runCommand([ + 'add-assembly', + 'simple.unusual.extension.xyz', + '--load', + 'copy', + ]) + expect(error?.message).toMatchSnapshot() +}) - setup - .command([ - 'add-assembly', - '{"type":"fromConfigSequenceAdapter"}', - '--name', - 'simple', - '--refNameAliases', - 'notValidJSON', - '--refNameAliasesType', - 'custom', - '--load', - 'copy', - ]) - .exit(40) - .it('fails if using invalid inline JSON') - setup - .command([ - 'add-assembly', - 'https://mysite.com/data/simple.2bit', - '--load', - 'copy', - ]) - .exit(120) - .it('fails if load flag is passed with a URL') +test('fails if it cannot find a file', async () => { + const { error } = await runCommand([ + 'add-assembly', + 'simple.doesNotExist.fasta', + '--load', + 'copy', + ]) + expect(error?.message).toMatchSnapshot() +}) - setup - .do(ctx => { - fs.copyFileSync(dataDir('simple.fasta'), ctxDir(ctx, 'simple.fasta')) - fs.copyFileSync( - dataDir('simple.fasta.fai'), - ctxDir(ctx, 'simple.fasta.fai'), - ) - }) - .command(['add-assembly', 'simple.fasta', '--load', 'copy']) - .it('adds an assembly from a FASTA', async ctx => { - expect(readConf(ctx)).toEqual({ - ...defaultConfig, - assemblies: [ - { - ...baseAssembly, - sequence: { - ...baseSequence, - adapter: { - type: 'IndexedFastaAdapter', - fastaLocation: { - uri: 'simple.fasta', - locationType: 'UriLocation', - }, - faiLocation: { - uri: 'simple.fasta.fai', - locationType: 'UriLocation', - }, - }, - }, - }, - ], - }) - }) +test('fails if using invalid inline JSON', async () => { + const { error } = await runCommand([ + 'add-assembly', + '{"type":"fromConfigSequenceAdapter"}', + '--name', + 'simple', + '--refNameAliases', + 'notValidJSON', + '--refNameAliasesType', + 'custom', + '--load', + 'copy', + ]) + expect(error?.message).toMatchSnapshot() +}) - setup - .do(async ctx => { - fs.copyFileSync(dataDir('simple.fasta'), ctxDir(ctx, 'simple.fa')) - fs.copyFileSync(dataDir('simple.fasta.fai'), ctxDir(ctx, 'simple.fa.fai')) - }) - .command(['add-assembly', 'simple.fa', '--load', 'copy']) - .it('adds an assembly from a FASTA (.fa extension)', async ctx => { - expect(readConf(ctx)).toEqual({ - ...defaultConfig, - assemblies: [ - { - ...baseAssembly, - sequence: { - ...baseSequence, - adapter: { - type: 'IndexedFastaAdapter', - fastaLocation: { - uri: 'simple.fa', - locationType: 'UriLocation', - }, - faiLocation: { - uri: 'simple.fa.fai', - locationType: 'UriLocation', - }, - }, - }, - }, - ], - }) - }) +test('fails if load flag is passed with a URL', async () => { + const { error } = await runCommand([ + 'add-assembly', + 'https://mysite.com/data/simple.2bit', + '--load', + 'copy', + ]) + expect(error?.message).toMatchSnapshot() +}) - setup - .do(async ctx => { - fs.copyFileSync( - dataDir('simple.fasta.gz'), - ctxDir(ctx, 'simple.fasta.gz'), - ) - fs.copyFileSync( - dataDir('simple.fasta.gz.fai'), - ctxDir(ctx, 'simple.fasta.gz.fai'), - ) - fs.copyFileSync( - dataDir('simple.fasta.gz.gzi'), - ctxDir(ctx, 'simple.fasta.gz.gzi'), - ) - }) - .command(['add-assembly', 'simple.fasta.gz', '--load', 'copy']) - .it('adds an assembly from a compressed FASTA', async ctx => { - expect(readConf(ctx)).toEqual({ - ...defaultConfig, - assemblies: [ - { - ...baseAssembly, - sequence: { - ...baseSequence, - adapter: { - type: 'BgzipFastaAdapter', - fastaLocation: { - uri: 'simple.fasta.gz', - locationType: 'UriLocation', - }, - faiLocation: { - uri: 'simple.fasta.gz.fai', - locationType: 'UriLocation', - }, - gziLocation: { - uri: 'simple.fasta.gz.gzi', - locationType: 'UriLocation', - }, - }, - }, - }, - ], - }) - }) +test('adds an assembly from a FASTA', async () => { + await runInTmpDir(async ctx => { + fs.copyFileSync(dataDir('simple.fasta'), ctxDir(ctx, 'simple.fasta')) + fs.copyFileSync( + dataDir('simple.fasta.fai'), + ctxDir(ctx, 'simple.fasta.fai'), + ) + await runCommand(['add-assembly', 'simple.fasta', '--load', 'copy']) + expect(readConf(ctx)).toMatchSnapshot() + }) +}) - setup - .do(async ctx => { - await copyFile(dataDir('simple.2bit'), ctxDir(ctx, 'simple.2bit')) - }) - .command(['add-assembly', 'simple.2bit', '--load', 'copy']) - .it('adds an assembly from a 2bit', async ctx => { - expect(readConf(ctx)).toEqual({ - ...defaultConfig, - assemblies: [ - { - ...baseAssembly, - sequence: { - ...baseSequence, - adapter: { - type: 'TwoBitAdapter', - twoBitLocation: { - uri: 'simple.2bit', - locationType: 'UriLocation', - }, - }, - }, - }, - ], - }) - }) +test('adds an assembly from a FASTA (.fa extension)', async () => { + await runInTmpDir(async ctx => { + fs.copyFileSync(dataDir('simple.fasta'), ctxDir(ctx, 'simple.fa')) + fs.copyFileSync(dataDir('simple.fasta.fai'), ctxDir(ctx, 'simple.fa.fai')) + await runCommand(['add-assembly', 'simple.fa', '--load', 'copy']) + expect(readConf(ctx)).toMatchSnapshot() + }) +}) - setup - .do(async ctx => { - await copyFile( - dataDir('simple.chrom.sizes'), - ctxDir(ctx, 'simple.chrom.sizes'), - ) - }) - .command(['add-assembly', 'simple.chrom.sizes', '--load', 'copy']) - .it('adds an assembly from a chrom.sizes', async ctx => { - expect(readConf(ctx)).toEqual({ - ...defaultConfig, - assemblies: [ - { - ...baseAssembly, - sequence: { - ...baseSequence, - adapter: { - type: 'ChromSizesAdapter', - chromSizesLocation: { - uri: 'simple.chrom.sizes', - locationType: 'UriLocation', - }, - }, - }, - }, - ], - }) - }) +test('adds an assembly from a FASTA (bgzip)', async () => { + await runInTmpDir(async ctx => { + fs.copyFileSync(dataDir('simple.fasta.gz'), ctxDir(ctx, 'simple.fasta.gz')) + fs.copyFileSync( + dataDir('simple.fasta.gz.fai'), + ctxDir(ctx, 'simple.fasta.gz.fai'), + ) + fs.copyFileSync( + dataDir('simple.fasta.gz.gzi'), + ctxDir(ctx, 'simple.fasta.gz.gzi'), + ) + await runCommand(['add-assembly', 'simple.fasta.gz', '--load', 'copy']) + expect(readConf(ctx)).toMatchSnapshot() + }) +}) - setup - .do(async ctx => { - await copyFile(dataDir('simple.json'), ctxDir(ctx, 'simple.json')) - }) - .command(['add-assembly', 'simple.json', '--load', 'copy']) - .it('adds an assembly from a custom adapter JSON file', async ctx => { - expect(readConf(ctx)).toEqual({ - ...defaultConfig, - assemblies: [ - { - ...baseAssembly, - sequence: { - ...baseSequence, - adapter: { - type: 'FromConfigSequenceAdapter', - features: [ - { - refName: 'SEQUENCE_1', - uniqueId: 'firstId', - start: 0, - end: 233, - seq: 'CCAAGATCTAAGATGTCAACACCTATCTGCTCAAGGTGGTTTTTATAAGGAGTCGCATCGAGGTAAGACATTTTAGAAGTATTTCTCAAGCGTGGGGCAGTTCGCCAAGTTACATCGCTCAGCCCAGGTTCCCTGATTCGAGAACATATCGGTGCTGGGTATTTGTTGGGTTGGTTGATTTGCACCGTAGTTTACACCTTACGACACTACCTATCCAAACAATTGTGTGATAG', - }, - { - refName: 'SEQUENCE_2', - uniqueId: 'secondId', - start: 0, - end: 120, - seq: 'CCGAACCACAGGCCTATGTTACCATTGGAAAGCTCACCTTCCCGAAGGATTGGGACTCCACTAGTCGAAGCCTCAATTCGCCGCGATTAGATAGGGGGCAAGTGGAGATTGATGTTTGGT', - }, - ], - }, - }, - }, - ], - }) - }) +test('adds an assembly from a 2bit', async () => { + await runInTmpDir(async ctx => { + await copyFile(dataDir('simple.2bit'), ctxDir(ctx, 'simple.2bit')) + await runCommand(['add-assembly', 'simple.2bit', '--load', 'copy']) + expect(readConf(ctx)).toMatchSnapshot() + }) +}) +test('adds an assembly from chrom.sizes', async () => { + await runInTmpDir(async ctx => { + await copyFile( + dataDir('simple.chrom.sizes'), + ctxDir(ctx, 'simple.chrom.sizes'), + ) + await runCommand(['add-assembly', 'simple.chrom.sizes', '--load', 'copy']) + expect(readConf(ctx)).toMatchSnapshot() + }) +}) +test('adds an assembly from a custom adapter JSON file', async () => { + await runInTmpDir(async ctx => { + await copyFile(dataDir('simple.json'), ctxDir(ctx, 'simple.json')) + await runCommand(['add-assembly', 'simple.json', '--load', 'copy']) + expect(readConf(ctx)).toMatchSnapshot() + }) +}) - setup - .command([ +test('adds an assembly from a custom adapter inline JSON', async () => { + await runInTmpDir(async ctx => { + await runCommand([ 'add-assembly', '{"type":"FromConfigRegionsAdapter","features":[{"refName":"SEQUENCE_1","uniqueId":"firstId","start":0,"end":233},{"refName":"SEQUENCE_2","uniqueId":"secondId","start":0,"end":120}]}', '--name', @@ -325,42 +205,15 @@ describe('add-assembly', () => { '--load', 'copy', ]) - .it('adds an assembly from a custom adapter inline JSON', async ctx => { - expect(readConf(ctx)).toEqual({ - ...defaultConfig, - assemblies: [ - { - ...baseAssembly, - sequence: { - ...baseSequence, - adapter: { - type: 'FromConfigRegionsAdapter', - features: [ - { - refName: 'SEQUENCE_1', - uniqueId: 'firstId', - start: 0, - end: 233, - }, - { - refName: 'SEQUENCE_2', - uniqueId: 'secondId', - start: 0, - end: 120, - }, - ], - }, - }, - }, - ], - }) - }) + expect(readConf(ctx)).toMatchSnapshot() + }) +}) + +test("can specify --type when the type can't be inferred from the extension", async () => { + await runInTmpDir(async ctx => { + fs.copyFileSync(dataDir('simple.2bit'), ctxDir(ctx, 'simple.2bit.xyz')) - setup - .do(ctx => { - fs.copyFileSync(dataDir('simple.2bit'), ctxDir(ctx, 'simple.2bit.xyz')) - }) - .command([ + await runCommand([ 'add-assembly', 'simple.2bit.xyz', '--type', @@ -368,45 +221,22 @@ describe('add-assembly', () => { '--load', 'copy', ]) - .it( - "can specify --type when the type can't be inferred from the extension", - async ctx => { - expect(readConf(ctx)).toEqual({ - ...defaultConfig, - assemblies: [ - { - ...baseAssembly, - name: 'simple.2bit.xyz', - sequence: { - ...baseSequence, - trackId: 'simple.2bit.xyz-ReferenceSequenceTrack', - adapter: { - type: 'TwoBitAdapter', - twoBitLocation: { - uri: 'simple.2bit.xyz', - locationType: 'UriLocation', - }, - }, - }, - }, - ], - }) - }, + expect(readConf(ctx)).toMatchSnapshot() + }) +}) +test('can specify a custom faiLocation and gziLocation', async () => { + await runInTmpDir(async ctx => { + await copyFile(dataDir('simple.fasta.gz'), ctxDir(ctx, 'simple.fasta.gz')) + await copyFile( + dataDir('simple.fasta.gz.fai'), + ctxDir(ctx, 'simple.fasta.gz.fai.abc'), + ) + await copyFile( + dataDir('simple.fasta.gz.gzi'), + ctxDir(ctx, 'simple.fasta.gz.gzi.def'), ) - setup - .do(async ctx => { - await copyFile(dataDir('simple.fasta.gz'), ctxDir(ctx, 'simple.fasta.gz')) - await copyFile( - dataDir('simple.fasta.gz.fai'), - ctxDir(ctx, 'simple.fasta.gz.fai.abc'), - ) - await copyFile( - dataDir('simple.fasta.gz.gzi'), - ctxDir(ctx, 'simple.fasta.gz.gzi.def'), - ) - }) - .command([ + await runCommand([ 'add-assembly', 'simple.fasta.gz', '--faiLocation', @@ -416,38 +246,13 @@ describe('add-assembly', () => { '--load', 'copy', ]) - .it('can specify a custom faiLocation and gziLocation', async ctx => { - expect(readConf(ctx)).toEqual({ - ...defaultConfig, - assemblies: [ - { - ...baseAssembly, - sequence: { - ...baseSequence, - adapter: { - type: 'BgzipFastaAdapter', - fastaLocation: { - uri: 'simple.fasta.gz', - locationType: 'UriLocation', - }, - faiLocation: { - uri: 'simple.fasta.gz.fai.abc', - locationType: 'UriLocation', - }, - gziLocation: { - uri: 'simple.fasta.gz.gzi.def', - locationType: 'UriLocation', - }, - }, - }, - }, - ], - }) - }) + expect(readConf(ctx)).toMatchSnapshot() + }) +}) - setup - .only() - .command([ +test('can specify a custom name and alias', async () => { + await runInTmpDir(async ctx => { + await runCommand([ 'add-assembly', '{"type":"CustomAdapter"}', '--name', @@ -457,29 +262,13 @@ describe('add-assembly', () => { '--load', 'copy', ]) - .it('can specify a custom name and alias', async ctx => { - expect(ctx.stdout).toContain( - 'Added assembly "customName" to config.json\n', - ) - expect(readConf(ctx)).toEqual({ - ...defaultConfig, - assemblies: [ - { - ...baseAssembly, - name: 'customName', - aliases: ['customAlias'], - sequence: { - ...baseSequence, - trackId: 'customName-ReferenceSequenceTrack', - adapter: { type: 'CustomAdapter' }, - }, - }, - ], - }) - }) - setup - .command([ + expect(readConf(ctx)).toMatchSnapshot() + }) +}) +test('can specify a multiple aliases', async () => { + await runInTmpDir(async ctx => { + await runCommand([ 'add-assembly', '{"type":"CustomAdapter"}', '--name', @@ -491,27 +280,14 @@ describe('add-assembly', () => { '--load', 'copy', ]) - .it('can specify a multiple aliases', async ctx => { - expect(readConf(ctx)).toEqual({ - ...defaultConfig, - assemblies: [ - { - ...baseAssembly, - aliases: ['firstAlias', 'secondAlias'], - sequence: { - ...baseSequence, - adapter: { type: 'CustomAdapter' }, - }, - }, - ], - }) - }) - setup - .do(async ctx => { - await copyFile(dataDir('simple.aliases'), ctxDir(ctx, 'simple.aliases')) - }) - .command([ + expect(readConf(ctx)).toMatchSnapshot() + }) +}) +test('can specify a refNameAliases file', async () => { + await runInTmpDir(async ctx => { + await copyFile(dataDir('simple.aliases'), ctxDir(ctx, 'simple.aliases')) + await runCommand([ 'add-assembly', '{"type":"CustomAdapter"}', '--name', @@ -521,103 +297,47 @@ describe('add-assembly', () => { '--load', 'copy', ]) - .it('can specify a refNameAliases file', async ctx => { - expect(readConf(ctx)).toEqual({ - ...defaultConfig, - assemblies: [ - { - ...baseAssembly, - refNameAliases: { - adapter: { - location: { - uri: 'simple.aliases', - locationType: 'UriLocation', - }, - type: 'RefNameAliasAdapter', - }, - }, - sequence: { - ...baseSequence, - adapter: { type: 'CustomAdapter' }, - }, - }, - ], - }) - }) - setup - .do(ctx => - copyFile(dataDir('simple.aliases'), ctxDir(ctx, 'simple.aliases')), - ) - .command([ - 'add-assembly', - '{"type":"CustomAdapter"}', + expect(readConf(ctx)).toMatchSnapshot() + }) +}) + +test('can specify a refNameAliases file type custom', async () => { + await runInTmpDir(async ctx => { + await runCommand([ + 'add-assembly {"type":"CustomAdapter"}', '--name', 'simple', '--refNameAliases', - '{"type": "CustomAdapter"}', + '{"type":"CustomAdapter"}', '--refNameAliasesType', 'custom', '--load', 'copy', ]) - .it('can specify a custom refNameAliases adapter', async ctx => { - expect(readConf(ctx)).toEqual({ - ...defaultConfig, - assemblies: [ - { - ...baseAssembly, - refNameAliases: { - adapter: { type: 'CustomAdapter' }, - }, - sequence: { - ...baseSequence, - adapter: { type: 'CustomAdapter' }, - }, - }, - ], - }) - }) - setup - .command([ - 'add-assembly', - '{"type":"CustomAdapter"}', + expect(readConf(ctx)).toMatchSnapshot() + }) +}) +test('can specify a custom name and alias and refNameColors', async () => { + await runInTmpDir(async ctx => { + await runCommand([ + 'add-assembly {"type":"CustomAdapter"}', '--name', 'simple', '--refNameColors', - 'red,orange,yellow, green, blue, purple', + 'red,orange,yellow,green,blue,purple', '--load', 'copy', ]) - .it('can specify a custom name and and alias', async ctx => { - expect(readConf(ctx)).toEqual({ - ...defaultConfig, - assemblies: [ - { - ...baseAssembly, - refNameColors: [ - 'red', - 'orange', - 'yellow', - 'green', - 'blue', - 'purple', - ], - sequence: { - ...baseSequence, - adapter: { type: 'CustomAdapter' }, - }, - }, - ], - }) - }) - setup - .do(async () => { - await writeFile('config.json', '{}') - }) - .command([ + expect(readConf(ctx)).toMatchSnapshot() + }) +}) +test('can use an existing config file', async () => { + await runInTmpDir(async ctx => { + await writeFile('config.json', '{}') + await runCommand([ 'add-assembly', '{"type":"CustomAdapter"}', '--name', @@ -625,76 +345,52 @@ describe('add-assembly', () => { '--load', 'copy', ]) - .it('can use an existing config file', async ctx => { - expect(readConf(ctx)).toEqual({ - ...defaultConfig, - assemblies: [ - { - ...baseAssembly, - sequence: { - ...baseSequence, - adapter: { type: 'CustomAdapter' }, - }, - }, - ], - }) - }) - setup - .do(async ctx => { - await copyFile(dataDir('simple.2bit'), ctxDir(ctx, 'simple.2bit')) - }) - .command(['add-assembly', 'simple.2bit', '--load', 'copy']) - .command(['add-assembly', 'simple.2bit', '--overwrite', '--load', 'copy']) - .it('can use --overwrite to replace an existing assembly', async ctx => { - expect(readConf(ctx).assemblies.length).toBe(1) - }) + expect(readConf(ctx)).toMatchSnapshot() + }) +}) +test('can use --overwrite to replace an existing assembly', async () => { + await runInTmpDir(async ctx => { + await copyFile(dataDir('simple.2bit'), ctxDir(ctx, 'simple.2bit')) + await runCommand(['add-assembly', 'simple.2bit', '--load', 'copy']) + await runCommand([ + 'add-assembly', + 'simple.2bit', + '--overwrite', + '--load', + 'copy', + ]) + + expect(readConf(ctx)).toMatchSnapshot() + }) +}) - setup - .do(async ctx => { - await mkdir('jbrowse') - await rename('manifest.json', path.join('jbrowse', 'manifest.json')) - await copyFile(dataDir('simple.2bit'), ctxDir(ctx, 'simple.2bit')) - process.chdir('jbrowse') - }) - .command([ +test('relative path', async () => { + await runInTmpDir(async ctx => { + await mkdir('jbrowse') + await copyFile(dataDir('simple.2bit'), ctxDir(ctx, 'simple.2bit')) + process.chdir('jbrowse') + await runCommand([ 'add-assembly', path.join('..', 'simple.2bit'), '--load', 'inPlace', ]) + expect(readConf(ctx, 'jbrowse')).toMatchSnapshot() + }) +}) - setup - .nock('https://mysite.com', site => - site.head('/data/simple.2bit').reply(200), - ) - .command(['add-assembly', 'https://mysite.com/data/simple.2bit']) - .it('adds an assembly from a URL', async ctx => { - expect(readConf(ctx)).toEqual({ - ...defaultConfig, - assemblies: [ - { - ...baseAssembly, - sequence: { - ...baseSequence, - adapter: { - type: 'TwoBitAdapter', - twoBitLocation: { - uri: 'https://mysite.com/data/simple.2bit', - locationType: 'UriLocation', - }, - }, - }, - }, - ], - }) - }) - - setup - .do(ctx => - fs.copyFileSync(dataDir('simple.2bit'), ctxDir(ctx, 'simple.2bit')), - ) - .command([ +test('adds an assembly from a URL', async () => { + await runInTmpDir(async ctx => { + nock('https://mysite.com').head('/data/simple.2bit').reply(200) + await runCommand(['add-assembly', 'https://mysite.com/data/simple.2bit']) + expect(readConf(ctx)).toMatchSnapshot() + }) +}) +test('can use --out to make a new directory', async () => { + await runInTmpDir(async ctx => { + fs.copyFileSync(dataDir('simple.2bit'), ctxDir(ctx, 'simple.2bit')) + await runCommand([ 'add-assembly', 'simple.2bit', '--load', @@ -702,15 +398,13 @@ describe('add-assembly', () => { '--out', 'testing', ]) - .it('can use --out to make a new directory', async ctx => { - expect(readConf(ctx, 'testing').assemblies.length).toBe(1) - }) - - setup - .do(ctx => { - fs.copyFileSync(dataDir('simple.2bit'), ctxDir(ctx, 'simple.2bit')) - }) - .command([ + expect(readConf(ctx, 'testing').assemblies.length).toBe(1) + }) +}) +test('can use --out to write to a file', async () => { + await runInTmpDir(async ctx => { + fs.copyFileSync(dataDir('simple.2bit'), ctxDir(ctx, 'simple.2bit')) + await runCommand([ 'add-assembly', 'simple.2bit', '--load', @@ -718,7 +412,6 @@ describe('add-assembly', () => { '--out', 'out/testing.json', ]) - .it('can use --out to write to a file', async ctx => { - expect(readConfAlt(ctx, 'out', 'testing.json').assemblies.length).toBe(1) - }) + expect(readConfAlt(ctx, 'out', 'testing.json').assemblies.length).toBe(1) + }) }) diff --git a/products/jbrowse-cli/src/commands/add-connection.test.ts b/products/jbrowse-cli/src/commands/add-connection.test.ts index 5dc4ff0820..4d999d0812 100644 --- a/products/jbrowse-cli/src/commands/add-connection.test.ts +++ b/products/jbrowse-cli/src/commands/add-connection.test.ts @@ -5,35 +5,12 @@ import fs from 'fs' import path from 'path' -import { setup, readConf } from '../testUtil' +import { readConf, runInTmpDir } from '../testUtil' +import nock from 'nock' +import { runCommand } from '@oclif/test' const { copyFile, rename } = fs.promises -const defaultConfig = { - assemblies: [ - { - name: 'testAssembly', - sequence: { - type: 'testSequenceTrack', - trackId: '', - adapter: { - type: 'testSeqAdapter', - twoBitLocation: { - uri: 'test.2bit', - locationType: 'UriLocation', - }, - }, - }, - }, - ], - configuration: {}, - connections: [], - defaultSession: { - name: 'New Session', - }, - tracks: [], -} - const testConfig = path.join( __dirname, '..', @@ -51,82 +28,58 @@ async function copyConf(ctx: { dir: string }) { path.join(ctx.dir, 'config.json'), ) } -const originalDateNow = Date.now - -const setupWithDateMock = setup - .do(() => { - Date.now = jest.fn(() => 1) - }) - .finally(() => { - Date.now = originalDateNow - }) -// Cleaning up exitCode in Node.js 20, xref https://github.com/jestjs/jest/issues/14501 +// Cleaning up exitCode in Node.js 20, xref +// https://github.com/jestjs/jest/issues/14501 afterAll(() => (process.exitCode = 0)) +beforeAll(() => (Date.now = jest.fn(() => 1))) + +test('fails if no config file', async () => { + nock('https://example.com').head('/hub.txt').reply(200) + + const { error } = await runCommand([ + 'add-connection', + 'https://example.com/hub.txt', + ]) + expect(error?.message).toMatchSnapshot() +}) + +test('fails if data directory is not an url', async () => { + const { error } = await runCommand(['add-connection .']) + expect(error?.message).toMatchSnapshot() +}) -describe('add-connection', () => { - setup - .nock('https://example.com', site => site.head('/hub.txt').reply(200)) - .command(['add-connection', 'https://example.com/hub.txt']) - .catch(/no such file or directory/) - .it('fails if no config file') - setup - .command(['add-connection', '.']) - .exit(160) - .it('fails if data directory is not an url') - setup - .nock('https://mysite.com', site => site.head('/notafile.txt').reply(500)) - .command(['add-connection', 'https://mysite.com/notafile.txt']) - .exit(170) - .it('fails when fetching from url fails') +test('fails when fetching from url fails', async () => { + nock('https://mysite.com').head('/notafile.txt').reply(500) + const { error } = await runCommand([ + 'add-connection', + 'https://mysite.com/notafile.txt', + ]) + expect(error?.message).toMatchSnapshot() +}) - setupWithDateMock - .nock('https://mysite.com', site => site.head('/data/hub.txt').reply(200)) - .do(ctx => copyConf(ctx)) - .command(['add-connection', 'https://mysite.com/data/hub.txt']) - .it('adds an UCSCTrackHubConnection connection from a url', async ctx => { - const contents = readConf(ctx) - expect(contents).toEqual({ - ...defaultConfig, - connections: [ - { - type: 'UCSCTrackHubConnection', - connectionId: 'UCSCTrackHubConnection-1', - hubTxtLocation: { - uri: 'https://mysite.com/data/hub.txt', - locationType: 'UriLocation', - }, - name: 'UCSCTrackHubConnection-1', - }, - ], - }) - }) - setupWithDateMock - .nock('https://mysite.com', site => site.head('/jbrowse/data').reply(200)) - .do(ctx => copyConf(ctx)) - .command(['add-connection', 'https://mysite.com/jbrowse/data']) - .it('adds JBrowse1 connection from a url', async ctx => { - const contents = readConf(ctx) - expect(contents).toEqual({ - ...defaultConfig, - connections: [ - { - type: 'JBrowse1Connection', - connectionId: 'JBrowse1Connection-1', - dataDirLocation: { - uri: 'https://mysite.com/jbrowse/data', - locationType: 'UriLocation', - }, - name: 'JBrowse1Connection-1', - }, - ], - }) - }) +test('adds an UCSCTrackHubConnection connection from a url', async () => { + await runInTmpDir(async ctx => { + nock('https://mysite.com').head('/data/hub.txt').reply(200) + await copyConf(ctx) + await runCommand(['add-connection', 'https://mysite.com/data/hub.txt']) + expect(readConf(ctx).connections).toMatchSnapshot() + }) +}) - setup - .nock('https://mysite.com', site => site.head('/custom').reply(200)) - .do(ctx => copyConf(ctx)) - .command([ +test('adds JBrowse1 connection from a url', async () => { + await runInTmpDir(async ctx => { + nock('https://mysite.com').head('/jbrowse/data').reply(200) + await copyConf(ctx) + await runCommand(['add-connection', 'https://mysite.com/jbrowse/data']) + expect(readConf(ctx).connections).toMatchSnapshot() + }) +}) +test('adds a custom connection with user set fields', async () => { + await runInTmpDir(async ctx => { + nock('https://mysite.com').head('/custom').reply(200) + await copyConf(ctx) + await runCommand([ 'add-connection', 'https://mysite.com/custom', '--type', @@ -138,86 +91,58 @@ describe('add-connection', () => { '--assemblyNames', 'testAssembly', '--config', - '{"url":{"uri":"https://mysite.com/custom"}, "locationType": "UriLocation"}', + '{"url":{"uri":"https://mysite.com/custom"},"locationType":"UriLocation"}', ]) - .it('adds a custom connection with user set fields', async ctx => { - const contents = readConf(ctx) - expect(contents).toEqual({ - ...defaultConfig, - connections: [ - { - type: 'newType', - assemblyNames: ['testAssembly'], - connectionId: 'newConnectionId', - locationType: 'UriLocation', - url: { - uri: 'https://mysite.com/custom', - }, - name: 'newName', - }, - ], - }) - }) - setup - .nock('https://mysite.com', site => site.head('/custom').reply(200)) - .do(ctx => copyConf(ctx)) - .command([ + expect(readConf(ctx).connections).toMatchSnapshot() + }) +}) +test('fails to add a duplicate connection', async () => { + await runInTmpDir(async ctx => { + nock('https://mysite.com').head('/custom').reply(200) + await copyConf(ctx) + await runCommand([ 'add-connection', 'https://mysite.com/custom', '--connectionId', 'newConnectionId', '--config', - '{"url":{"uri":"https://mysite.com/custom"}, "locationType": "UriLocation"}', + '{"url":{"uri":"https://mysite.com/custom"},"locationType":"UriLocation"}', ]) - .nock('https://mysite.com', site => site.head('/custom').reply(200)) - .command([ + nock('https://mysite.com').head('/custom').reply(200) + const { error } = await runCommand([ 'add-connection', 'https://mysite.com/custom', '--connectionId', 'newConnectionId', '--config', - '{"url":{"uri":"https://mysite.com/custom"}, "locationType": "UriLocation"}', + '{"url":{"uri":"https://mysite.com/custom"},"locationType":"UriLocation"}', ]) - .exit(150) - .it('Fails to add a duplicate connection Id') - setup - .do(ctx => copyConf(ctx)) - .command([ + expect(error?.message).toMatchSnapshot() + }) +}) +test('overwrites an existing custom connection and does not check URL', async () => { + await runInTmpDir(async ctx => { + nock('https://mysite.com').head('/custom').reply(200) + await copyConf(ctx) + await runCommand([ 'add-connection', 'https://mysite.com/custom', '--connectionId', 'newConnectionId', '--config', - '{"url":{"uri":"https://mysite.com/custom"}, "locationType": "UriLocation"}', + '{"url":{"uri":"https://mysite.com/custom"},"locationType":"UriLocation"}', '--force', ]) - .command([ + nock('https://mysite.com').head('/custom').reply(200) + await runCommand([ 'add-connection', 'https://mysite.com/custom', '--connectionId', 'newConnectionId', '--config', - '{"url":{"uri":"https://mysite.com/custom"}, "locationType": "UriLocation"}', + '{"url":{"uri":"https://mysite.com/custom"},"locationType":"UriLocation"}', '--force', ]) - .it( - 'overwrites an existing custom connection and does not check URL', - async ctx => { - const contents = readConf(ctx) - expect(contents).toEqual({ - ...defaultConfig, - connections: [ - { - type: 'custom', - connectionId: 'newConnectionId', - locationType: 'UriLocation', - url: { - uri: 'https://mysite.com/custom', - }, - name: 'newConnectionId', - }, - ], - }) - }, - ) + expect(readConf(ctx).connections).toMatchSnapshot() + }) }) diff --git a/products/jbrowse-cli/src/commands/add-track.test.ts b/products/jbrowse-cli/src/commands/add-track.test.ts index bf96a85cc8..84efdcaa2a 100644 --- a/products/jbrowse-cli/src/commands/add-track.test.ts +++ b/products/jbrowse-cli/src/commands/add-track.test.ts @@ -5,7 +5,8 @@ import fs from 'fs' import path from 'path' -import { setup, readConf, ctxDir } from '../testUtil' +import { readConf, ctxDir, runInTmpDir } from '../testUtil' +import { runCommand } from '@oclif/test' const { writeFile, copyFile } = fs.promises @@ -44,106 +45,124 @@ function init2bit(ctx: { dir: string }) { // Cleaning up exitCode in Node.js 20, xref https://github.com/jestjs/jest/issues/14501 afterAll(() => (process.exitCode = 0)) -describe('add-track', () => { - setup.command(['add-track']).exit(2).it('fails if no track is specified') - setup - .command(['add-track', simpleBam]) - .exit(110) - .it('fails if load flag isnt passed in for a localFile') - setup - .command([ +test('fails if no track is specified', async () => { + const { error } = await runCommand(['add-track']) + expect(error?.message).toMatchSnapshot() +}) + +test('fails if load flag is not passed in for a localFile', async () => { + const { error } = await runCommand(['add-track', simpleBam]) + expect(error?.message).toMatchSnapshot() +}) + +test('fails if URL with load flag is passed', async () => { + const { error } = await runCommand([ + 'add-track', + 'https://mysite.com/data/simple.bam', + '--load', + 'inPlace', + ]) + expect(error?.message).toMatchSnapshot() +}) + +test('cannot add a track with the same track id', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + await runCommand(['add-track', simpleBam, '--load', 'copy']) + const { error } = await runCommand([ 'add-track', - 'https://mysite.com/data/simple.bam', + simpleBam, '--load', - 'inPlace', + 'copy', + ]) + expect(error?.message).toMatchSnapshot() + }) +}) + +test('use force to overwrite a symlink', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + + await runCommand(['add-track', simpleBam, '--load', 'symlink']) + const { error } = await runCommand([ + 'add-track', + simpleBam, + '--load', + 'symlink', + '--force', + ]) + expect(error).toBe(undefined) + }) +}) + +test('use force to overwrite a copied file', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + + await runCommand(['add-track', simpleBam, '--load', 'copy']) + const { error } = await runCommand([ + 'add-track', + simpleBam, + '--load', + 'copy', + '--force', + ]) + expect(error).toBe(undefined) + }) +}) + +// setting up a test for move difficult currently, because it would literally +// move the file in our test data... +// +// .do(initctx) +// .do(async ctx => { +// await fsPromises.copyFile(simpleBam, path.join(ctx.dir, 'new.bam')) +// await fsPromises.copyFile(simpleBai, path.join(ctx.dir, 'new.bam.bai')) +// }) +// runCommand(['add-track', 'new.bam', '--load', 'move']) +// runCommand(['add-track', 'new.bam', '--load', 'move', '--force']) +// .it('use force to overwrite a moved file') + +test('cannot add a track if there is no config file', async () => { + await runInTmpDir(async () => { + const { error } = await runCommand([ + 'add-track', + simpleBam, + '--load', + 'copy', + ]) + expect(error?.message).toMatchSnapshot() + }) +}) +test('fails if it cannot assume the assemblyname', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + await writeFile(path.join(ctx.dir, 'config.json'), '{"assemblies":[]}') + const { error } = await runCommand([ + 'add-track', + simpleBam, + '--load', + 'copy', ]) - .exit(100) - .it('fails if URL with load flag is passed') - - setup - .do(initctx) - .command(['add-track', simpleBam, '--load', 'copy']) - .command(['add-track', simpleBam, '--load', 'copy']) - .exit(160) - .it('cannot add a track with the same track id') - - setup - .do(initctx) - .command(['add-track', simpleBam, '--load', 'symlink']) - .command(['add-track', simpleBam, '--load', 'symlink', '--force']) - .it('use force to overwrite a symlink') - - setup - .do(initctx) - .command(['add-track', simpleBam, '--load', 'copy']) - .command(['add-track', simpleBam, '--load', 'copy', '--force']) - .it('use force to overwrite a copied file') - - // setting up a test for move difficult currently, because it would literally - // move the file in our test data... - // setup - // .do(initctx) - // .do(async ctx => { - // await fsPromises.copyFile(simpleBam, path.join(ctx.dir, 'new.bam')) - // await fsPromises.copyFile(simpleBai, path.join(ctx.dir, 'new.bam.bai')) - // }) - // .command(['add-track', 'new.bam', '--load', 'move']) - // .command(['add-track', 'new.bam', '--load', 'move', '--force']) - // .it('use force to overwrite a moved file') - - setup - .command(['add-track', simpleBam, '--load', 'copy']) - .catch(/no such file or directory/) - .it('cannot add a track if there is no config file') - setup - .do(initctx) - .do(ctx => - writeFile(path.join(ctx.dir, 'config.json'), '{"assemblies":[]}'), - ) - .command(['add-track', simpleBam, '--load', 'copy']) - .exit(150) - .it('fails if it cannot assume the assemblyname') - - setup - .do(initctx) - .command(['add-track', simpleBam, '--load', 'copy']) - .it('adds a bam track with bai', async ctx => { - expect(exists(path.join(ctx.dir, 'simple.bam'))).toBeTruthy() - expect(exists(path.join(ctx.dir, 'simple.bam.bai'))).toBeTruthy() - expect(readConf(ctx).tracks).toEqual([ - { - type: 'AlignmentsTrack', - trackId: 'simple', - name: 'simple', - assemblyNames: ['testAssembly'], - adapter: { - type: 'BamAdapter', - bamLocation: { - uri: 'simple.bam', - locationType: 'UriLocation', - }, - index: { - indexType: 'BAI', - location: { - uri: 'simple.bam.bai', - locationType: 'UriLocation', - }, - }, - sequenceAdapter: { - type: 'testSeqAdapter', - twoBitLocation: { - uri: 'test.2bit', - locationType: 'UriLocation', - }, - }, - }, - }, - ]) - }) - - setup - .do(initctx) - .command([ + + expect(error?.message).toMatchSnapshot() + }) +}) + +test('adds a bam track with bai', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + await runCommand(['add-track', simpleBam, '--load', 'copy']) + expect(exists(path.join(ctx.dir, 'simple.bam'))).toBeTruthy() + expect(exists(path.join(ctx.dir, 'simple.bam.bai'))).toBeTruthy() + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a bam track with csi', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + await runCommand([ 'add-track', simpleBam, '--load', @@ -151,76 +170,29 @@ describe('add-track', () => { '--indexFile', simpleBam + '.csi', ]) - .it('adds a bam track with csi', async ctx => { - expect(exists(ctxDir(ctx, 'simple.bam'))).toBeTruthy() - expect(exists(ctxDir(ctx, 'simple.bam.csi'))).toBeTruthy() - expect(readConf(ctx).tracks).toEqual([ - { - type: 'AlignmentsTrack', - trackId: 'simple', - name: 'simple', - assemblyNames: ['testAssembly'], - adapter: { - type: 'BamAdapter', - bamLocation: { - uri: 'simple.bam', - locationType: 'UriLocation', - }, - index: { - indexType: 'CSI', - location: { - uri: 'simple.bam.csi', - locationType: 'UriLocation', - }, - }, - sequenceAdapter: { - type: 'testSeqAdapter', - twoBitLocation: { - uri: 'test.2bit', - locationType: 'UriLocation', - }, - }, - }, - }, - ]) - }) - setup - .do(initctx) - .command(['add-track', '/testing/in/place.bam', '--load', 'inPlace']) - .it('adds a bam track with load inPlace', async ctx => { - expect(readConf(ctx).tracks).toEqual([ - { - type: 'AlignmentsTrack', - trackId: 'place', - name: 'place', - assemblyNames: ['testAssembly'], - adapter: { - type: 'BamAdapter', - bamLocation: { - uri: '/testing/in/place.bam', - locationType: 'UriLocation', - }, - index: { - indexType: 'BAI', - location: { - uri: '/testing/in/place.bam.bai', - locationType: 'UriLocation', - }, - }, - sequenceAdapter: { - type: 'testSeqAdapter', - twoBitLocation: { - uri: 'test.2bit', - locationType: 'UriLocation', - }, - }, - }, - }, - ]) - }) - setup - .do(initctx) - .command([ + expect(exists(path.join(ctx.dir, 'simple.bam'))).toBeTruthy() + expect(exists(path.join(ctx.dir, 'simple.bam.csi'))).toBeTruthy() + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a bam track with load inPlace', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + await runCommand([ + 'add-track', + '/testing/in/place.bam', + '--load', + 'inPlace', + ]) + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a bam+bai track with load inPlace', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + await runCommand([ 'add-track', '/testing/in/place.bam', '--load', @@ -228,41 +200,14 @@ describe('add-track', () => { '--indexFile', '/something/else/random.bai', ]) - .it('adds a bam track with load inPlace', async ctx => { - expect(readConf(ctx).tracks).toEqual([ - { - type: 'AlignmentsTrack', - trackId: 'place', - name: 'place', - assemblyNames: ['testAssembly'], - adapter: { - type: 'BamAdapter', - bamLocation: { - uri: '/testing/in/place.bam', - locationType: 'UriLocation', - }, - index: { - indexType: 'BAI', - location: { - uri: '/something/else/random.bai', - locationType: 'UriLocation', - }, - }, - sequenceAdapter: { - type: 'testSeqAdapter', - twoBitLocation: { - uri: 'test.2bit', - locationType: 'UriLocation', - }, - }, - }, - }, - ]) - }) - - setup - .do(initctx) - .command([ + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a bam track with indexFile for bai', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + await runCommand([ 'add-track', simpleBam, '--load', @@ -270,78 +215,35 @@ describe('add-track', () => { '--indexFile', simpleBai, ]) - .it('adds a bam track with indexFile for bai', async ctx => { - expect(exists(ctxDir(ctx, 'simple.bam'))).toBeTruthy() - expect(exists(ctxDir(ctx, 'simple.bai'))).toBeTruthy() - expect(readConf(ctx).tracks).toEqual([ - { - type: 'AlignmentsTrack', - trackId: 'simple', - name: 'simple', - assemblyNames: ['testAssembly'], - adapter: { - type: 'BamAdapter', - bamLocation: { - uri: 'simple.bam', - locationType: 'UriLocation', - }, - index: { - indexType: 'BAI', - location: { - uri: 'simple.bai', - locationType: 'UriLocation', - }, - }, - sequenceAdapter: { - type: 'testSeqAdapter', - twoBitLocation: { - uri: 'test.2bit', - locationType: 'UriLocation', - }, - }, - }, - }, - ]) - }) - - setup - .do(initctx) - .command(['add-track', simpleBam, '--load', 'copy', '--subDir', 'bam']) - .it('adds a bam track with subDir', async ctx => { - expect(readConf(ctx).tracks).toEqual([ - { - type: 'AlignmentsTrack', - trackId: 'simple', - name: 'simple', - assemblyNames: ['testAssembly'], - adapter: { - type: 'BamAdapter', - bamLocation: { - uri: 'bam/simple.bam', - locationType: 'UriLocation', - }, - index: { - indexType: 'BAI', - location: { - uri: 'bam/simple.bam.bai', - locationType: 'UriLocation', - }, - }, - sequenceAdapter: { - type: 'testSeqAdapter', - twoBitLocation: { - uri: 'test.2bit', - locationType: 'UriLocation', - }, - }, - }, - }, - ]) - }) - - setup - .do(initctx) - .command([ + expect(exists(ctxDir(ctx, 'simple.bam'))).toBeTruthy() + expect(exists(ctxDir(ctx, 'simple.bai'))).toBeTruthy() + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a bam track with subDir', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + await runCommand([ + 'add-track', + simpleBam, + '--load', + 'copy', + '--subDir', + 'bam', + ]) + + expect(exists(ctxDir(ctx, 'bam/simple.bam'))).toBeTruthy() + expect(exists(ctxDir(ctx, 'bam/simple.bam.bai'))).toBeTruthy() + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a bam track with subDir and localPath protocol', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + + await runCommand([ 'add-track', simpleBam, '--load', @@ -351,41 +253,18 @@ describe('add-track', () => { '--subDir', 'bam', ]) - .it('adds a bam track with subDir and localPath protocol', async ctx => { - expect(readConf(ctx).tracks).toEqual([ - { - type: 'AlignmentsTrack', - trackId: 'simple', - name: 'simple', - assemblyNames: ['testAssembly'], - adapter: { - type: 'BamAdapter', - bamLocation: { - localPath: 'bam/simple.bam', - locationType: 'LocalPathLocation', - }, - index: { - indexType: 'BAI', - location: { - localPath: 'bam/simple.bam.bai', - locationType: 'LocalPathLocation', - }, - }, - sequenceAdapter: { - type: 'testSeqAdapter', - twoBitLocation: { - uri: 'test.2bit', - locationType: 'UriLocation', - }, - }, - }, - }, - ]) - }) - - setup - .do(initctx) - .command([ + + expect(exists(ctxDir(ctx, 'bam/simple.bam'))).toBeTruthy() + expect(exists(ctxDir(ctx, 'bam/simple.bam.bai'))).toBeTruthy() + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a bam track with all the custom fields', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + + await runCommand([ 'add-track', simpleBam, '--load', @@ -395,7 +274,7 @@ describe('add-track', () => { '--trackId', 'customTrackId', '--description', - 'new description', + '"new description"', '--trackType', 'CustomTrackType', '--category', @@ -403,88 +282,47 @@ describe('add-track', () => { '--assemblyNames', 'customAssemblyName', '--config', - '{"defaultRendering": "test"}', + '{"defaultRendering":"test"}', ]) - .it('adds a bam track with all the custom fields', async ctx => { - expect(readConf(ctx).tracks).toEqual([ - { - type: 'CustomTrackType', - trackId: 'customTrackId', - name: 'customName', - description: 'new description', - category: ['newcategory'], - assemblyNames: ['customAssemblyName'], - adapter: { - type: 'BamAdapter', - bamLocation: { - uri: 'simple.bam', - locationType: 'UriLocation', - }, - index: { - indexType: 'BAI', - location: { - uri: 'simple.bam.bai', - locationType: 'UriLocation', - }, - }, - }, - defaultRendering: 'test', - }, - ]) - }) - - setup - .do(initctx) - .command(['add-track', 'https://mysite.com/data/simple.bam']) - .it('adds a bam track from a url', async ctx => { - expect(readConf(ctx).tracks).toEqual([ - { - type: 'AlignmentsTrack', - trackId: 'simple', - name: 'simple', - assemblyNames: ['testAssembly'], - adapter: { - type: 'BamAdapter', - bamLocation: { - uri: 'https://mysite.com/data/simple.bam', - locationType: 'UriLocation', - }, - index: { - indexType: 'BAI', - location: { - uri: 'https://mysite.com/data/simple.bam.bai', - locationType: 'UriLocation', - }, - }, - sequenceAdapter: { - type: 'testSeqAdapter', - twoBitLocation: { - uri: 'test.2bit', - locationType: 'UriLocation', - }, - }, - }, - }, - ]) - }) - - // fails when there is more than one assembly and none is specified on the - // command line - setup - .do(initctx) - .do(init2bit) - .command(['add-assembly', 'simple.2bit', '--load', 'copy']) - .command(['add-track', simpleBam, '--load', 'copy']) - .exit(2) - .it('fails multiple assemblies exist but no assemblyNames passed') - - // fails when there is more than one assembly and none is specified on the - // command line - setup - .do(initctx) - .do(init2bit) - .command(['add-assembly', 'simple.2bit', '--load', 'copy']) - .command([ + + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a bam track from a url', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + + await runCommand(['add-track', 'https://mysite.com/data/simple.bam']) + + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('fails multiple assemblies exist but no assemblyNames passed', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + await init2bit(ctx) + + await runCommand(['add-assembly', 'simple.2bit', '--load', 'copy']) + const { error } = await runCommand([ + 'add-track', + simpleBam, + '--load', + 'copy', + ]) + + expect(error?.message).toMatchSnapshot() + }) +}) + +test('adds a track to a config with multiple assemblies', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + await init2bit(ctx) + + await runCommand(['add-assembly', 'simple.2bit', '--load', 'copy']) + const { error } = await runCommand([ 'add-track', simpleBam, '--load', @@ -492,109 +330,80 @@ describe('add-track', () => { '--assemblyNames', 'testAssembly', ]) - .it('adds a track to a config with multiple assemblies', async ctx => { - const contents = readConf(ctx) - expect(contents.tracks).toEqual([ - { - type: 'AlignmentsTrack', - trackId: 'simple', - name: 'simple', - assemblyNames: ['testAssembly'], - adapter: { - type: 'BamAdapter', - bamLocation: { - uri: 'simple.bam', - locationType: 'UriLocation', - }, - index: { - indexType: 'BAI', - location: { - uri: 'simple.bam.bai', - locationType: 'UriLocation', - }, - }, - - sequenceAdapter: { - twoBitLocation: { - uri: 'test.2bit', - locationType: 'UriLocation', - }, - type: 'testSeqAdapter', - }, - }, - }, - ]) - }) - - setup - .do(initctx) - .command(['add-track', simpleGff, '--load', 'copy']) - .it('adds a plaintext gff', async ctx => { - expect(exists(ctxDir(ctx, 'volvox.sort.gff3'))).toBeTruthy() - expect(readConf(ctx).tracks).toEqual([ - { - type: 'FeatureTrack', - trackId: 'volvox.sort', - name: 'volvox.sort', - assemblyNames: ['testAssembly'], - adapter: { - type: 'Gff3Adapter', - gffLocation: { - uri: 'volvox.sort.gff3', - locationType: 'UriLocation', - }, - }, - }, - ]) - }) - - setup - .do(initctx) - .command(['add-track', simpleVcf, '--load', 'copy']) - .it('adds a plaintext vcf', async ctx => { - expect(exists(ctxDir(ctx, 'volvox.filtered.vcf'))).toBeTruthy() - expect(readConf(ctx).tracks).toEqual([ - { - type: 'VariantTrack', - trackId: 'volvox.filtered', - name: 'volvox.filtered', - assemblyNames: ['testAssembly'], - adapter: { - type: 'VcfAdapter', - vcfLocation: { - uri: 'volvox.filtered.vcf', - locationType: 'UriLocation', - }, - }, - }, - ]) - }) - - setup - .do(initctx) - .command(['add-track', simpleGtf, '--load', 'copy']) - .it('adds a plaintext gtf', async ctx => { - expect(exists(ctxDir(ctx, 'volvox.sorted.gtf'))).toBeTruthy() - expect(readConf(ctx).tracks).toEqual([ - { - type: 'FeatureTrack', - trackId: 'volvox.sorted', - name: 'volvox.sorted', - assemblyNames: ['testAssembly'], - adapter: { - type: 'GtfAdapter', - gtfLocation: { - uri: 'volvox.sorted.gtf', - locationType: 'UriLocation', - }, - }, - }, - ]) - }) - - setup - .do(initctx) - .command([ + + expect(error).toBe(undefined) + }) +}) + +test('adds a plaintext gff', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + + await runCommand(['add-track', simpleGff, '--load', 'copy']) + expect(exists(ctxDir(ctx, 'volvox.sort.gff3'))).toBeTruthy() + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a plaintext vcf', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + + await runCommand(['add-track', simpleVcf, '--load', 'copy']) + expect(exists(ctxDir(ctx, 'volvox.filtered.vcf'))).toBeTruthy() + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a plaintext gtf', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + await runCommand(['add-track', simpleGtf, '--load', 'copy']) + expect(exists(ctxDir(ctx, 'volvox.sorted.gtf'))).toBeTruthy() + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a plaintext bed', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + await runCommand(['add-track', simpleBed, '--load', 'copy']) + + expect(exists(ctxDir(ctx, 'volvox.bed'))).toBeTruthy() + + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a plaintext bedpe', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + await runCommand(['add-track', simpleBedpe, '--load', 'copy']) + + expect(exists(ctxDir(ctx, 'volvox.bedpe'))).toBeTruthy() + + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a tabix gff with tbi', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + + await runCommand(['add-track', simpleGffGz, '--load', 'copy']) + + expect(exists(ctxDir(ctx, 'volvox.sort.gff3.gz'))).toBeTruthy() + expect(exists(ctxDir(ctx, 'volvox.sort.gff3.gz.tbi'))).toBeTruthy() + + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a tabix gff with csi', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + + await runCommand([ 'add-track', simpleGffGz, '--load', @@ -602,36 +411,19 @@ describe('add-track', () => { '--indexFile', simpleGffGz + '.csi', ]) - .it('adds a tabix gff with csi', async ctx => { - expect(exists(ctxDir(ctx, 'volvox.sort.gff3.gz'))).toBeTruthy() - expect(exists(ctxDir(ctx, 'volvox.sort.gff3.gz.csi'))).toBeTruthy() - expect(readConf(ctx).tracks).toEqual([ - { - type: 'FeatureTrack', - trackId: 'volvox.sort.gff3', - name: 'volvox.sort.gff3', - assemblyNames: ['testAssembly'], - adapter: { - type: 'Gff3TabixAdapter', - gffGzLocation: { - uri: 'volvox.sort.gff3.gz', - locationType: 'UriLocation', - }, - index: { - location: { - uri: 'volvox.sort.gff3.gz.csi', - locationType: 'UriLocation', - }, - indexType: 'CSI', - }, - }, - }, - ]) - }) - - setup - .do(initctx) - .command([ + + expect(exists(ctxDir(ctx, 'volvox.sort.gff3.gz'))).toBeTruthy() + expect(exists(ctxDir(ctx, 'volvox.sort.gff3.gz.csi'))).toBeTruthy() + + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a paf.gz file', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + + await runCommand([ 'add-track', simplePafGz, '--assemblyNames', @@ -639,29 +431,17 @@ describe('add-track', () => { '--load', 'copy', ]) - .it('adds a paf gz file', async ctx => { - expect(exists(ctxDir(ctx, 'volvox_inv_indels.paf.gz'))).toBeTruthy() - expect(readConf(ctx).tracks).toEqual([ - { - type: 'SyntenyTrack', - trackId: 'volvox_inv_indels.paf', - name: 'volvox_inv_indels.paf', - adapter: { - type: 'PAFAdapter', - pafLocation: { - uri: 'volvox_inv_indels.paf.gz', - locationType: 'UriLocation', - }, - assemblyNames: ['volvox_random_inv', 'volvox'], - }, - assemblyNames: ['volvox_random_inv', 'volvox'], - }, - ]) - }) - - setup - .do(initctx) - .command([ + expect(exists(ctxDir(ctx, 'volvox_inv_indels.paf.gz'))).toBeTruthy() + + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a paf file', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + + await runCommand([ 'add-track', simplePaf, '--assemblyNames', @@ -669,29 +449,16 @@ describe('add-track', () => { '--load', 'copy', ]) - .it('adds a paf file', async ctx => { - expect(exists(ctxDir(ctx, 'volvox_inv_indels.paf'))).toBeTruthy() - expect(readConf(ctx).tracks).toEqual([ - { - type: 'SyntenyTrack', - trackId: 'volvox_inv_indels', - name: 'volvox_inv_indels', - adapter: { - type: 'PAFAdapter', - pafLocation: { - uri: 'volvox_inv_indels.paf', - locationType: 'UriLocation', - }, - assemblyNames: ['volvox_random_inv', 'volvox'], - }, - assemblyNames: ['volvox_random_inv', 'volvox'], - }, - ]) - }) - - setup - .do(initctx) - .command([ + + expect(exists(ctxDir(ctx, 'volvox_inv_indels.paf'))).toBeTruthy() + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a delta file', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + await runCommand([ 'add-track', simpleDelta, '--assemblyNames', @@ -699,29 +466,16 @@ describe('add-track', () => { '--load', 'copy', ]) - .it('adds a delta file', async ctx => { - expect(exists(ctxDir(ctx, 'volvox_inv_indels.delta'))).toBeTruthy() - expect(readConf(ctx).tracks).toEqual([ - { - type: 'SyntenyTrack', - trackId: 'volvox_inv_indels', - name: 'volvox_inv_indels', - adapter: { - type: 'DeltaAdapter', - assemblyNames: ['volvox_random_inv', 'volvox'], - deltaLocation: { - uri: 'volvox_inv_indels.delta', - locationType: 'UriLocation', - }, - }, - assemblyNames: ['volvox_random_inv', 'volvox'], - }, - ]) - }) - - setup - .do(initctx) - .command([ + + expect(exists(ctxDir(ctx, 'volvox_inv_indels.delta'))).toBeTruthy() + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a mashmap file', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + await runCommand([ 'add-track', simpleOut, '--assemblyNames', @@ -729,29 +483,17 @@ describe('add-track', () => { '--load', 'copy', ]) - .it('adds a mashmap file', async ctx => { - expect(exists(ctxDir(ctx, 'volvox_inv_indels.out'))).toBeTruthy() - expect(readConf(ctx).tracks).toEqual([ - { - type: 'SyntenyTrack', - trackId: 'volvox_inv_indels', - name: 'volvox_inv_indels', - adapter: { - type: 'MashMapAdapter', - assemblyNames: ['volvox_random_inv', 'volvox'], - outLocation: { - uri: 'volvox_inv_indels.out', - locationType: 'UriLocation', - }, - }, - assemblyNames: ['volvox_random_inv', 'volvox'], - }, - ]) - }) - - setup - .do(initctx) - .command([ + + expect(exists(ctxDir(ctx, 'volvox_inv_indels.out'))).toBeTruthy() + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a mcscan simple anchors file', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + + await runCommand([ 'add-track', simpleMcScanSimple, '--assemblyNames', @@ -763,41 +505,19 @@ describe('add-track', () => { '--load', 'copy', ]) - .it('adds a mcscan simpleanchors file', async ctx => { - expect( - exists(ctxDir(ctx, 'volvox_inv_indels.anchors.simple')), - ).toBeTruthy() - expect(exists(ctxDir(ctx, 'grape.bed'))).toBeTruthy() - expect(exists(ctxDir(ctx, 'peach.bed'))).toBeTruthy() - expect(readConf(ctx).tracks).toEqual([ - { - type: 'SyntenyTrack', - trackId: 'volvox_inv_indels.anchors', - name: 'volvox_inv_indels.anchors', - adapter: { - type: 'MCScanSimpleAnchorsAdapter', - assemblyNames: ['volvox_random_inv', 'volvox'], - mcscanSimpleAnchorsLocation: { - uri: 'volvox_inv_indels.anchors.simple', - locationType: 'UriLocation', - }, - bed1Location: { - uri: 'grape.bed', - locationType: 'UriLocation', - }, - bed2Location: { - uri: 'peach.bed', - locationType: 'UriLocation', - }, - }, - assemblyNames: ['volvox_random_inv', 'volvox'], - }, - ]) - }) - - setup - .do(initctx) - .command([ + expect(exists(ctxDir(ctx, 'volvox_inv_indels.anchors.simple'))).toBeTruthy() + expect(exists(ctxDir(ctx, 'grape.bed'))).toBeTruthy() + expect(exists(ctxDir(ctx, 'peach.bed'))).toBeTruthy() + + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a mcscan anchors file', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + + await runCommand([ 'add-track', simpleMcScan, '--assemblyNames', @@ -809,40 +529,19 @@ describe('add-track', () => { '--load', 'copy', ]) - .it('adds a mcscan anchors file', async ctx => { - expect(exists(ctxDir(ctx, 'volvox_inv_indels.anchors'))).toBeTruthy() - expect(exists(ctxDir(ctx, 'grape.bed'))).toBeTruthy() - expect(exists(ctxDir(ctx, 'peach.bed'))).toBeTruthy() - - expect(readConf(ctx).tracks).toEqual([ - { - type: 'SyntenyTrack', - trackId: 'volvox_inv_indels', - name: 'volvox_inv_indels', - adapter: { - type: 'MCScanAnchorsAdapter', - assemblyNames: ['volvox_random_inv', 'volvox'], - mcscanAnchorsLocation: { - uri: 'volvox_inv_indels.anchors', - locationType: 'UriLocation', - }, - bed1Location: { - uri: 'grape.bed', - locationType: 'UriLocation', - }, - bed2Location: { - uri: 'peach.bed', - locationType: 'UriLocation', - }, - }, - assemblyNames: ['volvox_random_inv', 'volvox'], - }, - ]) - }) - - setup - .do(initctx) - .command([ + expect(exists(ctxDir(ctx, 'volvox_inv_indels.anchors'))).toBeTruthy() + expect(exists(ctxDir(ctx, 'grape.bed'))).toBeTruthy() + expect(exists(ctxDir(ctx, 'peach.bed'))).toBeTruthy() + + expect(readConf(ctx).tracks).toMatchSnapshot() + }) +}) + +test('adds a chain file', async () => { + await runInTmpDir(async ctx => { + await initctx(ctx) + + await runCommand([ 'add-track', simpleChain, '--assemblyNames', @@ -850,96 +549,7 @@ describe('add-track', () => { '--load', 'copy', ]) - .it('adds a liftover chain file', async ctx => { - expect(exists(ctxDir(ctx, 'volvox_inv_indels.chain'))).toBeTruthy() - expect(readConf(ctx).tracks).toEqual([ - { - type: 'SyntenyTrack', - trackId: 'volvox_inv_indels', - name: 'volvox_inv_indels', - adapter: { - type: 'ChainAdapter', - assemblyNames: ['volvox_random_inv', 'volvox'], - chainLocation: { - uri: 'volvox_inv_indels.chain', - locationType: 'UriLocation', - }, - }, - assemblyNames: ['volvox_random_inv', 'volvox'], - }, - ]) - }) - - setup - .do(initctx) - .command(['add-track', simpleGffGz, '--load', 'copy']) - .it('adds a tabix gff', async ctx => { - expect(exists(ctxDir(ctx, 'volvox.sort.gff3.gz'))).toBeTruthy() - expect(exists(ctxDir(ctx, 'volvox.sort.gff3.gz.tbi'))).toBeTruthy() - expect(readConf(ctx).tracks).toEqual([ - { - type: 'FeatureTrack', - trackId: 'volvox.sort.gff3', - name: 'volvox.sort.gff3', - assemblyNames: ['testAssembly'], - adapter: { - type: 'Gff3TabixAdapter', - gffGzLocation: { - uri: 'volvox.sort.gff3.gz', - locationType: 'UriLocation', - }, - index: { - location: { - uri: 'volvox.sort.gff3.gz.tbi', - locationType: 'UriLocation', - }, - indexType: 'TBI', - }, - }, - }, - ]) - }) - - setup - .do(initctx) - .command(['add-track', simpleBed, '--load', 'copy']) - .it('adds a bed track', async ctx => { - expect(exists(ctxDir(ctx, 'volvox.bed'))).toBeTruthy() - expect(readConf(ctx).tracks).toEqual([ - { - type: 'FeatureTrack', - trackId: 'volvox', - name: 'volvox', - assemblyNames: ['testAssembly'], - adapter: { - type: 'BedAdapter', - bedLocation: { - uri: 'volvox.bed', - locationType: 'UriLocation', - }, - }, - }, - ]) - }) - setup - .do(initctx) - .command(['add-track', simpleBedpe, '--load', 'copy']) - .it('adds a bedpe track', async ctx => { - expect(exists(ctxDir(ctx, 'volvox.bedpe'))).toBeTruthy() - expect(readConf(ctx).tracks).toEqual([ - { - type: 'VariantTrack', - trackId: 'volvox', - name: 'volvox', - assemblyNames: ['testAssembly'], - adapter: { - type: 'BedpeAdapter', - bedpeLocation: { - uri: 'volvox.bedpe', - locationType: 'UriLocation', - }, - }, - }, - ]) - }) + expect(exists(ctxDir(ctx, 'volvox_inv_indels.chain'))).toBeTruthy() + expect(readConf(ctx).tracks).toMatchSnapshot() + }) }) diff --git a/products/jbrowse-cli/src/commands/admin-server.test.ts b/products/jbrowse-cli/src/commands/admin-server.test.ts index fc07d360d3..dd414a36b3 100644 --- a/products/jbrowse-cli/src/commands/admin-server.test.ts +++ b/products/jbrowse-cli/src/commands/admin-server.test.ts @@ -4,56 +4,22 @@ import fs from 'fs' import path from 'path' +import { runCommand } from '@oclif/test' // locals import fetch from '../fetchWithProxy' -import { setup, dataDir, readConf } from '../testUtil' +import { dataDir, readConf, runInTmpDir } from '../testUtil' const { copyFile, rename, chmod } = fs.promises -const defaultConfig = { - assemblies: [], - configuration: {}, - connections: [], - defaultSession: { - name: 'New Session', - }, - tracks: [], -} - const testConfig = dataDir('test_config.json') -const testConfigContents = { - assemblies: [ - { - name: 'testAssembly', - sequence: { - type: 'testSequenceTrack', - trackId: '', - adapter: { - type: 'testSeqAdapter', - twoBitLocation: { - uri: 'test.2bit', - locationType: 'UriLocation', - }, - }, - }, - }, - ], - configuration: {}, - connections: [], - defaultSession: { - name: 'New Session', - }, - tracks: [], -} - // extend setup to include the addition of a simple HTML index to serve statically const testIndex = dataDir('simpleIndex.html') -const setupWithCreateAndTeardown = setup - .do(ctx => copyFile(testIndex, path.join(ctx.dir, path.basename(testIndex)))) - .finally(killExpress) +// Cleaning up exitCode in Node.js 20, xref +// https://github.com/jestjs/jest/issues/14501 +afterAll(() => (process.exitCode = 0)) function getPort(output: string) { const portMatch = output.match(/localhost:([0-9]{4})/) @@ -74,10 +40,10 @@ function getAdminKey(output: string) { } async function killExpress({ stdout }: { stdout: string }) { - if (!stdout || typeof stdout !== 'string') { - // This test didn't start a server - return - } + // if (!stdout || typeof stdout !== 'string') { + // // This test didn't start a server + // return + // } return fetch(`http://localhost:${getPort(stdout)}/shutdown`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, @@ -85,112 +51,128 @@ async function killExpress({ stdout }: { stdout: string }) { }) } -// Cleaning up exitCode in Node.js 20, xref https://github.com/jestjs/jest/issues/14501 -afterAll(() => (process.exitCode = 0)) +test('creates a default config', async () => { + await runInTmpDir(async ctx => { + await copyFile(testIndex, path.join(ctx.dir, path.basename(testIndex))) + const { stdout } = await runCommand(['admin-server', '--port', '9091']) + expect(readConf(ctx)).toMatchSnapshot() + await killExpress({ stdout }) + }) +}) -describe('admin-server', () => { - setupWithCreateAndTeardown - .command(['admin-server', '--port', '9091']) - .it('creates a default config', async ctx => { - expect(readConf(ctx)).toEqual(defaultConfig) - }) - setupWithCreateAndTeardown - .do(async ctx => { - await copyFile(testConfig, path.join(ctx.dir, path.basename(testConfig))) - - await rename( - path.join(ctx.dir, path.basename(testConfig)), - path.join(ctx.dir, 'config.json'), - ) - }) - .command(['admin-server', '--port', '9092']) - .it('does not overwrite an existing config', async ctx => { - expect(readConf(ctx)).toEqual(testConfigContents) - }) - setupWithCreateAndTeardown - .command(['admin-server']) - .it('uses port 9090 if not specified', async ctx => { - expect(ctx.stdout).toMatch( - /http:\/\/localhost:9090\?adminKey=[a-zA-Z0-9]{10,12}/, - ) - }) - setupWithCreateAndTeardown - .command(['admin-server', '--port', '-10']) - .catch('-10 is not a valid port') - .it('throws an error with a negative port') - setupWithCreateAndTeardown - .command(['admin-server', '--port', '66666']) - .catch('66666 is not a valid port') - .it('throws an error with a port greater than 65535') - setupWithCreateAndTeardown - .command(['admin-server', '--port', '9093']) - .it('notifies the user if adminKey is incorrect', async () => { - const payload = { adminKey: 'badKey' } - const response = await fetch('http://localhost:9093/updateConfig', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(payload), - }) - expect(response.status).toBe(403) - expect(await response.text()).toBe('Admin key does not match') - }) - setupWithCreateAndTeardown - .command(['admin-server', '--port', '9094']) - .it('writes the config to disk if adminKey is valid', async ctx => { - // grab the correct admin key from URL - const adminKey = getAdminKey(ctx.stdout) - const config = { foo: 'bar' } - const payload = { adminKey, config } - const response = await fetch('http://localhost:9094/updateConfig', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(payload), - }) - - expect(await response.text()).toBe('Config written to disk') - expect(readConf(ctx)).toEqual(config) - }) - setupWithCreateAndTeardown - .command(['admin-server', '--port', '9095']) - .do(async () => { - await chmod('config.json', '444') +test('does not overwrite an existing config', async () => { + await runInTmpDir(async ctx => { + await copyFile(testConfig, path.join(ctx.dir, path.basename(testConfig))) + + await rename( + path.join(ctx.dir, path.basename(testConfig)), + path.join(ctx.dir, 'config.json'), + ) + + const { stdout } = await runCommand(['admin-server', '--port', '9092']) + + expect(readConf(ctx)).toMatchSnapshot() + await killExpress({ stdout }) + }) +}) + +test('uses port 9090 if not specified', async () => { + await runInTmpDir(async () => { + const { stdout } = await runCommand(['admin-server']) + expect(stdout).toMatch( + /http:\/\/localhost:9090\?adminKey=[a-zA-Z0-9]{10,12}/, + ) + await killExpress({ stdout }) + }) +}) + +test('throws an error with a negative port', async () => { + await runInTmpDir(async () => { + const { error } = await runCommand(['admin-server', '--port', '-10']) + expect(error?.message).toMatchSnapshot() + }) +}) + +test('throws an error with a port greater than 65535', async () => { + await runInTmpDir(async () => { + const { error } = await runCommand(['admin-server', '--port', '66666']) + expect(error?.message).toMatchSnapshot() + }) +}) + +test('notifies the user if adminKey is incorrect', async () => { + await runInTmpDir(async () => { + const { stdout } = await runCommand(['admin-server', '--port', '9093']) + const payload = { adminKey: 'badKey' } + const response = await fetch('http://localhost:9093/updateConfig', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload), }) - .it('throws an error if unable to write to config.json', async ctx => { - const adminKey = getAdminKey(ctx.stdout) - const config = { foo: 'bar' } - const payload = { adminKey, config } - const response = await fetch('http://localhost:9095/updateConfig', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(payload), - }) - expect(response.status).toBe(500) - expect(await response.text()).toMatch(/Could not write config file/) + expect(response.status).toBe(403) + expect(await response.text()).toBe('Admin key does not match') + await killExpress({ stdout }) + }) +}) + +test('writes the config to disk if adminKey is valid', async () => { + await runInTmpDir(async ctx => { + const { stdout } = await runCommand(['admin-server', '--port', '9094']) + const adminKey = getAdminKey(stdout) + const config = { foo: 'bar' } + const payload = { adminKey, config } + const response = await fetch('http://localhost:9094/updateConfig', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload), }) - setupWithCreateAndTeardown - .command(['admin-server', '--port', '9096']) - .it('throws an error if unable to write to config.json', async ctx => { - const adminKey = getAdminKey(ctx.stdout) - const configPath = '/etc/passwd' - const config = { foo: 'bar' } - const payload = { configPath, adminKey, config } - const response = await fetch('http://localhost:9096/updateConfig', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(payload), - }) - expect(response.status).toBe(500) - expect(await response.text()).toMatch( - /Cannot perform directory traversal/, - ) + expect(await response.text()).toBe('Config written to disk') + expect(readConf(ctx)).toEqual(config) + await killExpress({ stdout }) + }) +}) + +test('throws an error if unable to write to config.json', async () => { + await runInTmpDir(async () => { + const { stdout } = await runCommand(['admin-server', '--port', '9095']) + await chmod('config.json', '444') + // grab the correct admin key from URL + const adminKey = getAdminKey(stdout) + const config = { foo: 'bar' } + const payload = { adminKey, config } + const response = await fetch('http://localhost:9095/updateConfig', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload), }) + expect(response.status).toBe(500) + expect(await response.text()).toMatch(/Could not write config file/) + await killExpress({ stdout }) + }) +}) +test('throws an error if unable to write to config.json pt 2', async () => { + await runInTmpDir(async () => { + const { stdout } = await runCommand(['admin-server', '--port', '9096']) + const adminKey = getAdminKey(stdout) + const configPath = '/etc/passwd' + const config = { foo: 'bar' } + const payload = { configPath, adminKey, config } + const response = await fetch('http://localhost:9096/updateConfig', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload), + }) + expect(response.status).toBe(500) + expect(await response.text()).toMatch(/Cannot perform directory traversal/) + await killExpress({ stdout }) + }) }) diff --git a/products/jbrowse-cli/src/commands/create.test.ts b/products/jbrowse-cli/src/commands/create.test.ts index 73a94e0345..3d5a6d3bd1 100644 --- a/products/jbrowse-cli/src/commands/create.test.ts +++ b/products/jbrowse-cli/src/commands/create.test.ts @@ -4,8 +4,11 @@ import fs from 'fs' import path from 'path' -import { Scope } from 'nock' -import { setup } from '../testUtil' +import nock from 'nock' +import { runCommand } from '@oclif/test' + +// locals +import { runInTmpDir } from '../testUtil' const { readdir } = fs.promises @@ -22,34 +25,14 @@ const releaseArray = [ }, ] -function mockTagFail(gitHubApi: Scope) { - return gitHubApi - .get('/repos/GMOD/jbrowse-components/releases/tags/v999.999.999') - .reply(404, {}) -} - -function mockTagSuccess(gitHubApi: Scope) { - return gitHubApi - .get('/repos/GMOD/jbrowse-components/releases/tags/v0.0.1') - .reply(200, releaseArray[0]) -} - -function mockReleases(gitHubApi: Scope) { - return gitHubApi - .get('/repos/GMOD/jbrowse-components/releases?page=1') - .reply(200, releaseArray) -} - -function mockReleasesListVersions(gitHubApi: Scope) { - return gitHubApi +function mockReleases() { + nock('https://api.github.com') .get('/repos/GMOD/jbrowse-components/releases?page=1') .reply(200, releaseArray) - .get('/repos/GMOD/jbrowse-components/releases?page=2') - .reply(200, []) } -function mockZip(exampleSite: Scope) { - return exampleSite +function mockZip() { + nock('https://example.com') .get('/jbrowse-web-v0.0.1.zip') .replyWithFile( 200, @@ -58,110 +41,118 @@ function mockZip(exampleSite: Scope) { ) } -function mockWrongSite(exampleSite: Scope) { - return exampleSite - .get('/jbrowse-web-v0.0.1.json') - .reply(200, 'I am the wrong type', { 'Content-Type': 'application/json' }) -} - -// Cleaning up exitCode in Node.js 20, xref https://github.com/jestjs/jest/issues/14501 +// Cleaning up exitCode in Node.js 20, xref +// https://github.com/jestjs/jest/issues/14501 afterAll(() => (process.exitCode = 0)) -describe('create', () => { - setup - .command(['create']) - .catch(err => { - expect(err.message).toContain('Missing 1 required arg:') - expect(err.message).toContain( - 'localPath Location where JBrowse 2 will be installed', - ) - expect(err.message).toContain('See more help with --help') - }) - .it('fails if no path is provided to the command') - setup - .command(['create', '--force']) - .catch(err => { - expect(err.message).toContain('Missing 1 required arg:') - expect(err.message).toContain( - 'localPath Location where JBrowse 2 will be installed', - ) - expect(err.message).toContain('See more help with --help') - }) - .it('fails if no path is provided to the command even with force') - setup - .command(['create', '.']) - .exit(120) - .it( - 'fails if user selects a directory that already has existing files, no force flag', - ) - setup - .nock('https://example.com', mockWrongSite) - .command([ +test('fails if no path is provided to the command', async () => { + await runInTmpDir(async () => { + const { error } = await runCommand(['create']) + expect(error?.message).toMatchSnapshot() + }) +}) + +test('fails if no path is provided to the command, even with force', async () => { + await runInTmpDir(async () => { + const { error } = await runCommand(['create', '--force']) + expect(error?.message).toMatchSnapshot() + }) +}) + +test('fails if user selects a directory that already has existing files', async () => { + await runInTmpDir(async () => { + nock('https://example.com') + .get('/jbrowse-web-v0.0.1.json') + .reply(200, 'I am the wrong type', { 'Content-Type': 'application/json' }) + const { error } = await runCommand(['create', '.']) + expect(error?.message).toMatchSnapshot() + }) +}) +test('fails if the fetch does not return the right file', async () => { + await runInTmpDir(async () => { + const { error } = await runCommand([ 'create', 'jbrowse', '--url', 'https://example.com/jbrowse-web-v0.0.1.json', ]) - .exit(2) - .it('fails if the fetch does not return the right file') - setup - .nock('https://api.github.com', mockReleases) - .nock('https://example.com', mockZip) - .command(['create', 'jbrowse']) - .it('download and unzips JBrowse 2 to new directory', async ctx => { - expect(await readdir(path.join(ctx.dir, 'jbrowse'))).toContain( - 'manifest.json', - ) - }) - setup - - .nock('https://example.com', mockZip) - .command([ + expect(error?.message).toMatchSnapshot() + }) +}) + +test('download and unzips to new directory', async () => { + await runInTmpDir(async ctx => { + mockReleases() + mockZip() + await runCommand(['create', 'jbrowse']) + expect(await readdir(path.join(ctx.dir, 'jbrowse'))).toContain( + 'manifest.json', + ) + }) +}) + +test('downloads from a url', async () => { + await runInTmpDir(async ctx => { + mockZip() + await runCommand([ 'create', 'jbrowse', '--url', 'https://example.com/jbrowse-web-v0.0.1.zip', ]) - .it('upgrades a directory from a url', async ctx => { - expect(await readdir(path.join(ctx.dir, 'jbrowse'))).toContain( - 'manifest.json', - ) - }) - setup - - .nock('https://api.github.com', mockTagSuccess) - - .nock('https://example.com', mockZip) - .command(['create', 'jbrowse', '--tag', 'v0.0.1', '--force']) - .it( - 'overwrites and succeeds in downloading JBrowse in a non-empty directory with version #', - async ctx => { - expect(await readdir(path.join(ctx.dir, 'jbrowse'))).toContain( - 'manifest.json', - ) - }, + expect(await readdir(path.join(ctx.dir, 'jbrowse'))).toContain( + 'manifest.json', ) - setup - - .nock('https://api.github.com', mockTagFail) - .command(['create', 'jbrowse', '--tag', 'v999.999.999', '--force']) - .catch(/Could not find version/) - .it('fails to download a version that does not exist') - setup - - .nock('https://api.github.com', mockReleases) - - .nock('https://example.com', mockZip) - .command(['create', 'jbrowse']) - .command(['create', 'jbrowse']) - .exit(120) - .it('fails because this directory is already set up') - setup - - .nock('https://api.github.com', mockReleasesListVersions) - .command(['create', '--listVersions']) - .catch(/0/) - .it('lists versions', ctx => { - expect(ctx.stdout).toBe('All JBrowse versions:\nv0.0.1\n') - }) + }) +}) + +test('overwrites and succeeds in download in a non-empty directory with tag', async () => { + await runInTmpDir(async ctx => { + nock('https://api.github.com') + .get('/repos/GMOD/jbrowse-components/releases/tags/v0.0.1') + .reply(200, releaseArray[0]) + mockZip() + await runCommand(['create', 'jbrowse', '--tag', 'v0.0.1', '--force']) + expect(await readdir(path.join(ctx.dir, 'jbrowse'))).toContain( + 'manifest.json', + ) + }) +}) + +test('fails to download a version that does not exist', async () => { + await runInTmpDir(async () => { + nock('https://api.github.com') + .get('/repos/GMOD/jbrowse-components/releases/tags/v999.999.999') + .reply(404, {}) + const { error } = await runCommand([ + 'create', + 'jbrowse', + '--tag', + 'v999.999.999', + '--force', + ]) + expect(error?.message).toMatchSnapshot() + }) +}) + +test('fails because this directory is already set up', async () => { + await runInTmpDir(async () => { + mockReleases() + mockZip() + await runCommand(['create', 'jbrowse']) + const { error } = await runCommand(['create', 'jbrowse']) + expect(error?.message).toMatchSnapshot() + }) +}) + +test('lists versions', async () => { + await runInTmpDir(async () => { + nock('https://api.github.com') + .get('/repos/GMOD/jbrowse-components/releases?page=1') + .reply(200, releaseArray) + .get('/repos/GMOD/jbrowse-components/releases?page=2') + .reply(200, []) + const { stdout } = await runCommand(['create', '--listVersions']) + expect(stdout).toBe('All JBrowse versions:\nv0.0.1\n') + }) }) diff --git a/products/jbrowse-cli/src/commands/make-pif.test.ts b/products/jbrowse-cli/src/commands/make-pif.test.ts index 3f2cce0a0f..84de93e6d7 100644 --- a/products/jbrowse-cli/src/commands/make-pif.test.ts +++ b/products/jbrowse-cli/src/commands/make-pif.test.ts @@ -4,23 +4,28 @@ import path from 'path' import fs from 'fs' -import { setup } from '../testUtil' import { gunzipSync } from 'zlib' +import { runCommand } from '@oclif/test' +import { runInTmpDir } from '../testUtil' const base = path.join(__dirname, '..', '..', 'test', 'data') const simplePaf = path.join(base, 'volvox_inv_indels.paf') const exists = (p: string) => fs.existsSync(p) -describe('make-pif', () => { - const fn = path.basename(simplePaf, '.paf') + '.pif.gz' - setup - .command(['make-pif', simplePaf, '--out', fn]) - .it('processes volvox paf', () => { - expect(exists(fn)).toBeTruthy() - expect(gunzipSync(fs.readFileSync(fn)).toString()).toMatchSnapshot() - }) - setup.command(['make-pif', simplePaf, '--out', fn, '--csi']).it('csi', () => { +test('make-pif', async () => { + await runInTmpDir(async () => { + const fn = path.basename(simplePaf, '.paf') + '.pif.gz' + await runCommand(['make-pif', simplePaf, '--out', fn]) + expect(exists(fn)).toBeTruthy() + expect(gunzipSync(fs.readFileSync(fn)).toString()).toMatchSnapshot() + }) +}) + +test('make pif with CSI', async () => { + await runInTmpDir(async () => { + const fn = path.basename(simplePaf, '.paf') + '.pif.gz' + await runCommand(['make-pif', simplePaf, '--out', fn, '--csi']) expect(exists(fn)).toBeTruthy() expect(exists(fn + '.csi')).toBeTruthy() }) diff --git a/products/jbrowse-cli/src/commands/remove-track.test.ts b/products/jbrowse-cli/src/commands/remove-track.test.ts index f308264066..fdcdf3c386 100644 --- a/products/jbrowse-cli/src/commands/remove-track.test.ts +++ b/products/jbrowse-cli/src/commands/remove-track.test.ts @@ -5,24 +5,23 @@ import fs from 'fs' import path from 'path' -import { setup, readConf } from '../testUtil' +import { readConf, runInTmpDir } from '../testUtil' +import { runCommand } from '@oclif/test' const twoPath = path.join(__dirname, '..', '..', 'test', 'data', 'simple.2bit') -// Cleaning up exitCode in Node.js 20, xref https://github.com/jestjs/jest/issues/14501 +// Cleaning up exitCode in Node.js 20, xref +// https://github.com/jestjs/jest/issues/14501 afterAll(() => (process.exitCode = 0)) -describe('add-assembly', () => { - setup - .do(ctx => - fs.copyFileSync(twoPath, path.join(ctx.dir, path.basename(twoPath))), - ) - .command(['add-assembly', 'simple.2bit', '--load', 'copy']) - .command(['add-track', 'simple.bam', '--load', 'inPlace']) - .command(['remove-track', 'simple']) - .it('can use --out to make a new directory', async ctx => { - const contents = readConf(ctx) - expect(contents.assemblies.length).toBe(1) - expect(contents.tracks.length).toBe(0) - }) +test('remove track', async () => { + await runInTmpDir(async ctx => { + fs.copyFileSync(twoPath, path.join(ctx.dir, path.basename(twoPath))) + await runCommand(['add-assembly', 'simple.2bit', '--load', 'copy']) + await runCommand(['add-track', 'simple.bam', '--load', 'inPlace']) + await runCommand(['remove-track', 'simple']) + const contents = readConf(ctx) + expect(contents.assemblies.length).toBe(1) + expect(contents.tracks.length).toBe(0) + }) }) diff --git a/products/jbrowse-cli/src/commands/set-default-session.test.ts b/products/jbrowse-cli/src/commands/set-default-session.test.ts index 11aaca8687..875cc0ba94 100644 --- a/products/jbrowse-cli/src/commands/set-default-session.test.ts +++ b/products/jbrowse-cli/src/commands/set-default-session.test.ts @@ -4,63 +4,11 @@ import fs from 'fs' import path from 'path' -import { setup, readConf, dataDir } from '../testUtil' +import { readConf, dataDir, runInTmpDir } from '../testUtil' +import { runCommand } from '@oclif/test' const { copyFile, rename } = fs.promises -const defaultConfig = { - assemblies: [ - { - name: 'testAssembly', - sequence: { - type: 'testSequenceTrack', - trackId: '', - adapter: { - type: 'testSeqAdapter', - twoBitLocation: { - uri: 'test.2bit', - locationType: 'UriLocation', - }, - }, - }, - }, - ], - configuration: {}, - connections: [], - defaultSession: { - name: 'New Session', - }, - tracks: [ - { - type: 'AlignmentsTrack', - trackId: 'simple', - name: 'simple', - assemblyNames: ['testAssembly'], - adapter: { - type: 'BamAdapter', - bamLocation: { - uri: 'simple.bam', - locationType: 'UriLocation', - }, - index: { - indexType: 'BAI', - location: { - uri: 'simple.bam.bai', - locationType: 'UriLocation', - }, - }, - sequenceAdapter: { - type: 'testSeqAdapter', - twoBitLocation: { - uri: 'test.2bit', - locationType: 'UriLocation', - }, - }, - }, - }, - ], -} - const simpleBam = dataDir('simple.bam') const simpleDefaultSession = dataDir('sampleDefaultSession.json') const testConfig = dataDir('test_config.json') @@ -69,107 +17,89 @@ const testConfig = dataDir('test_config.json') // https://github.com/jestjs/jest/issues/14501 afterAll(() => (process.exitCode = 0)) -describe('set-default-session', () => { - setup - .do(async ctx => { - await copyFile(testConfig, path.join(ctx.dir, path.basename(testConfig))) +test('fails when no necessary default session information is provided', async () => { + await runInTmpDir(async ctx => { + await copyFile(testConfig, path.join(ctx.dir, path.basename(testConfig))) + + await rename( + path.join(ctx.dir, path.basename(testConfig)), + path.join(ctx.dir, 'config.json'), + ) + const { error } = await runCommand(['set-default-session']) + expect(error?.message).toMatchSnapshot() + }) +}) - await rename( - path.join(ctx.dir, path.basename(testConfig)), - path.join(ctx.dir, 'config.json'), - ) - }) - .command(['set-default-session']) - .exit(120) - .it('fails when no necessary default session information is provided') - setup - .do(async ctx => { - await copyFile(testConfig, path.join(ctx.dir, path.basename(testConfig))) - await rename( - path.join(ctx.dir, path.basename(testConfig)), - path.join(ctx.dir, 'config.json'), - ) - }) - .command(['set-default-session', '--session', '{}']) - .exit(150) - .it('fails when default session is not readable') - setup - .do(async ctx => { - await copyFile(testConfig, path.join(ctx.dir, path.basename(testConfig))) - await rename( - path.join(ctx.dir, path.basename(testConfig)), - path.join(ctx.dir, 'config.json'), - ) - }) - .command([ +test('fails when default session is not readable', async () => { + await runInTmpDir(async ctx => { + await copyFile(testConfig, path.join(ctx.dir, path.basename(testConfig))) + await rename( + path.join(ctx.dir, path.basename(testConfig)), + path.join(ctx.dir, 'config.json'), + ) + const { error } = await runCommand([ + 'set-default-session', + '--session', + '{}', + ]) + expect(error?.message).toMatchSnapshot() + }) +}) +test('fails when file does not exist', async () => { + await runInTmpDir(async ctx => { + await copyFile(testConfig, path.join(ctx.dir, path.basename(testConfig))) + await rename( + path.join(ctx.dir, path.basename(testConfig)), + path.join(ctx.dir, 'config.json'), + ) + const { error } = await runCommand([ 'set-default-session', '--session', path.join(simpleDefaultSession, 'nonexist.json'), ]) - .exit(150) - .it('fails when file does not exist') - setup - .do(async ctx => { - await copyFile(testConfig, path.join(ctx.dir, path.basename(testConfig))) + expect(error?.message).toMatchSnapshot() + }) +}) - await rename( - path.join(ctx.dir, path.basename(testConfig)), - path.join(ctx.dir, 'config.json'), - ) - }) - .command(['set-default-session', '--session', simpleBam]) - .exit(160) - .it('fails when file is does not have a default session to read') +test('fails when file is does not have a default session to read', async () => { + await runInTmpDir(async ctx => { + await copyFile(testConfig, path.join(ctx.dir, path.basename(testConfig))) - setup - .do(async ctx => { - await copyFile(testConfig, path.join(ctx.dir, path.basename(testConfig))) + await rename( + path.join(ctx.dir, path.basename(testConfig)), + path.join(ctx.dir, 'config.json'), + ) + const { error } = await runCommand([ + 'set-default-session', + '--session', + simpleBam, + ]) + expect(error?.message).toMatchSnapshot() + }) +}) +test('deletes a default session', async () => { + await runInTmpDir(async ctx => { + await copyFile(testConfig, path.join(ctx.dir, path.basename(testConfig))) + + await rename( + path.join(ctx.dir, path.basename(testConfig)), + path.join(ctx.dir, 'config.json'), + ) + await runCommand(['set-default-session', '--delete']) - await rename( - path.join(ctx.dir, path.basename(testConfig)), - path.join(ctx.dir, 'config.json'), - ) - }) - .command(['set-default-session', '--delete']) - .it('deletes a default session', async ctx => { - const contents = readConf(ctx) + expect(readConf(ctx)).toMatchSnapshot() + }) +}) - expect(contents).toEqual({ - ...defaultConfig, - tracks: [], - defaultSession: undefined, - }) - }) - setup - .do(async ctx => { - await copyFile(testConfig, path.join(ctx.dir, path.basename(testConfig))) +test('adds a default session from a file', async () => { + await runInTmpDir(async ctx => { + await copyFile(testConfig, path.join(ctx.dir, path.basename(testConfig))) - await rename( - path.join(ctx.dir, path.basename(testConfig)), - path.join(ctx.dir, 'config.json'), - ) - }) - .command(['set-default-session', '--session', simpleDefaultSession]) - .it('adds a default session from a file', async ctx => { - const contents = readConf(ctx) - expect(contents).toEqual({ - ...defaultConfig, - tracks: [], - defaultSession: { - name: 'test new session', - views: [ - { - id: '823WX', - type: 'LinearGenomeView', - tracks: [ - { - type: 'AlignmentsTrack', - configuration: 'simple', - }, - ], - }, - ], - }, - }) - }) + await rename( + path.join(ctx.dir, path.basename(testConfig)), + path.join(ctx.dir, 'config.json'), + ) + await runCommand(['set-default-session', '--session', simpleDefaultSession]) + expect(readConf(ctx)).toMatchSnapshot() + }) }) diff --git a/products/jbrowse-cli/src/commands/text-index.test.ts b/products/jbrowse-cli/src/commands/text-index.test.ts index b5f4615f48..d766d10f86 100644 --- a/products/jbrowse-cli/src/commands/text-index.test.ts +++ b/products/jbrowse-cli/src/commands/text-index.test.ts @@ -4,10 +4,11 @@ import fs from 'fs' import path from 'path' -import { Scope } from 'nock' +import nock from 'nock' // locals -import { setup, dataDir, copyDir } from '../testUtil' +import { dataDir, copyDir, runInTmpDir } from '../testUtil' +import { runCommand } from '@oclif/test' const configPath = dataDir('indexing_config.json') const volvoxDir = path.join( @@ -20,22 +21,6 @@ const volvoxDir = path.join( 'volvox', ) -function mockRemote1(exampleSite: Scope) { - return exampleSite - .get('/GMOD/jbrowse/master/tests/data/au9_scaffold_subset_sync.gff3') - .reply(200, () => - fs.createReadStream(dataDir('au9_scaffold_subset_sync.gff3')), - ) -} - -function mockRemote2(exampleSite: Scope) { - return exampleSite - .get( - '/GMOD/jbrowse-components/raw/main/test_data/volvox/volvox.sort.gff3.gz', - ) - .reply(200, fs.createReadStream(dataDir('volvox.sort.gff3.gz'))) -} - const ixLoc = (loc: string, b = 'volvox') => path.join(loc, 'trix', b + '.ix') const ixxLoc = (loc: string, b = 'volvox') => path.join(loc, 'trix', b + '.ixx') @@ -65,199 +50,213 @@ function verifyIxxFiles(ctx: string, base = 'volvox') { expect(ixxdata).toMatchSnapshot() } -// Cleaning up exitCode in Node.js 20, xref https://github.com/jestjs/jest/issues/14501 +// Cleaning up exitCode in Node.js 20, xref +// https://github.com/jestjs/jest/issues/14501 afterAll(() => (process.exitCode = 0)) -// Base text index command -// Test throwing an error if --tracks and no track ids provided -describe('textIndexCommandErrors', () => { - setup - .command(['text-index', '--tracks']) - .catch('Flag --tracks expects a value') - .it('fails if no track ids are provided to the command with --tracks flag.') - - setup - .command(['text-index', '--Command']) - .catch(err => expect(err.message).toContain('Nonexistent flag:')) - .it('fails if there is an invalid flag') +test('fails if no track ids are provided with --tracks flag.', async () => { + await runInTmpDir(async () => { + const { error } = await runCommand(['text-index', '--tracks']) + expect(error?.message).toMatchSnapshot() + }) }) -// Non-Gzipped File -describe('text-index', () => { - setup - .do(async ctx => { - const gff3File = dataDir('au9_scaffold_subset_sync.gff3') - fs.copyFileSync(gff3File, path.join(ctx.dir, path.basename(gff3File))) - fs.copyFileSync(configPath, path.join(ctx.dir, 'config.json')) - }) - .command(['text-index', '--tracks=au9_scaffold', '--target=config.json']) - .it('Indexes a local non-gz gff3 file', ctx => verifyIxxFiles(ctx.dir)) +test('fails if there is an invalid flag', async () => { + await runInTmpDir(async () => { + const { error } = await runCommand(['text-index', '--Command']) + expect(error?.message).toMatchSnapshot() + }) }) -// Gzipped File -describe('text-index tracks', () => { - setup - .do(async ctx => { - const gff3File = dataDir('volvox.sort.gff3.gz') - fs.copyFileSync(gff3File, path.join(ctx.dir, path.basename(gff3File))) - fs.copyFileSync(configPath, path.join(ctx.dir, 'config.json')) - }) - .command(['text-index', '--tracks=gff3tabix_genes', '--target=config.json']) - .it('Indexes a local gz gff3 file', ctx => verifyIxxFiles(ctx.dir)) +test('indexes a local non-gz gff3 file', async () => { + await runInTmpDir(async ctx => { + const gff3File = dataDir('au9_scaffold_subset_sync.gff3') + fs.copyFileSync(gff3File, path.join(ctx.dir, path.basename(gff3File))) + fs.copyFileSync(configPath, path.join(ctx.dir, 'config.json')) + await runCommand([ + 'text-index', + '--tracks=au9_scaffold', + '--target=config.json', + ]) + verifyIxxFiles(ctx.dir) + }) }) - -// Remote GZ -describe('text-index tracks', () => { - setup - .nock('https://github.com', mockRemote2) - .do(ctx => fs.copyFileSync(configPath, path.join(ctx.dir, 'config.json'))) - .command([ +test('indexes a local gz gff3 file', async () => { + await runInTmpDir(async ctx => { + // Gzipped File + const gff3File = dataDir('volvox.sort.gff3.gz') + fs.copyFileSync(gff3File, path.join(ctx.dir, path.basename(gff3File))) + fs.copyFileSync(configPath, path.join(ctx.dir, 'config.json')) + await runCommand([ + 'text-index', + '--tracks=gff3tabix_genes', + '--target=config.json', + ]) + verifyIxxFiles(ctx.dir) + }) +}) +test('indexes a remote gz gff3 file', async () => { + await runInTmpDir(async ctx => { + nock('https://github.com') + .get( + '/GMOD/jbrowse-components/raw/main/test_data/volvox/volvox.sort.gff3.gz', + ) + .reply(200, fs.createReadStream(dataDir('volvox.sort.gff3.gz'))) + fs.copyFileSync(configPath, path.join(ctx.dir, 'config.json')) + await runCommand([ 'text-index', '--tracks=online_gff3tabix_genes', '--target=config.json', ]) - .it('Indexes a remote gz gff3 file', ctx => verifyIxxFiles(ctx.dir)) + verifyIxxFiles(ctx.dir) + }) }) -// Remote Non-GZ - -describe('text-index tracks', () => { - setup - .nock('https://raw.githubusercontent.com', mockRemote1) - .do(ctx => fs.copyFileSync(configPath, path.join(ctx.dir, 'config.json'))) - .command([ +test('indexes a remote non-gz gff3 file', async () => { + await runInTmpDir(async ctx => { + nock('https://raw.githubusercontent.com') + .get('/GMOD/jbrowse/master/tests/data/au9_scaffold_subset_sync.gff3') + .reply(200, () => + fs.createReadStream(dataDir('au9_scaffold_subset_sync.gff3')), + ) + fs.copyFileSync(configPath, path.join(ctx.dir, 'config.json')) + await runCommand([ 'text-index', '--tracks=online_au9_scaffold', '--target=config.json', ]) - .it('Indexes a remote non-gz gff3 file', ctx => verifyIxxFiles(ctx.dir)) + verifyIxxFiles(ctx.dir) + }) }) -// 2 Local Files - -describe('text-index tracks', () => { - setup - .do(ctx => { - const gff3File = dataDir('volvox.sort.gff3.gz') - const gff3File2 = dataDir('au9_scaffold_subset_sync.gff3') - fs.copyFileSync(gff3File, path.join(ctx.dir, path.basename(gff3File))) - fs.copyFileSync(gff3File2, path.join(ctx.dir, path.basename(gff3File2))) - fs.copyFileSync(configPath, path.join(ctx.dir, 'config.json')) - }) - .command([ +test('indexes multiple local gff3 files', async () => { + await runInTmpDir(async ctx => { + const gff3File = dataDir('volvox.sort.gff3.gz') + const gff3File2 = dataDir('au9_scaffold_subset_sync.gff3') + fs.copyFileSync(gff3File, path.join(ctx.dir, path.basename(gff3File))) + fs.copyFileSync(gff3File2, path.join(ctx.dir, path.basename(gff3File2))) + fs.copyFileSync(configPath, path.join(ctx.dir, 'config.json')) + await runCommand([ 'text-index', '--tracks=gff3tabix_genes,au9_scaffold', '--target=config.json', ]) - .it('Indexes multiple local gff3 files', ctx => verifyIxxFiles(ctx.dir)) + verifyIxxFiles(ctx.dir) + }) }) -describe('text-index tracks', () => { - setup - .nock('https://github.com', mockRemote2) - .nock('https://raw.githubusercontent.com', mockRemote1) - .do(ctx => fs.copyFileSync(configPath, path.join(ctx.dir, 'config.json'))) - .command([ +test('indexes multiple remote gff3 file', async () => { + await runInTmpDir(async ctx => { + nock('https://github.com') + .get( + '/GMOD/jbrowse-components/raw/main/test_data/volvox/volvox.sort.gff3.gz', + ) + .reply(200, fs.createReadStream(dataDir('volvox.sort.gff3.gz'))) + + nock('https://raw.githubusercontent.com') + .get('/GMOD/jbrowse/master/tests/data/au9_scaffold_subset_sync.gff3') + .reply(200, () => + fs.createReadStream(dataDir('au9_scaffold_subset_sync.gff3')), + ) + fs.copyFileSync(configPath, path.join(ctx.dir, 'config.json')) + await runCommand([ 'text-index', '--tracks=online_gff3tabix_genes,online_au9_scaffold', '--target=config.json', ]) - .it('Indexes multiple remote gff3 file', ctx => verifyIxxFiles(ctx.dir)) + verifyIxxFiles(ctx.dir) + }) }) -// URL and Local -describe('text-index tracks', () => { - setup - .nock('https://raw.githubusercontent.com', mockRemote1) - .do(ctx => { - const gff3File = dataDir('volvox.sort.gff3.gz') - fs.copyFileSync(gff3File, path.join(ctx.dir, path.basename(gff3File))) - fs.copyFileSync(configPath, path.join(ctx.dir, 'config.json')) - }) - .command([ +test('indexes a remote and a local file', async () => { + await runInTmpDir(async ctx => { + nock('https://raw.githubusercontent.com') + .get('/GMOD/jbrowse/master/tests/data/au9_scaffold_subset_sync.gff3') + .reply(200, () => + fs.createReadStream(dataDir('au9_scaffold_subset_sync.gff3')), + ) + const gff3File = dataDir('volvox.sort.gff3.gz') + fs.copyFileSync(gff3File, path.join(ctx.dir, path.basename(gff3File))) + fs.copyFileSync(configPath, path.join(ctx.dir, 'config.json')) + await runCommand([ 'text-index', '--tracks=gff3tabix_genes,online_au9_scaffold', '--target=config.json', ]) - .it('Indexes a remote and a local file', ctx => verifyIxxFiles(ctx.dir)) + verifyIxxFiles(ctx.dir) + }) }) -describe('text-index tracks', () => { - setup - .do(ctx => { - const gff3File = dataDir('volvox.sort.gff3.gz') - fs.copyFileSync(gff3File, path.join(ctx.dir, path.basename(gff3File))) - fs.copyFileSync(configPath, path.join(ctx.dir, 'config.json')) - }) - .command([ +test('indexes a track using only the attributes tag', async () => { + await runInTmpDir(async ctx => { + const gff3File = dataDir('volvox.sort.gff3.gz') + fs.copyFileSync(gff3File, path.join(ctx.dir, path.basename(gff3File))) + fs.copyFileSync(configPath, path.join(ctx.dir, 'config.json')) + await runCommand([ 'text-index', '--tracks=noAttributes', '--target=config.json', '--attributes=ID', ]) - .it('Indexes a track using only the attributes tag', ctx => - verifyIxxFiles(ctx.dir), - ) + verifyIxxFiles(ctx.dir) + }) }) // no attributes in track -describe('text-index tracks', () => { - setup - .do(ctx => { - const gff3File = dataDir('volvox.sort.gff3.gz') - fs.copyFileSync(gff3File, path.join(ctx.dir, path.basename(gff3File))) - fs.copyFileSync(configPath, path.join(ctx.dir, 'config.json')) - }) - .command(['text-index', '--tracks=noAttributes', '--target=config.json']) - .it('Indexes a track with no attributes in the config', ctx => - verifyIxxFiles(ctx.dir), - ) +test('indexes a track with no attributes in the config', async () => { + await runInTmpDir(async ctx => { + const gff3File = dataDir('volvox.sort.gff3.gz') + fs.copyFileSync(gff3File, path.join(ctx.dir, path.basename(gff3File))) + fs.copyFileSync(configPath, path.join(ctx.dir, 'config.json')) + await runCommand([ + 'text-index', + '--tracks=noAttributes', + '--target=config.json', + ]) + verifyIxxFiles(ctx.dir) + }) }) - -describe('text-index with multiple per-files', () => { - setup - .do(ctx => copyDir(volvoxDir, ctx.dir)) - .command([ +test('indexes with multiple per-file args', async () => { + await runInTmpDir(async ctx => { + await copyDir(volvoxDir, ctx.dir) + await runCommand([ 'text-index', '--file', 'volvox.sort.gff3.gz', '--file', 'volvox.filtered.vcf.gz', ]) - .it('Indexes with multiple per-file args', ctx => - verifyIxxFiles(ctx.dir, 'aggregate'), - ) + verifyIxxFiles(ctx.dir, 'aggregate') + }) }) -describe('text-index with single per-file', () => { - setup - .do(ctx => copyDir(volvoxDir, ctx.dir)) - .command(['text-index', '--file', 'volvox.sort.gff3.gz']) - .it('Indexes with single per-file arg', ctx => - verifyIxxFiles(ctx.dir, 'volvox.sort.gff3.gz'), - ) +test('indexes with single per-file arg', async () => { + await runInTmpDir(async ctx => { + await copyDir(volvoxDir, ctx.dir) + await runCommand(['text-index', '--file', 'volvox.sort.gff3.gz']) + verifyIxxFiles(ctx.dir, 'volvox.sort.gff3.gz') + }) }) -describe('run with a single assembly similar to embedded config', () => { - let preVolvoxIx = '' - let preVolvoxIxx = '' - let preVolvoxMeta = '' - setup - .do(async ctx => { - await copyDir(volvoxDir, ctx.dir) - const volvoxConfig = readJSON(path.join(ctx.dir, 'config.json')) - const assembly = volvoxConfig.assemblies[0] - delete volvoxConfig.assemblies - fs.writeFileSync( - path.join(ctx.dir, 'config.json'), - JSON.stringify({ ...volvoxConfig, assembly }), - ) +test('indexes single assembly volvox config', async () => { + await runInTmpDir(async ctx => { + let preVolvoxIx = '' + let preVolvoxIxx = '' + let preVolvoxMeta = '' + + await copyDir(volvoxDir, ctx.dir) + const volvoxConfig = readJSON(path.join(ctx.dir, 'config.json')) + const assembly = volvoxConfig.assemblies[0] + delete volvoxConfig.assemblies + fs.writeFileSync( + path.join(ctx.dir, 'config.json'), + JSON.stringify({ ...volvoxConfig, assembly }), + ) - preVolvoxIx = readTrix(ctx.dir, 'volvox.ix') - preVolvoxIxx = readTrix(ctx.dir, 'volvox.ixx') - preVolvoxMeta = readTrixJSON(ctx.dir, 'volvox_meta.json') - }) - .command([ + preVolvoxIx = readTrix(ctx.dir, 'volvox.ix') + preVolvoxIxx = readTrix(ctx.dir, 'volvox.ixx') + preVolvoxMeta = readTrixJSON(ctx.dir, 'volvox_meta.json') + await runCommand([ 'text-index', '--target=config.json', '--force', @@ -266,27 +265,24 @@ describe('run with a single assembly similar to embedded config', () => { ]) // to update (e.g. if volvox config is updated) run: // bin/run text-index --out ../../test_data/volvox/ --attributes Name,ID,Note --force - .it('Indexes single assembly volvox config', ctx => { - expect(readTrix(ctx.dir, 'volvox.ix')).toEqual(preVolvoxIx) - expect(readTrix(ctx.dir, 'volvox.ixx')).toEqual(preVolvoxIxx) - expect(readTrixJSON(ctx.dir, 'volvox_meta.json')).toEqual(preVolvoxMeta) - }) + expect(readTrix(ctx.dir, 'volvox.ix')).toEqual(preVolvoxIx) + expect(readTrix(ctx.dir, 'volvox.ixx')).toEqual(preVolvoxIxx) + expect(readTrixJSON(ctx.dir, 'volvox_meta.json')).toEqual(preVolvoxMeta) + }) }) -describe('run with a volvox config', () => { - let preVolvoxIx = '' - let preVolvoxIxx = '' - let preVolvoxMeta = '' +test('indexes entire volvox config', async () => { + await runInTmpDir(async ctx => { + let preVolvoxIx = '' + let preVolvoxIxx = '' + let preVolvoxMeta = '' - setup - .do(async ctx => { - await copyDir(volvoxDir, ctx.dir) + await copyDir(volvoxDir, ctx.dir) - preVolvoxIx = readTrix(ctx.dir, 'volvox.ix') - preVolvoxIxx = readTrix(ctx.dir, 'volvox.ixx') - preVolvoxMeta = readTrixJSON(ctx.dir, 'volvox_meta.json') - }) - .command([ + preVolvoxIx = readTrix(ctx.dir, 'volvox.ix') + preVolvoxIxx = readTrix(ctx.dir, 'volvox.ixx') + preVolvoxMeta = readTrixJSON(ctx.dir, 'volvox_meta.json') + await runCommand([ 'text-index', '--target=config.json', '--force', @@ -295,9 +291,8 @@ describe('run with a volvox config', () => { ]) // to update (e.g. if volvox config is updated) run: // bin/run text-index --out ../../test_data/volvox/ --attributes Name,ID,Note --force - .it('Indexes entire volvox config', ctx => { - expect(readTrix(ctx.dir, 'volvox.ix')).toEqual(preVolvoxIx) - expect(readTrix(ctx.dir, 'volvox.ixx')).toEqual(preVolvoxIxx) - expect(readTrixJSON(ctx.dir, 'volvox_meta.json')).toEqual(preVolvoxMeta) - }) + expect(readTrix(ctx.dir, 'volvox.ix')).toEqual(preVolvoxIx) + expect(readTrix(ctx.dir, 'volvox.ixx')).toEqual(preVolvoxIxx) + expect(readTrixJSON(ctx.dir, 'volvox_meta.json')).toEqual(preVolvoxMeta) + }) }) diff --git a/products/jbrowse-cli/src/commands/upgrade.test.ts b/products/jbrowse-cli/src/commands/upgrade.test.ts index e43977e18b..0f4fe6711a 100644 --- a/products/jbrowse-cli/src/commands/upgrade.test.ts +++ b/products/jbrowse-cli/src/commands/upgrade.test.ts @@ -4,10 +4,11 @@ import fs, { mkdirSync } from 'fs' import path from 'path' -import { Scope } from 'nock' -import { setup } from '../testUtil' +import { runInTmpDir } from '../testUtil' +import { runCommand } from '@oclif/test' +import nock from 'nock' -const { stat, readdir } = fs.promises +const { stat, readdir, writeFile } = fs.promises const releaseArray = [ { @@ -32,97 +33,97 @@ const releaseArray = [ }, ] -function mockTagFail(gitHubApi: Scope) { - return gitHubApi - .get('/repos/GMOD/jbrowse-components/releases/tags/v999.999.999') - .reply(404, {}) -} +// Cleaning up exitCode in Node.js 20, xref +// https://github.com/jestjs/jest/issues/14501 +afterAll(() => (process.exitCode = 0)) -function mockTagSuccess(gitHubApi: Scope) { - return gitHubApi - .get('/repos/GMOD/jbrowse-components/releases/tags/v0.0.1') - .reply(200, releaseArray[1]) -} +test('fails if user selects a directory that does not have a installation', async () => { + await runInTmpDir(async () => { + mkdirSync('jbrowse') + const { error } = await runCommand(['upgrade', 'jbrowse']) + expect(error?.message).toMatchSnapshot() + }) +}) -function mockReleases(gitHubApi: Scope) { - return gitHubApi - .get('/repos/GMOD/jbrowse-components/releases?page=1') - .reply(200, releaseArray) -} +test('fails if user selects a directory that does not exist', async () => { + const { error } = await runCommand(['upgrade', 'jbrowse']) + expect(error?.message).toMatchSnapshot() +}) -function mockWrongSite(exampleSite: Scope) { - return exampleSite - .get('/JBrowse2-0.0.1.json') - .reply(200, 'I am the wrong type', { 'Content-Type': 'application/json' }) -} +test('upgrades a directory', async () => { + await runInTmpDir(async ctx => { + nock('https://api.github.com') + .get('/repos/GMOD/jbrowse-components/releases?page=1') + .reply(200, releaseArray) + nock('https://example.com') + .get('/JBrowse2-0.0.2.zip') + .replyWithFile( + 200, + path.join(__dirname, '..', '..', 'test', 'data', 'JBrowse2.zip'), + ) + await writeFile('manifest.json', '{"name":"JBrowse"}') + const prevStat = await stat(path.join(ctx.dir, 'manifest.json')) + await runCommand(['upgrade']) + expect(await readdir(ctx.dir)).toContain('manifest.json') + // upgrade successful if it updates stats of manifest json + expect(await stat('manifest.json')).not.toEqual(prevStat) + }) +}) -function mockV1Zip(exampleSite: Scope) { - return exampleSite - .get('/JBrowse2-0.0.1.zip') - .replyWithFile( - 200, - path.join(__dirname, '..', '..', 'test', 'data', 'JBrowse2.zip'), - { 'Content-Type': 'application/zip' }, - ) -} +test('upgrades a directory with a specific version', async () => { + await runInTmpDir(async ctx => { + nock('https://api.github.com') + .get('/repos/GMOD/jbrowse-components/releases/tags/v0.0.1') + .reply(200, releaseArray[1]) + nock('https://example.com') + .get('/JBrowse2-0.0.1.zip') + .replyWithFile( + 200, + path.join(__dirname, '..', '..', 'test', 'data', 'JBrowse2.zip'), + { 'Content-Type': 'application/zip' }, + ) -function mockV2Zip(exampleSite: Scope) { - return exampleSite - .get('/JBrowse2-0.0.2.zip') - .replyWithFile( - 200, - path.join(__dirname, '..', '..', 'test', 'data', 'JBrowse2.zip'), - ) -} + await writeFile('manifest.json', '{"name":"JBrowse"}') + await runCommand(['upgrade', '--tag', 'v0.0.1']) + expect(await readdir(ctx.dir)).toContain('manifest.json') + }) +}) -// Cleaning up exitCode in Node.js 20, xref https://github.com/jestjs/jest/issues/14501 -afterAll(() => (process.exitCode = 0)) +test('upgrades a directory from a url', async () => { + await runInTmpDir(async ctx => { + nock('https://example.com') + .get('/JBrowse2-0.0.1.zip') + .replyWithFile( + 200, + path.join(__dirname, '..', '..', 'test', 'data', 'JBrowse2.zip'), + { 'Content-Type': 'application/zip' }, + ) + await writeFile('manifest.json', '{"name":"JBrowse"}') + await runCommand([ + 'upgrade', + '--url', + 'https://example.com/JBrowse2-0.0.1.zip', + ]) + expect(await readdir(ctx.dir)).toContain('manifest.json') + }) +}) + +test('fails to upgrade if version does not exist', async () => { + nock('https://api.github.com') + .get('/repos/GMOD/jbrowse-components/releases/tags/v999.999.999') + .reply(404, {}) -describe('upgrade', () => { - setup - .do(() => { - mkdirSync('jbrowse') - }) - .command(['upgrade', 'jbrowse']) - .exit(10) - .it( - 'fails if user selects a directory that does not have a JBrowse installation', - ) - setup - .command(['upgrade', 'jbrowse']) - .exit(10) - .it('fails if user selects a directory that does not exist') - setup - .nock('https://api.github.com', mockReleases) - .nock('https://example.com', mockV2Zip) - .add('prevStat', ctx => stat(path.join(ctx.dir, 'manifest.json'))) - .command(['upgrade']) - .it('upgrades a directory', async ctx => { - expect(await readdir(ctx.dir)).toContain('manifest.json') - // upgrade successful if it updates stats of manifest json - expect(await stat('manifest.json')).not.toEqual(ctx.prevStat) - }) - setup - .nock('https://api.github.com', mockTagSuccess) - .nock('https://example.com', mockV1Zip) - .command(['upgrade', '--tag', 'v0.0.1']) - .it('upgrades a directory with a specific version', async ctx => { - expect(await readdir(ctx.dir)).toContain('manifest.json') - }) - setup - .nock('https://example.com', mockV1Zip) - .command(['upgrade', '--url', 'https://example.com/JBrowse2-0.0.1.zip']) - .it('upgrades a directory from a url', async ctx => { - expect(await readdir(ctx.dir)).toContain('manifest.json') - }) - setup - .nock('https://api.github.com', mockTagFail) - .command(['upgrade', '--tag', 'v999.999.999']) - .catch(/Could not find version/) - .it('fails to upgrade if version does not exist') - setup - .nock('https://example.com', mockWrongSite) - .command(['upgrade', '--url', 'https://example.com/JBrowse2-0.0.1.json']) - .exit(2) - .it('fails if the fetch does not return the right file') + const { error } = await runCommand(['upgrade', '--tag', 'v999.999.999']) + expect(error?.message).toMatchSnapshot() +}) +test('fails if the fetch does not return the right file', async () => { + nock('https://example.com') + .get('/JBrowse2-0.0.1.json') + .reply(200, 'I am the wrong type', { 'Content-Type': 'application/json' }) + const { error } = await runCommand([ + 'upgrade', + '--url', + 'https://example.com/JBrowse2-0.0.1.json', + ]) + expect(error?.message).toMatchSnapshot() }) diff --git a/products/jbrowse-cli/src/testUtil.ts b/products/jbrowse-cli/src/testUtil.ts index 9a5381edca..8bda0ef7a2 100644 --- a/products/jbrowse-cli/src/testUtil.ts +++ b/products/jbrowse-cli/src/testUtil.ts @@ -1,10 +1,10 @@ -import { test as oclifTest } from '@oclif/test' +import { runCommand } from '@oclif/test' import { rimrafSync } from 'rimraf' import fs from 'fs' import os from 'os' import path from 'path' -const { mkdir, mkdtemp, writeFile } = fs.promises +const { mkdir, mkdtemp } = fs.promises // increase test timeout for all tests jest.setTimeout(20000) @@ -13,22 +13,27 @@ jest.setTimeout(20000) // https://github.com/nodejs/node/issues/11422 const tmpDir = fs.realpathSync(os.tmpdir()) -export const setup = oclifTest - .stdout() - .add('originalDir', () => process.cwd()) - .add('dir', async () => { +export async function runInTmpDir( + callbackFn: (args: { dir: string; originalDir: string }) => Promise, +) { + const originalDir = process.cwd() + let dir: string | undefined + try { const jbrowseTmpDir = path.join(tmpDir, 'jbrowse') await mkdir(jbrowseTmpDir, { recursive: true }) - return mkdtemp(path.join(jbrowseTmpDir, path.sep)) - }) - .finally(ctx => { - rimrafSync(ctx.dir) - process.chdir(ctx.originalDir) - }) - .do(async ctx => { - process.chdir(ctx.dir) - await writeFile('manifest.json', '{"name":"JBrowse"}') - }) + dir = await mkdtemp(path.join(jbrowseTmpDir, path.sep)) + process.chdir(dir) + await callbackFn({ dir, originalDir }) + } finally { + if (dir) { + rimrafSync(dir) + } + process.chdir(originalDir) + } +} +export async function setup(str: string | string[]) { + return runCommand(str) +} // eslint-disable-next-line @typescript-eslint/no-explicit-any type Conf = Record diff --git a/yarn.lock b/yarn.lock index b14e7ba1ab..c1f384934a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -27,15 +27,6 @@ dependencies: default-browser-id "3.0.0" -"@aws-crypto/crc32@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-3.0.0.tgz#07300eca214409c33e3ff769cd5697b57fdd38fa" - integrity sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA== - dependencies: - "@aws-crypto/util" "^3.0.0" - "@aws-sdk/types" "^3.222.0" - tslib "^1.11.1" - "@aws-crypto/crc32@5.2.0": version "5.2.0" resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-5.2.0.tgz#cfcc22570949c98c6689cfcbd2d693d36cdae2e1" @@ -45,73 +36,55 @@ "@aws-sdk/types" "^3.222.0" tslib "^2.6.2" -"@aws-crypto/crc32c@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz#016c92da559ef638a84a245eecb75c3e97cb664f" - integrity sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w== +"@aws-crypto/crc32c@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz#4e34aab7f419307821509a98b9b08e84e0c1917e" + integrity sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag== dependencies: - "@aws-crypto/util" "^3.0.0" + "@aws-crypto/util" "^5.2.0" "@aws-sdk/types" "^3.222.0" - tslib "^1.11.1" - -"@aws-crypto/ie11-detection@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz#640ae66b4ec3395cee6a8e94ebcd9f80c24cd688" - integrity sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q== - dependencies: - tslib "^1.11.1" + tslib "^2.6.2" -"@aws-crypto/sha1-browser@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz#f9083c00782b24714f528b1a1fef2174002266a3" - integrity sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw== +"@aws-crypto/sha1-browser@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz#b0ee2d2821d3861f017e965ef3b4cb38e3b6a0f4" + integrity sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg== dependencies: - "@aws-crypto/ie11-detection" "^3.0.0" - "@aws-crypto/supports-web-crypto" "^3.0.0" - "@aws-crypto/util" "^3.0.0" + "@aws-crypto/supports-web-crypto" "^5.2.0" + "@aws-crypto/util" "^5.2.0" "@aws-sdk/types" "^3.222.0" "@aws-sdk/util-locate-window" "^3.0.0" - "@aws-sdk/util-utf8-browser" "^3.0.0" - tslib "^1.11.1" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" -"@aws-crypto/sha256-browser@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz#05f160138ab893f1c6ba5be57cfd108f05827766" - integrity sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ== +"@aws-crypto/sha256-browser@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e" + integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw== dependencies: - "@aws-crypto/ie11-detection" "^3.0.0" - "@aws-crypto/sha256-js" "^3.0.0" - "@aws-crypto/supports-web-crypto" "^3.0.0" - "@aws-crypto/util" "^3.0.0" + "@aws-crypto/sha256-js" "^5.2.0" + "@aws-crypto/supports-web-crypto" "^5.2.0" + "@aws-crypto/util" "^5.2.0" "@aws-sdk/types" "^3.222.0" "@aws-sdk/util-locate-window" "^3.0.0" - "@aws-sdk/util-utf8-browser" "^3.0.0" - tslib "^1.11.1" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" -"@aws-crypto/sha256-js@3.0.0", "@aws-crypto/sha256-js@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz#f06b84d550d25521e60d2a0e2a90139341e007c2" - integrity sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ== +"@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz#c4fdb773fdbed9a664fc1a95724e206cf3860042" + integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== dependencies: - "@aws-crypto/util" "^3.0.0" + "@aws-crypto/util" "^5.2.0" "@aws-sdk/types" "^3.222.0" - tslib "^1.11.1" - -"@aws-crypto/supports-web-crypto@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz#5d1bf825afa8072af2717c3e455f35cda0103ec2" - integrity sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg== - dependencies: - tslib "^1.11.1" + tslib "^2.6.2" -"@aws-crypto/util@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-3.0.0.tgz#1c7ca90c29293f0883468ad48117937f0fe5bfb0" - integrity sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w== +"@aws-crypto/supports-web-crypto@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz#a1e399af29269be08e695109aa15da0a07b5b5fb" + integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== dependencies: - "@aws-sdk/types" "^3.222.0" - "@aws-sdk/util-utf8-browser" "^3.0.0" - tslib "^1.11.1" + tslib "^2.6.2" "@aws-crypto/util@^5.2.0": version "5.2.0" @@ -123,526 +96,526 @@ tslib "^2.6.2" "@aws-sdk/client-cloudfront@^3.592.0": - version "3.596.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudfront/-/client-cloudfront-3.596.0.tgz#ba361cc28095caf543d5e1e0f40287d2f19b4276" - integrity sha512-D5PnoYWXrHfaYooZzu3f0RVjqGNSW6qLZGTcldnHwh6jwnzfqLY5L04i4/mTf+r6ODVrtuTpH2NIKAJomKZx3g== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sso-oidc" "3.596.0" - "@aws-sdk/client-sts" "3.596.0" - "@aws-sdk/core" "3.592.0" - "@aws-sdk/credential-provider-node" "3.596.0" - "@aws-sdk/middleware-host-header" "3.577.0" - "@aws-sdk/middleware-logger" "3.577.0" - "@aws-sdk/middleware-recursion-detection" "3.577.0" - "@aws-sdk/middleware-user-agent" "3.587.0" - "@aws-sdk/region-config-resolver" "3.587.0" - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-endpoints" "3.587.0" - "@aws-sdk/util-user-agent-browser" "3.577.0" - "@aws-sdk/util-user-agent-node" "3.587.0" - "@aws-sdk/xml-builder" "3.575.0" - "@smithy/config-resolver" "^3.0.1" - "@smithy/core" "^2.2.0" - "@smithy/fetch-http-handler" "^3.0.1" - "@smithy/hash-node" "^3.0.0" - "@smithy/invalid-dependency" "^3.0.0" - "@smithy/middleware-content-length" "^3.0.0" - "@smithy/middleware-endpoint" "^3.0.1" - "@smithy/middleware-retry" "^3.0.3" - "@smithy/middleware-serde" "^3.0.0" - "@smithy/middleware-stack" "^3.0.0" - "@smithy/node-config-provider" "^3.1.0" - "@smithy/node-http-handler" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/smithy-client" "^3.1.1" - "@smithy/types" "^3.0.0" - "@smithy/url-parser" "^3.0.0" + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudfront/-/client-cloudfront-3.598.0.tgz#a6dd4aba7b44315a253c635cdf92862f377f93bf" + integrity sha512-bkAVZ0VjrvPsRkoVQEAEBH7jbHLBqmVfdGRNsJkHRK4pvelM0wNfMbrMpXXRMu2DvjHdKp8akEratldlavN9Pw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.598.0" + "@aws-sdk/client-sts" "3.598.0" + "@aws-sdk/core" "3.598.0" + "@aws-sdk/credential-provider-node" "3.598.0" + "@aws-sdk/middleware-host-header" "3.598.0" + "@aws-sdk/middleware-logger" "3.598.0" + "@aws-sdk/middleware-recursion-detection" "3.598.0" + "@aws-sdk/middleware-user-agent" "3.598.0" + "@aws-sdk/region-config-resolver" "3.598.0" + "@aws-sdk/types" "3.598.0" + "@aws-sdk/util-endpoints" "3.598.0" + "@aws-sdk/util-user-agent-browser" "3.598.0" + "@aws-sdk/util-user-agent-node" "3.598.0" + "@aws-sdk/xml-builder" "3.598.0" + "@smithy/config-resolver" "^3.0.2" + "@smithy/core" "^2.2.1" + "@smithy/fetch-http-handler" "^3.0.2" + "@smithy/hash-node" "^3.0.1" + "@smithy/invalid-dependency" "^3.0.1" + "@smithy/middleware-content-length" "^3.0.1" + "@smithy/middleware-endpoint" "^3.0.2" + "@smithy/middleware-retry" "^3.0.4" + "@smithy/middleware-serde" "^3.0.1" + "@smithy/middleware-stack" "^3.0.1" + "@smithy/node-config-provider" "^3.1.1" + "@smithy/node-http-handler" "^3.0.1" + "@smithy/protocol-http" "^4.0.1" + "@smithy/smithy-client" "^3.1.2" + "@smithy/types" "^3.1.0" + "@smithy/url-parser" "^3.0.1" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.3" - "@smithy/util-defaults-mode-node" "^3.0.3" - "@smithy/util-endpoints" "^2.0.1" - "@smithy/util-middleware" "^3.0.0" - "@smithy/util-retry" "^3.0.0" - "@smithy/util-stream" "^3.0.1" + "@smithy/util-defaults-mode-browser" "^3.0.4" + "@smithy/util-defaults-mode-node" "^3.0.4" + "@smithy/util-endpoints" "^2.0.2" + "@smithy/util-middleware" "^3.0.1" + "@smithy/util-retry" "^3.0.1" + "@smithy/util-stream" "^3.0.2" "@smithy/util-utf8" "^3.0.0" - "@smithy/util-waiter" "^3.0.0" + "@smithy/util-waiter" "^3.0.1" tslib "^2.6.2" "@aws-sdk/client-s3@^3.583.0": - version "3.596.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.596.0.tgz#28233f0cc826d189230489ca816a37c350fa06f8" - integrity sha512-W5C85cEUTYbmCpvvhLye+KirtLcBMX4t0l4Zj3EsGc5tTwkp7lxZDmJEoDfRy0+FE2H/O6OZQJdWMXCwt/Inqw== - dependencies: - "@aws-crypto/sha1-browser" "3.0.0" - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sso-oidc" "3.596.0" - "@aws-sdk/client-sts" "3.596.0" - "@aws-sdk/core" "3.592.0" - "@aws-sdk/credential-provider-node" "3.596.0" - "@aws-sdk/middleware-bucket-endpoint" "3.587.0" - "@aws-sdk/middleware-expect-continue" "3.577.0" - "@aws-sdk/middleware-flexible-checksums" "3.587.0" - "@aws-sdk/middleware-host-header" "3.577.0" - "@aws-sdk/middleware-location-constraint" "3.577.0" - "@aws-sdk/middleware-logger" "3.577.0" - "@aws-sdk/middleware-recursion-detection" "3.577.0" - "@aws-sdk/middleware-sdk-s3" "3.587.0" - "@aws-sdk/middleware-signing" "3.587.0" - "@aws-sdk/middleware-ssec" "3.577.0" - "@aws-sdk/middleware-user-agent" "3.587.0" - "@aws-sdk/region-config-resolver" "3.587.0" - "@aws-sdk/signature-v4-multi-region" "3.587.0" - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-endpoints" "3.587.0" - "@aws-sdk/util-user-agent-browser" "3.577.0" - "@aws-sdk/util-user-agent-node" "3.587.0" - "@aws-sdk/xml-builder" "3.575.0" - "@smithy/config-resolver" "^3.0.1" - "@smithy/core" "^2.2.0" - "@smithy/eventstream-serde-browser" "^3.0.0" - "@smithy/eventstream-serde-config-resolver" "^3.0.0" - "@smithy/eventstream-serde-node" "^3.0.0" - "@smithy/fetch-http-handler" "^3.0.1" - "@smithy/hash-blob-browser" "^3.0.0" - "@smithy/hash-node" "^3.0.0" - "@smithy/hash-stream-node" "^3.0.0" - "@smithy/invalid-dependency" "^3.0.0" - "@smithy/md5-js" "^3.0.0" - "@smithy/middleware-content-length" "^3.0.0" - "@smithy/middleware-endpoint" "^3.0.1" - "@smithy/middleware-retry" "^3.0.3" - "@smithy/middleware-serde" "^3.0.0" - "@smithy/middleware-stack" "^3.0.0" - "@smithy/node-config-provider" "^3.1.0" - "@smithy/node-http-handler" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/smithy-client" "^3.1.1" - "@smithy/types" "^3.0.0" - "@smithy/url-parser" "^3.0.0" + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.598.0.tgz#04f594cb7e36b3551898c656715f94785ca8acf0" + integrity sha512-UMxftsgF6j1vzm4Qd9vQJHs2he1NQCWWV8esZfmNFq23OpUC2BPMxkqi13ZQ9tnTAZUNs7yFT/x4Zsi/wpRZEw== + dependencies: + "@aws-crypto/sha1-browser" "5.2.0" + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.598.0" + "@aws-sdk/client-sts" "3.598.0" + "@aws-sdk/core" "3.598.0" + "@aws-sdk/credential-provider-node" "3.598.0" + "@aws-sdk/middleware-bucket-endpoint" "3.598.0" + "@aws-sdk/middleware-expect-continue" "3.598.0" + "@aws-sdk/middleware-flexible-checksums" "3.598.0" + "@aws-sdk/middleware-host-header" "3.598.0" + "@aws-sdk/middleware-location-constraint" "3.598.0" + "@aws-sdk/middleware-logger" "3.598.0" + "@aws-sdk/middleware-recursion-detection" "3.598.0" + "@aws-sdk/middleware-sdk-s3" "3.598.0" + "@aws-sdk/middleware-signing" "3.598.0" + "@aws-sdk/middleware-ssec" "3.598.0" + "@aws-sdk/middleware-user-agent" "3.598.0" + "@aws-sdk/region-config-resolver" "3.598.0" + "@aws-sdk/signature-v4-multi-region" "3.598.0" + "@aws-sdk/types" "3.598.0" + "@aws-sdk/util-endpoints" "3.598.0" + "@aws-sdk/util-user-agent-browser" "3.598.0" + "@aws-sdk/util-user-agent-node" "3.598.0" + "@aws-sdk/xml-builder" "3.598.0" + "@smithy/config-resolver" "^3.0.2" + "@smithy/core" "^2.2.1" + "@smithy/eventstream-serde-browser" "^3.0.2" + "@smithy/eventstream-serde-config-resolver" "^3.0.1" + "@smithy/eventstream-serde-node" "^3.0.2" + "@smithy/fetch-http-handler" "^3.0.2" + "@smithy/hash-blob-browser" "^3.1.0" + "@smithy/hash-node" "^3.0.1" + "@smithy/hash-stream-node" "^3.1.0" + "@smithy/invalid-dependency" "^3.0.1" + "@smithy/md5-js" "^3.0.1" + "@smithy/middleware-content-length" "^3.0.1" + "@smithy/middleware-endpoint" "^3.0.2" + "@smithy/middleware-retry" "^3.0.4" + "@smithy/middleware-serde" "^3.0.1" + "@smithy/middleware-stack" "^3.0.1" + "@smithy/node-config-provider" "^3.1.1" + "@smithy/node-http-handler" "^3.0.1" + "@smithy/protocol-http" "^4.0.1" + "@smithy/smithy-client" "^3.1.2" + "@smithy/types" "^3.1.0" + "@smithy/url-parser" "^3.0.1" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.3" - "@smithy/util-defaults-mode-node" "^3.0.3" - "@smithy/util-endpoints" "^2.0.1" - "@smithy/util-retry" "^3.0.0" - "@smithy/util-stream" "^3.0.1" + "@smithy/util-defaults-mode-browser" "^3.0.4" + "@smithy/util-defaults-mode-node" "^3.0.4" + "@smithy/util-endpoints" "^2.0.2" + "@smithy/util-retry" "^3.0.1" + "@smithy/util-stream" "^3.0.2" "@smithy/util-utf8" "^3.0.0" - "@smithy/util-waiter" "^3.0.0" + "@smithy/util-waiter" "^3.0.1" tslib "^2.6.2" -"@aws-sdk/client-sso-oidc@3.596.0": - version "3.596.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.596.0.tgz#9d75619043e5f0e3d985d800c3df06d9a8a3bfeb" - integrity sha512-KnTWtKzO0N+rMdIrVwbewFp4FAvVWBV/ekCAh5w7EN+uAvBHxMoFElE2RwlcRF/gH1/F715OspPMvOxPom6bMA== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.596.0" - "@aws-sdk/core" "3.592.0" - "@aws-sdk/credential-provider-node" "3.596.0" - "@aws-sdk/middleware-host-header" "3.577.0" - "@aws-sdk/middleware-logger" "3.577.0" - "@aws-sdk/middleware-recursion-detection" "3.577.0" - "@aws-sdk/middleware-user-agent" "3.587.0" - "@aws-sdk/region-config-resolver" "3.587.0" - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-endpoints" "3.587.0" - "@aws-sdk/util-user-agent-browser" "3.577.0" - "@aws-sdk/util-user-agent-node" "3.587.0" - "@smithy/config-resolver" "^3.0.1" - "@smithy/core" "^2.2.0" - "@smithy/fetch-http-handler" "^3.0.1" - "@smithy/hash-node" "^3.0.0" - "@smithy/invalid-dependency" "^3.0.0" - "@smithy/middleware-content-length" "^3.0.0" - "@smithy/middleware-endpoint" "^3.0.1" - "@smithy/middleware-retry" "^3.0.3" - "@smithy/middleware-serde" "^3.0.0" - "@smithy/middleware-stack" "^3.0.0" - "@smithy/node-config-provider" "^3.1.0" - "@smithy/node-http-handler" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/smithy-client" "^3.1.1" - "@smithy/types" "^3.0.0" - "@smithy/url-parser" "^3.0.0" +"@aws-sdk/client-sso-oidc@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.598.0.tgz#17ad1acd1c616ccbd36cda2db1ee80d63ad0aff5" + integrity sha512-jfdH1pAO9Tt8Nkta/JJLoUnwl7jaRdxToQTJfUtE+o3+0JP5sA4LfC2rBkJSWcU5BdAA+kyOs5Lv776DlN04Vg== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sts" "3.598.0" + "@aws-sdk/core" "3.598.0" + "@aws-sdk/credential-provider-node" "3.598.0" + "@aws-sdk/middleware-host-header" "3.598.0" + "@aws-sdk/middleware-logger" "3.598.0" + "@aws-sdk/middleware-recursion-detection" "3.598.0" + "@aws-sdk/middleware-user-agent" "3.598.0" + "@aws-sdk/region-config-resolver" "3.598.0" + "@aws-sdk/types" "3.598.0" + "@aws-sdk/util-endpoints" "3.598.0" + "@aws-sdk/util-user-agent-browser" "3.598.0" + "@aws-sdk/util-user-agent-node" "3.598.0" + "@smithy/config-resolver" "^3.0.2" + "@smithy/core" "^2.2.1" + "@smithy/fetch-http-handler" "^3.0.2" + "@smithy/hash-node" "^3.0.1" + "@smithy/invalid-dependency" "^3.0.1" + "@smithy/middleware-content-length" "^3.0.1" + "@smithy/middleware-endpoint" "^3.0.2" + "@smithy/middleware-retry" "^3.0.4" + "@smithy/middleware-serde" "^3.0.1" + "@smithy/middleware-stack" "^3.0.1" + "@smithy/node-config-provider" "^3.1.1" + "@smithy/node-http-handler" "^3.0.1" + "@smithy/protocol-http" "^4.0.1" + "@smithy/smithy-client" "^3.1.2" + "@smithy/types" "^3.1.0" + "@smithy/url-parser" "^3.0.1" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.3" - "@smithy/util-defaults-mode-node" "^3.0.3" - "@smithy/util-endpoints" "^2.0.1" - "@smithy/util-middleware" "^3.0.0" - "@smithy/util-retry" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.4" + "@smithy/util-defaults-mode-node" "^3.0.4" + "@smithy/util-endpoints" "^2.0.2" + "@smithy/util-middleware" "^3.0.1" + "@smithy/util-retry" "^3.0.1" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/client-sso@3.592.0": - version "3.592.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.592.0.tgz#90462e744998990079c28a083553090af9ac2902" - integrity sha512-w+SuW47jQqvOC7fonyjFjsOh3yjqJ+VpWdVrmrl0E/KryBE7ho/Wn991Buf/EiHHeJikoWgHsAIPkBH29+ntdA== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/core" "3.592.0" - "@aws-sdk/middleware-host-header" "3.577.0" - "@aws-sdk/middleware-logger" "3.577.0" - "@aws-sdk/middleware-recursion-detection" "3.577.0" - "@aws-sdk/middleware-user-agent" "3.587.0" - "@aws-sdk/region-config-resolver" "3.587.0" - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-endpoints" "3.587.0" - "@aws-sdk/util-user-agent-browser" "3.577.0" - "@aws-sdk/util-user-agent-node" "3.587.0" - "@smithy/config-resolver" "^3.0.1" - "@smithy/core" "^2.2.0" - "@smithy/fetch-http-handler" "^3.0.1" - "@smithy/hash-node" "^3.0.0" - "@smithy/invalid-dependency" "^3.0.0" - "@smithy/middleware-content-length" "^3.0.0" - "@smithy/middleware-endpoint" "^3.0.1" - "@smithy/middleware-retry" "^3.0.3" - "@smithy/middleware-serde" "^3.0.0" - "@smithy/middleware-stack" "^3.0.0" - "@smithy/node-config-provider" "^3.1.0" - "@smithy/node-http-handler" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/smithy-client" "^3.1.1" - "@smithy/types" "^3.0.0" - "@smithy/url-parser" "^3.0.0" +"@aws-sdk/client-sso@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.598.0.tgz#aef58e198e504d3b3d1ba345355650a67d21facb" + integrity sha512-nOI5lqPYa+YZlrrzwAJywJSw3MKVjvu6Ge2fCqQUNYMfxFB0NAaDFnl0EPjXi+sEbtCuz/uWE77poHbqiZ+7Iw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.598.0" + "@aws-sdk/middleware-host-header" "3.598.0" + "@aws-sdk/middleware-logger" "3.598.0" + "@aws-sdk/middleware-recursion-detection" "3.598.0" + "@aws-sdk/middleware-user-agent" "3.598.0" + "@aws-sdk/region-config-resolver" "3.598.0" + "@aws-sdk/types" "3.598.0" + "@aws-sdk/util-endpoints" "3.598.0" + "@aws-sdk/util-user-agent-browser" "3.598.0" + "@aws-sdk/util-user-agent-node" "3.598.0" + "@smithy/config-resolver" "^3.0.2" + "@smithy/core" "^2.2.1" + "@smithy/fetch-http-handler" "^3.0.2" + "@smithy/hash-node" "^3.0.1" + "@smithy/invalid-dependency" "^3.0.1" + "@smithy/middleware-content-length" "^3.0.1" + "@smithy/middleware-endpoint" "^3.0.2" + "@smithy/middleware-retry" "^3.0.4" + "@smithy/middleware-serde" "^3.0.1" + "@smithy/middleware-stack" "^3.0.1" + "@smithy/node-config-provider" "^3.1.1" + "@smithy/node-http-handler" "^3.0.1" + "@smithy/protocol-http" "^4.0.1" + "@smithy/smithy-client" "^3.1.2" + "@smithy/types" "^3.1.0" + "@smithy/url-parser" "^3.0.1" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.3" - "@smithy/util-defaults-mode-node" "^3.0.3" - "@smithy/util-endpoints" "^2.0.1" - "@smithy/util-middleware" "^3.0.0" - "@smithy/util-retry" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.4" + "@smithy/util-defaults-mode-node" "^3.0.4" + "@smithy/util-endpoints" "^2.0.2" + "@smithy/util-middleware" "^3.0.1" + "@smithy/util-retry" "^3.0.1" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/client-sts@3.596.0": - version "3.596.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.596.0.tgz#236ed4b898265c737f860060adab422ea8ec6383" - integrity sha512-37+WQDjgmqS/YXj3vPzIVIrbXaFcZ1WXk715AMGIPBZn9Y2/wr2bmSTpX7bsMyn0G8+LxmoIxFcG7n1Gu0nvLg== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sso-oidc" "3.596.0" - "@aws-sdk/core" "3.592.0" - "@aws-sdk/credential-provider-node" "3.596.0" - "@aws-sdk/middleware-host-header" "3.577.0" - "@aws-sdk/middleware-logger" "3.577.0" - "@aws-sdk/middleware-recursion-detection" "3.577.0" - "@aws-sdk/middleware-user-agent" "3.587.0" - "@aws-sdk/region-config-resolver" "3.587.0" - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-endpoints" "3.587.0" - "@aws-sdk/util-user-agent-browser" "3.577.0" - "@aws-sdk/util-user-agent-node" "3.587.0" - "@smithy/config-resolver" "^3.0.1" - "@smithy/core" "^2.2.0" - "@smithy/fetch-http-handler" "^3.0.1" - "@smithy/hash-node" "^3.0.0" - "@smithy/invalid-dependency" "^3.0.0" - "@smithy/middleware-content-length" "^3.0.0" - "@smithy/middleware-endpoint" "^3.0.1" - "@smithy/middleware-retry" "^3.0.3" - "@smithy/middleware-serde" "^3.0.0" - "@smithy/middleware-stack" "^3.0.0" - "@smithy/node-config-provider" "^3.1.0" - "@smithy/node-http-handler" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/smithy-client" "^3.1.1" - "@smithy/types" "^3.0.0" - "@smithy/url-parser" "^3.0.0" +"@aws-sdk/client-sts@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.598.0.tgz#5b3c082ac14b3f0b7a4c964eb4ba2b320988e1e4" + integrity sha512-bXhz/cHL0iB9UH9IFtMaJJf4F8mV+HzncETCRFzZ9SyUMt5rP9j8A7VZknqGYSx/6mI8SsB1XJQkWSbhn6FiSQ== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.598.0" + "@aws-sdk/core" "3.598.0" + "@aws-sdk/credential-provider-node" "3.598.0" + "@aws-sdk/middleware-host-header" "3.598.0" + "@aws-sdk/middleware-logger" "3.598.0" + "@aws-sdk/middleware-recursion-detection" "3.598.0" + "@aws-sdk/middleware-user-agent" "3.598.0" + "@aws-sdk/region-config-resolver" "3.598.0" + "@aws-sdk/types" "3.598.0" + "@aws-sdk/util-endpoints" "3.598.0" + "@aws-sdk/util-user-agent-browser" "3.598.0" + "@aws-sdk/util-user-agent-node" "3.598.0" + "@smithy/config-resolver" "^3.0.2" + "@smithy/core" "^2.2.1" + "@smithy/fetch-http-handler" "^3.0.2" + "@smithy/hash-node" "^3.0.1" + "@smithy/invalid-dependency" "^3.0.1" + "@smithy/middleware-content-length" "^3.0.1" + "@smithy/middleware-endpoint" "^3.0.2" + "@smithy/middleware-retry" "^3.0.4" + "@smithy/middleware-serde" "^3.0.1" + "@smithy/middleware-stack" "^3.0.1" + "@smithy/node-config-provider" "^3.1.1" + "@smithy/node-http-handler" "^3.0.1" + "@smithy/protocol-http" "^4.0.1" + "@smithy/smithy-client" "^3.1.2" + "@smithy/types" "^3.1.0" + "@smithy/url-parser" "^3.0.1" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.3" - "@smithy/util-defaults-mode-node" "^3.0.3" - "@smithy/util-endpoints" "^2.0.1" - "@smithy/util-middleware" "^3.0.0" - "@smithy/util-retry" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.4" + "@smithy/util-defaults-mode-node" "^3.0.4" + "@smithy/util-endpoints" "^2.0.2" + "@smithy/util-middleware" "^3.0.1" + "@smithy/util-retry" "^3.0.1" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/core@3.592.0": - version "3.592.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.592.0.tgz#d903a3993f8ba6836480314c2a8af8b7857bb943" - integrity sha512-gLPMXR/HXDP+9gXAt58t7gaMTvRts9i6Q7NMISpkGF54wehskl5WGrbdtHJFylrlJ5BQo3XVY6i661o+EuR1wg== +"@aws-sdk/core@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.598.0.tgz#82a069d703be0cafe3ddeacb1de51981ee4faa25" + integrity sha512-HaSjt7puO5Cc7cOlrXFCW0rtA0BM9lvzjl56x0A20Pt+0wxXGeTOZZOkXQIepbrFkV2e/HYukuT9e99vXDm59g== dependencies: - "@smithy/core" "^2.2.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/signature-v4" "^3.0.0" - "@smithy/smithy-client" "^3.1.1" - "@smithy/types" "^3.0.0" + "@smithy/core" "^2.2.1" + "@smithy/protocol-http" "^4.0.1" + "@smithy/signature-v4" "^3.1.0" + "@smithy/smithy-client" "^3.1.2" + "@smithy/types" "^3.1.0" fast-xml-parser "4.2.5" tslib "^2.6.2" -"@aws-sdk/credential-provider-env@3.587.0": - version "3.587.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.587.0.tgz#40435be331773e4b1b665a1f4963518d4647505c" - integrity sha512-Hyg/5KFECIk2k5o8wnVEiniV86yVkhn5kzITUydmNGCkXdBFHMHRx6hleQ1bqwJHbBskyu8nbYamzcwymmGwmw== +"@aws-sdk/credential-provider-env@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.598.0.tgz#ea1f30cfc9948017dd0608518868d3f50074164f" + integrity sha512-vi1khgn7yXzLCcgSIzQrrtd2ilUM0dWodxj3PQ6BLfP0O+q1imO3hG1nq7DVyJtq7rFHs6+9N8G4mYvTkxby2w== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/property-provider" "^3.1.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.598.0" + "@smithy/property-provider" "^3.1.1" + "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-http@3.596.0": - version "3.596.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.596.0.tgz#ad81565e37f84c860a7a5f82ff256a962397816c" - integrity sha512-nnmvEsz1KJgRmfSZJPWuzbxPRXu8Y+/78Ifa1jY3fQKSKdEJfXMDsjPljJvMDBl4dZ8pf5Hwx+S/ONnMEDwYEA== - dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/fetch-http-handler" "^3.0.1" - "@smithy/node-http-handler" "^3.0.0" - "@smithy/property-provider" "^3.1.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/smithy-client" "^3.1.1" - "@smithy/types" "^3.0.0" - "@smithy/util-stream" "^3.0.1" +"@aws-sdk/credential-provider-http@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.598.0.tgz#58144440e698aef63b5cb459780325817c0acf10" + integrity sha512-N7cIafi4HVlQvEgvZSo1G4T9qb/JMLGMdBsDCT5XkeJrF0aptQWzTFH0jIdZcLrMYvzPcuEyO3yCBe6cy/ba0g== + dependencies: + "@aws-sdk/types" "3.598.0" + "@smithy/fetch-http-handler" "^3.0.2" + "@smithy/node-http-handler" "^3.0.1" + "@smithy/property-provider" "^3.1.1" + "@smithy/protocol-http" "^4.0.1" + "@smithy/smithy-client" "^3.1.2" + "@smithy/types" "^3.1.0" + "@smithy/util-stream" "^3.0.2" tslib "^2.6.2" -"@aws-sdk/credential-provider-ini@3.596.0": - version "3.596.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.596.0.tgz#2e5155b52590dbc768a2775e0b5266287a00d8ca" - integrity sha512-c7PLtd7GbnOVAc5sk3sVlHxLvEsM8RF96rsBGlRo4AVpil/lXLKyNv9VarS4w/ZZZoRbJRyZ+m92PjNcLvpTDQ== - dependencies: - "@aws-sdk/credential-provider-env" "3.587.0" - "@aws-sdk/credential-provider-http" "3.596.0" - "@aws-sdk/credential-provider-process" "3.587.0" - "@aws-sdk/credential-provider-sso" "3.592.0" - "@aws-sdk/credential-provider-web-identity" "3.587.0" - "@aws-sdk/types" "3.577.0" - "@smithy/credential-provider-imds" "^3.1.0" - "@smithy/property-provider" "^3.1.0" - "@smithy/shared-ini-file-loader" "^3.1.0" - "@smithy/types" "^3.0.0" +"@aws-sdk/credential-provider-ini@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.598.0.tgz#fd0ba8ab5c3701e05567d1c6f7752cfd9f4ba111" + integrity sha512-/ppcIVUbRwDIwJDoYfp90X3+AuJo2mvE52Y1t2VSrvUovYn6N4v95/vXj6LS8CNDhz2jvEJYmu+0cTMHdhI6eA== + dependencies: + "@aws-sdk/credential-provider-env" "3.598.0" + "@aws-sdk/credential-provider-http" "3.598.0" + "@aws-sdk/credential-provider-process" "3.598.0" + "@aws-sdk/credential-provider-sso" "3.598.0" + "@aws-sdk/credential-provider-web-identity" "3.598.0" + "@aws-sdk/types" "3.598.0" + "@smithy/credential-provider-imds" "^3.1.1" + "@smithy/property-provider" "^3.1.1" + "@smithy/shared-ini-file-loader" "^3.1.1" + "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-node@3.596.0": - version "3.596.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.596.0.tgz#d70bce8de4f1849558215117d73f7433bfdcdc24" - integrity sha512-F4MLyXpQyie1AnJS9n7TIRL0aF7YH8tKMIJXDsM5OXpSZi2en+yR6SzsxvHf5dwS2Ga8LUdEJyiyS2NoebaJGA== - dependencies: - "@aws-sdk/credential-provider-env" "3.587.0" - "@aws-sdk/credential-provider-http" "3.596.0" - "@aws-sdk/credential-provider-ini" "3.596.0" - "@aws-sdk/credential-provider-process" "3.587.0" - "@aws-sdk/credential-provider-sso" "3.592.0" - "@aws-sdk/credential-provider-web-identity" "3.587.0" - "@aws-sdk/types" "3.577.0" - "@smithy/credential-provider-imds" "^3.1.0" - "@smithy/property-provider" "^3.1.0" - "@smithy/shared-ini-file-loader" "^3.1.0" - "@smithy/types" "^3.0.0" +"@aws-sdk/credential-provider-node@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.598.0.tgz#b24173cf9ae33718c6273c9bac996791c73d9359" + integrity sha512-sXTlqL5I/awlF9Dg2MQ17SfrEaABVnsj2mf4jF5qQrIRhfbvQOIYdEqdy8Rn1AWlJMz/N450SGzc0XJ5owxxqw== + dependencies: + "@aws-sdk/credential-provider-env" "3.598.0" + "@aws-sdk/credential-provider-http" "3.598.0" + "@aws-sdk/credential-provider-ini" "3.598.0" + "@aws-sdk/credential-provider-process" "3.598.0" + "@aws-sdk/credential-provider-sso" "3.598.0" + "@aws-sdk/credential-provider-web-identity" "3.598.0" + "@aws-sdk/types" "3.598.0" + "@smithy/credential-provider-imds" "^3.1.1" + "@smithy/property-provider" "^3.1.1" + "@smithy/shared-ini-file-loader" "^3.1.1" + "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-process@3.587.0": - version "3.587.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.587.0.tgz#1e5cc562a68438a77f464adc0493b02e04dd3ea1" - integrity sha512-V4xT3iCqkF8uL6QC4gqBJg/2asd/damswP1h9HCfqTllmPWzImS+8WD3VjgTLw5b0KbTy+ZdUhKc0wDnyzkzxg== +"@aws-sdk/credential-provider-process@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.598.0.tgz#f48ff6f964cd6726499b207f45bfecda4be922ce" + integrity sha512-rM707XbLW8huMk722AgjVyxu2tMZee++fNA8TJVNgs1Ma02Wx6bBrfIvlyK0rCcIRb0WdQYP6fe3Xhiu4e8IBA== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/property-provider" "^3.1.0" - "@smithy/shared-ini-file-loader" "^3.1.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.598.0" + "@smithy/property-provider" "^3.1.1" + "@smithy/shared-ini-file-loader" "^3.1.1" + "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-sso@3.592.0": - version "3.592.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.592.0.tgz#340649b4f5b4fbcb816f248089979d7d38ce96d3" - integrity sha512-fYFzAdDHKHvhtufPPtrLdSv8lO6GuW3em6n3erM5uFdpGytNpjXvr3XGokIsuXcNkETAY/Xihg+G9ksNE8WJxQ== - dependencies: - "@aws-sdk/client-sso" "3.592.0" - "@aws-sdk/token-providers" "3.587.0" - "@aws-sdk/types" "3.577.0" - "@smithy/property-provider" "^3.1.0" - "@smithy/shared-ini-file-loader" "^3.1.0" - "@smithy/types" "^3.0.0" +"@aws-sdk/credential-provider-sso@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.598.0.tgz#52781e2b60b1f61752829c44a5e0b9fedd0694d6" + integrity sha512-5InwUmrAuqQdOOgxTccRayMMkSmekdLk6s+az9tmikq0QFAHUCtofI+/fllMXSR9iL6JbGYi1940+EUmS4pHJA== + dependencies: + "@aws-sdk/client-sso" "3.598.0" + "@aws-sdk/token-providers" "3.598.0" + "@aws-sdk/types" "3.598.0" + "@smithy/property-provider" "^3.1.1" + "@smithy/shared-ini-file-loader" "^3.1.1" + "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-web-identity@3.587.0": - version "3.587.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.587.0.tgz#daa41e3cc9309594327056e431b8065145c5297a" - integrity sha512-XqIx/I2PG7kyuw3WjAP9wKlxy8IvFJwB8asOFT1xPFoVfZYKIogjG9oLP5YiRtfvDkWIztHmg5MlVv3HdJDGRw== +"@aws-sdk/credential-provider-web-identity@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.598.0.tgz#d737e9c2b7c4460b8e31a55b4979bf4d88913900" + integrity sha512-GV5GdiMbz5Tz9JO4NJtRoFXjW0GPEujA0j+5J/B723rTN+REHthJu48HdBKouHGhdzkDWkkh1bu52V02Wprw8w== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/property-provider" "^3.1.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.598.0" + "@smithy/property-provider" "^3.1.1" + "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-bucket-endpoint@3.587.0": - version "3.587.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.587.0.tgz#def5edbadf53bdfe765aa9acf12f119eb208b22f" - integrity sha512-HkFXLPl8pr6BH/Q0JpOESqEKL0ZK3sk7aSZ1S6GE4RXET7H5R94THULXqQFZzD48gZcyFooO/yNKZTqrZFaWKg== +"@aws-sdk/middleware-bucket-endpoint@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.598.0.tgz#033b08921f9f284483a7337ed165743ee0dc598d" + integrity sha512-PM7BcFfGUSkmkT6+LU9TyJiB4S8yI7dfuKQDwK5ZR3P7MKaK4Uj4yyDiv0oe5xvkF6+O2+rShj+eh8YuWkOZ/Q== dependencies: - "@aws-sdk/types" "3.577.0" + "@aws-sdk/types" "3.598.0" "@aws-sdk/util-arn-parser" "3.568.0" - "@smithy/node-config-provider" "^3.1.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/types" "^3.0.0" + "@smithy/node-config-provider" "^3.1.1" + "@smithy/protocol-http" "^4.0.1" + "@smithy/types" "^3.1.0" "@smithy/util-config-provider" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-expect-continue@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.577.0.tgz#47add47f17873a6044cb140f17033cb6e1d02744" - integrity sha512-6dPp8Tv4F0of4un5IAyG6q++GrRrNQQ4P2NAMB1W0VO4JoEu1C8GievbbDLi88TFIFmtKpnHB0ODCzwnoe8JsA== +"@aws-sdk/middleware-expect-continue@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.598.0.tgz#5b08b8cae70d1e7cc082d3627b31856f6ba20d17" + integrity sha512-ZuHW18kaeHR8TQyhEOYMr8VwiIh0bMvF7J1OTqXHxDteQIavJWA3CbfZ9sgS4XGtrBZDyHJhjZKeCfLhN2rq3w== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.598.0" + "@smithy/protocol-http" "^4.0.1" + "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-flexible-checksums@3.587.0": - version "3.587.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.587.0.tgz#74afe7bd3088adf05b2ed843ad41386e793e0397" - integrity sha512-URMwp/budDvKhIvZ4a6zIBfFTun/iDlPWXqsGKYjEtHt8jz27OSjCZtDtIeqW4WTBdKL8KZgQcl+DdaE5M1qiQ== +"@aws-sdk/middleware-flexible-checksums@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.598.0.tgz#8e40734d5fb1b116816f885885f16db9b5e39032" + integrity sha512-xukAzds0GQXvMEY9G6qt+CzwVzTx8NyKKh04O2Q+nOch6QQ8Rs+2kTRy3Z4wQmXq2pK9hlOWb5nXA7HWpmz6Ng== dependencies: - "@aws-crypto/crc32" "3.0.0" - "@aws-crypto/crc32c" "3.0.0" - "@aws-sdk/types" "3.577.0" + "@aws-crypto/crc32" "5.2.0" + "@aws-crypto/crc32c" "5.2.0" + "@aws-sdk/types" "3.598.0" "@smithy/is-array-buffer" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/types" "^3.0.0" + "@smithy/protocol-http" "^4.0.1" + "@smithy/types" "^3.1.0" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-host-header@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.577.0.tgz#a3fc626d409ec850296740478c64ef5806d8b878" - integrity sha512-9ca5MJz455CODIVXs0/sWmJm7t3QO4EUa1zf8pE8grLpzf0J94bz/skDWm37Pli13T3WaAQBHCTiH2gUVfCsWg== +"@aws-sdk/middleware-host-header@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.598.0.tgz#0a7c4d5a95657bea2d7c4e29b9a8b379952d09b1" + integrity sha512-WiaG059YBQwQraNejLIi0gMNkX7dfPZ8hDIhvMr5aVPRbaHH8AYF3iNSsXYCHvA2Cfa1O9haYXsuMF9flXnCmA== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.598.0" + "@smithy/protocol-http" "^4.0.1" + "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-location-constraint@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.577.0.tgz#9372441a4ac5747b3176ac6378d92866a51de815" - integrity sha512-DKPTD2D2s+t2QUo/IXYtVa/6Un8GZ+phSTBkyBNx2kfZz4Kwavhl/JJzSqTV3GfCXkVdFu7CrjoX7BZ6qWeTUA== +"@aws-sdk/middleware-location-constraint@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.598.0.tgz#45564d5119468e3ac97949431c249e8b6e00ec09" + integrity sha512-8oybQxN3F1ISOMULk7JKJz5DuAm5hCUcxMW9noWShbxTJuStNvuHf/WLUzXrf8oSITyYzIHPtf8VPlKR7I3orQ== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.598.0" + "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-logger@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.577.0.tgz#6da3b13ae284fb3930961f0fc8e20b1f6cf8be30" - integrity sha512-aPFGpGjTZcJYk+24bg7jT4XdIp42mFXSuPt49lw5KygefLyJM/sB0bKKqPYYivW0rcuZ9brQ58eZUNthrzYAvg== +"@aws-sdk/middleware-logger@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.598.0.tgz#0c0692d2f4f9007c915734ab319db377ca9a3b1b" + integrity sha512-bxBjf/VYiu3zfu8SYM2S9dQQc3tz5uBAOcPz/Bt8DyyK3GgOpjhschH/2XuUErsoUO1gDJqZSdGOmuHGZQn00Q== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.598.0" + "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-recursion-detection@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.577.0.tgz#fff76abc6d4521636f9e654ce5bf2c4c79249417" - integrity sha512-pn3ZVEd2iobKJlR3H+bDilHjgRnNrQ6HMmK9ZzZw89Ckn3Dcbv48xOv4RJvu0aU8SDLl/SNCxppKjeLDTPGBNA== +"@aws-sdk/middleware-recursion-detection@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.598.0.tgz#94015d41f8174bd41298fd13f8fb0a8c4576d7c8" + integrity sha512-vjT9BeFY9FeN0f8hm2l6F53tI0N5bUq6RcDkQXKNabXBnQxKptJRad6oP2X5y3FoVfBLOuDkQgiC2940GIPxtQ== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.598.0" + "@smithy/protocol-http" "^4.0.1" + "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-sdk-s3@3.587.0": - version "3.587.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.587.0.tgz#720620ccdc2eb6ecab0f3a6adbd28fc27fdc70ce" - integrity sha512-vtXTGEiw1E9Fax4LmcU2Z208gbrC8ShrdsSLmGcRPpu5NPOGBFBSDG5sy5EDNClrFxIl/Le8coQnD0EDBtx+uQ== +"@aws-sdk/middleware-sdk-s3@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.598.0.tgz#308604f8a38959ad65ec5674c643c7032d678f43" + integrity sha512-5AGtLAh9wyK6ANPYfaKTqJY1IFJyePIxsEbxa7zS6REheAqyVmgJFaGu3oQ5XlxfGr5Uq59tFTRkyx26G1HkHA== dependencies: - "@aws-sdk/types" "3.577.0" + "@aws-sdk/types" "3.598.0" "@aws-sdk/util-arn-parser" "3.568.0" - "@smithy/node-config-provider" "^3.1.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/signature-v4" "^3.0.0" - "@smithy/smithy-client" "^3.1.1" - "@smithy/types" "^3.0.0" + "@smithy/node-config-provider" "^3.1.1" + "@smithy/protocol-http" "^4.0.1" + "@smithy/signature-v4" "^3.1.0" + "@smithy/smithy-client" "^3.1.2" + "@smithy/types" "^3.1.0" "@smithy/util-config-provider" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-signing@3.587.0": - version "3.587.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.587.0.tgz#593c418c09c51c0bc55f23a7a6b0fda8502a8103" - integrity sha512-tiZaTDj4RvhXGRAlncFn7CSEfL3iNPO67WSaxAq+Ls5j1VgczPhu5262cWONNoMgth3nXR1hhLC4ITSl/a6AzA== - dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/property-provider" "^3.1.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/signature-v4" "^3.0.0" - "@smithy/types" "^3.0.0" - "@smithy/util-middleware" "^3.0.0" +"@aws-sdk/middleware-signing@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.598.0.tgz#b90eef6a9fe3f76777c9cd4890dcae8e1febd249" + integrity sha512-XKb05DYx/aBPqz6iCapsCbIl8aD8EihTuPCs51p75QsVfbQoVr4TlFfIl5AooMSITzojdAQqxt021YtvxjtxIQ== + dependencies: + "@aws-sdk/types" "3.598.0" + "@smithy/property-provider" "^3.1.1" + "@smithy/protocol-http" "^4.0.1" + "@smithy/signature-v4" "^3.1.0" + "@smithy/types" "^3.1.0" + "@smithy/util-middleware" "^3.0.1" tslib "^2.6.2" -"@aws-sdk/middleware-ssec@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.577.0.tgz#9fcd74e8bf2c277b4349c537cbeceba279166f32" - integrity sha512-i2BPJR+rp8xmRVIGc0h1kDRFcM2J9GnClqqpc+NLSjmYadlcg4mPklisz9HzwFVcRPJ5XcGf3U4BYs5G8+iTyg== +"@aws-sdk/middleware-ssec@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.598.0.tgz#d6a3c64ce77bd7379653b46b58ded32a7b0fe6f4" + integrity sha512-f0p2xP8IC1uJ5e/tND1l81QxRtRFywEdnbtKCE0H6RSn4UIt2W3Dohe1qQDbnh27okF0PkNW6BJGdSAz3p7qbA== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.598.0" + "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-user-agent@3.587.0": - version "3.587.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.587.0.tgz#2a68900cfb29afbae2952d901de4fcb91850bd3d" - integrity sha512-SyDomN+IOrygLucziG7/nOHkjUXES5oH5T7p8AboO8oakMQJdnudNXiYWTicQWO52R51U6CR27rcMPTGeMedYA== +"@aws-sdk/middleware-user-agent@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.598.0.tgz#6fa26849d256434ca4884c42c1c4755aa2f1556e" + integrity sha512-4tjESlHG5B5MdjUaLK7tQs/miUtHbb6deauQx8ryqSBYOhfHVgb1ZnzvQR0bTrhpqUg0WlybSkDaZAICf9xctg== dependencies: - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-endpoints" "3.587.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.598.0" + "@aws-sdk/util-endpoints" "3.598.0" + "@smithy/protocol-http" "^4.0.1" + "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@aws-sdk/region-config-resolver@3.587.0": - version "3.587.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.587.0.tgz#ad1c15494f44dfc4c7a7bce389f8b128dace923f" - integrity sha512-93I7IPZtulZQoRK+O20IJ4a1syWwYPzoO2gc3v+/GNZflZPV3QJXuVbIm0pxBsu0n/mzKGUKqSOLPIaN098HcQ== +"@aws-sdk/region-config-resolver@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.598.0.tgz#fd8fd6b7bc11b5f81def4db0db9e835d40a8f86e" + integrity sha512-oYXhmTokSav4ytmWleCr3rs/1nyvZW/S0tdi6X7u+dLNL5Jee+uMxWGzgOrWK6wrQOzucLVjS4E/wA11Kv2GTw== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/node-config-provider" "^3.1.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.598.0" + "@smithy/node-config-provider" "^3.1.1" + "@smithy/types" "^3.1.0" "@smithy/util-config-provider" "^3.0.0" - "@smithy/util-middleware" "^3.0.0" + "@smithy/util-middleware" "^3.0.1" tslib "^2.6.2" -"@aws-sdk/signature-v4-multi-region@3.587.0": - version "3.587.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.587.0.tgz#f8bb6de9135f3fafab04b9220409cd0d0549b7d8" - integrity sha512-TR9+ZSjdXvXUz54ayHcCihhcvxI9W7102J1OK6MrLgBlPE7uRhAx42BR9L5lLJ86Xj3LuqPWf//o9d/zR9WVIg== +"@aws-sdk/signature-v4-multi-region@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.598.0.tgz#1716022e31dcbc5821aeca85204718f523a1ddbf" + integrity sha512-1r/EyTrO1gSa1FirnR8V7mabr7gk+l+HkyTI0fcTSr8ucB7gmYyW6WjkY8JCz13VYHFK62usCEDS7yoJoJOzTA== dependencies: - "@aws-sdk/middleware-sdk-s3" "3.587.0" - "@aws-sdk/types" "3.577.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/signature-v4" "^3.0.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/middleware-sdk-s3" "3.598.0" + "@aws-sdk/types" "3.598.0" + "@smithy/protocol-http" "^4.0.1" + "@smithy/signature-v4" "^3.1.0" + "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@aws-sdk/token-providers@3.587.0": - version "3.587.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.587.0.tgz#f9fd2ddfc554c1370f8d0f467c76a4c8cb904ae6" - integrity sha512-ULqhbnLy1hmJNRcukANBWJmum3BbjXnurLPSFXoGdV0llXYlG55SzIla2VYqdveQEEjmsBuTZdFvXAtNpmS5Zg== +"@aws-sdk/token-providers@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.598.0.tgz#49a94c14ce2e392bb0e84b69986c33ecfad5b804" + integrity sha512-TKY1EVdHVBnZqpyxyTHdpZpa1tUpb6nxVeRNn1zWG8QB5MvH4ALLd/jR+gtmWDNQbIG4cVuBOZFVL8hIYicKTA== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/property-provider" "^3.1.0" - "@smithy/shared-ini-file-loader" "^3.1.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.598.0" + "@smithy/property-provider" "^3.1.1" + "@smithy/shared-ini-file-loader" "^3.1.1" + "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@aws-sdk/types@3.577.0", "@aws-sdk/types@^3.222.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.577.0.tgz#7700784d368ce386745f8c340d9d68cea4716f90" - integrity sha512-FT2JZES3wBKN/alfmhlo+3ZOq/XJ0C7QOZcDNrpKjB0kqYoKjhVKZ/Hx6ArR0czkKfHzBBEs6y40ebIHx2nSmA== +"@aws-sdk/types@3.598.0", "@aws-sdk/types@^3.222.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.598.0.tgz#b840d2446dee19a2a4731e6166f2327915d846db" + integrity sha512-742uRl6z7u0LFmZwDrFP6r1wlZcgVPw+/TilluDJmCAR8BgRw3IR+743kUXKBGd8QZDRW2n6v/PYsi/AWCDDMQ== dependencies: - "@smithy/types" "^3.0.0" + "@smithy/types" "^3.1.0" tslib "^2.6.2" "@aws-sdk/util-arn-parser@3.568.0": @@ -652,14 +625,14 @@ dependencies: tslib "^2.6.2" -"@aws-sdk/util-endpoints@3.587.0": - version "3.587.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.587.0.tgz#781e0822a95dba15f7ac8f22a6f6d7f0c8819818" - integrity sha512-8I1HG6Em8wQWqKcRW6m358mqebRVNpL8XrrEoT4In7xqkKkmYtHRNVYP6lcmiQh5pZ/c/FXu8dSchuFIWyEtqQ== +"@aws-sdk/util-endpoints@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.598.0.tgz#7f78d68524babac7fdacf381590470353d45b959" + integrity sha512-Qo9UoiVVZxcOEdiOMZg3xb1mzkTxrhd4qSlg5QQrfWPJVx/QOg+Iy0NtGxPtHtVZNHZxohYwDwV/tfsnDSE2gQ== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/types" "^3.0.0" - "@smithy/util-endpoints" "^2.0.1" + "@aws-sdk/types" "3.598.0" + "@smithy/types" "^3.1.0" + "@smithy/util-endpoints" "^2.0.2" tslib "^2.6.2" "@aws-sdk/util-locate-window@^3.0.0": @@ -669,39 +642,32 @@ dependencies: tslib "^2.6.2" -"@aws-sdk/util-user-agent-browser@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.577.0.tgz#d4d2cdb3a2b3d1c8b35f239ee9f7b2c87bee66ea" - integrity sha512-zEAzHgR6HWpZOH7xFgeJLc6/CzMcx4nxeQolZxVZoB5pPaJd3CjyRhZN0xXeZB0XIRCWmb4yJBgyiugXLNMkLA== +"@aws-sdk/util-user-agent-browser@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.598.0.tgz#5039d0335f8a06af5be73c960df85009dda59090" + integrity sha512-36Sxo6F+ykElaL1mWzWjlg+1epMpSe8obwhCN1yGE7Js9ywy5U6k6l+A3q3YM9YRbm740sNxncbwLklMvuhTKw== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.598.0" + "@smithy/types" "^3.1.0" bowser "^2.11.0" tslib "^2.6.2" -"@aws-sdk/util-user-agent-node@3.587.0": - version "3.587.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.587.0.tgz#a6bf422f307a68e16a6c19ee5d731fcc32696fb9" - integrity sha512-Pnl+DUe/bvnbEEDHP3iVJrOtE3HbFJBPgsD6vJ+ml/+IYk1Eq49jEG+EHZdNTPz3SDG0kbp2+7u41MKYJHR/iQ== +"@aws-sdk/util-user-agent-node@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.598.0.tgz#f9bdf1b7cc3a40787c379f7c2ff028de2612c177" + integrity sha512-oyWGcOlfTdzkC6SVplyr0AGh54IMrDxbhg5RxJ5P+V4BKfcDoDcZV9xenUk9NsOi9MuUjxMumb9UJGkDhM1m0A== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/node-config-provider" "^3.1.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.598.0" + "@smithy/node-config-provider" "^3.1.1" + "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@aws-sdk/util-utf8-browser@^3.0.0": - version "3.259.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" - integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== - dependencies: - tslib "^2.3.1" - -"@aws-sdk/xml-builder@3.575.0": - version "3.575.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.575.0.tgz#233b2aae422dd789a078073032da1bc60317aa1d" - integrity sha512-cWgAwmbFYNCFzPwxL705+lWps0F3ZvOckufd2KKoEZUmtpVw9/txUXNrPySUXSmRTSRhoatIMABNfStWR043bQ== +"@aws-sdk/xml-builder@3.598.0": + version "3.598.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.598.0.tgz#ee591c5d80a34d9c5bc14326f1a62e9a0649c587" + integrity sha512-ZIa2RK7CHFTZ4gwK77WRtsZ6vF7xwRXxJ8KQIxK2duhoTVcn0xYxpFLdW9WZZZvdP9GIF3Loqvf8DRdeU5Jc7Q== dependencies: - "@smithy/types" "^3.0.0" + "@smithy/types" "^3.1.0" tslib "^2.6.2" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.8.3": @@ -3180,41 +3146,7 @@ resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.3.0.tgz#f451ba810a52d26c020e73d1d02d9110aef7e847" integrity sha512-M7e2zXGfTjH8NLiwqKLdWC9VlfMSQDYlI4/SM4OSpPqhUTfPlRPa+wNKNTG7perKfDXxE9ei8yjocujknXJk/A== -"@oclif/core@^3.22.0", "@oclif/core@^3.26.6": - version "3.27.0" - resolved "https://registry.yarnpkg.com/@oclif/core/-/core-3.27.0.tgz#a22a4ff4e5811db7a182b1687302237a57802381" - integrity sha512-Fg93aNFvXzBq5L7ztVHFP2nYwWU1oTCq48G0TjF/qC1UN36KWa2H5Hsm72kERd5x/sjy2M2Tn4kDEorUlpXOlw== - dependencies: - "@types/cli-progress" "^3.11.5" - ansi-escapes "^4.3.2" - ansi-styles "^4.3.0" - cardinal "^2.1.1" - chalk "^4.1.2" - clean-stack "^3.0.1" - cli-progress "^3.12.0" - color "^4.2.3" - debug "^4.3.5" - ejs "^3.1.10" - get-package-type "^0.1.0" - globby "^11.1.0" - hyperlinker "^1.0.0" - indent-string "^4.0.0" - is-wsl "^2.2.0" - js-yaml "^3.14.1" - minimatch "^9.0.4" - natural-orderby "^2.0.3" - object-treeify "^1.1.33" - password-prompt "^1.1.3" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - supports-color "^8.1.1" - supports-hyperlinks "^2.2.0" - widest-line "^3.1.0" - wordwrap "^1.0.0" - wrap-ansi "^7.0.0" - -"@oclif/core@^4": +"@oclif/core@^4", "@oclif/core@^4.0.0", "@oclif/core@^4.0.6": version "4.0.6" resolved "https://registry.yarnpkg.com/@oclif/core/-/core-4.0.6.tgz#05958a928591567b7fe90638e0ee8df9e07eb3ff" integrity sha512-z/4YUVQsf2pHsXRze5etbmvAYDhoUhIzpM6oJGEdsdWfvQJ6YQBogH7TdX/ItuGda6+vpfXg/4U1CtPexSF+bA== @@ -3237,17 +3169,17 @@ wordwrap "^1.0.0" wrap-ansi "^7.0.0" -"@oclif/plugin-help@^6.0.15", "@oclif/plugin-help@^6.2.0": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-6.2.2.tgz#d782f273693b19b6d78e7fbf696641d4ddfd8576" - integrity sha512-2n3QCeq0eaWR/RfwGaJ8LMbparsGktc63WNQfjBFLfGm7VLv3tR5JNYaUrMmL3zUd3emw1SObVXmH6oY0NPEnA== +"@oclif/plugin-help@^6.0.15", "@oclif/plugin-help@^6.2.2": + version "6.2.3" + resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-6.2.3.tgz#09e54a1816fe7c2ef02c8a40c59afc7754a6eaca" + integrity sha512-ogaCD2i6dmEgrrIKG8iV42o/s45EG53Q+dW/zeEhL8It9UdVDooXjXkZLPSyRS+CyrbK3it8Mwh08DrJxjZiqQ== dependencies: "@oclif/core" "^4" "@oclif/plugin-not-found@^3.2.3": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@oclif/plugin-not-found/-/plugin-not-found-3.2.4.tgz#c4e84983e1b36b3b5470f14aade0b10970dc1c33" - integrity sha512-dTOqfFJZCVVmDQXgJJqbTEgmc1Dguz6tWi2R3V0XlQoRljdEKq0ixk9D6g3Ty5cRr/C3NYlJozAErbCsxZnPcg== + version "3.2.5" + resolved "https://registry.yarnpkg.com/@oclif/plugin-not-found/-/plugin-not-found-3.2.5.tgz#f7db68c2684294f4261bdc9b12eee464b4597945" + integrity sha512-C3YgT46dQpVs0DkXECTVrlg8KeOzLAOXFpmCYMPQQU3siptliep2eESjXrFm9VL+jZijGJjyckwQgn/X5zq1LQ== dependencies: "@inquirer/confirm" "^3.1.9" "@oclif/core" "^4" @@ -3255,9 +3187,9 @@ fast-levenshtein "^3.0.0" "@oclif/plugin-warn-if-update-available@^3.0.19": - version "3.1.5" - resolved "https://registry.yarnpkg.com/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-3.1.5.tgz#8e8194139c7bca9e9a2e57fbe486d12af38eab79" - integrity sha512-WNWq1co1McIqxE/kovrslZfdIMNvaruaDgxflvN3JganabfBLMDfdsH9TalApkmtT8X9UBEZH/j9YUDNNMqLnw== + version "3.1.6" + resolved "https://registry.yarnpkg.com/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-3.1.6.tgz#354e04e43fdcb4abad733b979dc2a7e44e91d312" + integrity sha512-K/hKDUD1HOXJa89arqpzB5bqLO1+abiOgvQ3nIGnbO3yyVPsieBRD3yuv+ti7r/nUIroZnPYBlyNESL6W0/NaA== dependencies: "@oclif/core" "^4" ansis "^3.2.0" @@ -3265,14 +3197,13 @@ http-call "^5.2.2" lodash "^4.17.21" -"@oclif/test@^3.2.1": - version "3.2.15" - resolved "https://registry.yarnpkg.com/@oclif/test/-/test-3.2.15.tgz#aaddb08dee841c3d6f86bfbea2a798cae0c3f499" - integrity sha512-XqG3RosozNqySkxSXInU12Xec2sPSOkqYHJDfdFZiWG3a8Cxu4dnPiAQvms+BJsOlLQmfEQlSHqiyVUKOMHhXA== +"@oclif/test@^4.0.0": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@oclif/test/-/test-4.0.4.tgz#e7e16d9a3edf2d2b83c8066f3f08569b4aa84e4f" + integrity sha512-O0lGcUl6sq4ijgjPimbx32O6DPCoHknzrNsA+X+XzWD9DsEv0SK6Tib2+22cOqLzLItr+gU73pIYttiD5+UWag== dependencies: - "@oclif/core" "^3.26.6" - chai "^4.4.1" - fancy-test "^3.0.15" + ansis "^3.2.0" + debug "^4.3.5" "@octokit/auth-token@^3.0.0": version "3.0.4" @@ -3667,13 +3598,6 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz#719df7fb41766bc143369eaa0dd56d8dc87c9958" integrity sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg== -"@sinonjs/commons@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" - integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== - dependencies: - type-detect "4.0.8" - "@sinonjs/commons@^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" @@ -3681,34 +3605,13 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^10.0.2", "@sinonjs/fake-timers@^10.3.0": +"@sinonjs/fake-timers@^10.0.2": version "10.3.0" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: "@sinonjs/commons" "^3.0.0" -"@sinonjs/fake-timers@^11.2.2": - version "11.2.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz#50063cc3574f4a27bd8453180a04171c85cc9699" - integrity sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@sinonjs/samsam@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.0.tgz#0d488c91efb3fa1442e26abea81759dfc8b5ac60" - integrity sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew== - dependencies: - "@sinonjs/commons" "^2.0.0" - lodash.get "^4.4.2" - type-detect "^4.0.8" - -"@sinonjs/text-encoding@^0.7.2": - version "0.7.2" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" - integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== - "@smithy/abort-controller@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-3.0.1.tgz#bb8debe1c23ca62a61b33a9ee2918f5a79d81928" @@ -3732,7 +3635,7 @@ dependencies: tslib "^2.6.2" -"@smithy/config-resolver@^3.0.1", "@smithy/config-resolver@^3.0.2": +"@smithy/config-resolver@^3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-3.0.2.tgz#ad19331d48d9a6e67bdd43a0099e1d8af1b82a82" integrity sha512-wUyG6ezpp2sWAvfqmSYTROwFUmJqKV78GLf55WODrosBcT0BAMd9bOLO4HRhynWBgAobPml2cF9ZOdgCe00r+g== @@ -3743,7 +3646,7 @@ "@smithy/util-middleware" "^3.0.1" tslib "^2.6.2" -"@smithy/core@^2.2.0": +"@smithy/core@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@smithy/core/-/core-2.2.1.tgz#92ed71eb96ef16d5ac8b23dbdf913bcb225ab875" integrity sha512-R8Pzrr2v2oGUoj4CTZtKPr87lVtBsz7IUBGhSwS1kc6Cj0yPwNdYbkzhFsxhoDE9+BPl09VN/6rFsW9GJzWnBA== @@ -3757,7 +3660,7 @@ "@smithy/util-middleware" "^3.0.1" tslib "^2.6.2" -"@smithy/credential-provider-imds@^3.1.0", "@smithy/credential-provider-imds@^3.1.1": +"@smithy/credential-provider-imds@^3.1.1": version "3.1.1" resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-3.1.1.tgz#8b2b3c9e7e67fd9e3e436a5e1db6652ab339af7b" integrity sha512-htndP0LwHdE3R3Nam9ZyVWhwPYOmD4xCL79kqvNxy8u/bv0huuy574CSiRY4cvEICgimv8jlVfLeZ7zZqbnB2g== @@ -3778,7 +3681,7 @@ "@smithy/util-hex-encoding" "^3.0.0" tslib "^2.6.2" -"@smithy/eventstream-serde-browser@^3.0.0": +"@smithy/eventstream-serde-browser@^3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.2.tgz#342fbdbdf99f8fb7c247024716c5236bffae043e" integrity sha512-6147vdedQGaWn3Nt4P1KV0LuV8IH4len1SAeycyko0p8oRLWFyYyx0L8JHGclePDSphkjxZqBHtyIfyupCaTGg== @@ -3787,7 +3690,7 @@ "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@smithy/eventstream-serde-config-resolver@^3.0.0": +"@smithy/eventstream-serde-config-resolver@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.1.tgz#74e9cb3992edc03319ffa05eb6008aacaaca4f71" integrity sha512-6+B8P+5Q1mll4u7IoI7mpmYOSW3/c2r3WQoYLdqOjbIKMixJFGmN79ZjJiNMy4X2GZ4We9kQ6LfnFuczSlhcyw== @@ -3795,7 +3698,7 @@ "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@smithy/eventstream-serde-node@^3.0.0": +"@smithy/eventstream-serde-node@^3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.2.tgz#fff9e92983c97f07174c1bbcf7f1af47fc478a6e" integrity sha512-DLtmGAfqxZAql8rB+HqyPlUne22u3EEVj+hxlUjgXk0hXt+SfLGK0ljzRFmiWQ3qGpHu1NdJpJA9e5JE/dJxFw== @@ -3813,7 +3716,7 @@ "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@smithy/fetch-http-handler@^3.0.1", "@smithy/fetch-http-handler@^3.0.2": +"@smithy/fetch-http-handler@^3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-3.0.2.tgz#eff4056e819b3591d1c5d472ee58c2981886920a" integrity sha512-0nW6tLK0b7EqSsfKvnOmZCgJqnodBAnvqcrlC5dotKfklLedPTRGsQamSVbVDWyuU/QGg+YbZDJUQ0CUufJXZQ== @@ -3824,7 +3727,7 @@ "@smithy/util-base64" "^3.0.0" tslib "^2.6.2" -"@smithy/hash-blob-browser@^3.0.0": +"@smithy/hash-blob-browser@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.0.tgz#0002113c3214e1d4fef2c489ac7b15d0b141d2af" integrity sha512-lKEHDN6bLzYdx5cFmdMHfYVmmTZTmjphwPBSumgkaniEYwRAXnbDEGETeuzfquS9Py1aH6cmqzXWxxkD7mV3sA== @@ -3834,7 +3737,7 @@ "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@smithy/hash-node@^3.0.0": +"@smithy/hash-node@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-3.0.1.tgz#52924bcbd6a02c7f7e2d9c332f59d5adc09688a3" integrity sha512-w2ncjgk2EYO2+WhAsSQA8owzoOSY7IL1qVytlwpnL1pFGWTjIoIh5nROkEKXY51unB63bMGZqDiVoXaFbyKDlg== @@ -3844,7 +3747,7 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@smithy/hash-stream-node@^3.0.0": +"@smithy/hash-stream-node@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-3.1.0.tgz#80fbd12b223869862e6ab3aecc5a8fb7064b884e" integrity sha512-OkU9vjN17yYsXTSrouctZn2iYwG4z8WSc7F50+9ogG2crOtMopkop+22j35tX2ry2i/vLRCYgnqEmBWfvnYT2g== @@ -3853,7 +3756,7 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@smithy/invalid-dependency@^3.0.0": +"@smithy/invalid-dependency@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-3.0.1.tgz#921787acfbe136af7ded46ae6f4b3d81c9b7e05e" integrity sha512-RSNF/32BKygXKKMyS7koyuAq1rcdW5p5c4EFa77QenBFze9As+JiRnV9OWBh2cB/ejGZalEZjvIrMLHwJl7aGA== @@ -3875,7 +3778,7 @@ dependencies: tslib "^2.6.2" -"@smithy/md5-js@^3.0.0": +"@smithy/md5-js@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-3.0.1.tgz#796dca16509f66da5ba380120efdbbbfc4d1ab5d" integrity sha512-wQa0YGsR4Zb1GQLGwOOgRAbkj22P6CFGaFzu5bKk8K4HVNIC2dBlIxqZ/baF0pLiSZySAPdDZT7CdZ7GkGXt5A== @@ -3884,7 +3787,7 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@smithy/middleware-content-length@^3.0.0": +"@smithy/middleware-content-length@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-3.0.1.tgz#90bce78dfd0db978df7920ae58e420ce9ed2f79a" integrity sha512-6QdK/VbrCfXD5/QolE2W/ok6VqxD+SM28Ds8iSlEHXZwv4buLsvWyvoEEy0322K/g5uFgPzBmZjGqesTmPL+yQ== @@ -3893,7 +3796,7 @@ "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@smithy/middleware-endpoint@^3.0.1", "@smithy/middleware-endpoint@^3.0.2": +"@smithy/middleware-endpoint@^3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-3.0.2.tgz#93bb575a25bb0bd5d1d18cd77157ccb2ba15112a" integrity sha512-gWEaGYB3Bei17Oiy/F2IlUPpBazNXImytoOdJ1xbrUOaJKAOiUhx8/4FOnYLLJHdAwa9PlvJ2ULda2f/Dnwi9w== @@ -3906,7 +3809,7 @@ "@smithy/util-middleware" "^3.0.1" tslib "^2.6.2" -"@smithy/middleware-retry@^3.0.3", "@smithy/middleware-retry@^3.0.4": +"@smithy/middleware-retry@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-3.0.4.tgz#4f1a23c218fe279659c3d88ec1c18bf19938eba6" integrity sha512-Tu+FggbLNF5G9L6Wi8o32Mg4bhlBInWlhhaFKyytGRnkfxGopxFVXJQn7sjZdFYJyTz6RZZa06tnlvavUgtoVg== @@ -3921,7 +3824,7 @@ tslib "^2.6.2" uuid "^9.0.1" -"@smithy/middleware-serde@^3.0.0", "@smithy/middleware-serde@^3.0.1": +"@smithy/middleware-serde@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-3.0.1.tgz#566ec46ee84873108c1cea26b3f3bd2899a73249" integrity sha512-ak6H/ZRN05r5+SR0/IUc5zOSyh2qp3HReg1KkrnaSLXmncy9lwOjNqybX4L4x55/e5mtVDn1uf/gQ6bw5neJPw== @@ -3929,7 +3832,7 @@ "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@smithy/middleware-stack@^3.0.0", "@smithy/middleware-stack@^3.0.1": +"@smithy/middleware-stack@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-3.0.1.tgz#9418f1295efda318c181bf3bca65173a75d133e5" integrity sha512-fS5uT//y1SlBdkzIvgmWQ9FufwMXrHSSbuR25ygMy1CRDIZkcBMoF4oTMYNfR9kBlVBcVzlv7joFdNrFuQirPA== @@ -3937,7 +3840,7 @@ "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@smithy/node-config-provider@^3.1.0", "@smithy/node-config-provider@^3.1.1": +"@smithy/node-config-provider@^3.1.1": version "3.1.1" resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-3.1.1.tgz#a361ab228d2229b03cc2fbdfd304055c38127614" integrity sha512-z5G7+ysL4yUtMghUd2zrLkecu0mTfnYlt5dR76g/HsFqf7evFazwiZP1ag2EJenGxNBDwDM5g8nm11NPogiUVA== @@ -3947,7 +3850,7 @@ "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@smithy/node-http-handler@^3.0.0", "@smithy/node-http-handler@^3.0.1": +"@smithy/node-http-handler@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-3.0.1.tgz#40e1ebe00aeb628a46a3a12b14ad6cabb69b576e" integrity sha512-hlBI6MuREA4o1wBMEt+QNhUzoDtFFvwR6ecufimlx9D79jPybE/r8kNorphXOi91PgSO9S2fxRjcKCLk7Jw8zA== @@ -3958,7 +3861,7 @@ "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@smithy/property-provider@^3.1.0", "@smithy/property-provider@^3.1.1": +"@smithy/property-provider@^3.1.1": version "3.1.1" resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-3.1.1.tgz#4849b69b83ac97e68e80d2dc0c2b98ce5950dffe" integrity sha512-YknOMZcQkB5on+MU0DvbToCmT2YPtTETMXW0D3+/Iln7ezT+Zm1GMHhCW1dOH/X/+LkkQD9aXEoCX/B10s4Xdw== @@ -3966,7 +3869,7 @@ "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@smithy/protocol-http@^4.0.0", "@smithy/protocol-http@^4.0.1": +"@smithy/protocol-http@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-4.0.1.tgz#7b57080565816f229d2391726f537e13371c7e38" integrity sha512-eBhm9zwcFPEazc654c0BEWtxYAzrw+OhoSf5pkwKzfftWKXRoqEhwOE2Pvn30v0iAdo7Mfsfb6pi1NnZlGCMpg== @@ -3998,7 +3901,7 @@ dependencies: "@smithy/types" "^3.1.0" -"@smithy/shared-ini-file-loader@^3.1.0", "@smithy/shared-ini-file-loader@^3.1.1": +"@smithy/shared-ini-file-loader@^3.1.1": version "3.1.1" resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.1.tgz#752ecd8962a660ded75d25341a48feb94f145a6f" integrity sha512-nD6tXIX2126/P9e3wqRY1bm9dTtPZwRDyjVOd18G28o+1UOG+kOVgUwujE795HslSuPlEgqzsH5sgNP1hDjj9g== @@ -4006,7 +3909,7 @@ "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@smithy/signature-v4@^3.0.0": +"@smithy/signature-v4@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-3.1.0.tgz#cc819568c4fcbadce107901680a96e662bccc86a" integrity sha512-m0/6LW3IQ3/JBcdhqjpkpABPTPhcejqeAn0U877zxBdNLiWAnG2WmCe5MfkUyVuvpFTPQnQwCo/0ZBR4uF5kxg== @@ -4019,7 +3922,7 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@smithy/smithy-client@^3.1.1", "@smithy/smithy-client@^3.1.2": +"@smithy/smithy-client@^3.1.2": version "3.1.2" resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-3.1.2.tgz#1c27ab4910bbfd6c0bc04ddd8412494e7a7daba7" integrity sha512-f3eQpczBOFUtdT/ptw2WpUKu1qH1K7xrssrSiHYtd9TuLXkvFqb88l9mz9FHeUVNSUxSnkW1anJnw6rLwUKzQQ== @@ -4031,14 +3934,14 @@ "@smithy/util-stream" "^3.0.2" tslib "^2.6.2" -"@smithy/types@^3.0.0", "@smithy/types@^3.1.0": +"@smithy/types@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.1.0.tgz#e2eb2e2130026a8a0631b2605c17df1975aa99d6" integrity sha512-qi4SeCVOUPjhSSZrxxB/mB8DrmuSFUcJnD9KXjuP+7C3LV/KFV4kpuUSH3OHDZgQB9TEH/1sO/Fq/5HyaK9MPw== dependencies: tslib "^2.6.2" -"@smithy/url-parser@^3.0.0", "@smithy/url-parser@^3.0.1": +"@smithy/url-parser@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-3.0.1.tgz#5451fc7034e9eda112696d1a9508746a7f8b0521" integrity sha512-G140IlNFlzYWVCedC4E2d6NycM1dCUbe5CnsGW1hmGt4hYKiGOw0v7lVru9WAn5T2w09QEjl4fOESWjGmCvVmg== @@ -4093,7 +3996,7 @@ dependencies: tslib "^2.6.2" -"@smithy/util-defaults-mode-browser@^3.0.3": +"@smithy/util-defaults-mode-browser@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.4.tgz#4392db3d96aa08ae161bb987ecfedc094d84b88d" integrity sha512-sXtin3Mue3A3xo4+XkozpgPptgmRwvNPOqTvb3ANGTCzzoQgAPBNjpE+aXCINaeSMXwHmv7E2oEn2vWdID+SAQ== @@ -4104,7 +4007,7 @@ bowser "^2.11.0" tslib "^2.6.2" -"@smithy/util-defaults-mode-node@^3.0.3": +"@smithy/util-defaults-mode-node@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.4.tgz#794b8bb3facb5f6581af8d02fcf1b42b34c103e5" integrity sha512-CUF6TyxLh3CgBRVYgZNOPDfzHQjeQr0vyALR6/DkQkOm7rNfGEzW1BRFi88C73pndmfvoiIT7ochuT76OPz9Dw== @@ -4117,7 +4020,7 @@ "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@smithy/util-endpoints@^2.0.1": +"@smithy/util-endpoints@^2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-2.0.2.tgz#f995cca553569af43bef82f59d63b4969516df95" integrity sha512-4zFOcBFQvifd2LSD4a1dKvfIWWwh4sWNtS3oZ7mpob/qPPmJseqKB148iT+hWCDsG//TmI+8vjYPgZdvnkYlTg== @@ -4133,7 +4036,7 @@ dependencies: tslib "^2.6.2" -"@smithy/util-middleware@^3.0.0", "@smithy/util-middleware@^3.0.1": +"@smithy/util-middleware@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-3.0.1.tgz#3e0eabaf936e62651a0b9a7c7c3bbe43d3971c91" integrity sha512-WRODCQtUsO7vIvfrdxS8RFPeLKcewYtaCglZsBsedIKSUGIIvMlZT5oh+pCe72I+1L+OjnZuqRNpN2LKhWA4KQ== @@ -4141,7 +4044,7 @@ "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@smithy/util-retry@^3.0.0", "@smithy/util-retry@^3.0.1": +"@smithy/util-retry@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-3.0.1.tgz#24037ff87a314a1ac99f80da43f579ae2352fe18" integrity sha512-5lRtYm+8fNFEUTdqZXg5M4ppVp40rMIJfR1TpbHAhKQgPIDpWT+iYMaqgnwEbtpi9U1smyUOPv5Sg+M1neOBgw== @@ -4150,7 +4053,7 @@ "@smithy/types" "^3.1.0" tslib "^2.6.2" -"@smithy/util-stream@^3.0.1", "@smithy/util-stream@^3.0.2": +"@smithy/util-stream@^3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-3.0.2.tgz#ed1377bfe824d8acfc105ab2d17ec4f376382cb2" integrity sha512-n5Obp5AnlI6qHo8sbupwrcpBe6vFp4qkl0SRNuExKPNrH3ABAMG2ZszRTIUIv2b4AsFrCO+qiy4uH1Q3z1dxTA== @@ -4187,7 +4090,7 @@ "@smithy/util-buffer-from" "^3.0.0" tslib "^2.6.2" -"@smithy/util-waiter@^3.0.0": +"@smithy/util-waiter@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-3.0.1.tgz#62d8ff58374032aa8c7e573b1ca4234407c605bd" integrity sha512-wwnrVQdjQxvWGOAiLmqlEhENGCcDIN+XJ/+usPOgSZObAslrCXgKlkX7rNVwIWW2RhPguTKthvF+4AoO0Z6KpA== @@ -5017,12 +4920,7 @@ "@types/node" "*" "@types/responselike" "^1.0.0" -"@types/chai@*": - version "4.3.16" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.16.tgz#b1572967f0b8b60bf3f87fe1d854a5604ea70c82" - integrity sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ== - -"@types/cli-progress@^3.11.5", "@types/cli-progress@^3.9.2": +"@types/cli-progress@^3.9.2": version "3.11.5" resolved "https://registry.yarnpkg.com/@types/cli-progress/-/cli-progress-3.11.5.tgz#9518c745e78557efda057e3f96a5990c717268c3" integrity sha512-D4PbNRbviKyppS5ivBGyFO29POlySLmA2HyUFE4p5QGazAMM3CwkKWcvTl8gvElSuxRh6FPKL8XmidX873ou4g== @@ -5560,18 +5458,6 @@ resolved "https://registry.yarnpkg.com/@types/set-value/-/set-value-4.0.3.tgz#ac7f5f9715c95c7351e02832df672a112428e587" integrity sha512-tSuUcLl6kMzI+l0gG7FZ04xbIcynxNIYgWFj91LPAvRcn7W3L1EveXNdVjqFDgAZPjY1qCOsm8Sb1C70SxAPHw== -"@types/sinon@*": - version "17.0.3" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-17.0.3.tgz#9aa7e62f0a323b9ead177ed23a36ea757141a5fa" - integrity sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw== - dependencies: - "@types/sinonjs__fake-timers" "*" - -"@types/sinonjs__fake-timers@*": - version "8.1.5" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz#5fd3592ff10c1e9695d377020c033116cc2889f2" - integrity sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ== - "@types/sockjs@^0.3.36": version "0.3.36" resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" @@ -6152,7 +6038,7 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.3.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" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -6169,11 +6055,6 @@ ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -ansicolors@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" - integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== - ansis@^3.1.1, ansis@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.2.0.tgz#0e050c5be94784f32ffdac4b84fccba064aeae4b" @@ -6420,11 +6301,6 @@ assert@^2.1.0: object.assign "^4.1.4" util "^0.12.5" -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - ast-types@^0.16.1: version "0.16.1" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.16.1.tgz#7a9da1617c9081bc121faafe91711b4c8bb81da2" @@ -7089,32 +6965,11 @@ capital-case@^1.0.4: tslib "^2.0.3" upper-case-first "^2.0.2" -cardinal@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" - integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== - dependencies: - ansicolors "~0.3.2" - redeyed "~2.1.0" - case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== -chai@^4.3.4, chai@^4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" - integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.3" - deep-eql "^4.1.3" - get-func-name "^2.0.2" - loupe "^2.3.6" - pathval "^1.1.1" - type-detect "^4.0.8" - chalk@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" @@ -7181,13 +7036,6 @@ charenc@0.0.2: resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== -check-error@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" - integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== - dependencies: - get-func-name "^2.0.2" - chokidar@^3.4.2, chokidar@^3.5.3, chokidar@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" @@ -7300,7 +7148,7 @@ cli-highlight@^2.1.11: parse5-htmlparser2-tree-adapter "^6.0.0" yargs "^16.0.0" -cli-progress@^3.12.0, cli-progress@^3.9.0: +cli-progress@^3.9.0: version "3.12.0" resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.12.0.tgz#807ee14b66bcc086258e444ad0f19e7d42577942" integrity sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A== @@ -7432,32 +7280,16 @@ color-name@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.0.0, color-name@~1.1.4: +color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - color-support@^1.1.2, color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== -color@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" - integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== - dependencies: - color-convert "^2.0.1" - color-string "^1.9.0" - colord@^2.9.3: version "2.9.3" resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" @@ -8271,13 +8103,6 @@ dedent@^1.0.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== -deep-eql@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" - integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== - dependencies: - type-detect "^4.0.0" - deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -8474,7 +8299,7 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -diff@^5.1.0, diff@^5.2.0: +diff@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== @@ -8778,9 +8603,9 @@ electron-publish@24.13.1: mime "^2.5.2" electron-to-chromium@^1.4.796: - version "1.4.802" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.802.tgz#49b397eadc95a49b1ac33eebee146b8e5a93773f" - integrity sha512-TnTMUATbgNdPXVSHsxvNVSG0uEd6cSZsANjm8c9HbvflZVVn1yTRcmVXYT1Ma95/ssB/Dcd30AHweH2TE+dNpA== + version "1.4.803" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.803.tgz#cf55808a5ee12e2a2778bbe8cdc941ef87c2093b" + integrity sha512-61H9mLzGOCLLVsnLiRzCbc63uldP0AniRYPV3hbGVtONA1pI7qSGILdbofR7A8TMbOypDocEAjH/e+9k1QIe3g== electron-updater@^6.1.1: version "6.2.1" @@ -9489,21 +9314,6 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== -fancy-test@^3.0.15: - version "3.0.16" - resolved "https://registry.yarnpkg.com/fancy-test/-/fancy-test-3.0.16.tgz#13f60771421ea93de94b1a1cac185c18021553bf" - integrity sha512-y1xZFpyYbE2TMiT+agOW2Emv8gr73zvDrKKbcXc8L+gMyIVJFn71cc4ICfzu2zEXjHirpHpdDJN0JBX99wwDXQ== - dependencies: - "@types/chai" "*" - "@types/lodash" "*" - "@types/node" "*" - "@types/sinon" "*" - lodash "^4.17.13" - mock-stdin "^1.0.0" - nock "^13.5.4" - sinon "^16.1.3" - stdout-stderr "^0.1.9" - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -9799,9 +9609,9 @@ for-each@^0.3.3: is-callable "^1.1.3" foreground-child@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.0.tgz#5eb496c4ebf3bcc4572e8908a45a72f5a1d2d658" - integrity sha512-CrWQNaEl1/6WeZoarcM9LHupTo3RpZO2Pdk1vktwzPiQTsJnAKJmm3TACKeG5UZbWDfaH2AbvYxzP96y0MT7fA== + version "3.2.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" + integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== dependencies: cross-spawn "^7.0.0" signal-exit "^4.0.1" @@ -10020,11 +9830,6 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-func-name@^2.0.1, get-func-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== - get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" @@ -10810,11 +10615,6 @@ hyperdyperid@^1.2.0: resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b" integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== -hyperlinker@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e" - integrity sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ== - iconv-corefoundation@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a" @@ -11029,11 +10829,6 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - is-async-function@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" @@ -11957,7 +11752,7 @@ js-yaml@4.1.0, js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -js-yaml@^3.10.0, js-yaml@^3.13.1, js-yaml@^3.14.1: +js-yaml@^3.10.0, js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -12151,11 +11946,6 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: object.assign "^4.1.4" object.values "^1.1.6" -just-extend@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-6.2.0.tgz#b816abfb3d67ee860482e7401564672558163947" - integrity sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw== - keyboardevent-from-electron-accelerator@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-2.0.0.tgz#ace21b1aa4e47148815d160057f9edb66567c50c" @@ -12184,9 +11974,9 @@ kleur@^3.0.3: integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== launch-editor@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" - integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== + version "2.7.0" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.7.0.tgz#53ba12b3eb131edefee99acaef7850c40272273f" + integrity sha512-KAc66u6LxWL8MifQ94oG3YGKYWDwz/Gi0T15lN//GaQoZe08vQGFJxrXkPAeu50UXgvJPPaRKVGuP1TRUm/aHQ== dependencies: picocolors "^1.0.0" shell-quote "^1.8.1" @@ -12447,11 +12237,6 @@ lodash.escaperegexp@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" integrity sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw== -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" @@ -12477,7 +12262,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.4: +lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -12502,13 +12287,6 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -loupe@^2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" - integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== - dependencies: - get-func-name "^2.0.1" - lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -12734,13 +12512,13 @@ memfs@^3.1.2, memfs@^3.4.1, memfs@^3.4.12: fs-monkey "^1.0.4" memfs@^4.6.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.9.2.tgz#42e7b48207268dad8c9c48ea5d4952c5d3840433" - integrity sha512-f16coDZlTG1jskq3mxarwB+fGRrd0uXWt+o1WIhRfOwbXQZqUDsTVxQBFK9JjRQHblg8eAG2JSbprDXKjc7ijQ== + version "4.9.3" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.9.3.tgz#41a3218065fe3911d9eba836250c8f4e43f816bc" + integrity sha512-bsYSSnirtYTWi1+OPMFb0M048evMKyUYe0EbtuGQgq6BVQM1g1W8/KIUJCCvjgI/El0j6Q4WsmMiBwLUBSw8LA== dependencies: "@jsonjoy.com/json-pack" "^1.0.3" "@jsonjoy.com/util" "^1.1.2" - sonic-forest "^1.0.0" + tree-dump "^1.0.1" tslib "^2.0.0" "memoize-one@>=3.1.1 <6": @@ -13067,11 +12845,6 @@ mobx@^6.0.0, mobx@^6.6.0: resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.12.4.tgz#a1e176cd173bf45d3e5eb825eaff2c736c0a90cb" integrity sha512-uIymg89x+HmItX1p3MG+d09irn2k63J6biftZ5Ok+UpNojS1I3NJPLfcmJT9ANnUltNlHi+HQqrVyxiAN8ISYg== -mock-stdin@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mock-stdin/-/mock-stdin-1.0.0.tgz#efcfaf4b18077e14541742fd758b9cae4e5365ea" - integrity sha512-tukRdb9Beu27t6dN+XztSRHq9J0B/CoAOySGzHfn8UTfmqipA5yNT/sDUEyYdAV3Hpka6Wx6kOMxuObdOex60Q== - modify-values@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" @@ -13145,11 +12918,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -natural-orderby@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/natural-orderby/-/natural-orderby-2.0.3.tgz#8623bc518ba162f8ff1cdb8941d74deb0fdcc016" - integrity sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q== - negotiator@0.6.3, negotiator@^0.6.2, negotiator@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -13165,17 +12933,6 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^5.1.4: - version "5.1.9" - resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.9.tgz#0cb73b5e4499d738231a473cd89bd8afbb618139" - integrity sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww== - dependencies: - "@sinonjs/commons" "^3.0.0" - "@sinonjs/fake-timers" "^11.2.2" - "@sinonjs/text-encoding" "^0.7.2" - just-extend "^6.2.0" - path-to-regexp "^6.2.1" - no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -13184,7 +12941,7 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -nock@^13.2.1, nock@^13.5.4: +nock@^13.5.4: version "13.5.4" resolved "https://registry.yarnpkg.com/nock/-/nock-13.5.4.tgz#8918f0addc70a63736170fef7106a9721e0dc479" integrity sha512-yAyTfdeNJGGBFxWdzSKCBYxs5FxLbCg5X5Q4ets974hcQzG1+qCxvIyOo4j2Ry6MUlhWVMX4OoYDefAIIwupjw== @@ -13594,11 +13351,6 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-treeify@^1.1.33: - version "1.1.33" - resolved "https://registry.yarnpkg.com/object-treeify/-/object-treeify-1.1.33.tgz#f06fece986830a3cba78ddd32d4c11d1f76cdf40" - integrity sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A== - object.assign@^4.1.4, object.assign@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" @@ -13657,9 +13409,9 @@ obuf@^1.0.0, obuf@^1.1.2: integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== oclif@^4.0.0: - version "4.13.6" - resolved "https://registry.yarnpkg.com/oclif/-/oclif-4.13.6.tgz#804f991ef7f77c5d1d3592c0c16c45499ec6bfd4" - integrity sha512-PnBwhHp+9DiMsUbED0nv13mBGy4PDeDF0blcWfAkS8Uy9+SYgjA3rWxOk5edSdVSv2k2VdSCwitqmGWmOrfBNw== + version "4.13.7" + resolved "https://registry.yarnpkg.com/oclif/-/oclif-4.13.7.tgz#8d6b3f9068c4c0288ad0b45aa62e1936478b44b3" + integrity sha512-wK+5w8KTg5oxMA7QjSpeBAIAJuKcpK+74pD5exG6CHNKGFZ2kbFSp6kKiGcplIRM1V6KtM8T78jpfPVgpZQaLA== dependencies: "@aws-sdk/client-cloudfront" "^3.592.0" "@aws-sdk/client-s3" "^3.583.0" @@ -13667,7 +13419,7 @@ oclif@^4.0.0: "@inquirer/input" "^2.1.9" "@inquirer/select" "^2.3.5" "@oclif/core" "^4" - "@oclif/plugin-help" "^6.2.0" + "@oclif/plugin-help" "^6.2.2" "@oclif/plugin-not-found" "^3.2.3" "@oclif/plugin-warn-if-update-available" "^3.0.19" async-retry "^1.3.3" @@ -14060,14 +13812,6 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" -password-prompt@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/password-prompt/-/password-prompt-1.1.3.tgz#05e539f4e7ca4d6c865d479313f10eb9db63ee5f" - integrity sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw== - dependencies: - ansi-escapes "^4.3.2" - cross-spawn "^7.0.3" - path-browserify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" @@ -14134,11 +13878,6 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== -path-to-regexp@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.2.tgz#324377a83e5049cbecadc5554d6a63a9a4866b36" - integrity sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw== - path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -14161,11 +13900,6 @@ pathe@^1.1.2: resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - peek-stream@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/peek-stream/-/peek-stream-1.1.3.tgz#3b35d84b7ccbbd262fff31dc10da56856ead6d67" @@ -15177,13 +14911,6 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -redeyed@~2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" - integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== - dependencies: - esprima "~4.0.0" - reflect.getprototypeof@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" @@ -15832,13 +15559,6 @@ simple-get@^3.0.3: once "^1.3.1" simple-concat "^1.0.0" -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - simple-update-notifier@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" @@ -15846,18 +15566,6 @@ simple-update-notifier@2.0.0: dependencies: semver "^7.5.3" -sinon@^16.1.3: - version "16.1.3" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-16.1.3.tgz#b760ddafe785356e2847502657b4a0da5501fba8" - integrity sha512-mjnWWeyxcAf9nC0bXcPmiDut+oE8HYridTNzBbF98AYVLmWwGRp2ISEpyhYflG1ifILT+eNn3BmKUJPxjXUPlA== - dependencies: - "@sinonjs/commons" "^3.0.0" - "@sinonjs/fake-timers" "^10.3.0" - "@sinonjs/samsam" "^8.0.0" - diff "^5.1.0" - nise "^5.1.4" - supports-color "^7.2.0" - sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -15887,15 +15595,6 @@ slice-ansi@^3.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - slugify@^1.6.5: version "1.6.6" resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.6.tgz#2d4ac0eacb47add6af9e04d3be79319cbcc7924b" @@ -15958,13 +15657,6 @@ socks@^2.6.2, socks@^2.7.1: ip-address "^9.0.5" smart-buffer "^4.2.0" -sonic-forest@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sonic-forest/-/sonic-forest-1.0.3.tgz#81363af60017daba39b794fce24627dc412563cb" - integrity sha512-dtwajos6IWMEWXdEbW1IkEkyL2gztCAgDplRIX+OT5aRKnEd5e7r7YCxRgXZdhRP1FBdOBf8axeTPhzDv8T4wQ== - dependencies: - tree-dump "^1.0.0" - sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" @@ -16176,14 +15868,6 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -stdout-stderr@^0.1.9: - version "0.1.13" - resolved "https://registry.yarnpkg.com/stdout-stderr/-/stdout-stderr-0.1.13.tgz#54e3450f3d4c54086a49c0c7f8786a44d1844b6f" - integrity sha512-Xnt9/HHHYfjZ7NeQLvuQDyL1LnbsbddgMFKCuaQKwGCdJm8LnstZIXop+uOY36UR1UXXoHXfMbC1KlVdVd2JLA== - dependencies: - debug "^4.1.1" - strip-ansi "^6.0.0" - store2@^2.14.2: version "2.14.3" resolved "https://registry.yarnpkg.com/store2/-/store2-2.14.3.tgz#24077d7ba110711864e4f691d2af941ec533deb5" @@ -16439,28 +16123,20 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0, supports-color@^7.2.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" -supports-color@^8, supports-color@^8.0.0, supports-color@^8.1.1: +supports-color@^8, supports-color@^8.0.0: 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-hyperlinks@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" - integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.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" @@ -16782,7 +16458,7 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -tree-dump@^1.0.0: +tree-dump@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.0.1.tgz#b448758da7495580e6b7830d6b7834fca4c45b96" integrity sha512-WCkcRBVPSlHHq1dc/px9iOfqklvzCbdRwvlNfxGZsrHqf6aZttfPrd7DJTt6oR10dwUfpFFQeVTkPbBIZxX/YA== @@ -16837,7 +16513,7 @@ tsconfig-paths@^4.1.2, tsconfig-paths@^4.2.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.11.1, tslib@^1.13.0: +tslib@^1.13.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -16888,7 +16564,7 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.8: +type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==