diff --git a/.gitignore b/.gitignore index d4eaa4726..5c8742b25 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,11 @@ gulpfile.js /public/js/p3/widget/UserDetails.js # Auspice dist files -/public/js/auspice-custom/dist/ \ No newline at end of file +/public/js/auspice-custom/dist/ +# Vendored bvbrc_js_client. The bare `src/` and `test/` rules above are +# unanchored, so they match at any depth and would silently swallow this +# vendored package's own source. Re-include it explicitly; only its build +# dependencies stay ignored. +public/js/bvbrc_js_client/node_modules/ +!public/js/bvbrc_js_client/src/ +!public/js/bvbrc_js_client/test/ diff --git a/package-lock.json b/package-lock.json index 9e5bb51d7..2bb18225f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,6 @@ "axios": "^1.18.0", "body-parser": "^1.20.6", "braces": "^3.0.3", - "bvbrc_js_client": "github:bv-brc/bvbrc_js_client", "cookie-parser": "~1.4.6", "cytoscape": "^3.2.4", "cytoscape-cola": "^1.6.0", @@ -9116,14 +9115,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, - "node_modules/bvbrc_js_client": { - "version": "1.0.1", - "resolved": "git+ssh://git@github.com/bv-brc/bvbrc_js_client.git#3847d9c5bef285a86b8b32f8aadee0474574c0cf", - "license": "BSD-3-Clause", - "dependencies": { - "node-fetch": ">=2.6.1" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -10283,14 +10274,6 @@ "lodash": "^4.17.15" } }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "engines": { - "node": ">= 12" - } - }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -11818,28 +11801,6 @@ "node": ">= 10.18.1" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, "node_modules/figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", @@ -12070,17 +12031,6 @@ "node": ">= 6" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/formidable": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.5.tgz", @@ -15365,41 +15315,6 @@ "tslib": "^2.0.3" } }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -19239,14 +19154,6 @@ "node": ">=10.13.0" } }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "engines": { - "node": ">= 8" - } - }, "node_modules/webcola": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/webcola/-/webcola-3.4.0.tgz", diff --git a/package.json b/package.json index 2c3b4fc60..15d6a6bdf 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,6 @@ "axios": "^1.18.0", "body-parser": "^1.20.6", "braces": "^3.0.3", - "bvbrc_js_client": "github:bv-brc/bvbrc_js_client", "cookie-parser": "~1.4.6", "cytoscape": "^3.2.4", "cytoscape-cola": "^1.6.0", diff --git a/public/js/bvbrc_js_client b/public/js/bvbrc_js_client deleted file mode 120000 index 2a08190d2..000000000 --- a/public/js/bvbrc_js_client +++ /dev/null @@ -1 +0,0 @@ -../../node_modules/bvbrc_js_client \ No newline at end of file diff --git a/public/js/bvbrc_js_client/README.md b/public/js/bvbrc_js_client/README.md new file mode 100644 index 000000000..15612d309 --- /dev/null +++ b/public/js/bvbrc_js_client/README.md @@ -0,0 +1,268 @@ +# BV-BRC Javascript Client + +bvbrc_js_client is a javascript client library for accessing the BV-BRC Data API + +## Installation + +``` +npm install bvbrc_js_client +``` + +## Build + +Running a build will create a dist/bvbrc_client.js file that can be loaded independantly in the browser. This creates a 'BVBRCClient' class on the global (window) object when included in browser. + +``` +npm run build +``` + + +## Tests +``` +npm run test +``` + +## Instantiation + +### NodeJS + +``` +const Service = require('bvbrc_js_client') +const svc = new Service("https://patricbrc.org/api") +``` + +### Browser + +There is a pre-built standalone version of this library in the 'dist' folder. Of course, one may include the source in other JS projects and use those project's build tools to bundle with other software. + +``` + + + +``` + +The BVBRCCLient class takes the user's token as a second optional parameter, which is of course required when trying to access any private data. + +Additionally the BVBRCClient class can be instantiated with no parameters and later initialized with an endpoint and token. This allows lazy instantiation of the class so that it is easily integrated into the singleton pattern p3_web is currently using. + +``` + const svc = new BVBRCClient(); + + /* later */ + + svc.init(endpoint, token) + +``` + +If API calls are made while the class is not initialized, a `ClientNotInitialized` error will be thrown + +## Base API + +The base API call methods are `get`,`query`,and `getSchema`. Most other methods are built atop these. They are all data type independent and take the data type as the first parameter. The data type parameter is the SOLR collection name. The code contains a white list of valid data types and will throw an `InvalidDataType` error if an invalid one is provided. + +Most methods are asyncronous and will work using either `await` syntax or with Promises (e.g., `.then(callback)`). `await` syntax can only be used in `async` functions. + +### getSchema() + +`getSchema()` returns the SOLR schema associated with the provided data type +``` +var schema = await svc.getSchema('genome') +``` + +### get() + +`get()` retrieves a single item of the provided datatype. It uses the data type as its first parameter and its second parameter is the ID of the item to retrieve. The specific ID property for a data type is its SOLR unique key. It returns a single item. + +``` +# GET using async/await +var genome = await svc.get("genome","227377.26") +console.log(`Genome: ${genome}`) + +# GET using promises +svc.get("genome","227377.26").then((genome)=>{ + console.log(`Genome: ${genome}`) +}) +``` + +### query() + +`query()` takes the data_type, a query string, and an optional options object as parameters and returns a set of data. The query string defaults to expecting an RQL query, but may also accept a SOLR query if the `"query_lang"` option is set to `"solr"`. The default return type is `application/json` and this is mapped to a `QueryResult` object. This object contains two properties: `items` and `meta`. The metadata contains data such as `start` and `total_items`. `items` is the array of returned objects. + +The query method will automatically switch between `GET` requests and `POST` requests based on the size of the query. If the provided query is greater than 2000 characters, the `POST` will be used. Otherwise, `GET` will be used. This is transparent to the caller. + +#### Query Options + +- `query_lang` - `solr` or `rql` +- `limit` - Maximum number of records to return +- `start` - start/offset within query to begin returning records +- `accept` - Defaults to `application/json`. The appropriate transformers are available: + - `application/solr+json` + - `text/tsv` + - `text/csv` + - TODO: fill out the rest +- `select` - Array of columns to include in the response. By default the whole object is returned, this will limit the properties returned. + +>Note that `limit`,`start`, and `select` will automatically append data onto the query you provide. Adding the limit option, for example, will add &row=VALUE for a SOLR query and &limit(VALUE) for an RQL query. You may elect not to use these options and add these operators into the actual query yourself. + +``` +# QUERY with RQL using async/await +var result = await svc.query("genome","eq(genome_id,227377.26)") +console.log(`Query Metadata - Total Items: ${result.meta.total_items} Start: ${result.meta.start}`) +console.log("Genomes: ", result.items) + +# QUERY with RQL using promises +svc.query("genome","eq(genome_id,227377.26)").then((result)=>{ + console.log(`Query Metadata - Total Items: ${result.meta.total_items} Start: ${result.meta.start}`) + console.log("Genomes: ", result.items) +}) + +# QUERY with SOLR queries +var result = await svc.query("genome","genome_id:227377.26") +console.log(`Query Metadata - Total Items: ${result.meta.total_items} Start: ${result.meta.start}`) +console.log("Genomes: ", result.items) +``` + +## DataType Specific Methods + +In addition to the base methods described above, each of the specific data types also has associated wrapper methods. For example, `getGenome()` and `queryGenomes()`. These methods work the same as the `get()` and `query()` methods above, but do not require the first parameter or to know the solr collection name for specific data type. +``` +# Get Genome +const genome = await svc.getGenome("227377.26") + +# Queries for Genomes +const result = await svc.queryGenomes("eq(genome_id,227377.26)") +const result = await svc.queryGenomes("keyword(coxiella)",{limit: 10}) +const result = await svc.queryGenomes("coxiella",{limit: 10, start:5, query_lang: "solr"}) +``` + +## Extended API + +In addition to the base method calls and the common method calls for each data type, some specialized methods also exist. These may be simple shortcuts, specialized calls specific to a data type or they may be made up of a complex set of queries. If you add new methods, be sure to document them here and in the All Methods section below. + +- `getGenomeFeatures(,)` - Get the `genome_features` for a given set of genome IDs. Standard query options apply to the results. +- `getGenomeFeaturesByQuery(,,)` - Query for a set of genomes and then with that set of genomes find all of the `genome_features` filtered by the feature filter (if present). Standard query options apply to the final query. +- `getGenomeSequences(,)` - Get the `genome_sequences` for a given set of genome IDs. Standard query options apply to the results. +- `setGenomePermissions(, )` - Sets the provided permissions on the genomes identified by `` +- `solrPermsToObjs()` - Maps the permissions on provided genome objects to objects for processing. This is a synchronous method and does not communicate with the server. + +## All Methods + +- Base Methods + - `get(,)` + - `query(, , )` + - `getSchema()` +- Antibiotic + - `getAntibiotic()` + - `queryAntibiotics(, )` +- FeatureSequence + - `getFeatureSequence()` + - `queryFeatureSequences(, )` +- GeneOntologyRef + - `getGeneOntologyRef()` + - `queryGeneOntologyRefs(, )` +- GenomeAMR + - `getGenomeAMR()` + - `queryGenomeAMRs(, )` +- GenomeFeature + - `getGenomeFeature()` + - `queryGenomeFeatures(, )` + - `getGenomeFeatures(,)` + - `getGenomeFeaturesByQuery(,,)` +- GenomeSequence + - `getGenomeSequence()` + - `queryGenomeSequences(, )` + - `getGenomeSequences(,)` +- Genome + - `getGenome()` + - `queryGenomes(, )` + - `setGenomePermissions(, )` + - `solrPermsToObjs()` +- IDRef + - `getIDRef()` + - `queryIDRefs(, )` +- MiscNIAIDSGC + - `getMiscNIAIDSGC()` + - `queryMiscNIAIDSGCs(, )` +- Pathway + - `getPathway()` + - `queryPathways(, )` +- PathwayRef + - `getPathwayRef()` + - `queryPathwayRefs(, )` +- PPI + - `getPPI()` + - `queryPPIs(, )` +- ProteinFamilyRef + - `getProteinFamilyRef()` + - `queryProteinFamilyRefs(, )` +- SpecialtyGene + - `getSpecialtyGene()` + - `querySpecialtyGenes(, )` +- SpecialtyGeneRef + - `getSpecialtyGeneRef()` + - `querySpecialtyGeneRefs(, )` +- SpecialtyGeneEvidence + - `getSpecialtyGeneEvidence()` + - `querySpecialtyGeneEvidences(, )` +- Subsystem + - `getSubsystem()` + - `querySubsystems(, )` +- SubsystemRef + - `getSubsystemRef()` + - `querySubsystemRefs(, )` +- Taxonomy + - `getTaxonomy()` + - `queryTaxonomys(, )` +- TranscriptomicsExperiment + - `getTranscriptomicsExperiment()` + - `queryTranscriptomicsExperiments(, )` +- TranscriptomicsGene + - `getTranscriptomicsGene()` + - `queryTranscriptomicsGenes(, )` +- TranscriptomicsSample + - `getTranscriptomicsSample()` + - `queryTranscriptomicsSamples(, )` +--- + +## Vendored in BV-BRC-Web + +This directory was a symlink to `node_modules/bvbrc_js_client`, installed from +`github:bv-brc/bvbrc_js_client`. It is now vendored directly into this repo. + +Why: upstream has been dormant since 2021-08-10 (the pinned commit `3847d9c5` was +also HEAD of `main`), BV-BRC-Web is its only consumer, and 429 retry handling has +to be added to `src/index.js`. Patching a `node_modules` symlink target is not +possible from this repo, so the code lives here instead. + +**This copy is now the source of truth.** Upstream is not kept in sync. If another +consumer ever appears, port changes back rather than re-adding the dependency. + +### Rebuilding `dist/bvbrc_client.js` + +`dist/` is generated and **must not be hand-edited** — the next build silently +overwrites it. After changing anything under `src/`: + +```sh +cd public/js/bvbrc_js_client +npm install # devDeps only: browserify, tinyify, derequire +npm run build +``` + +`views/javascript.ejs` loads `dist/bvbrc_client.js` as a plain script tag, so the +bundle must be committed alongside the `src/` change. + +The bundle is self-contained: `node-fetch` is a build-time dependency only, and the +browser build uses the native `fetch`. + +### node-fetch is pinned to v2 on purpose + +The original `>=2.6.1` range resolved to node-fetch 3.x, which is ESM-only. +browserify cannot parse it, so `npm run build` failed — and because the build +pipes through `derequire`, the failure **truncated `dist/bvbrc_client.js` to +zero bytes** rather than leaving the previous bundle intact. Pinned to `^2.7.0` +(CJS), which is what the committed bundle has always been built against. + +If you change this, check `dist/` is non-empty afterwards; a broken build here +is silent until the page fails to load. diff --git a/public/js/bvbrc_js_client/dist/bvbrc_client.js b/public/js/bvbrc_js_client/dist/bvbrc_client.js new file mode 100644 index 000000000..931298592 --- /dev/null +++ b/public/js/bvbrc_js_client/dist/bvbrc_client.js @@ -0,0 +1 @@ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).BVBRCClient=e()}}((function(){var e={};(function(t){(function(){"use strict";var n=function(){if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if(void 0!==t)return t;throw new Error("unable to locate global object")}();e=e=n.fetch,n.fetch&&(e.default=n.fetch.bind(n)),e.Headers=n.Headers,e.Request=n.Request,e.Response=n.Response}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{});var t={};t.NotFound=class extends Error{constructor(e){super(e),this.name="NotFound"}},t.InvalidDataType=class extends Error{constructor(e){super(e),this.name="InvalidDataType"}},t.InvalidQueryLanguage=class extends Error{constructor(e){super(e),this.name="InvalidQueryLanguage"}},t.ClientNotInitialized=class extends Error{constructor(e){super(e),this.name="ClientNotInitialized"}};const n={429:!0,503:!0};function i(e,t){const n=function(e){const t=e.headers&&"function"==typeof e.headers.get?e.headers.get("Retry-After"):null,n=parseInt(t,10);return Number.isFinite(n)&&n>=0?n:void 0}(t),i=void 0!==n?n:2*2**e;return 1e3*Math.max(i,1)*(1+.3*Math.random())}function r(e,t){try{if("undefined"!=typeof window&&"function"==typeof window.require){const n=window.require("dojo/topic");n&&"function"==typeof n.publish&&n.publish(e,t)}}catch(n){}}var a={fetchWithBackoff:async function(t,a,s=3){let o=0,u=!1;try{for(;;){const c=await e(t,a);if(!n[c.status]||"undefined"!=typeof window&&window.App&&!window.App.enableThrottleRetry)return c;if(o>=s){const e=new Error("The server is currently busy. Please try again in a few minutes.");throw e.isThrottled=!0,e.status=c.status,r("/throttle/failed"),u=!1,e}const y=i(o,c);u||(u=!0,r("/throttle/active",{label:String(t)})),r("/throttle/retrying",{waitMs:y,attempt:o+1,label:String(t)}),o++,await new Promise(e=>setTimeout(e,y))}}finally{u&&r("/throttle/resolved")}},httpError:function(e){const t=new Error(`${e.status} ${e.statusText}`);return t.status=e.status,t.statusText=e.statusText,t}};const{fetchWithBackoff:s,httpError:o}=a;return class{constructor(e,t){this.initialized=!1,e&&this.init(e,t),this.dataTypes=["antibiotics","feature_sequence","gene_ontology_ref","genome","genome_amr","genome_feature","genome_sequence","id_ref","misc_niaid_sgc","pathway","pathway_ref","ppi","protein_family_ref","sp_gene","sp_gene_evidence","sp_gene_ref","subsystem","subsystem_ref","taxonomy","transcriptomics_experiment","transcriptomics_gene","transcriptomics_sample"]}checkInitialization(){if(!this.initialized)throw new t.ClientNotInitialized}init(e,t){if(!e)throw Error("Must provide endpont to initialize client");"/"===e.charAt(e.length-1)?this.endpoint=e.substring(0,e.length-1):this.endpoint=e,this.token=t,this.initialized=!0}async get(e,n){if(this.checkInitialization(),this.dataTypes.indexOf(e)<0)throw new t.InvalidDataType("Invalid Data Type: "+e);var i={headers:{accept:"application/json",authorization:this.token||""}};const r=await s(`${this.endpoint}/${e}/${encodeURIComponent(n)}`,i);if(!r.ok){if(404===r.status)throw new t.NotFound(`${e} ${n} not found`);throw o(r)}return r.json()}async query(e,n,i={}){if(this.checkInitialization(),this.dataTypes.indexOf(e)<0)throw Error("Invalid Data Type");var r,a={method:"POST",headers:{accept:i.accept||"application/json",authorization:this.token||""}};if(i.query_lang=i.query_lang||"rql",["rql","solr"].indexOf(i.query_lang)<0)throw t.InvalidQueryLanguage(i.query_lang+" is not a valid query lang. Must be 'rql' or 'solr'");switch(i.query_lang){case"solr":a.headers["content-type"]="application/solrquery+x-www-form-urlencoded",r="q="+n,i.limit&&(r=`${r}&rows=${i.limit}&start=${i.start||0}`),i.select&&(r=`${r}&fl=${i.select.join(",")}`);break;case"rql":default:a.headers["content-type"]="application/rqlquery+x-www-form-urlencoded",r=n,i.limit&&(r=`${r}&limit(${i.limit},${i.start||0})`),i.select&&(r=`${r}&select(${i.select.join(",")})`)}var u=`${this.endpoint}/${e}/`;r.length<2e3?(a.method="GET",u=`${u}?${r}`):a.body=r;var c=await s(u,a);if(!c.ok)throw o(c);switch(a.headers.accept){case"application/solr+json":return await c.json();case"application/json":var y=c.headers.get("content-range").split(" ")[1].split("/"),h=parseInt(y[1]),l={start:parseInt(y[0].split("-")[0]),total_items:h};return new class{constructor(e,t={}){this.items=e,this.start=t.start||0,this.total_items=t.total_items||this.length}}(await c.json(),l);default:return await c.text()}}async getSchema(e){if(this.checkInitialization(),this.dataTypes.indexOf(e)<0)throw Error("Invalid Data Type");return s(`${this.endpoint}/${e}/schema`,{method:"GET",headers:{accept:"application/json"}}).then(e=>{if(!e.ok)throw o(e);return e.json()})}async getGenome(e){return await this.get("genome",e)}async queryGenomes(e,t={}){return await this.query("genome",e,t)}async getGenomeFeature(e){return await this.get("genome_feature",e)}async getGenomeFeatures(e,t={}){return e instanceof Array||(e=[e]),this.queryGenomeFeatures(`in(genome_id,(${e.join(",")}))`,t)}async getGenomeFeaturesByQuery(e,n="",i={}){if(i.query_lang&&"rql"!=i.query_lang)throw t.InvalidQueryLanguage("getGenomeFeaturesByQuery currently only works with RQL queries and filters");var r=`in(genome_id,(${(await this.queryGenomes(e,{select:["genome_id"],limit:i.genome_limit||500})).items.map(e=>e.genome_id)}))`;return n&&(r=`${r}&${n}`),this.queryGenomeFeatures(r,i)}async queryGenomeFeatures(e,t={}){return await this.query("genome_feature",e,t)}async getGenomeSequence(e){return await this.get("genome_sequence",e)}async getGenomeSequences(e,t={}){return e instanceof Array||(e=[e]),this.queryGenomeSequences(`in(genome_id,(${e.join(",")}))`,t)}async getFeatureSequence(e){return await this.get("feature_sequence",e)}async queryFeatureSequences(e,t={}){return await this.query("feature_sequence",e,t)}async getGeneOntologyRef(e){return await this.get("gene_ontology_ref",e)}async queryGeneOntologyRefs(e,t={}){return await this.query("gene_ontology_ref",e,t)}async queryGenomeSequences(e,t={}){return await this.query("genome_sequence",e,t)}async getSpecialtyGene(e){return await this.get("sp_gene",e)}async querySpecialtyGenes(e,t={}){return await this.query("sp_gene",e,t)}async getAntibiotic(e){return await this.get("antibiotics",e)}async queryAntibiotics(e,t={}){return await this.query("antibiotics",e,t)}async getGenomeAMR(e){return await this.get("genome_amr",e)}async queryGenomeAMRs(e,t={}){return await this.query("genome_amr",e,t)}async getIDRef(e){return await this.get("id_ref",e)}async queryIDRefs(e,t={}){return await this.query("id_ref",e,t)}async getMiscNIAIDSGC(e){return await this.get("misc_niaid_sgc",e)}async queryMiscNIAIDSGCs(e,t={}){return await this.query("misc_niaid_sgc",e,t)}async getPathway(e){return await this.get("pathway",e)}async queryPathways(e,t={}){return await this.query("pathway",e,t)}async getPathwayRef(e){return await this.get("pathway_ref",e)}async queryPathwayRefs(e,t={}){return await this.query("pathway_ref",e,t)}async getPPI(e){return await this.get("ppi",e)}async queryPPIs(e,t={}){return await this.query("ppi",e,t)}async getProteinFamilyRef(e){return await this.get("protein_family_ref",e)}async queryProteinFamilyRefs(e,t={}){return await this.query("protein_family_ref",e,t)}async getSpecialtyGeneEvidence(e){return await this.get("sp_gene_evidence",e)}async querySpecialtyGeneEvidences(e,t={}){return await this.query("sp_gene_evidence",e,t)}async getSpecialtyGeneRef(e){return await this.get("sp_gene_ref",e)}async querySpecialtyGeneRefs(e,t={}){return await this.query("sp_gene_ref",e,t)}async getSubsystem(e){return await this.get("subsystem",e)}async querySubsystems(e,t={}){return await this.query("subsystem",e,t)}async getSubsystemRef(e){return await this.get("subsystem_ref",e)}async querySubsystemRefs(e,t={}){return await this.query("subsystem_ref",e,t)}async getTaxonomy(e){return await this.get("taxonomy",e)}async queryTaxonomys(e,t={}){return await this.query("taxonomy",e,t)}async getTranscriptomicsExperiment(e){return await this.get("transcriptomics_experiment",e)}async queryTranscriptomicsExperiments(e,t={}){return await this.query("transcriptomics_experiment",e,t)}async getTranscriptomicsGene(e){return await this.get("transcriptomics_gene",e)}async queryTranscriptomicsGenes(e,t={}){return await this.query("transcriptomics_gene",e,t)}async getTranscriptomicsSample(e){return await this.get("transcriptomics_sample",e)}async queryTranscriptomicsSamples(e,t={}){return await this.query("transcriptomics_sample",e,t)}async setGenomePermissions(e,t){if(this.checkInitialization(),!this.token)throw new Error("Missing token. Authorization required for setGenomePermissions");if(!e||!t)throw new Error("setGenomePermission expects id and permissions");var n=t.map((function(e){return{user:e.user,permission:this.permMapping(e.permission)}}),this);e=Array.isArray(e)?e:[e];const i={method:"POST",headers:{"content-type":"application/json",accept:"application/json",Authorization:this.token},body:JSON.stringify(n)};var r=await s(`${this.endpoint}/permissions/genome/${e.join(",")}`,i);if(!r.ok)throw o(r);return await r.json()}permMapping(e){return{"Can view":"read","Can edit":"write",Varies:"unchanged",r:"read",w:"write"}[e]}solrPermsToObjs(e){var t=[];return e.forEach((function(e){var n=e.user_read||[],i=e.user_write||[],r=i.map((function(e){return{user:e,perm:"Can edit"}})),a=n.filter((function(e){return-1==i.indexOf(e)})).map((function(e){return{user:e,perm:"Can view"}})).concat(r);t.push(a)})),t.reduce((function(e,t){return e.concat(t)}),[])}}})); \ No newline at end of file diff --git a/public/js/bvbrc_js_client/package-lock.json b/public/js/bvbrc_js_client/package-lock.json new file mode 100644 index 000000000..8f50d2c06 --- /dev/null +++ b/public/js/bvbrc_js_client/package-lock.json @@ -0,0 +1,4405 @@ +{ + "name": "bvbrc_js_client", + "version": "1.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "bvbrc_js_client", + "version": "1.0.1", + "license": "BSD-3-Clause", + "dependencies": { + "node-fetch": "^2.7.0" + }, + "devDependencies": { + "browserify": "^17.0.0", + "chai": "^4.3.4", + "derequire": "^2.1.1", + "mocha": ">=9.0.3", + "tinyify": "^3.0.0" + } + }, + "node_modules/@goto-bus-stop/common-shake": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@goto-bus-stop/common-shake/-/common-shake-2.4.1.tgz", + "integrity": "sha512-U77x9X3VXHQfuo8ncsQShFGnQ+DLSiHjaAKWyqyfIzcoddnOromP2SE615r1UmZdZTyc9DAZ4BYEBs2QQ1JwMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn-walk": "^7.0.0", + "debug": "^3.2.6", + "escope": "^3.6.0" + } + }, + "node_modules/@goto-bus-stop/common-shake/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@goto-bus-stop/envify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@goto-bus-stop/envify/-/envify-5.0.0.tgz", + "integrity": "sha512-xAnxuDWmwQxO8CgVuPTxKuNsKDfwyXXTyAabG4sNoK59H/ZMC7BHxTA/4ehtinsxbcH7/9L65F5VhyNdQfUyqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn-node": "^2.0.1", + "dash-ast": "^2.0.1", + "multisplice": "^1.0.0", + "through2": "^2.0.5" + }, + "bin": { + "envify": "bin/envify" + } + }, + "node_modules/@goto-bus-stop/envify/node_modules/acorn-node": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-2.0.1.tgz", + "integrity": "sha512-VLR5sHqjk+8c5hrKeP2fWaIHb8eewsoxnZ8r2qpwRHXMHuC7KyOPflnOx9dLssVQUurzJ7rO0OzIFjHcndafWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/@goto-bus-stop/envify/node_modules/dash-ast": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-2.0.1.tgz", + "integrity": "sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true, + "license": "BSD-3-Clause OR MIT", + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/argparse": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-3.0.3.tgz", + "integrity": "sha512-Sn98ftV3KfsO8xfLPHG6oT8y+b0yvbrLgZjgPDXsharNY15tTAjqIsIju4S32nl6/iEUNNE4v+yL2Zhm8ooP3w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "PSF-2.0" + }, + "node_modules/array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", + "dev": true, + "license": "MIT" + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", + "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/assert": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", + "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.4", + "util": "^0.10.4" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.5.tgz", + "integrity": "sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "JSONStream": "^1.0.3", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + }, + "bin": { + "browser-pack": "bin/cmd.js" + } + }, + "node_modules/browser-pack-flat": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/browser-pack-flat/-/browser-pack-flat-3.5.0.tgz", + "integrity": "sha512-u3iJUjs+TC/NGIL2GLyIcn5ppoNZXhTWqSW/gQbGIGvQiXXCQQzr5VWfACFraXQn2JrDlyRnKLeOs5AWXzKI6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "combine-source-map": "^0.8.0", + "convert-source-map": "^1.5.1", + "count-lines": "^0.1.2", + "dedent": "^0.7.0", + "estree-is-member-expression": "^1.0.0", + "estree-is-require": "^1.0.0", + "esutils": "^2.0.2", + "JSONStream": "^1.3.2", + "path-parse": "^1.0.5", + "scope-analyzer": "^2.0.0", + "stream-combiner": "^0.2.2", + "through2": "^3.0.1", + "transform-ast": "^2.4.2", + "umd": "^3.0.3", + "wrap-comment": "^1.0.0" + }, + "bin": { + "browser-pack-flat": "cli.js" + } + }, + "node_modules/browser-pack-flat/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/browser-pack-flat/node_modules/through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + }, + "node_modules/browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.17.0" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/browser-unpack": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/browser-unpack/-/browser-unpack-1.4.3.tgz", + "integrity": "sha512-vWNnNr19gS3RR76/Xrz2xFUUFumVu7tt0XRV1wikjDAmujGgz8Ly0J8CSOMoQP9JCZ/QGiOnhval6wLkctYALQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn-node": "^1.5.2", + "concat-stream": "^1.5.0", + "minimist": "^1.1.1" + }, + "bin": { + "browser-unpack": "bin/cmd.js" + } + }, + "node_modules/browserify": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.1.tgz", + "integrity": "sha512-pxhT00W3ylMhCHwG5yfqtZjNnFuX5h2IJdaBfSo4ChaaBsIp9VLrEMQ1bHV+Xr1uLPXuNDDM1GlJkjli0qkRsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.1", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^3.0.0", + "glob": "^7.1.0", + "hasown": "^2.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.2.1", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.2.3", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "^1.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum-object": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^3.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.12.0", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "browserify": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.6.tgz", + "integrity": "sha512-sd+Q65fjlWCYWtZKXiKfrUc8d+4jtp/8f0W2NkwzLtoW4bI6UDnWusLWIurHnmurW0XShIRxpwiOX4EoPtXUAg==", + "dev": true, + "license": "ISC", + "dependencies": { + "bn.js": "^5.2.3", + "browserify-rsa": "^4.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.6.1", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.9", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bundle-collapser": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/bundle-collapser/-/bundle-collapser-1.4.0.tgz", + "integrity": "sha512-Gd3K3+3KI1Utuk+gwAvuOVOjT/2XLGL8tU6FwDKk04LlOZkYfT0pwQllsG1Dv8RRhgcjNxZSDmmSXb0AOkwSwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-pack": "^6.0.2", + "browser-unpack": "^1.1.0", + "concat-stream": "^1.5.0", + "falafel": "^2.1.0", + "minimist": "^1.1.1", + "through2": "^2.0.0" + }, + "bin": { + "bundle-collapser": "bin/cmd.js" + } + }, + "node_modules/cached-path-relative": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", + "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-matcher": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-2.0.0.tgz", + "integrity": "sha512-CIDC5wZZfZ2VjZu849WQckS58Z3pJXFfRaSjNjgo/q3in5zxkhTwVL83vttgtmvyLG7TuDlLlBya7SKP6CjDIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-equal": "^1.0.0", + "espurify": "^2.0.0", + "estraverse": "^4.0.0" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "dev": true, + "license": "MIT", + "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.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/cipher-base": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", + "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/common-shakeify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/common-shakeify/-/common-shakeify-1.1.2.tgz", + "integrity": "sha512-r2zRKPCbCx1l9BT8nVGZssZXrH9jeLl5qfHKxUwSBT7Kr9l1jSjZsItZE/jXo+GYDyO3kQfsyV7Poid475MgWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@goto-bus-stop/common-shake": "^2.3.0", + "convert-source-map": "^1.5.1", + "through2": "^2.0.3", + "transform-ast": "^2.4.3", + "wrap-comment": "^1.0.1" + } + }, + "node_modules/common-shakeify/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/count-lines": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/count-lines/-/count-lines-0.1.2.tgz", + "integrity": "sha512-YS8P4UYXX/hrDyLU3r/A5OcCNwdNbJFJckbe8j+x2Jhxsr2J4/rYl0sDwOljLZL7Uxc4s7mRSNcQD8dSjobz+g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", + "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", + "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "dev": true, + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + }, + "bin": { + "deps-sort": "bin/cmd.js" + } + }, + "node_modules/derequire": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/derequire/-/derequire-2.1.1.tgz", + "integrity": "sha512-5hGVgKAEGhSGZM02abtkwDzqEOXun1dP9Ocw0yh7Pz7j70k4SNk7WURm93YyHbs2PcieRyX8m4ta1glGakw84Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "concat-stream": "^1.4.6", + "escope": "^3.6.0", + "through2": "^2.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "derequire": "bin/cmd.js" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/diff": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-9.0.0.tgz", + "integrity": "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", + "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", + "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "dev": true, + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==", + "dev": true, + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "node_modules/es6-set": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.6.tgz", + "integrity": "sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "es6-iterator": "~2.0.3", + "es6-symbol": "^3.1.3", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha512-75IUQsusDdalQEW/G/2esa87J7raqdJF+Ca0/Xm5C3Q58Nr4yVYjZGp/P1+2xiEVgXRrA39dpRb8LcshajbqDQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/espurify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/espurify/-/espurify-2.1.1.tgz", + "integrity": "sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-is-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-is-function/-/estree-is-function-1.0.0.tgz", + "integrity": "sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/estree-is-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-is-identifier/-/estree-is-identifier-1.0.0.tgz", + "integrity": "sha512-2BDRGrkQJV/NhCAmmE33A35WAaxq3WQaGHgQuD//7orGWfpFqj8Srkwvx0TH+20yIdOF1yMQwi8anv5ISec2AQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/estree-is-member-expression": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-is-member-expression/-/estree-is-member-expression-1.0.0.tgz", + "integrity": "sha512-Ec+X44CapIGExvSZN+pGkmr5p7HwUVQoPQSd458Lqwvaf4/61k/invHSh4BYK8OXnCkfEhWuIoG5hayKLQStIg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/estree-is-require": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-is-require/-/estree-is-require-1.0.0.tgz", + "integrity": "sha512-oWxQdSEmnUwNZsDQYiBNpVxKEhMmsJQSSxnDrwsr1MWtooCLfhgzsNGzmokdmfK0EzEIS5V4LPvqxv1Kmb1vvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "estree-is-identifier": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/falafel": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", + "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "isarray": "^2.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/falafel/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/from2-string/-/from2-string-1.1.0.tgz", + "integrity": "sha512-m8vCh+KnXXXBtfF2VUbiYlQ+nczLcntB0BrtNgpmLkHylhObe9WF1b2LZjBBzrZzA6P4mkEla6ZYQoOUTG8cYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "from2": "^2.0.3" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", + "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/inline-source-map": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.3.tgz", + "integrity": "sha512-1aVsPEsJWMJq/pdMU61CDlm1URcW702MTB4w9/zUjMus6H/Py8o7g68Pr9D4I6QluWGt/KdmswuRhaA05xVR1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.5.3" + } + }, + "node_modules/insert-module-globals": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", + "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + }, + "bin": { + "insert-module-globals": "bin/cmd.js" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.17.0.tgz", + "integrity": "sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.5.0.tgz", + "integrity": "sha512-paNr4LFIFPjeeSmwNYdrb8FafLLG/Cr2Af3GjbsHJ5CxIjH4r0c2emlmRdAtpPAieP1gRVzk6buBbVP5gBMGAg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^3.0.3" + }, + "bin": { + "js-yaml": "bin/js-yaml.mjs" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru-cache": { + "version": "11.5.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", + "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.23.2.tgz", + "integrity": "sha512-oIUZaAxbcxYIp4AyLafV6OVKoB3YouZs0UTCJ8mOKBHNyJgGDaMJ4TgA+VylJh6fx7EQCC52XkbURxxG9IoJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.1" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/merge-source-map": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "^0.5.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", + "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/minify-stream": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minify-stream/-/minify-stream-2.1.0.tgz", + "integrity": "sha512-P5xE4EQRkn7Td54VGcgfDMFx1jmKPPIXCdcMfrbXS6cNHK4dO1LXwtYFb48hHrSmZfT+jlGImvHgSZEkbpNtCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "concat-stream": "^2.0.0", + "convert-source-map": "^1.5.0", + "duplexify": "^4.1.1", + "from2-string": "^1.1.0", + "terser": "^4.7.0", + "xtend": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minify-stream/node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/minify-stream/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/minify-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true, + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-12.0.3.tgz", + "integrity": "sha512-beammieDdiWdkjANWeWPpkxUROYGi5FN88fPOkLiticz7HTg3Y+Pho3EYE6SUdcuWnZ3h2WD8EXCA55JF4o6wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-stdout": "^1.3.1", + "chokidar": "^5.0.0", + "debug": "^4.3.5", + "diff": "^9.0.0", + "find-up-simple": "^1.0.1", + "glob": "^13.0.0", + "is-path-inside": "^4.0.0", + "is-unicode-supported": "^0.1.0", + "js-yaml": "^5.0.0", + "minimatch": "^10.2.2", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^7.1.1", + "strip-json-comments": "^5.0.3", + "supports-color": "^8.1.1", + "workerpool": "^10.0.0" + }, + "bin": { + "mocha": "bin/mocha.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/mocha/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/module-deps": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", + "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-resolve": "^2.0.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.2.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "module-deps": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/multi-stage-sourcemap": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/multi-stage-sourcemap/-/multi-stage-sourcemap-0.2.1.tgz", + "integrity": "sha512-umaOM+8BZByZIB/ciD3dQLzTv50rEkkGJV78ta/tIVc/J/rfGZY5y1R+fBD3oTaolx41mK8rRcyGtYbDXlzx8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "^0.1.34" + } + }, + "node_modules/multi-stage-sourcemap/node_modules/source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "dev": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/multisplice": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/multisplice/-/multisplice-1.0.0.tgz", + "integrity": "sha512-KU5tVjIdTGsMb92JlWwEZCGrvtI1ku9G9GuNbWdQT/Ici1ztFXX0L8lWpbbC3pISVMfBNL56wdqplHvva2XSlA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/mutexify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mutexify/-/mutexify-1.4.0.tgz", + "integrity": "sha512-pbYSsOrSB/AKN5h/WzzLRMFgZhClWccf2XIB4RSMC8JbquiB0e0/SH5AIfdQMdyHmYtv4seU7yV/TvAwPLJ1Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "queue-tick": "^1.0.0" + } + }, + "node_modules/nanobench": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nanobench/-/nanobench-2.1.1.tgz", + "integrity": "sha512-z+Vv7zElcjN+OpzAxAquUayFLGK3JI/ubCl0Oh64YQqsTGG09CGqieJVQw4ui8huDnnAgrvTv93qi5UaOoNj8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^0.1.2", + "chalk": "^1.1.3", + "mutexify": "^1.1.0", + "pretty-hrtime": "^1.0.2" + }, + "bin": { + "nanobench": "run.js", + "nanobench-compare": "compare.js" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-platform": "~0.11.15" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.9.tgz", + "integrity": "sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "pbkdf2": "^3.1.5", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.7.tgz", + "integrity": "sha512-nS4mvFgVwUrecPTRdpdseM2fwpdfnX0/HibA8DgBRQtihUAzHQYJFU2l+OlEtiXtpqkrMvCPDwyXMUnASDt6Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "ripemd160": "^2.0.3", + "safe-buffer": "^5.2.1", + "sha.js": "^2.4.12", + "to-buffer": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", + "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.16.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.1.tgz", + "integrity": "sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true, + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "license": "ISC" + }, + "node_modules/resolve": { + "version": "1.22.13", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.13.tgz", + "integrity": "sha512-Dj/cW9zBV2aRj6XzCxuGIs3ESZKv02jixne3q6jFZYZ3/Tg09gHHviSMDL4kObh9pqSahdRHEnDoaP2gn8YLhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.17.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ripemd160": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", + "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.1.2", + "inherits": "^2.0.4" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ripemd160/node_modules/hash-base": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", + "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scope-analyzer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/scope-analyzer/-/scope-analyzer-2.1.2.tgz", + "integrity": "sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "array-from": "^2.1.1", + "dash-ast": "^2.0.1", + "es6-map": "^0.1.5", + "es6-set": "^0.1.5", + "es6-symbol": "^3.1.1", + "estree-is-function": "^1.0.0", + "get-assigned-identifiers": "^1.1.0" + } + }, + "node_modules/scope-analyzer/node_modules/dash-ast": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-2.0.1.tgz", + "integrity": "sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/serialize-javascript": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.1.2.tgz", + "integrity": "sha512-GL2BWwVa6JydKO6l/ljVgjAZF4QJ3S7dWDWi53s5GZT8PJzD2fNxi67HANQGKAqPrwEpL5ba7gUBGi0Ls/sEoQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "dev": true, + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shasum-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.1.tgz", + "integrity": "sha512-SsC+1tW7XKQ/94D4k1JhLmjDFpVGET/Nf54jVDtbavbALf8Zhp0Td9zTlxScjMW6nbEIrpADtPWfLk9iCXzHDQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "fast-safe-stringify": "^2.0.7" + }, + "bin": { + "shasum-object": "bin.js" + } + }, + "node_modules/shell-quote": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.12.0.tgz", + "integrity": "sha512-PcByqNyT/38F2kDNi006HAMRJaULuBzq/FOsw3qdZvX/GA9W/jamDaRskgHjubHiftXK5sIFxLNkvrXUwcof6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true, + "license": "MIT" + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", + "integrity": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.1.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn-node": "^1.2.0" + } + }, + "node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==", + "dev": true, + "dependencies": { + "process": "~0.11.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tinyify": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyify/-/tinyify-3.1.0.tgz", + "integrity": "sha512-r4tHoDkWhhoItWbxJ3KCHXask3hJN7gCUkR5PLfnQzQagTA6oDkzhCbiEDHkMqo7Ck7vVSA1pTP1gDc9p1AC1w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@goto-bus-stop/envify": "^5.0.0", + "acorn-node": "^1.8.2", + "browser-pack-flat": "^3.0.9", + "bundle-collapser": "^1.3.0", + "common-shakeify": "^1.1.1", + "dash-ast": "^1.0.0", + "minify-stream": "^2.0.1", + "multisplice": "^1.0.0", + "through2": "^3.0.1", + "uglifyify": "^5.0.0", + "unassertify": "^2.1.1" + } + }, + "node_modules/tinyify/node_modules/through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + }, + "node_modules/to-buffer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-buffer/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/transform-ast": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/transform-ast/-/transform-ast-2.4.4.tgz", + "integrity": "sha512-AxjeZAcIOUO2lev2GDe3/xZ1Q0cVGjIMk5IsriTy8zbWlsEnjeB025AhkhBJHoy997mXpLd4R+kRbvnnQVuQHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn-node": "^1.3.0", + "convert-source-map": "^1.5.1", + "dash-ast": "^1.0.0", + "is-buffer": "^2.0.0", + "magic-string": "^0.23.2", + "merge-source-map": "1.0.4", + "nanobench": "^2.1.1" + } + }, + "node_modules/transform-ast/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/transform-ast/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/uglifyify": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/uglifyify/-/uglifyify-5.0.2.tgz", + "integrity": "sha512-NcSk6pgoC+IgwZZ2tVLVHq+VNKSvLPlLkF5oUiHPVOJI0s/OlSVYEGXG9PCAH0hcyFZLyvt4KBdPAQBRlVDn1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "convert-source-map": "~1.1.0", + "minimatch": "^3.0.2", + "terser": "^3.7.5", + "through": "~2.3.4", + "xtend": "^4.0.1" + } + }, + "node_modules/uglifyify/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglifyify/node_modules/terser": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + }, + "bin": { + "terser": "bin/uglifyjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "dev": true, + "license": "MIT", + "bin": { + "umd": "bin/cli.js" + } + }, + "node_modules/unassert": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unassert/-/unassert-1.6.0.tgz", + "integrity": "sha512-GoMtWTwGSxSFuRD0NKmbjlx3VJkgvSogzDzMPpJXYmBZv6MIWButsyMqEYhMx3NI4osXACcZA9mXiBteXyJtRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^7.0.0", + "call-matcher": "^2.0.0", + "deep-equal": "^1.0.0", + "espurify": "^2.0.1", + "estraverse": "^4.1.0", + "esutils": "^2.0.2", + "object-assign": "^4.1.0" + } + }, + "node_modules/unassertify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/unassertify/-/unassertify-2.1.1.tgz", + "integrity": "sha512-YIAaIlc6/KC9Oib8cVZLlpDDhK1UTEuaDyx9BwD97xqxDZC0cJOqwFcs/Y6K3m73B5VzHsRTBLXNO0dxS/GkTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^5.1.0", + "convert-source-map": "^1.1.1", + "escodegen": "^1.6.1", + "multi-stage-sourcemap": "^0.2.1", + "through": "^2.3.7", + "unassert": "^1.3.1" + } + }, + "node_modules/unassertify/node_modules/acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + }, + "bin": { + "undeclared-identifiers": "bin.js" + } + }, + "node_modules/url": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/which-typed-array": { + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.24.tgz", + "integrity": "sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-10.0.3.tgz", + "integrity": "sha512-6z2Iis68Wqth93/G/wJP9u+R3O+d2XTlgWChGCwuT1qLbBsOYueGRZuJ++v3mtDP5KjYdy+WzvWC+VWETSVXJA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-comment": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrap-comment/-/wrap-comment-1.0.1.tgz", + "integrity": "sha512-APccrMwl/ont0RHFTXNAQfM647duYYEfs6cngrIyTByTI0xbWnDnPSptFZhS68L4WCjt2ZxuhCFwuY6Pe88KZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + } + } +} diff --git a/public/js/bvbrc_js_client/package.json b/public/js/bvbrc_js_client/package.json new file mode 100644 index 000000000..bab542112 --- /dev/null +++ b/public/js/bvbrc_js_client/package.json @@ -0,0 +1,26 @@ +{ + "name": "bvbrc_js_client", + "version": "1.0.1", + "homepage": "https://github.com/patric3/bvbrc_js_client#readme", + "license": "BSD-3-Clause", + "author": "Dustin Machi ", + "main": "src/index.js", + "repository": { + "type": "git", + "url": "https://github.com/patric3/bvbrc_js_client.git" + }, + "scripts": { + "test": "mocha -t 6000 ", + "build": "mkdir -p dist && ./node_modules/.bin/browserify -p tinyify src/index.js --standalone BVBRCClient | ./node_modules/.bin/derequire > dist/bvbrc_client.js" + }, + "dependencies": { + "node-fetch": "^2.7.0" + }, + "devDependencies": { + "browserify": "^17.0.0", + "chai": "^4.3.4", + "derequire": "^2.1.1", + "mocha": ">=9.0.3", + "tinyify": "^3.0.0" + } +} diff --git a/public/js/bvbrc_js_client/src/errors.js b/public/js/bvbrc_js_client/src/errors.js new file mode 100644 index 000000000..5f24f77d5 --- /dev/null +++ b/public/js/bvbrc_js_client/src/errors.js @@ -0,0 +1,32 @@ + +class NotFound extends Error { + constructor(message) { + super(message); + this.name = 'NotFound'; + } +} +module.exports.NotFound=NotFound + +class InvalidDataType extends Error { + constructor(message) { + super(message); + this.name = 'InvalidDataType'; + } +} +module.exports.InvalidDataType=InvalidDataType + +class InvalidQueryLanguage extends Error { + constructor(message) { + super(message); + this.name = 'InvalidQueryLanguage'; + } +} +module.exports.InvalidQueryLanguage=InvalidQueryLanguage + +class ClientNotInitialized extends Error { + constructor(message) { + super(message); + this.name = 'ClientNotInitialized'; + } +} +module.exports.ClientNotInitialized=ClientNotInitialized diff --git a/public/js/bvbrc_js_client/src/index.js b/public/js/bvbrc_js_client/src/index.js new file mode 100644 index 000000000..ab4af302a --- /dev/null +++ b/public/js/bvbrc_js_client/src/index.js @@ -0,0 +1,515 @@ +const fetch = require('node-fetch'); +const errors = require("./errors"); +const QueryResult = require("./query_result") +const { fetchWithBackoff, httpError } = require("./retry") + +class BVBRCAPIService { + constructor(endpoint, token) { + this.initialized=false + + if (endpoint) { + this.init(endpoint,token) + } + + this.dataTypes = ["antibiotics", "feature_sequence", "gene_ontology_ref", "genome", "genome_amr", "genome_feature", "genome_sequence", + "id_ref", "misc_niaid_sgc", "pathway", "pathway_ref", "ppi", "protein_family_ref", "sp_gene", "sp_gene_evidence", "sp_gene_ref", + "subsystem", "subsystem_ref", "taxonomy","transcriptomics_experiment", "transcriptomics_gene", "transcriptomics_sample"] + } + + checkInitialization(){ + if (!this.initialized){ + throw new errors.ClientNotInitialized() + } + } + + init(endpoint,token){ + if (!endpoint){ + throw Error("Must provide endpont to initialize client") + }else{ + if (endpoint.charAt(endpoint.length-1) === '/') { + this.endpoint = endpoint.substring(0,endpoint.length-1) + }else{ + this.endpoint = endpoint + } + } + + this.token=token + this.initialized=true + } + + async get(data_type, id) { + // base get for all data types + + this.checkInitialization() + if (this.dataTypes.indexOf(data_type) < 0) { + throw new errors.InvalidDataType(`Invalid Data Type: ${data_type}`) + } + + var req_opts = { + "headers": { + accept: "application/json", + authorization: this.token || '' + } + } + + const response = await fetchWithBackoff(`${this.endpoint}/${data_type}/${encodeURIComponent(id)}`, req_opts) + + if (!response.ok) { + if (response.status === 404) { + throw new errors.NotFound(`${data_type} ${id} not found`) + } + throw httpError(response); + } + return response.json() + } + + async query(data_type, query, options = {}) { + // base query function for all data types + // console.log(`query(${data_type},${query},${options})`); + // If the query is < 2k characters, it will use a GET request, otherwise + // a POST request. + + this.checkInitialization() + + if (this.dataTypes.indexOf(data_type) < 0) { + throw Error("Invalid Data Type") + } + var req_options = { + method: "POST", + headers: { + "accept": options.accept || "application/json", + "authorization": this.token || '' + } + } + var body; + + options.query_lang = options.query_lang || "rql" + if (["rql", "solr"].indexOf(options.query_lang) < 0) { + throw errors.InvalidQueryLanguage(`${options.query_lang} is not a valid query lang. Must be 'rql' or 'solr'`) + } + + switch (options.query_lang) { + case "solr": + req_options.headers["content-type"] = "application/solrquery+x-www-form-urlencoded" + body = `q=${query}` + if (options.limit) { + body = `${body}&rows=${options.limit}&start=${options.start || 0}` + } + + if (options.select) { + body = `${body}&fl=${options.select.join(',')}` + } + break; + case "rql": + default: + req_options.headers["content-type"] = "application/rqlquery+x-www-form-urlencoded" + body = query + if (options.limit) { + body = `${body}&limit(${options.limit},${options.start || 0})` + } + if (options.select) { + body = `${body}&select(${options.select.join(',')})` + } + break; + + } + var url = `${this.endpoint}/${data_type}/` + + if (body.length<2000){ + req_options.method="GET" + url = `${url}?${body}` + }else{ + req_options.body = body; + } + + var response = await fetchWithBackoff(url, req_options) + + if (!response.ok) { + throw httpError(response); + } + + switch(req_options.headers.accept){ + case "application/solr+json": + return await response.json() + break; + case "application/json": + var item_meta = response.headers.get('content-range').split(" ")[1] + var parts = item_meta.split("/") + var total = parseInt(parts[1]) + var start = parseInt(parts[0].split("-")[0]) + var meta = { start: start, total_items: total } + return new QueryResult(await response.json(), meta) + break; + default: + return await response.text() + } + } + + async getSchema(data_type) { + //get the solr schema for a data type + + this.checkInitialization() + + if (this.dataTypes.indexOf(data_type) < 0) { + throw Error("Invalid Data Type") + } + + var req_opts = { + "method": "GET", + "headers": { + accept: "application/json" + } + } + return fetchWithBackoff(`${this.endpoint}/${data_type}/schema`, req_opts) + .then((response) => { + if (!response.ok) { + throw httpError(response); + } + return response.json() + }) + } + + async getGenome(id) { + // Get Genome by Id + return await this.get("genome", id); + } + + async queryGenomes(query, opts = {}) { + // Query for Genomes using a query string (rql or solr) + return await this.query("genome", query, opts) + } + + async getGenomeFeature(id) { + // Get a Genome feature by ID + return await this.get("genome_feature", id); + } + + async getGenomeFeatures(genomes, opts = {}) { + // Get features for a genome or an array of genomes + if (!(genomes instanceof Array)) { + genomes = [genomes] + } + return this.queryGenomeFeatures(`in(genome_id,(${genomes.join(',')}))`, opts) + } + + async getGenomeFeaturesByQuery(genome_query, feature_filter = "", opts = {}) { + // query genomes with 'genome_query' and with the resulting genome_ids, query genome_features. + // optionally limit the feature query further with the feature_filter query. + // Only works with RQL at the moment + + if (opts.query_lang && opts.query_lang != "rql") { + throw errors.InvalidQueryLanguage("getGenomeFeaturesByQuery currently only works with RQL queries and filters") + } + const result = await this.queryGenomes(genome_query, { select: ["genome_id"], limit: opts.genome_limit || 500 }) + const genome_ids = result.items.map(g => { return g.genome_id }) + var query = `in(genome_id,(${genome_ids}))` + if (feature_filter) { + query = `${query}&${feature_filter}` + } + return this.queryGenomeFeatures(query, opts) + } + + async queryGenomeFeatures(query, opts = {}) { + // query for genome_features + return await this.query("genome_feature", query, opts) + } + + async getGenomeSequence(id) { + // get a genome sequence by id + return await this.get("genome_sequence", id); + } + + async getGenomeSequences(genomes, opts = {}) { + // Get sequences for a genome id or an array of genome ids + if (!(genomes instanceof Array)) { + genomes = [genomes] + } + return this.queryGenomeSequences(`in(genome_id,(${genomes.join(',')}))`, opts) + } + + async getFeatureSequence(id) { + // get a feature sequence by id + return await this.get("feature_sequence", id); + } + + async queryFeatureSequences(query, opts = {}) { + // query for feature sequences + return await this.query("feature_sequence", query, opts) + } + + async getGeneOntologyRef(id) { + // get a GO ref by id + return await this.get("gene_ontology_ref", id); + } + + async queryGeneOntologyRefs(query, opts = {}) { + // query for GO refs + return await this.query("gene_ontology_ref", query, opts) + } + + async queryGenomeSequences(query, opts = {}) { + // query for genome sequences + return await this.query("genome_sequence", query, opts) + } + + async getSpecialtyGene(id) { + // get a specialty gene by id + return await this.get("sp_gene", id); + } + + async querySpecialtyGenes(query, opts = {}) { + //query for specialty genes + return await this.query("sp_gene", query, opts) + } + + async getAntibiotic(id) { + // get a antibiotic by id + return await this.get("antibiotics", id); + } + + async queryAntibiotics(query, opts = {}) { + //query for antibiotics + return await this.query("antibiotics", query, opts) + } + async getGenomeAMR(id) { + // get a genome amr by id + return await this.get("genome_amr", id); + } + + async queryGenomeAMRs(query, opts = {}) { + //query for genome amrs + return await this.query("genome_amr", query, opts) + } + async getIDRef(id) { + // get a ID Ref by ID + return await this.get("id_ref", id); + } + + async queryIDRefs(query, opts = {}) { + //query for IDRef + return await this.query("id_ref", query, opts) + } + + async getMiscNIAIDSGC(id) { + // get a misc_niaid_sgc by id + return await this.get("misc_niaid_sgc", id); + } + + async queryMiscNIAIDSGCs(query, opts = {}) { + //query for misc niaid sgcs + return await this.query("misc_niaid_sgc", query, opts) + } + + async getPathway(id) { + // get a Pathway by id + return await this.get("pathway", id); + } + + async queryPathways(query, opts = {}) { + //query for pathways + return await this.query("pathway", query, opts) + } + + async getPathwayRef(id) { + // get a PathwayRef by id + return await this.get("pathway_ref", id); + } + + async queryPathwayRefs(query, opts = {}) { + //query for pathway refs + return await this.query("pathway_ref", query, opts) + } + + async getPPI(id) { + // get a PPI by id + return await this.get("ppi", id); + } + + async queryPPIs(query, opts = {}) { + //query for pathways + return await this.query("ppi", query, opts) + } + + async getProteinFamilyRef(id) { + // get a ProteinFamilyRef by id + return await this.get("protein_family_ref", id); + } + + async queryProteinFamilyRefs(query, opts = {}) { + //query for ProteinFamilyRefs + return await this.query("protein_family_ref", query, opts) + } + + async getSpecialtyGeneEvidence(id) { + // get a SpecialtyGeneEvidence by id + return await this.get("sp_gene_evidence", id); + } + + async querySpecialtyGeneEvidences(query, opts = {}) { + //query for SpecialtyGeneEvidences + return await this.query("sp_gene_evidence", query, opts) + } + async getSpecialtyGeneRef(id) { + // get a SpecialtyGeneRef by id + return await this.get("sp_gene_ref", id); + } + + async querySpecialtyGeneRefs(query, opts = {}) { + //query for SpecialtyGeneRefs + return await this.query("sp_gene_ref", query, opts) + } + + async getSubsystem(id) { + // get a Subsystem by id + return await this.get("subsystem", id); + } + + async querySubsystems(query, opts = {}) { + //query for Subsystems + return await this.query("subsystem", query, opts) + } + + async getSubsystemRef(id) { + // get a SubsystemRef by id + return await this.get("subsystem_ref", id); + } + + async querySubsystemRefs(query, opts = {}) { + //query for Subsystem Refs + return await this.query("subsystem_ref", query, opts) + } + + async getTaxonomy(id) { + // get a Taxonomy by id + return await this.get("taxonomy", id); + } + + async queryTaxonomys(query, opts = {}) { + //query for Taxonomy + return await this.query("taxonomy", query, opts) + } + + async getTranscriptomicsExperiment(id) { + // get a TranscriptomicsExperiment by id + return await this.get("transcriptomics_experiment", id); + } + + async queryTranscriptomicsExperiments(query, opts = {}) { + //query for TranscriptomicsExperiments + return await this.query("transcriptomics_experiment", query, opts) + } + async getTranscriptomicsGene(id) { + // get a TranscriptomicsGene by id + return await this.get("transcriptomics_gene", id); + } + + async queryTranscriptomicsGenes(query, opts = {}) { + //query for TranscriptomicsExperiments + return await this.query("transcriptomics_gene", query, opts) + } + async getTranscriptomicsSample(id) { + // get a TranscriptomicsSample by id + return await this.get("transcriptomics_sample", id); + } + + async queryTranscriptomicsSamples(query, opts = {}) { + //query for TranscriptomicsSamples + return await this.query("transcriptomics_sample", query, opts) + } + + async setGenomePermissions(ids, perms) { + this.checkInitialization() + + if (!this.token) { + throw new Error("Missing token. Authorization required for setGenomePermissions") + } + if (!ids || !perms) { + throw new Error('setGenomePermission expects id and permissions'); + } + + var data = perms.map(function (p) { + return { + user: p.user, + permission: this.permMapping(p.permission) + }; + }, this); + + var ids = Array.isArray(ids) ? ids : [ids]; + + const req_options = { + method: "POST", + headers: { + 'content-type': 'application/json', + "accept": "application/json", + 'Authorization': this.token + }, + body: JSON.stringify(data) + } + + var response = await fetchWithBackoff(`${this.endpoint}/permissions/genome/${ids.join(',')}`, req_options) + + if (!response.ok) { + throw httpError(response); + } + + return await response.json() + } + + permMapping(perm) { + const mapping = { + 'Can view': 'read', + 'Can edit': 'write', + 'Varies': 'unchanged', + 'r': 'read', + 'w': 'write' + }; + + return mapping[perm]; + } + + solrPermsToObjs(selection) { + var permSets = []; + // var allPermissions = {}; + + selection.forEach(function (sel) { + // var id = sel.genome_id; + + var readList = sel.user_read || [], + writeList = sel.user_write || []; + + var writeObjs = writeList.map(function (user) { + var obj = { + user: user, + perm: 'Can edit' + }; + + return obj; + }); + + var readObjs = readList.filter(function (user) { + // if user has write permission, only list that + return writeList.indexOf(user) == -1; + }).map(function (user) { + var obj = { + user: user, + perm: 'Can view' + }; + + return obj; + }); + + var permObjs = readObjs.concat(writeObjs); + permSets.push(permObjs); + }); + + var permissions = permSets.reduce( + function (a, b) { return a.concat(b); }, + [] + ); + + return permissions; + } + +} + +module.exports = BVBRCAPIService diff --git a/public/js/bvbrc_js_client/src/query_result.js b/public/js/bvbrc_js_client/src/query_result.js new file mode 100644 index 000000000..840e863a6 --- /dev/null +++ b/public/js/bvbrc_js_client/src/query_result.js @@ -0,0 +1,9 @@ +class QueryResult { + constructor(items,meta={}){ + this.items=items + this.start=meta.start||0 + this.total_items = meta.total_items || this.length + } +} + +module.exports = QueryResult \ No newline at end of file diff --git a/public/js/bvbrc_js_client/src/retry.js b/public/js/bvbrc_js_client/src/retry.js new file mode 100644 index 000000000..d588214c7 --- /dev/null +++ b/public/js/bvbrc_js_client/src/retry.js @@ -0,0 +1,144 @@ +const fetch = require('node-fetch'); + +/** + * Retry 429/503 responses from the Data API per its client contract, + * BV-BRC-API Docs/CLIENT-429.md. + * + * The rule is not "retry on 429" -- it is back off by the amount the server + * asked for, and give up rather than hammer. A client that retries a shed + * request badly makes the overload worse at the moment the system has least + * capacity to absorb it. + * + * This mirrors p3/util/retryRequest.js in BV-BRC-Web, deliberately duplicated + * rather than imported: this package is standalone and has no AMD loader. Keep + * the two in step -- honour Retry-After, jitter every wait, cap at 3 retries, + * 429/503 only, floor at 1s. + */ + +const RETRIABLE = { 429: true, 503: true }; +const BUSY_MESSAGE = + 'The server is currently busy. Please try again in a few minutes.'; + +// The API floors Retry-After at 1s precisely because `Retry-After: 0` invites a +// tight retry loop, but a client must not depend on the server getting it right. +const MIN_DELAY_SECONDS = 1; + +/** + * Feature flag, matching BV-BRC-Web's `enableThrottleRetry` config. Read from + * window.App when running in the browser, which is the only context where the + * flag exists; outside a browser (tests, node consumers) retry is on, since + * there is no deployment switch to consult. + */ +function enabled () { + if (typeof window === 'undefined' || !window.App) { return true; } + return !!window.App.enableThrottleRetry; +} + +function retryAfterSeconds (response) { + const raw = response.headers && typeof response.headers.get === 'function' + ? response.headers.get('Retry-After') + : null; + const n = parseInt(raw, 10); + return (Number.isFinite(n) && n >= 0) ? n : undefined; +} + +function delayFor (attempt, response) { + const server = retryAfterSeconds(response); + // Exponential fallback from 2s when the server gave no usable figure. + const base = server !== undefined ? server : 2 * (2 ** attempt); + const seconds = Math.max(base, MIN_DELAY_SECONDS); + // Jitter, so simultaneously-shed clients do not all return at the same + // instant and reproduce the burst that caused the shedding. + return seconds * 1000 * (1 + Math.random() * 0.3); +} + +/** + * Publish the same topics BV-BRC-Web's ThrottleBanner listens on, when running + * inside that app. No-op anywhere else, so this package stays standalone. + * + * Without this the user sees a multi-second stall with no explanation, and on + * exhaustion an empty panel -- the outcome the spec calls worst, because a user + * who sees no data believes it is missing rather than deferred. + */ +function publish (topic, data) { + try { + if (typeof window !== 'undefined' && typeof window.require === 'function') { + const topicModule = window.require('dojo/topic'); + if (topicModule && typeof topicModule.publish === 'function') { + topicModule.publish(topic, data); + } + } + } catch (e) { + // dojo absent or not yet loaded; the retry itself still works. + } +} + +/** + * fetch(), retrying 429 and 503 with backoff. + * + * 504 and 400 are deliberately not retried: a 504 means the query was too + * expensive and retrying repeats the cost, and a 400 is a permanent refusal of + * that query. + * + * @param {string} url + * @param {object} options passed through to fetch + * @param {number} maxRetries default 3, per the spec's interactive cap + * @returns {Promise} the first non-shed response + * @throws {Error} with isThrottled=true and status, once retries are exhausted + */ +async function fetchWithBackoff (url, options, maxRetries = 3) { + let attempt = 0; + let announced = false; + + try { + for (;;) { + const response = await fetch(url, options); + + if (!RETRIABLE[response.status] || !enabled()) { + return response; + } + + if (attempt >= maxRetries) { + const err = new Error(BUSY_MESSAGE); + err.isThrottled = true; + err.status = response.status; + publish('/throttle/failed'); + announced = false; + throw err; + } + + const waitMs = delayFor(attempt, response); + if (!announced) { + announced = true; + publish('/throttle/active', { label: String(url) }); + } + publish('/throttle/retrying', { waitMs, attempt: attempt + 1, label: String(url) }); + + attempt++; + await new Promise((resolve) => setTimeout(resolve, waitMs)); + } + } finally { + // Balance the banner's counter on every exit path -- success, a + // non-retriable error, or a throw from fetch itself. An unbalanced counter + // leaves the banner pinned open for the rest of the session. + if (announced) { publish('/throttle/resolved'); } + } +} + +/** + * Build an Error that preserves the HTTP status. + * + * The client previously threw `Error(response.statusText)`, discarding the + * code. That is why 429 handling could not be bolted on from outside the + * client: a caller saw only the string "Too Many Requests" with no status and + * no Retry-After, so it could neither classify the failure nor honour the + * server's backoff. + */ +function httpError (response) { + const err = new Error(`${response.status} ${response.statusText}`); + err.status = response.status; + err.statusText = response.statusText; + return err; +} + +module.exports = { fetchWithBackoff, httpError }; diff --git a/public/js/bvbrc_js_client/test/antibiotics.js b/public/js/bvbrc_js_client/test/antibiotics.js new file mode 100644 index 000000000..761b3cb56 --- /dev/null +++ b/public/js/bvbrc_js_client/test/antibiotics.js @@ -0,0 +1,29 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' + +describe("Antibiotic API Tests", function(){ + const svc = new Service(endpoint) + const test_id="1046" + const test_id_field="pubchem_cid" + const test_rql_query = `eq(${test_id_field},${test_id})` + const test_solr_query = `${test_id_field}:${test_id}` + const expected_result_len = 1 + + it("queryAntibiotics-RQL", async function(){ + const result = await svc.queryAntibiotics(test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it("queryAntibiotics-SOLR", async function(){ + const result = await svc.queryAntibiotics(test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +}); diff --git a/public/js/bvbrc_js_client/test/base.js b/public/js/bvbrc_js_client/test/base.js new file mode 100644 index 000000000..f1ba15197 --- /dev/null +++ b/public/js/bvbrc_js_client/test/base.js @@ -0,0 +1,141 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const errors = require("../src/errors"); + +const endpoint = "https://patricbrc.org/api" + +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' + +describe("Base API Tests", function () { + var svc = new Service(endpoint) + const test_genome_id = "227377.26" + + it("get schema async", async function(){ + var schema = await svc.getSchema("genome") + assert.equal(schema.schema.name,"genome") + }) + + it("get schema promise", function(done){ + svc.getSchema("genome").then((schema)=>{ + assert.equal(schema.schema.name,"genome") + done() + }) + }) + + it("generic get(datatype,id) async", async function () { + var genome = await svc.get("genome", test_genome_id) + assert.equal(genome.genome_id, test_genome_id, "Mismatched Genome ID") + }); + + it("generic get(datatype,id) promise", function (done) { + svc.get("genome", test_genome_id).then((genome)=>{ + assert.equal(genome.genome_id, test_genome_id) + done() + }) + }); + + it("get non-existant genome async", async function () { + const test_genome_id = "invalid_id" + try { + var genome = await svc.get("genome", test_genome_id) + throw Error("Should be not found error"); + } catch (err) { + // console.log("err: ", err, typeof err, err instanceof errors.NotFound) + + assert.instanceOf(err,errors.NotFound,"Should be NotFound Error") + } + }) + + it("get non-existant genome promise", function (done) { + const test_genome_id = "invalid_id" + svc.get("genome", test_genome_id).then((genome)=>{ + done(Error("Should be NotFound Error")) + },(err)=>{ + assert.instanceOf(err,errors.NotFound,"Should be NotFound Error") + done() + }) + }) + + it("get invalid data type async", async function () { + const test_genome_id = "invalid_id" + try { + await svc.get("invalid", test_genome_id) + } catch (err) { + assert.instanceOf(err,errors.InvalidDataType,"Should be instance of InvalidDataType Error") + } + }) + + it("get invalid data type promise", function (done) { + const test_genome_id = "invalid_id" + svc.get("invalid", test_genome_id).then(()=>{ + done(Error("Should be InvalidDataType")) + }).catch((err)=>{ + assert.instanceOf(err,errors.InvalidDataType,"Should be instance of InvalidDataType Error") + done() + }) + }) + + it("query rql async", async function () { + const test_genome_id = "227377.26" + var result = await svc.query("genome", `eq(genome_id,${test_genome_id})`); + var genomes = result.items; + assert.lengthOf(genomes, 1, "query result size should be 1") + assert.equal(genomes[0].genome_id, test_genome_id) + }); + + it("query rql async - solr response obj", async function () { + const test_genome_id = "227377.26" + var result = await svc.query("genome", `eq(genome_id,${test_genome_id})`, {accept: "application/solr+json"}); + var genomes = result.response.docs; + assert.lengthOf(genomes, 1, "query result size should be 1") + assert.equal(genomes[0].genome_id, test_genome_id) + }); + + it("query rql async - TSV Response", async function () { + const test_genome_id = "227377.26" + var result = await svc.query("genome", `eq(genome_id,${test_genome_id})`, {accept: "text/tsv"}); + var genome = result.split('\n')[1] + var genome_id = genome.split("\t")[0] + assert.equal(genome_id, `"${test_genome_id}"`) + }); + + it("query rql promise", function (done) { + const test_genome_id = "227377.26" + svc.query("genome", `eq(genome_id,${test_genome_id})`).then((result)=>{ + const genomes = result.items + assert.lengthOf(genomes, 1, "query result size should be 1") + assert.equal(genomes[0].genome_id, test_genome_id) + done() + }) + }); + + it("query rql promise - solr response -obj", function (done) { + const test_genome_id = "227377.26" + svc.query("genome", `eq(genome_id,${test_genome_id})`,{accept: "application/solr+json"}).then((result)=>{ + const genomes = result.response.docs + assert.lengthOf(genomes, 1, "query result size should be 1") + assert.equal(genomes[0].genome_id, test_genome_id) + done() + }) + }); + + it("query solr async", async function () { + const test_genome_id = "227377.26" + var result = await svc.query("genome", `genome_id:${test_genome_id}`,{"query_lang": "solr"}); + var genomes = result.items + assert.lengthOf(genomes, 1, "query result size should be 1") + assert.equal(genomes[0].genome_id, test_genome_id) + }); + + it("query solr promise", function (done) { + const test_genome_id = "227377.26" + svc.query("genome", `genome_id:${test_genome_id}`,{"query_lang": "solr"}).then((result)=>{ + var genomes = result.items + assert.lengthOf(genomes, 1, "query result size should be 1") + assert.equal(genomes[0].genome_id, test_genome_id) + done() + }) + }); +}); diff --git a/public/js/bvbrc_js_client/test/feature_sequence.js b/public/js/bvbrc_js_client/test/feature_sequence.js new file mode 100644 index 000000000..3965590a3 --- /dev/null +++ b/public/js/bvbrc_js_client/test/feature_sequence.js @@ -0,0 +1,35 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' +const type="FeatureSequence" + +describe(`${type} API Tests`, function(){ + const svc = new Service(endpoint) + const test_id="2795c372e1576629f476795d0b088da4" + const test_id_field="md5" + const test_rql_query = `eq(${test_id_field},${test_id})` + const test_solr_query = `${test_id_field}:${test_id}` + const expected_result_len = 1 + + it(`get${type}`, async function(){ + const item = await svc[`get${type}`](test_id) + assert.equal(item[test_id_field],test_id) + }) + + it(`query ${type} RQL`, async function(){ + const result = await svc[`query${type}s`](test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it(`query ${type} SOLR`, async function(){ + const result = await svc[`query${type}s`](test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +}); diff --git a/public/js/bvbrc_js_client/test/gene_ontology_ref.js b/public/js/bvbrc_js_client/test/gene_ontology_ref.js new file mode 100644 index 000000000..334e98b2f --- /dev/null +++ b/public/js/bvbrc_js_client/test/gene_ontology_ref.js @@ -0,0 +1,34 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' +const type="GeneOntologyRef" + +describe(`${type} API Tests`, function(){ + const svc = new Service(endpoint) + const test_id="GO:0000001" + const test_id_field="go_id" + const test_rql_query = `eq(${test_id_field},${encodeURIComponent('"'+test_id+'"')})` + const test_solr_query = `${test_id_field}:${encodeURIComponent('"'+test_id+'"')}` + const expected_result_len = 1 + it(`get${type}`, async function(){ + const item = await svc[`get${type}`](test_id) + assert.equal(item[test_id_field],test_id) + }) + + it(`query ${type} RQL`, async function(){ + const result = await svc[`query${type}s`](test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it(`query ${type} SOLR`, async function(){ + const result = await svc[`query${type}s`](test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +}); diff --git a/public/js/bvbrc_js_client/test/genome.js b/public/js/bvbrc_js_client/test/genome.js new file mode 100644 index 000000000..73386667a --- /dev/null +++ b/public/js/bvbrc_js_client/test/genome.js @@ -0,0 +1,29 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' + +describe("Genome API Tests", function(){ + var svc = new Service(endpoint) + const test_genome_id="227377.26" + const test_genome_feature_id="PATRIC.254246.3.QQAX01000001.CDS.67.237.fwd" + + it("getGenome", async function(){ + const genome = await svc.getGenome(test_genome_id) + assert.equal(genome.genome_id,test_genome_id) + }) + + it("queryGenomes-RQL", async function(){ + const result = await svc.queryGenomes(`eq(genome_id,${test_genome_id})`) + const genomes = result.items + assert.equal(genomes[0].genome_id,test_genome_id) + }) + + it("queryGenomes-SOLR", async function(){ + const result = await svc.queryGenomes(`genome_id:${test_genome_id}`,{"query_lang": "solr"}) + const genomes = result.items + assert.equal(genomes[0].genome_id,test_genome_id) + }) +}); diff --git a/public/js/bvbrc_js_client/test/genome_amr.js b/public/js/bvbrc_js_client/test/genome_amr.js new file mode 100644 index 000000000..24d162b64 --- /dev/null +++ b/public/js/bvbrc_js_client/test/genome_amr.js @@ -0,0 +1,34 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' +const type="GenomeAMR" + +describe(`${type} API Tests`, function(){ + const svc = new Service(endpoint) + const test_id="eeff140a-aecf-47e6-96f0-01433711f101" + const test_id_field="id" + const test_rql_query = `eq(${test_id_field},${encodeURIComponent('"'+test_id+'"')})` + const test_solr_query = `${test_id_field}:${encodeURIComponent('"'+test_id+'"')}` + const expected_result_len = 1 + it(`get${type}`, async function(){ + const item = await svc[`get${type}`](test_id) + assert.equal(item[test_id_field],test_id) + }) + + it(`query ${type} RQL`, async function(){ + const result = await svc[`query${type}s`](test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it(`query ${type} SOLR`, async function(){ + const result = await svc[`query${type}s`](test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +}); diff --git a/public/js/bvbrc_js_client/test/genome_feature.js b/public/js/bvbrc_js_client/test/genome_feature.js new file mode 100644 index 000000000..52b0e99d3 --- /dev/null +++ b/public/js/bvbrc_js_client/test/genome_feature.js @@ -0,0 +1,38 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' + +describe("Genome Feature API Tests", function(){ + const svc = new Service(endpoint) + const test_genome_id="227377.26" + const test_genome_ids=["227377.26","777.121","777.16"] + const test_genome_feature_id="PATRIC.254246.3.QQAX01000001.CDS.67.237.fwd" + + it("getGenomeFeature", async function(){ + const feature = await svc.getGenomeFeature(test_genome_feature_id) + assert.equal(feature.feature_id,test_genome_feature_id) + }) + + it("getGenomeFeatures", async function(){ + const result = await svc.getGenomeFeatures(test_genome_ids) + const features = result.items + assert.equal(features[0].genome_id,test_genome_id) + }) + + it("queryGenomeFeatures-RQL", async function(){ + const result = await svc.queryGenomeFeatures(`eq(genome_id,${test_genome_id})`,{"limit": 10}) + const features = result.items + assert.equal(features[0].genome_id,test_genome_id) + assert.lengthOf(features,10) + }) + + it("queryGenomeFeatures-SOLR", async function(){ + const result = await svc.queryGenomeFeatures(`genome_id:${test_genome_id}`,{"query_lang": "solr","limit":10}) + const features = result.items + assert.equal(features[0].genome_id,test_genome_id) + assert.lengthOf(features,10) + }) +}); diff --git a/public/js/bvbrc_js_client/test/genome_sequence.js b/public/js/bvbrc_js_client/test/genome_sequence.js new file mode 100644 index 000000000..62c5c0ff6 --- /dev/null +++ b/public/js/bvbrc_js_client/test/genome_sequence.js @@ -0,0 +1,31 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' + +describe("Genome Sequence API Tests", function(){ + var svc = new Service(endpoint) + const test_genome_id="777.121" + const test_genome_sequence_id="777.121.con.0001" + + it("getGenomeSequence", async function(){ + var seq = await svc.getGenomeSequence(test_genome_sequence_id) + assert.equal(seq.sequence_id,test_genome_sequence_id) + }) + + it("queryGenomeSequence-RQL", async function(){ + var result = await svc.queryGenomeSequences(`eq(genome_id,${test_genome_id})`,{"limit": 10}) + var seqs = result.items + assert.equal(seqs[0].genome_id,test_genome_id) + assert.lengthOf(seqs,10) + }) + + it("queryGenomeFeatures-SOLR", async function(){ + var result = await svc.queryGenomeSequences(`genome_id:${test_genome_id}`,{"query_lang": "solr","limit":10}) + var seqs = result.items + assert.equal(seqs[0].genome_id,test_genome_id) + assert.lengthOf(seqs,10) + }) +}); diff --git a/public/js/bvbrc_js_client/test/id_ref.js b/public/js/bvbrc_js_client/test/id_ref.js new file mode 100644 index 000000000..a2e95a00d --- /dev/null +++ b/public/js/bvbrc_js_client/test/id_ref.js @@ -0,0 +1,34 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' +const type="IDRef" + +describe(`${type} API Tests`, function(){ + const svc = new Service(endpoint) + const test_id="eccc46ee-2f71-4680-9713-04e6705b7305" + const test_id_field="id" + const test_rql_query = `eq(${test_id_field},${encodeURIComponent('"'+test_id+'"')})` + const test_solr_query = `${test_id_field}:${encodeURIComponent('"'+test_id+'"')}` + const expected_result_len = 1 + it(`get${type}`, async function(){ + const item = await svc[`get${type}`](test_id) + assert.equal(item[test_id_field],test_id) + }) + + it(`query ${type} RQL`, async function(){ + const result = await svc[`query${type}s`](test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it(`query ${type} SOLR`, async function(){ + const result = await svc[`query${type}s`](test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +}); diff --git a/public/js/bvbrc_js_client/test/initialization.js b/public/js/bvbrc_js_client/test/initialization.js new file mode 100644 index 000000000..af6266791 --- /dev/null +++ b/public/js/bvbrc_js_client/test/initialization.js @@ -0,0 +1,33 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const errors = require("../src/errors"); + +const endpoint = "https://patricbrc.org/api" + +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' + +describe("Initialization Tests API Tests", function () { + const svc = new Service() + const test_genome_id = "227377.26" + + + it("get while uninitialized", async function () { + try { + var genome = await svc.get("genome", test_genome_id) + throw Error("Should be ClientNotInitialized error"); + } catch (err) { + // console.log("err: ", err, typeof err, err instanceof errors.NotFound) + + assert.instanceOf(err,errors.ClientNotInitialized,"Should be ClientNotInitialized Error") + } + }) + + it("get after initialization", async function () { + svc.init(endpoint) + var genome = await svc.get("genome", test_genome_id) + assert.equal(genome.genome_id, test_genome_id, "Mismatched Genome ID") + }); + +}); diff --git a/public/js/bvbrc_js_client/test/misc_niaid_sgc.js b/public/js/bvbrc_js_client/test/misc_niaid_sgc.js new file mode 100644 index 000000000..2eac39317 --- /dev/null +++ b/public/js/bvbrc_js_client/test/misc_niaid_sgc.js @@ -0,0 +1,34 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' +const type="MiscNIAIDSGC" + +describe(`${type} API Tests`, function(){ + const svc = new Service(endpoint) + const test_id="AcbaA.00587.b" + const test_id_field="target_id" + const test_rql_query = `eq(${test_id_field},${encodeURIComponent('"'+test_id+'"')})` + const test_solr_query = `${test_id_field}:${encodeURIComponent('"'+test_id+'"')}` + const expected_result_len = 1 + it(`get${type}`, async function(){ + const item = await svc[`get${type}`](test_id) + assert.equal(item[test_id_field],test_id) + }) + + it(`query ${type} RQL`, async function(){ + const result = await svc[`query${type}s`](test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it(`query ${type} SOLR`, async function(){ + const result = await svc[`query${type}s`](test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +}); diff --git a/public/js/bvbrc_js_client/test/pathway.js b/public/js/bvbrc_js_client/test/pathway.js new file mode 100644 index 000000000..22c0f789f --- /dev/null +++ b/public/js/bvbrc_js_client/test/pathway.js @@ -0,0 +1,34 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' +const type="Pathway" + +describe(`${type} API Tests`, function(){ + const svc = new Service(endpoint) + const test_id="8ba3dd33-7c07-45d3-9dcf-8b897187b357" + const test_id_field="id" + const test_rql_query = `eq(${test_id_field},${encodeURIComponent('"'+test_id+'"')})` + const test_solr_query = `${test_id_field}:${encodeURIComponent('"'+test_id+'"')}` + const expected_result_len = 1 + it(`get${type}`, async function(){ + const item = await svc[`get${type}`](test_id) + assert.equal(item[test_id_field],test_id) + }) + + it(`query ${type} RQL`, async function(){ + const result = await svc[`query${type}s`](test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it(`query ${type} SOLR`, async function(){ + const result = await svc[`query${type}s`](test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +}); diff --git a/public/js/bvbrc_js_client/test/pathway_ref.js b/public/js/bvbrc_js_client/test/pathway_ref.js new file mode 100644 index 000000000..f4e19121c --- /dev/null +++ b/public/js/bvbrc_js_client/test/pathway_ref.js @@ -0,0 +1,34 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' +const type="PathwayRef" + +describe(`${type} API Tests`, function(){ + const svc = new Service(endpoint) + const test_id="001e5b2c-fbc6-4a12-9f52-0567958deeac" + const test_id_field="id" + const test_rql_query = `eq(${test_id_field},${encodeURIComponent('"'+test_id+'"')})` + const test_solr_query = `${test_id_field}:${encodeURIComponent('"'+test_id+'"')}` + const expected_result_len = 1 + it(`get${type}`, async function(){ + const item = await svc[`get${type}`](test_id) + assert.equal(item[test_id_field],test_id) + }) + + it(`query ${type} RQL`, async function(){ + const result = await svc[`query${type}s`](test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it(`query ${type} SOLR`, async function(){ + const result = await svc[`query${type}s`](test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +}); diff --git a/public/js/bvbrc_js_client/test/ppi.js b/public/js/bvbrc_js_client/test/ppi.js new file mode 100644 index 000000000..c588e8122 --- /dev/null +++ b/public/js/bvbrc_js_client/test/ppi.js @@ -0,0 +1,35 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' +const type="PPI" + +describe(`${type} API Tests`, function(){ + const svc = new Service(endpoint) + const test_id="9b8046aa-c62b-4110-a5e7-ec665d08a0b2" + const test_id_field="id" + const test_rql_query = `eq(${test_id_field},${encodeURIComponent('"'+test_id+'"')})` + const test_solr_query = `${test_id_field}:${encodeURIComponent('"'+test_id+'"')}` + const expected_result_len = 1 + + it(`get${type}`, async function(){ + const item = await svc[`get${type}`](test_id) + assert.equal(item[test_id_field],test_id) + }) + + it(`query ${type} RQL`, async function(){ + const result = await svc[`query${type}s`](test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it(`query ${type} SOLR`, async function(){ + const result = await svc[`query${type}s`](test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +}); diff --git a/public/js/bvbrc_js_client/test/protein_family_ref.js b/public/js/bvbrc_js_client/test/protein_family_ref.js new file mode 100644 index 000000000..30678e05f --- /dev/null +++ b/public/js/bvbrc_js_client/test/protein_family_ref.js @@ -0,0 +1,34 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' +const type="ProteinFamilyRef" + +describe(`${type} API Tests`, function(){ + const svc = new Service(endpoint) + const test_id="PLF_32008_00319462" + const test_id_field="family_id" + const test_rql_query = `eq(${test_id_field},${encodeURIComponent('"'+test_id+'"')})` + const test_solr_query = `${test_id_field}:${encodeURIComponent('"'+test_id+'"')}` + const expected_result_len = 1 + it(`get${type}`, async function(){ + const item = await svc[`get${type}`](test_id) + assert.equal(item[test_id_field],test_id) + }) + + it(`query ${type} RQL`, async function(){ + const result = await svc[`query${type}s`](test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it(`query ${type} SOLR`, async function(){ + const result = await svc[`query${type}s`](test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +}); diff --git a/public/js/bvbrc_js_client/test/retry.js b/public/js/bvbrc_js_client/test/retry.js new file mode 100644 index 000000000..f014fb599 --- /dev/null +++ b/public/js/bvbrc_js_client/test/retry.js @@ -0,0 +1,188 @@ +/* eslint-env mocha */ +const assert = require('chai').assert; +const path = require('path'); + +const RETRY_PATH = path.join(__dirname, '..', 'src', 'retry.js'); + +/** + * fetchWithBackoff closes over the module-level `fetch` from node-fetch, so + * stub it in require.cache and reload the module under test. + */ +function loadRetry (fetchStub) { + delete require.cache[require.resolve(RETRY_PATH)]; + delete require.cache[require.resolve('node-fetch')]; + require.cache[require.resolve('node-fetch')] = { + id: require.resolve('node-fetch'), + filename: require.resolve('node-fetch'), + loaded: true, + exports: fetchStub + }; + return require(RETRY_PATH); +} + +function response (status, { retryAfter, ok } = {}) { + return { + status, + statusText: status === 429 ? 'Too Many Requests' : 'Error', + ok: ok !== undefined ? ok : (status >= 200 && status < 300), + headers: { + get: (n) => (n === 'Retry-After' && retryAfter !== undefined + ? String(retryAfter) : null) + } + }; +} + +/** Replace setTimeout so backoffs resolve instantly, recording the delays. */ +function captureDelays () { + const real = global.setTimeout; + const delays = []; + global.setTimeout = (fn, ms) => { delays.push(ms); return real(fn, 0); }; + return { delays, restore: () => { global.setTimeout = real; } }; +} + +describe('fetchWithBackoff', function () { + let timers; + + beforeEach(function () { timers = captureDelays(); }); + afterEach(function () { + timers.restore(); + delete global.window; + }); + + it('passes a success straight through without retrying', async function () { + let calls = 0; + const { fetchWithBackoff } = loadRetry(async () => { calls++; return response(200); }); + + const res = await fetchWithBackoff('http://x/', {}); + assert.equal(res.status, 200); + assert.equal(calls, 1); + assert.lengthOf(timers.delays, 0); + }); + + it('retries a 429 and returns the eventual success', async function () { + let calls = 0; + const { fetchWithBackoff } = loadRetry(async () => { + calls++; + return calls === 1 ? response(429, { retryAfter: 2 }) : response(200); + }); + + const res = await fetchWithBackoff('http://x/', {}); + assert.equal(res.status, 200); + assert.equal(calls, 2); + }); + + it('honours Retry-After rather than substituting a shorter delay', async function () { + const { fetchWithBackoff } = loadRetry(async () => response(429, { retryAfter: 10 })); + + try { await fetchWithBackoff('http://x/', {}); } catch (e) { /* expected */ } + + // 10s plus up to 30% jitter, and never less than the server's figure. + timers.delays.forEach((d) => { + assert.isAtLeast(d, 10000); + assert.isAtMost(d, 13000); + }); + }); + + it('jitters, so shed clients do not all return at the same instant', async function () { + const { fetchWithBackoff } = loadRetry(async () => response(429, { retryAfter: 5 })); + + for (let i = 0; i < 4; i++) { + try { await fetchWithBackoff('http://x/', {}); } catch (e) { /* expected */ } + } + const unique = new Set(timers.delays); + assert.isAbove(unique.size, 1, 'all delays identical -- jitter missing'); + }); + + it('caps at 3 retries (4 attempts) then throws a busy error', async function () { + let calls = 0; + const { fetchWithBackoff } = loadRetry(async () => { calls++; return response(429, { retryAfter: 1 }); }); + + try { + await fetchWithBackoff('http://x/', {}); + assert.fail('should have thrown'); + } catch (e) { + assert.match(e.message, /server is currently busy/i); + assert.isTrue(e.isThrottled); + assert.equal(e.status, 429); + } + assert.equal(calls, 4); + }); + + it('treats 503 identically to 429', async function () { + let calls = 0; + const { fetchWithBackoff } = loadRetry(async () => { + calls++; + return calls === 1 ? response(503, { retryAfter: 1 }) : response(200); + }); + + const res = await fetchWithBackoff('http://x/', {}); + assert.equal(res.status, 200); + assert.equal(calls, 2); + }); + + [504, 400, 401, 500].forEach(function (status) { + it(`does not retry ${status}`, async function () { + let calls = 0; + const { fetchWithBackoff } = loadRetry(async () => { calls++; return response(status); }); + + const res = await fetchWithBackoff('http://x/', {}); + assert.equal(res.status, status); + assert.equal(calls, 1, 'retrying this status wastes a round trip'); + assert.lengthOf(timers.delays, 0); + }); + }); + + it('falls back to exponential backoff when Retry-After is absent', async function () { + const { fetchWithBackoff } = loadRetry(async () => response(429)); + + try { await fetchWithBackoff('http://x/', {}); } catch (e) { /* expected */ } + + // 2s, 4s, 8s before jitter. + assert.isAtLeast(timers.delays[0], 2000); + assert.isAtLeast(timers.delays[1], 4000); + assert.isAtLeast(timers.delays[2], 8000); + }); + + it('never retries without a delay, even on Retry-After: 0', async function () { + const { fetchWithBackoff } = loadRetry(async () => response(429, { retryAfter: 0 })); + + try { await fetchWithBackoff('http://x/', {}); } catch (e) { /* expected */ } + + timers.delays.forEach((d) => assert.isAtLeast(d, 1000, + 'Retry-After: 0 must not produce a tight loop')); + }); + + it('does not retry when window.App.enableThrottleRetry is false', async function () { + global.window = { App: { enableThrottleRetry: false } }; + let calls = 0; + const { fetchWithBackoff } = loadRetry(async () => { calls++; return response(429, { retryAfter: 1 }); }); + + const res = await fetchWithBackoff('http://x/', {}); + assert.equal(res.status, 429, 'should hand back the shed response unretried'); + assert.equal(calls, 1); + }); + + it('retries when the flag is on', async function () { + global.window = { App: { enableThrottleRetry: true } }; + let calls = 0; + const { fetchWithBackoff } = loadRetry(async () => { + calls++; + return calls === 1 ? response(429, { retryAfter: 1 }) : response(200); + }); + + const res = await fetchWithBackoff('http://x/', {}); + assert.equal(res.status, 200); + assert.equal(calls, 2); + }); +}); + +describe('httpError', function () { + it('preserves the status, which the old throw discarded', function () { + const { httpError } = require(RETRY_PATH); + const err = httpError(response(429)); + + assert.equal(err.status, 429); + assert.equal(err.statusText, 'Too Many Requests'); + assert.include(err.message, '429'); + }); +}); diff --git a/public/js/bvbrc_js_client/test/sp_gene_evidence.js b/public/js/bvbrc_js_client/test/sp_gene_evidence.js new file mode 100644 index 000000000..7414ecb34 --- /dev/null +++ b/public/js/bvbrc_js_client/test/sp_gene_evidence.js @@ -0,0 +1,34 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' +const type="SpecialtyGeneEvidence" + +describe(`${type} API Tests`, function(){ + const svc = new Service(endpoint) + const test_id="008ef9a0-6cf5-4e0a-a751-f85bb652ad32" + const test_id_field="id" + const test_rql_query = `eq(${test_id_field},${encodeURIComponent('"'+test_id+'"')})` + const test_solr_query = `${test_id_field}:${encodeURIComponent('"'+test_id+'"')}` + const expected_result_len = 1 + it(`get${type}`, async function(){ + const item = await svc[`get${type}`](test_id) + assert.equal(item[test_id_field],test_id) + }) + + it(`query ${type} RQL`, async function(){ + const result = await svc[`query${type}s`](test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it(`query ${type} SOLR`, async function(){ + const result = await svc[`query${type}s`](test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +}); diff --git a/public/js/bvbrc_js_client/test/sp_gene_ref.js b/public/js/bvbrc_js_client/test/sp_gene_ref.js new file mode 100644 index 000000000..ff777ef7d --- /dev/null +++ b/public/js/bvbrc_js_client/test/sp_gene_ref.js @@ -0,0 +1,34 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' +const type="SpecialtyGeneRef" + +describe(`${type} API Tests`, function(){ + const svc = new Service(endpoint) + const test_id="0002dba6-a28a-4ab7-8d14-aa70ec7b2c59" + const test_id_field="id" + const test_rql_query = `eq(${test_id_field},${encodeURIComponent('"'+test_id+'"')})` + const test_solr_query = `${test_id_field}:${encodeURIComponent('"'+test_id+'"')}` + const expected_result_len = 1 + it(`get${type}`, async function(){ + const item = await svc[`get${type}`](test_id) + assert.equal(item[test_id_field],test_id) + }) + + it(`query ${type} RQL`, async function(){ + const result = await svc[`query${type}s`](test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it(`query ${type} SOLR`, async function(){ + const result = await svc[`query${type}s`](test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +}); diff --git a/public/js/bvbrc_js_client/test/specialty_gene.js b/public/js/bvbrc_js_client/test/specialty_gene.js new file mode 100644 index 000000000..bce4b9475 --- /dev/null +++ b/public/js/bvbrc_js_client/test/specialty_gene.js @@ -0,0 +1,34 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' +const type="SpecialtyGene" + +describe(`${type} API Tests`, function(){ + const svc = new Service(endpoint) + const test_id="6c07c107-f416-4f4e-a265-8c689da27785" + const test_id_field="id" + const test_rql_query = `eq(${test_id_field},${encodeURIComponent('"'+test_id+'"')})` + const test_solr_query = `${test_id_field}:${encodeURIComponent('"'+test_id+'"')}` + const expected_result_len = 1 + it(`get${type}`, async function(){ + const item = await svc[`get${type}`](test_id) + assert.equal(item[test_id_field],test_id) + }) + + it(`query ${type} RQL`, async function(){ + const result = await svc[`query${type}s`](test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it(`query ${type} SOLR`, async function(){ + const result = await svc[`query${type}s`](test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +}); diff --git a/public/js/bvbrc_js_client/test/subsystem.js b/public/js/bvbrc_js_client/test/subsystem.js new file mode 100644 index 000000000..b188db826 --- /dev/null +++ b/public/js/bvbrc_js_client/test/subsystem.js @@ -0,0 +1,34 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' +const type="Subsystem" + +describe(`${type} API Tests`, function(){ + const svc = new Service(endpoint) + const test_id="001382b1-55e4-4581-ba85-c2744a2dbeb8" + const test_id_field="id" + const test_rql_query = `eq(${test_id_field},${encodeURIComponent('"'+test_id+'"')})` + const test_solr_query = `${test_id_field}:${encodeURIComponent('"'+test_id+'"')}` + const expected_result_len = 1 + it(`get${type}`, async function(){ + const item = await svc[`get${type}`](test_id) + assert.equal(item[test_id_field],test_id) + }) + + it(`query ${type} RQL`, async function(){ + const result = await svc[`query${type}s`](test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it(`query ${type} SOLR`, async function(){ + const result = await svc[`query${type}s`](test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +}); diff --git a/public/js/bvbrc_js_client/test/subsystem_ref.js b/public/js/bvbrc_js_client/test/subsystem_ref.js new file mode 100644 index 000000000..b6c1a88bb --- /dev/null +++ b/public/js/bvbrc_js_client/test/subsystem_ref.js @@ -0,0 +1,34 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' +const type="SubsystemRef" + +describe(`${type} API Tests`, function(){ + const svc = new Service(endpoint) + const test_id="00c2c133-a6a9-47d1-99c1-b6a451b65fd0" + const test_id_field="id" + const test_rql_query = `eq(${test_id_field},${encodeURIComponent('"'+test_id+'"')})` + const test_solr_query = `${test_id_field}:${encodeURIComponent('"'+test_id+'"')}` + const expected_result_len = 1 + it(`get${type}`, async function(){ + const item = await svc[`get${type}`](test_id) + assert.equal(item[test_id_field],test_id) + }) + + it(`query ${type} RQL`, async function(){ + const result = await svc[`query${type}s`](test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it(`query ${type} SOLR`, async function(){ + const result = await svc[`query${type}s`](test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +}); diff --git a/public/js/bvbrc_js_client/test/taxonomy.js b/public/js/bvbrc_js_client/test/taxonomy.js new file mode 100644 index 000000000..1d43e2991 --- /dev/null +++ b/public/js/bvbrc_js_client/test/taxonomy.js @@ -0,0 +1,34 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' +const type="Taxonomy" + +describe(`${type} API Tests`, function(){ + const svc = new Service(endpoint) + const test_id="884113" + const test_id_field="taxon_id" + const test_rql_query = `eq(${test_id_field},${encodeURIComponent('"'+test_id+'"')})` + const test_solr_query = `${test_id_field}:${encodeURIComponent('"'+test_id+'"')}` + const expected_result_len = 1 + it(`get${type}`, async function(){ + const item = await svc[`get${type}`](test_id) + assert.equal(item[test_id_field],test_id) + }) + + it(`query ${type} RQL`, async function(){ + const result = await svc[`query${type}s`](test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it(`query ${type} SOLR`, async function(){ + const result = await svc[`query${type}s`](test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +}); diff --git a/public/js/bvbrc_js_client/test/transcriptomics_experiment.js b/public/js/bvbrc_js_client/test/transcriptomics_experiment.js new file mode 100644 index 000000000..0fa586c0a --- /dev/null +++ b/public/js/bvbrc_js_client/test/transcriptomics_experiment.js @@ -0,0 +1,34 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' +const type="TranscriptomicsExperiment" + +describe(`${type} API Tests`, function(){ + const svc = new Service(endpoint) + const test_id="100493" + const test_id_field="eid" + const test_rql_query = `eq(${test_id_field},${encodeURIComponent('"'+test_id+'"')})` + const test_solr_query = `${test_id_field}:${encodeURIComponent('"'+test_id+'"')}` + const expected_result_len = 1 + it(`get${type}`, async function(){ + const item = await svc[`get${type}`](test_id) + assert.equal(item[test_id_field],test_id) + }) + + it(`query ${type} RQL`, async function(){ + const result = await svc[`query${type}s`](test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it(`query ${type} SOLR`, async function(){ + const result = await svc[`query${type}s`](test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +}); diff --git a/public/js/bvbrc_js_client/test/transcriptomics_gene.js b/public/js/bvbrc_js_client/test/transcriptomics_gene.js new file mode 100644 index 000000000..7cf50f07b --- /dev/null +++ b/public/js/bvbrc_js_client/test/transcriptomics_gene.js @@ -0,0 +1,34 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' +const type="TranscriptomicsGene" + +describe(`${type} API Tests`, function(){ + const svc = new Service(endpoint) + const test_id="05e4172c-8d8a-47d6-8543-e7bc3aad9be3" + const test_id_field="id" + const test_rql_query = `eq(${test_id_field},${encodeURIComponent('"'+test_id+'"')})` + const test_solr_query = `${test_id_field}:${encodeURIComponent('"'+test_id+'"')}` + const expected_result_len = 1 + it(`get${type}`, async function(){ + const item = await svc[`get${type}`](test_id) + assert.equal(item[test_id_field],test_id) + }) + + it(`query ${type} RQL`, async function(){ + const result = await svc[`query${type}s`](test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it(`query ${type} SOLR`, async function(){ + const result = await svc[`query${type}s`](test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +}); diff --git a/public/js/bvbrc_js_client/test/transcriptomics_sample.js b/public/js/bvbrc_js_client/test/transcriptomics_sample.js new file mode 100644 index 000000000..d51b10703 --- /dev/null +++ b/public/js/bvbrc_js_client/test/transcriptomics_sample.js @@ -0,0 +1,34 @@ +const chai = require("chai"); +const assert = chai.assert +const Service = require("../src") +const endpoint = "https://patricbrc.org/api" +//const endpoint = "http://localhost:3001" +//const endpoint='https://httpbin.org/post' +const type="TranscriptomicsSample" + +describe(`${type} API Tests`, function(){ + const svc = new Service(endpoint) + const test_id="100000007" + const test_id_field="pid" + const test_rql_query = `eq(${test_id_field},${encodeURIComponent('"'+test_id+'"')})` + const test_solr_query = `${test_id_field}:${encodeURIComponent('"'+test_id+'"')}` + const expected_result_len = 1 + it(`get${type}`, async function(){ + const item = await svc[`get${type}`](test_id) + assert.equal(item[test_id_field],test_id) + }) + + it(`query ${type} RQL`, async function(){ + const result = await svc[`query${type}s`](test_rql_query,{"limit": expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) + + it(`query ${type} SOLR`, async function(){ + const result = await svc[`query${type}s`](test_solr_query,{"query_lang": "solr","limit":expected_result_len}) + const items = result.items + assert.equal(items[0][test_id_field],test_id) + assert.lengthOf(items,expected_result_len) + }) +});