From 3fd77ec3eaa2764747b56591577d4e1710ae0867 Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Mon, 9 Feb 2026 13:46:24 -0500 Subject: [PATCH 01/82] Testing Feb 6 --- api/src/health.js | 2 +- api/src/services/elasticsearch.js | 7 - api/src/services/elasticsearch.ts | 7 + cms/src/routes/health.js | 4 +- .../services/elastic-search/common/client.js | 2 +- .../elastic-search/genomicVariants.js | 52 +++--- cms/src/services/elastic-search/unpublish.js | 6 +- data_model/bin/fake.js | 2 +- package.json | 2 +- scripts/utils/esUtils.js | 2 +- ui/vite.config.ts | 2 +- yarn.lock | 168 +++++++++++++++++- 12 files changed, 213 insertions(+), 43 deletions(-) delete mode 100644 api/src/services/elasticsearch.js create mode 100644 api/src/services/elasticsearch.ts diff --git a/api/src/health.js b/api/src/health.js index c0276a80f..a9f7f7b20 100644 --- a/api/src/health.js +++ b/api/src/health.js @@ -1,5 +1,5 @@ import express from 'express'; -import elasticsearch from '@elastic/elasticsearch'; +import elasticsearch from '@opensearch-project/opensearch'; import _ from 'lodash'; diff --git a/api/src/services/elasticsearch.js b/api/src/services/elasticsearch.js deleted file mode 100644 index 1f8d63dc5..000000000 --- a/api/src/services/elasticsearch.js +++ /dev/null @@ -1,7 +0,0 @@ -import elasticsearch from '@elastic/elasticsearch'; - -const client = new elasticsearch.Client({ - node: process.env.ES_URL, -}); - -export default client; diff --git a/api/src/services/elasticsearch.ts b/api/src/services/elasticsearch.ts new file mode 100644 index 000000000..b6d2327a8 --- /dev/null +++ b/api/src/services/elasticsearch.ts @@ -0,0 +1,7 @@ +import elasticsearch, { Client } from '@opensearch-project/opensearch'; + +const client: Client = new elasticsearch.Client({ + node: process.env.ES_URL, +}); + +export default client; diff --git a/cms/src/routes/health.js b/cms/src/routes/health.js index c11b77934..edb96b772 100644 --- a/cms/src/routes/health.js +++ b/cms/src/routes/health.js @@ -42,12 +42,12 @@ healthRouter.get('/db', async (req, res) => { healthRouter.get('/s3', async (req, res) => { try { await testS3Connection() - .then(data => + .then((data) => res .status(200) .json({ status: 200, response: `Connected to S3 successfully: ${JSON.stringify(data)}` }), ) - .catch(err => + .catch((err) => res.status(err.statusCode).json({ error: 'Error connecting to S3', response: err.code }), ); } catch (e) { diff --git a/cms/src/services/elastic-search/common/client.js b/cms/src/services/elastic-search/common/client.js index c7b8c7ca1..17d85d472 100644 --- a/cms/src/services/elastic-search/common/client.js +++ b/cms/src/services/elastic-search/common/client.js @@ -1,4 +1,4 @@ -import { Client } from '@elastic/elasticsearch'; +import { Client } from '@opensearch-project/opensearch'; const eshost = `${process.env.ES_HOST || 'http://localhost'}:${process.env.ES_PORT || 9200}`; const client = new Client({ node: eshost, diff --git a/cms/src/services/elastic-search/genomicVariants.js b/cms/src/services/elastic-search/genomicVariants.js index b09594b30..69abd0bad 100644 --- a/cms/src/services/elastic-search/genomicVariants.js +++ b/cms/src/services/elastic-search/genomicVariants.js @@ -10,7 +10,7 @@ const MODEL_INDEX = process.env.ES_INDEX; const GENES_INDEX = 'genes'; const VARIANTS_INDEX = 'genomic_variants'; -const getAllIndexedDocs = async index => { +const getAllIndexedDocs = async (index) => { let output = []; let startFrom = 0; let totalHits = 1; @@ -35,38 +35,40 @@ const getAllIndexedDocs = async index => { // can't be sure what is published for a model in draft form (changes not yet published) // Additionally, to know which genes to remove we have to compare this list to the currently published list in the genes index on ES -const updateVariantIndex = async desiredVariants => { +const updateVariantIndex = async (desiredVariants) => { // TEMP: Remove all usage of variantIdMafOnly and just use variant_id once the gene reference is reimplemented - Jon Eubank 2020-09 - const variantIdMafOnly = originalID => `${originalID}_MAF`; + const variantIdMafOnly = (originalID) => `${originalID}_MAF`; logger.debug({ desiredVariants }, 'List of Variants that should be published'); - const variantIds = desiredVariants.map(v => variantIdMafOnly(v.variant.variant_id)); + const variantIds = desiredVariants.map((v) => variantIdMafOnly(v.variant.variant_id)); // 1. get list of variants published in ES const variantsResponse = await getAllIndexedDocs(VARIANTS_INDEX); - const publishedVariants = variantsResponse.map(variant => variant._id); + const publishedVariants = variantsResponse.map((variant) => variant._id); logger.debug({ publishedVariants }, 'List of Variants currently published'); // 2. find list of variants to unpublish and genes to publish - const removeVariants = publishedVariants.filter(publishedID => !variantIds.includes(publishedID)); + const removeVariants = publishedVariants.filter( + (publishedID) => !variantIds.includes(publishedID), + ); logger.debug({ removeVariants }, 'Variants to unpublish'); // TEMP: Remove the second clause, where we filter out Unknown named variants, when we re-implement the gene reference - Jon Eubank 2020-09 const addVariants = desiredVariants.filter( - v => + (v) => !publishedVariants.includes(variantIdMafOnly(v.variant.variant_id)) && !v.variant.name.includes('Unknown'), ); logger.debug({ addVariants }, 'Variants to publish'); // 3. do the publish/unpublish operations - const deleteRequests = removeVariants.map(variant => ({ + const deleteRequests = removeVariants.map((variant) => ({ delete: { _index: VARIANTS_INDEX, _id: variant }, })); const addRequests = flatten( - addVariants.map(v => { + addVariants.map((v) => { const doc = { name: v.variant.name, transcript_id: v.variant.transcript_id, @@ -94,32 +96,34 @@ const updateVariantIndex = async desiredVariants => { } }; -const updateGeneIndex = async desiredGenes => { - const desiredGeneIds = desiredGenes.map(gene => gene.symbol); +const updateGeneIndex = async (desiredGenes) => { + const desiredGeneIds = desiredGenes.map((gene) => gene.symbol); logger.debug({ desiredGenes: desiredGeneIds }, 'List of Genes that should be published'); // 1. get list of genes published in ES const genesResponse = await getAllIndexedDocs(GENES_INDEX); - const publishedGenes = genesResponse.map(i => i._id); + const publishedGenes = genesResponse.map((i) => i._id); logger.debug({ publishedGenes }, 'List of Genes currently published'); // 2. find list of genes to unpublish and genes to publish - const removeGenes = uniq(publishedGenes.filter(gene => !desiredGeneIds.includes(gene))); + const removeGenes = uniq(publishedGenes.filter((gene) => !desiredGeneIds.includes(gene))); logger.debug({ removeGenes }, 'Genes to unpublish'); const addGenes = uniq( - desiredGenes.filter(gene => !publishedGenes.includes(gene.symbol)), + desiredGenes.filter((gene) => !publishedGenes.includes(gene.symbol)), 'symbol', ); logger.debug({ addGenes }, 'Genes to publish'); // 3. do the publish/unpublish operations - const deleteRequests = removeGenes.map(gene => ({ delete: { _index: GENES_INDEX, _id: gene } })); + const deleteRequests = removeGenes.map((gene) => ({ + delete: { _index: GENES_INDEX, _id: gene }, + })); const addRequests = flatten( - desiredGenes.map(gene => { + desiredGenes.map((gene) => { return [ { index: { @@ -151,8 +155,8 @@ export const updateGeneSearchIndicies = async () => { // 1a. collect set of genes and variants from those model variants const desiredGenomicVariants = flatten( - publishedModels.map(model => { - return (model._source.genomic_variants || []).map(variant => ({ + publishedModels.map((model) => { + return (model._source.genomic_variants || []).map((variant) => ({ variant: { transcript_id: variant.transcript_id, variant_id: variant.variant_id, @@ -167,17 +171,19 @@ export const updateGeneSearchIndicies = async () => { ); const clinicalVariantGenes = flatten( - publishedModels.map(model => flatten(model._source.variants.map(variant => variant.genes))), + publishedModels.map((model) => flatten(model._source.variants.map((variant) => variant.genes))), ); logger.debug({ clinicalVariantGenes }, 'Genes found in published model variants'); // Filter the list of clinical variants to only have the names missing from the genomic variants list - const desiredGeneSymbols = desiredGenomicVariants.map(i => i.gene.symbol); + const desiredGeneSymbols = desiredGenomicVariants.map((i) => i.gene.symbol); const additionalGenesFromClinical = clinicalVariantGenes - .filter(clinicalGene => !desiredGeneSymbols.includes(clinicalGene)) - .map(gene => ({ symbol: gene })); + .filter((clinicalGene) => !desiredGeneSymbols.includes(clinicalGene)) + .map((gene) => ({ symbol: gene })); - const desiredGenes = desiredGenomicVariants.map(i => i.gene).concat(additionalGenesFromClinical); + const desiredGenes = desiredGenomicVariants + .map((i) => i.gene) + .concat(additionalGenesFromClinical); await updateGeneIndex(desiredGenes); await updateVariantIndex(desiredGenomicVariants); diff --git a/cms/src/services/elastic-search/unpublish.js b/cms/src/services/elastic-search/unpublish.js index 22f667c7e..fe32ea876 100644 --- a/cms/src/services/elastic-search/unpublish.js +++ b/cms/src/services/elastic-search/unpublish.js @@ -12,13 +12,13 @@ const logger = getLogger('services/elastic-search/unpublish'); const index = process.env.ES_INDEX; -export const unpublishModel = async name => { +export const unpublishModel = async (name) => { await unpublishOneFromES(name); await indexMatchedModelsToES({ name }); updateGeneSearchIndicies(); }; -export const unpublishOneFromES = async name => { +export const unpublishOneFromES = async (name) => { // Not waiting for update promise to // resolve as this is just bookkeeping indexEsUpdate(); @@ -39,7 +39,7 @@ export const unpublishOneFromES = async name => { logger.audit({ model: name }, 'unpublish model', 'Model Unpublished from ES'); }; -export const unpublishManyFromES = nameArr => { +export const unpublishManyFromES = (nameArr) => { // Not waiting for update promise to // resolve as this is just bookkeeping indexEsUpdate(); diff --git a/data_model/bin/fake.js b/data_model/bin/fake.js index fab091c31..c6e07997f 100644 --- a/data_model/bin/fake.js +++ b/data_model/bin/fake.js @@ -56,7 +56,7 @@ let main = async () => { let variants = createVariants(models); let prepBulk = (docs, _index, _type) => - docs.map(doc => [ + docs.map((doc) => [ { index: { _index, diff --git a/package.json b/package.json index 27cd9b775..cdf3400ac 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@babel/eslint-plugin": "^7.27.1", "@babel/plugin-proposal-optional-chaining": "^7.21.0", "@babel/preset-react": "^7.27.1", - "@elastic/elasticsearch": "~7.17.0", + "@elastic/elasticsearch": "^8", "axios": "^1.7.9", "eslint": "^9.39.1", "eslint-config-prettier": "^10.1.8", diff --git a/scripts/utils/esUtils.js b/scripts/utils/esUtils.js index 83e0d4777..ad1eb1f59 100644 --- a/scripts/utils/esUtils.js +++ b/scripts/utils/esUtils.js @@ -1,4 +1,4 @@ -import es from '@elastic/elasticsearch'; +import es from '@opensearch-project/opensearch'; const pm2Path = process.env.CMS_CONFIG || '../../cms/pm2.config.js'; const pm2Env = process.env.ENV; diff --git a/ui/vite.config.ts b/ui/vite.config.ts index 383600b80..fcec787aa 100644 --- a/ui/vite.config.ts +++ b/ui/vite.config.ts @@ -26,7 +26,7 @@ export default defineConfig(() => { mainFields: ['browser', 'module', 'jsnext'], }, server: { - port: 3000, + port: 3001, }, }; }); diff --git a/yarn.lock b/yarn.lock index bef84d5d7..04141f734 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1747,6 +1747,29 @@ ms "^2.1.3" secure-json-parse "^2.4.0" +"@elastic/elasticsearch@^8": + version "8.19.1" + resolved "https://registry.yarnpkg.com/@elastic/elasticsearch/-/elasticsearch-8.19.1.tgz#d7541f2c67850c362257815bc80d92e1fb6d7c7c" + integrity sha512-+1j9NnQVOX+lbWB8LhCM7IkUmjU05Y4+BmSLfusq0msCsQb1Va+OUKFCoOXjCJqQrcgdRdQCjYYyolQ/npQALQ== + dependencies: + "@elastic/transport" "^8.9.6" + apache-arrow "18.x - 21.x" + tslib "^2.4.0" + +"@elastic/transport@^8.9.6": + version "8.10.1" + resolved "https://registry.yarnpkg.com/@elastic/transport/-/transport-8.10.1.tgz#045e11d78d033a7f4293789bba58a4d02be35a60" + integrity sha512-xo2lPBAJEt81fQRAKa9T/gUq1SPGBHpSnVUXhoSpL996fPZRAfQwFA4BZtEUQL1p8Dezodd3ZN8Wwno+mYyKuw== + dependencies: + "@opentelemetry/api" "1.x" + "@opentelemetry/core" "2.x" + debug "^4.4.1" + hpagent "^1.2.0" + ms "^2.1.3" + secure-json-parse "^3.0.1" + tslib "^2.8.1" + undici "^6.21.1" + "@emnapi/core@^1.6.0", "@emnapi/core@^1.7.1": version "1.7.1" resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.7.1.tgz#3a79a02dbc84f45884a1806ebb98e5746bdfaac4" @@ -2792,6 +2815,23 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@opentelemetry/api@1.x": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.0.tgz#d03eba68273dc0f7509e2a3d5cba21eae10379fe" + integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== + +"@opentelemetry/core@2.x": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-2.5.0.tgz#3b2ac6cf471ed9a85eea836048a4de77a2e549d3" + integrity sha512-ka4H8OM6+DlUhSAZpONu0cPBtPPTQKxbxVzC4CzVx5+K4JnroJVBtDzLAMx4/3CDTJXRvVFhpFjtl4SaiTNoyQ== + dependencies: + "@opentelemetry/semantic-conventions" "^1.29.0" + +"@opentelemetry/semantic-conventions@^1.29.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.39.0.tgz#f653b2752171411feb40310b8a8953d7e5c543b7" + integrity sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg== + "@overture-stack/arranger-components@^3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@overture-stack/arranger-components/-/arranger-components-3.0.2.tgz#87d8158da19313f4beb213ab2964a78a127a0407" @@ -3685,6 +3725,13 @@ "@styled-system/core" "^5.1.2" "@styled-system/css" "^5.1.5" +"@swc/helpers@^0.5.11": + version "0.5.18" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.18.tgz#feeeabea0d10106ee25aaf900165df911ab6d3b1" + integrity sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ== + dependencies: + tslib "^2.8.0" + "@tailwindcss/node@4.1.17": version "4.1.17" resolved "https://registry.yarnpkg.com/@tailwindcss/node/-/node-4.1.17.tgz#ec40a37293246f4eeab2dac00e4425af9272f600" @@ -3872,6 +3919,16 @@ "@types/connect" "*" "@types/node" "*" +"@types/command-line-args@^5.2.3": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@types/command-line-args/-/command-line-args-5.2.3.tgz#553ce2fd5acf160b448d307649b38ffc60d39639" + integrity sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw== + +"@types/command-line-usage@^5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/command-line-usage/-/command-line-usage-5.0.4.tgz#374e4c62d78fbc5a670a0f36da10235af879a0d5" + integrity sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg== + "@types/connect@*": version "3.4.38" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" @@ -4063,6 +4120,13 @@ dependencies: undici-types "~6.21.0" +"@types/node@^24.0.3": + version "24.10.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.10.10.tgz#ea4813a65368ca7a98dfd75c84d748831b63e1cf" + integrity sha512-+0/4J266CBGPUq/ELg7QUHhN25WYjE0wYTPSQJn1xeu8DOlIOPxXxrNGiLmfAWl7HMMgWFWXpt9IDjMWrF5Iow== + dependencies: + undici-types "~7.16.0" + "@types/normalize-package-data@^2.4.0": version "2.4.4" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" @@ -4428,6 +4492,21 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +"apache-arrow@18.x - 21.x": + version "21.1.0" + resolved "https://registry.yarnpkg.com/apache-arrow/-/apache-arrow-21.1.0.tgz#0b8d0a844d7a86cc29902f3561bf8be7844b7b36" + integrity sha512-kQrYLxhC+NTVVZ4CCzGF6L/uPVOzJmD1T3XgbiUnP7oTeVFOFgEUu6IKNwCDkpFoBVqDKQivlX4RUFqqnWFlEA== + dependencies: + "@swc/helpers" "^0.5.11" + "@types/command-line-args" "^5.2.3" + "@types/command-line-usage" "^5.0.4" + "@types/node" "^24.0.3" + command-line-args "^6.0.1" + command-line-usage "^7.0.1" + flatbuffers "^25.1.24" + json-bignum "^0.0.3" + tslib "^2.6.2" + apollo-datasource@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-3.3.2.tgz#5711f8b38d4b7b53fb788cb4dbd4a6a526ea74c8" @@ -4573,6 +4652,11 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== +array-back@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-6.2.2.tgz#f567d99e9af88a6d3d2f9dfcc21db6f9ba9fd157" + integrity sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw== + array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" @@ -5277,6 +5361,13 @@ capture-exit@^2.0.0: dependencies: rsvp "^4.8.4" +chalk-template@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-0.4.0.tgz#692c034d0ed62436b9062c1707fadcd0f753204b" + integrity sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg== + dependencies: + chalk "^4.1.2" + chalk@2.4.2, chalk@^2.0.1, chalk@^2.3.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -5297,7 +5388,7 @@ chalk@^1.0.0: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -5486,6 +5577,26 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== +command-line-args@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-6.0.1.tgz#cbd1efb4f72b285dbd54bde9a8585c2d9694b070" + integrity sha512-Jr3eByUjqyK0qd8W0SGFW1nZwqCaNCtbXjRo2cRJC1OYxWl3MZ5t1US3jq+cO4sPavqgw4l9BMGX0CBe+trepg== + dependencies: + array-back "^6.2.2" + find-replace "^5.0.2" + lodash.camelcase "^4.3.0" + typical "^7.2.0" + +command-line-usage@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-7.0.3.tgz#6bce992354f6af10ecea2b631bfdf0c8b3bfaea3" + integrity sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q== + dependencies: + array-back "^6.2.2" + chalk-template "^0.4.0" + table-layout "^4.1.0" + typical "^7.1.1" + commander@^2.15.1, commander@^2.20.3, commander@^2.8.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -7076,6 +7187,11 @@ find-cache-dir@^2.0.0: make-dir "^2.0.0" pkg-dir "^3.0.0" +find-replace@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-5.0.2.tgz#fe27ff0be05975aef6fc679c1139bbabea564e26" + integrity sha512-Y45BAiE3mz2QsrN2fb5QEtO4qb44NcS7en/0y9PEVsg351HsLeVclP8QPMH79Le9sH3rs5RSwJu99W0WPZO43Q== + find-root@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" @@ -7112,6 +7228,11 @@ flat-cache@^4.0.0: flatted "^3.2.9" keyv "^4.5.4" +flatbuffers@^25.1.24: + version "25.9.23" + resolved "https://registry.yarnpkg.com/flatbuffers/-/flatbuffers-25.9.23.tgz#346811557fe9312ab5647535e793c761e9c81eb1" + integrity sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ== + flatted@^3.2.9: version "3.3.3" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" @@ -7745,6 +7866,11 @@ hpagent@^0.1.1: resolved "https://registry.yarnpkg.com/hpagent/-/hpagent-0.1.2.tgz#cab39c66d4df2d4377dbd212295d878deb9bdaa9" integrity sha512-ePqFXHtSQWAFXYmj+JtOTHr84iNrII4/QRlAAPPE+zqnKy4xJo7Ie1Y4kC7AdB+LxLxSTTzBMASsEcy0q8YyvQ== +hpagent@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/hpagent/-/hpagent-1.2.0.tgz#0ae417895430eb3770c03443456b8d90ca464903" + integrity sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA== + hpkp@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/hpkp/-/hpkp-2.0.0.tgz#10e142264e76215a5d30c44ec43de64dee6d1672" @@ -8862,6 +8988,11 @@ json-bigint@^1.0.0: dependencies: bignumber.js "^9.0.0" +json-bignum@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/json-bignum/-/json-bignum-0.0.3.tgz#41163b50436c773d82424dbc20ed70db7604b8d7" + integrity sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg== + json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -9250,6 +9381,11 @@ lodash.bind@~2.3.0: lodash._renative "~2.3.0" lodash._slice "~2.3.0" +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -11678,6 +11814,11 @@ secure-json-parse@^2.4.0: resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.7.0.tgz#5a5f9cd6ae47df23dba3151edd06855d47e09862" integrity sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw== +secure-json-parse@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-3.0.2.tgz#255b03bb0627ba5805f64f384b0a7691d8cb021b" + integrity sha512-H6nS2o8bWfpFEV6U38sOSjS7bTbdgbCGU9wEM6W14P5H0QOsz94KCusifV44GpHDTu2nqZbuDNhTzu+mjDSw1w== + seek-bzip@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4" @@ -12475,6 +12616,14 @@ synckit@^0.11.7: dependencies: "@pkgr/core" "^0.2.9" +table-layout@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-4.1.1.tgz#0f72965de1a5c0c1419c9ba21cae4e73a2f73a42" + integrity sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA== + dependencies: + array-back "^6.2.2" + wordwrapjs "^5.1.0" + tailwindcss@4.1.17: version "4.1.17" resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-4.1.17.tgz#e6dcb7a9c60cef7522169b5f207ffec2fd652286" @@ -12703,7 +12852,7 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.2, tslib@^2.6.3: +tslib@^2.1.0, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.2, tslib@^2.6.3, tslib@^2.8.0, tslib@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -12832,6 +12981,11 @@ typescript@^5.8.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== +typical@^7.1.1, typical@^7.2.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-7.3.0.tgz#930376be344228709f134613911fa22aa09617a4" + integrity sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw== + ua-parser-js@^0.7.30: version "0.7.41" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.41.tgz#9f6dee58c389e8afababa62a4a2dc22edb69a452" @@ -12870,6 +13024,11 @@ undici-types@~7.16.0: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== +undici@^6.21.1: + version "6.23.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.23.0.tgz#7953087744d9095a96f115de3140ca3828aff3a4" + integrity sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" @@ -13386,6 +13545,11 @@ word-wrap@^1.2.5: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== +wordwrapjs@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-5.1.1.tgz#bfd1eb426f0f7eec73b7df32cf7df1f618bfb3a9" + integrity sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg== + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" From f7cd5040604750ddf341c99ad182034a386592bc Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Mon, 9 Mar 2026 17:10:46 -0400 Subject: [PATCH 02/82] Import organize --- scripts/utils/esUtils.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/utils/esUtils.js b/scripts/utils/esUtils.js index ad1eb1f59..74cd247d6 100644 --- a/scripts/utils/esUtils.js +++ b/scripts/utils/esUtils.js @@ -1,5 +1,10 @@ import es from '@opensearch-project/opensearch'; +/** Search index settings and mappings **/ +import modelsIndexConfig from '../../elasticsearch/modelsIndex.json' with { type: "json" }; +import genesIndexConfig from '../../elasticsearch/genesIndex.json' with { type: "json" }; +import variantsIndexConfig from '../../elasticsearch/variantsIndex.json' with { type: "json" }; + const pm2Path = process.env.CMS_CONFIG || '../../cms/pm2.config.js'; const pm2Env = process.env.ENV; if (!pm2Env) { @@ -10,15 +15,10 @@ const pm2ConfigGeneric = (pm2Config && pm2Config.apps && pm2Config.apps[0] && pm2Config.apps[0].env) || {}; const pm2ConfigForEnv = (pm2Config && pm2Config.apps && pm2Config.apps[0] && pm2Config.apps[0][`env_${pm2Env}`]) || {}; - const pm2 = { ...pm2ConfigGeneric, ...pm2ConfigForEnv }; -/** Search index settings and mappings **/ -import modelsIndexConfig from '../../elasticsearch/modelsIndex.json' with { type: "json" }; -import genesIndexConfig from '../../elasticsearch/genesIndex.json' with { type: "json" }; -import variantsIndexConfig from '../../elasticsearch/variantsIndex.json' with { type: "json" }; -const modelsIndexName = process.env.ES_INDEX || pm2.ES_INDEX || 'hcmi'; const esHost = process.env.ES_HOST || `${pm2.ES_HOST}:${pm2.ES_PORT}`; +const modelsIndexName = process.env.ES_INDEX || pm2.ES_INDEX || 'hcmi'; const GENES_INDEX = 'genes'; const VARIANTS_INDEX = 'genomic_variants'; From 3ea814591642f019aacaac304269eccc215bb225 Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Tue, 10 Mar 2026 11:15:55 -0400 Subject: [PATCH 03/82] Use Mongoose 8.23 --- api/package.json | 2 +- yarn.lock | 1264 ++++++++++++++++++++++------------------------ 2 files changed, 618 insertions(+), 648 deletions(-) diff --git a/api/package.json b/api/package.json index 3fde1c853..8cac75ea2 100644 --- a/api/package.json +++ b/api/package.json @@ -21,7 +21,7 @@ "helmet": "^3.15.0", "jszip": "^3.7.0", "map-stream": "^0.0.7", - "mongoose": "7.8.7", + "mongoose": "^8.23.0", "pino": "^9.13.1", "pino-http": "^10.5.0", "sharp": "0.34.4" diff --git a/yarn.lock b/yarn.lock index 04141f734..aeee3fa3b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -148,440 +148,397 @@ "@smithy/util-utf8" "^2.0.0" tslib "^2.6.2" -"@aws-sdk/client-cognito-identity@3.943.0": - version "3.943.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.943.0.tgz#d938a3dd1ebafafd38c55819e3c8347b674ac25c" - integrity sha512-XkuokRF2IQ+VLBn0AwrwfFOkZ2c1IXACwQdn3CDnpBZpT1s2hgH3MX0DoH9+41w4ar2QCSI09uAJiv9PX4DLoQ== +"@aws-sdk/client-cognito-identity@3.1005.0": + version "3.1005.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.1005.0.tgz#d18a9cb90238fcb6884a3a3944a5e2d91bcef1bc" + integrity sha512-vYZCaQPvawj2W76UtQCu2VCV0vEQnHxL1MOKri4jICLSRiFPlHTosUuwJDzJIIrvTuFgR2DolbcBLRSCLBo/oQ== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.943.0" - "@aws-sdk/credential-provider-node" "3.943.0" - "@aws-sdk/middleware-host-header" "3.936.0" - "@aws-sdk/middleware-logger" "3.936.0" - "@aws-sdk/middleware-recursion-detection" "3.936.0" - "@aws-sdk/middleware-user-agent" "3.943.0" - "@aws-sdk/region-config-resolver" "3.936.0" - "@aws-sdk/types" "3.936.0" - "@aws-sdk/util-endpoints" "3.936.0" - "@aws-sdk/util-user-agent-browser" "3.936.0" - "@aws-sdk/util-user-agent-node" "3.943.0" - "@smithy/config-resolver" "^4.4.3" - "@smithy/core" "^3.18.5" - "@smithy/fetch-http-handler" "^5.3.6" - "@smithy/hash-node" "^4.2.5" - "@smithy/invalid-dependency" "^4.2.5" - "@smithy/middleware-content-length" "^4.2.5" - "@smithy/middleware-endpoint" "^4.3.12" - "@smithy/middleware-retry" "^4.4.12" - "@smithy/middleware-serde" "^4.2.6" - "@smithy/middleware-stack" "^4.2.5" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/node-http-handler" "^4.4.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/smithy-client" "^4.9.8" - "@smithy/types" "^4.9.0" - "@smithy/url-parser" "^4.2.5" - "@smithy/util-base64" "^4.3.0" - "@smithy/util-body-length-browser" "^4.2.0" - "@smithy/util-body-length-node" "^4.2.1" - "@smithy/util-defaults-mode-browser" "^4.3.11" - "@smithy/util-defaults-mode-node" "^4.2.14" - "@smithy/util-endpoints" "^3.2.5" - "@smithy/util-middleware" "^4.2.5" - "@smithy/util-retry" "^4.2.5" - "@smithy/util-utf8" "^4.2.0" + "@aws-sdk/core" "^3.973.19" + "@aws-sdk/credential-provider-node" "^3.972.19" + "@aws-sdk/middleware-host-header" "^3.972.7" + "@aws-sdk/middleware-logger" "^3.972.7" + "@aws-sdk/middleware-recursion-detection" "^3.972.7" + "@aws-sdk/middleware-user-agent" "^3.972.20" + "@aws-sdk/region-config-resolver" "^3.972.7" + "@aws-sdk/types" "^3.973.5" + "@aws-sdk/util-endpoints" "^3.996.4" + "@aws-sdk/util-user-agent-browser" "^3.972.7" + "@aws-sdk/util-user-agent-node" "^3.973.5" + "@smithy/config-resolver" "^4.4.10" + "@smithy/core" "^3.23.9" + "@smithy/fetch-http-handler" "^5.3.13" + "@smithy/hash-node" "^4.2.11" + "@smithy/invalid-dependency" "^4.2.11" + "@smithy/middleware-content-length" "^4.2.11" + "@smithy/middleware-endpoint" "^4.4.23" + "@smithy/middleware-retry" "^4.4.40" + "@smithy/middleware-serde" "^4.2.12" + "@smithy/middleware-stack" "^4.2.11" + "@smithy/node-config-provider" "^4.3.11" + "@smithy/node-http-handler" "^4.4.14" + "@smithy/protocol-http" "^5.3.11" + "@smithy/smithy-client" "^4.12.3" + "@smithy/types" "^4.13.0" + "@smithy/url-parser" "^4.2.11" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-body-length-browser" "^4.2.2" + "@smithy/util-body-length-node" "^4.2.3" + "@smithy/util-defaults-mode-browser" "^4.3.39" + "@smithy/util-defaults-mode-node" "^4.2.42" + "@smithy/util-endpoints" "^3.3.2" + "@smithy/util-middleware" "^4.2.11" + "@smithy/util-retry" "^4.2.11" + "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" -"@aws-sdk/client-sso@3.943.0": - version "3.943.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.943.0.tgz#0ed7c0d6c1df537ed21ec882b2db162405541c9f" - integrity sha512-kOTO2B8Ks2qX73CyKY8PAajtf5n39aMe2spoiOF5EkgSzGV7hZ/HONRDyADlyxwfsX39Q2F2SpPUaXzon32IGw== - dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.943.0" - "@aws-sdk/middleware-host-header" "3.936.0" - "@aws-sdk/middleware-logger" "3.936.0" - "@aws-sdk/middleware-recursion-detection" "3.936.0" - "@aws-sdk/middleware-user-agent" "3.943.0" - "@aws-sdk/region-config-resolver" "3.936.0" - "@aws-sdk/types" "3.936.0" - "@aws-sdk/util-endpoints" "3.936.0" - "@aws-sdk/util-user-agent-browser" "3.936.0" - "@aws-sdk/util-user-agent-node" "3.943.0" - "@smithy/config-resolver" "^4.4.3" - "@smithy/core" "^3.18.5" - "@smithy/fetch-http-handler" "^5.3.6" - "@smithy/hash-node" "^4.2.5" - "@smithy/invalid-dependency" "^4.2.5" - "@smithy/middleware-content-length" "^4.2.5" - "@smithy/middleware-endpoint" "^4.3.12" - "@smithy/middleware-retry" "^4.4.12" - "@smithy/middleware-serde" "^4.2.6" - "@smithy/middleware-stack" "^4.2.5" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/node-http-handler" "^4.4.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/smithy-client" "^4.9.8" - "@smithy/types" "^4.9.0" - "@smithy/url-parser" "^4.2.5" - "@smithy/util-base64" "^4.3.0" - "@smithy/util-body-length-browser" "^4.2.0" - "@smithy/util-body-length-node" "^4.2.1" - "@smithy/util-defaults-mode-browser" "^4.3.11" - "@smithy/util-defaults-mode-node" "^4.2.14" - "@smithy/util-endpoints" "^3.2.5" - "@smithy/util-middleware" "^4.2.5" - "@smithy/util-retry" "^4.2.5" - "@smithy/util-utf8" "^4.2.0" +"@aws-sdk/core@^3.973.19": + version "3.973.19" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.973.19.tgz#ee67105ca00cdcd31d9921d338c2739442c8bc5b" + integrity sha512-56KePyOcZnKTWCd89oJS1G6j3HZ9Kc+bh/8+EbvtaCCXdP6T7O7NzCiPuHRhFLWnzXIaXX3CxAz0nI5My9spHQ== + dependencies: + "@aws-sdk/types" "^3.973.5" + "@aws-sdk/xml-builder" "^3.972.10" + "@smithy/core" "^3.23.9" + "@smithy/node-config-provider" "^4.3.11" + "@smithy/property-provider" "^4.2.11" + "@smithy/protocol-http" "^5.3.11" + "@smithy/signature-v4" "^5.3.11" + "@smithy/smithy-client" "^4.12.3" + "@smithy/types" "^4.13.0" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-middleware" "^4.2.11" + "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" -"@aws-sdk/core@3.943.0": - version "3.943.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.943.0.tgz#a0c3c20d5c3bbcfd3dd32f74f9620097b9734573" - integrity sha512-8CBy2hI9ABF7RBVQuY1bgf/ue+WPmM/hl0adrXFlhnhkaQP0tFY5zhiy1Y+n7V+5f3/ORoHBmCCQmcHDDYJqJQ== - dependencies: - "@aws-sdk/types" "3.936.0" - "@aws-sdk/xml-builder" "3.930.0" - "@smithy/core" "^3.18.5" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/property-provider" "^4.2.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/signature-v4" "^5.3.5" - "@smithy/smithy-client" "^4.9.8" - "@smithy/types" "^4.9.0" - "@smithy/util-base64" "^4.3.0" - "@smithy/util-middleware" "^4.2.5" - "@smithy/util-utf8" "^4.2.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-cognito-identity@3.943.0": - version "3.943.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.943.0.tgz#995c46fe62a78427e37242313ba34a1ee75006ef" - integrity sha512-jZJ0uHjNlhfjx2ZX7YVYnh1wfSkLAvQmecGCSl9C6LJRNXy4uWFPbGjPqcA0tWp0WWIsUYhqjasgvCOMZIY8nw== +"@aws-sdk/credential-provider-cognito-identity@^3.972.11": + version "3.972.11" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.972.11.tgz#d310bb4f583a799aa7d5e80b5b1346a1cacb6b44" + integrity sha512-yHBjinYauxSvikf15EtgXyZ9TBIMVHUSWFPycQtPltTINpK+uv6K22zKkVsbxpB0gvsdRdIWP0UG5gejM+jPuQ== dependencies: - "@aws-sdk/client-cognito-identity" "3.943.0" - "@aws-sdk/types" "3.936.0" - "@smithy/property-provider" "^4.2.5" - "@smithy/types" "^4.9.0" + "@aws-sdk/nested-clients" "^3.996.8" + "@aws-sdk/types" "^3.973.5" + "@smithy/property-provider" "^4.2.11" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-env@3.943.0": - version "3.943.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.943.0.tgz#eb2bf3a50df3f25ca125a953c450319a8b23aa45" - integrity sha512-WnS5w9fK9CTuoZRVSIHLOMcI63oODg9qd1vXMYb7QGLGlfwUm4aG3hdu7i9XvYrpkQfE3dzwWLtXF4ZBuL1Tew== +"@aws-sdk/credential-provider-env@^3.972.17": + version "3.972.17" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.17.tgz#5fe65959faac017cdbefa34be05f09490fc856ab" + integrity sha512-MBAMW6YELzE1SdkOniqr51mrjapQUv8JXSGxtwRjQV0mwVDutVsn22OPAUt4RcLRvdiHQmNBDEFP9iTeSVCOlA== dependencies: - "@aws-sdk/core" "3.943.0" - "@aws-sdk/types" "3.936.0" - "@smithy/property-provider" "^4.2.5" - "@smithy/types" "^4.9.0" + "@aws-sdk/core" "^3.973.19" + "@aws-sdk/types" "^3.973.5" + "@smithy/property-provider" "^4.2.11" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-http@3.943.0": - version "3.943.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.943.0.tgz#7d5b549a93145785b0d8f78c40fd5198e2e19e5b" - integrity sha512-SA8bUcYDEACdhnhLpZNnWusBpdmj4Vl67Vxp3Zke7SvoWSYbuxa+tiDiC+c92Z4Yq6xNOuLPW912ZPb9/NsSkA== - dependencies: - "@aws-sdk/core" "3.943.0" - "@aws-sdk/types" "3.936.0" - "@smithy/fetch-http-handler" "^5.3.6" - "@smithy/node-http-handler" "^4.4.5" - "@smithy/property-provider" "^4.2.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/smithy-client" "^4.9.8" - "@smithy/types" "^4.9.0" - "@smithy/util-stream" "^4.5.6" +"@aws-sdk/credential-provider-http@^3.972.19": + version "3.972.19" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.19.tgz#b9b0ee4a9388f3ed3013a1ec6b2bc269f04599e4" + integrity sha512-9EJROO8LXll5a7eUFqu48k6BChrtokbmgeMWmsH7lBb6lVbtjslUYz/ShLi+SHkYzTomiGBhmzTW7y+H4BxsnA== + dependencies: + "@aws-sdk/core" "^3.973.19" + "@aws-sdk/types" "^3.973.5" + "@smithy/fetch-http-handler" "^5.3.13" + "@smithy/node-http-handler" "^4.4.14" + "@smithy/property-provider" "^4.2.11" + "@smithy/protocol-http" "^5.3.11" + "@smithy/smithy-client" "^4.12.3" + "@smithy/types" "^4.13.0" + "@smithy/util-stream" "^4.5.17" tslib "^2.6.2" -"@aws-sdk/credential-provider-ini@3.943.0": - version "3.943.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.943.0.tgz#e03a5cfca5b822b6cc2ec36168801969c25b3b41" - integrity sha512-BcLDb8l4oVW+NkuqXMlO7TnM6lBOWW318ylf4FRED/ply5eaGxkQYqdGvHSqGSN5Rb3vr5Ek0xpzSjeYD7C8Kw== - dependencies: - "@aws-sdk/core" "3.943.0" - "@aws-sdk/credential-provider-env" "3.943.0" - "@aws-sdk/credential-provider-http" "3.943.0" - "@aws-sdk/credential-provider-login" "3.943.0" - "@aws-sdk/credential-provider-process" "3.943.0" - "@aws-sdk/credential-provider-sso" "3.943.0" - "@aws-sdk/credential-provider-web-identity" "3.943.0" - "@aws-sdk/nested-clients" "3.943.0" - "@aws-sdk/types" "3.936.0" - "@smithy/credential-provider-imds" "^4.2.5" - "@smithy/property-provider" "^4.2.5" - "@smithy/shared-ini-file-loader" "^4.4.0" - "@smithy/types" "^4.9.0" +"@aws-sdk/credential-provider-ini@^3.972.18": + version "3.972.18" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.18.tgz#ff3f3536e752f8c47300b48a07309f9c12438221" + integrity sha512-vthIAXJISZnj2576HeyLBj4WTeX+I7PwWeRkbOa0mVX39K13SCGxCgOFuKj2ytm9qTlLOmXe4cdEnroteFtJfw== + dependencies: + "@aws-sdk/core" "^3.973.19" + "@aws-sdk/credential-provider-env" "^3.972.17" + "@aws-sdk/credential-provider-http" "^3.972.19" + "@aws-sdk/credential-provider-login" "^3.972.18" + "@aws-sdk/credential-provider-process" "^3.972.17" + "@aws-sdk/credential-provider-sso" "^3.972.18" + "@aws-sdk/credential-provider-web-identity" "^3.972.18" + "@aws-sdk/nested-clients" "^3.996.8" + "@aws-sdk/types" "^3.973.5" + "@smithy/credential-provider-imds" "^4.2.11" + "@smithy/property-provider" "^4.2.11" + "@smithy/shared-ini-file-loader" "^4.4.6" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-login@3.943.0": - version "3.943.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.943.0.tgz#4813bebb468bc762f73501026edd4bb37c999d5f" - integrity sha512-9iCOVkiRW+evxiJE94RqosCwRrzptAVPhRhGWv4osfYDhjNAvUMyrnZl3T1bjqCoKNcETRKEZIU3dqYHnUkcwQ== - dependencies: - "@aws-sdk/core" "3.943.0" - "@aws-sdk/nested-clients" "3.943.0" - "@aws-sdk/types" "3.936.0" - "@smithy/property-provider" "^4.2.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/shared-ini-file-loader" "^4.4.0" - "@smithy/types" "^4.9.0" +"@aws-sdk/credential-provider-login@^3.972.18": + version "3.972.18" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.18.tgz#f580aeca507c4d383eaecf3d5db858f230a5816b" + integrity sha512-kINzc5BBxdYBkPZ0/i1AMPMOk5b5QaFNbYMElVw5QTX13AKj6jcxnv/YNl9oW9mg+Y08ti19hh01HhyEAxsSJQ== + dependencies: + "@aws-sdk/core" "^3.973.19" + "@aws-sdk/nested-clients" "^3.996.8" + "@aws-sdk/types" "^3.973.5" + "@smithy/property-provider" "^4.2.11" + "@smithy/protocol-http" "^5.3.11" + "@smithy/shared-ini-file-loader" "^4.4.6" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-node@3.943.0": - version "3.943.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.943.0.tgz#3d67bc92153efbc210d66acc63de7ac25b7632c3" - integrity sha512-14eddaH/gjCWoLSAELVrFOQNyswUYwWphIt+PdsJ/FqVfP4ay2HsiZVEIYbQtmrKHaoLJhiZKwBQRjcqJDZG0w== - dependencies: - "@aws-sdk/credential-provider-env" "3.943.0" - "@aws-sdk/credential-provider-http" "3.943.0" - "@aws-sdk/credential-provider-ini" "3.943.0" - "@aws-sdk/credential-provider-process" "3.943.0" - "@aws-sdk/credential-provider-sso" "3.943.0" - "@aws-sdk/credential-provider-web-identity" "3.943.0" - "@aws-sdk/types" "3.936.0" - "@smithy/credential-provider-imds" "^4.2.5" - "@smithy/property-provider" "^4.2.5" - "@smithy/shared-ini-file-loader" "^4.4.0" - "@smithy/types" "^4.9.0" +"@aws-sdk/credential-provider-node@^3.972.19": + version "3.972.19" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.19.tgz#0135ea6827ccec78f8440ed4e33cfa8188080aab" + integrity sha512-yDWQ9dFTr+IMxwanFe7+tbN5++q8psZBjlUwOiCXn1EzANoBgtqBwcpYcHaMGtn0Wlfj4NuXdf2JaEx1lz5RaQ== + dependencies: + "@aws-sdk/credential-provider-env" "^3.972.17" + "@aws-sdk/credential-provider-http" "^3.972.19" + "@aws-sdk/credential-provider-ini" "^3.972.18" + "@aws-sdk/credential-provider-process" "^3.972.17" + "@aws-sdk/credential-provider-sso" "^3.972.18" + "@aws-sdk/credential-provider-web-identity" "^3.972.18" + "@aws-sdk/types" "^3.973.5" + "@smithy/credential-provider-imds" "^4.2.11" + "@smithy/property-provider" "^4.2.11" + "@smithy/shared-ini-file-loader" "^4.4.6" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-process@3.943.0": - version "3.943.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.943.0.tgz#d289d73ee31471a5a0b5ca2c908983b3a1866be1" - integrity sha512-GIY/vUkthL33AdjOJ8r9vOosKf/3X+X7LIiACzGxvZZrtoOiRq0LADppdiKIB48vTL63VvW+eRIOFAxE6UDekw== +"@aws-sdk/credential-provider-process@^3.972.17": + version "3.972.17" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.17.tgz#c8ae4e2e1adb96b21d763c86a1c6562aa599145c" + integrity sha512-c8G8wT1axpJDgaP3xzcy+q8Y1fTi9A2eIQJvyhQ9xuXrUZhlCfXbC0vM9bM1CUXiZppFQ1p7g0tuUMvil/gCPg== dependencies: - "@aws-sdk/core" "3.943.0" - "@aws-sdk/types" "3.936.0" - "@smithy/property-provider" "^4.2.5" - "@smithy/shared-ini-file-loader" "^4.4.0" - "@smithy/types" "^4.9.0" + "@aws-sdk/core" "^3.973.19" + "@aws-sdk/types" "^3.973.5" + "@smithy/property-provider" "^4.2.11" + "@smithy/shared-ini-file-loader" "^4.4.6" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-sso@3.943.0": - version "3.943.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.943.0.tgz#39ca467b492e731a81e52c43462bb4a00df72861" - integrity sha512-1c5G11syUrru3D9OO6Uk+ul5e2lX1adb+7zQNyluNaLPXP6Dina6Sy6DFGRLu7tM8+M7luYmbS3w63rpYpaL+A== - dependencies: - "@aws-sdk/client-sso" "3.943.0" - "@aws-sdk/core" "3.943.0" - "@aws-sdk/token-providers" "3.943.0" - "@aws-sdk/types" "3.936.0" - "@smithy/property-provider" "^4.2.5" - "@smithy/shared-ini-file-loader" "^4.4.0" - "@smithy/types" "^4.9.0" +"@aws-sdk/credential-provider-sso@^3.972.18": + version "3.972.18" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.18.tgz#0d00e49ffca3760895ec46ec54532b479a2745d7" + integrity sha512-YHYEfj5S2aqInRt5ub8nDOX8vAxgMvd84wm2Y3WVNfFa/53vOv9T7WOAqXI25qjj3uEcV46xxfqdDQk04h5XQA== + dependencies: + "@aws-sdk/core" "^3.973.19" + "@aws-sdk/nested-clients" "^3.996.8" + "@aws-sdk/token-providers" "3.1005.0" + "@aws-sdk/types" "^3.973.5" + "@smithy/property-provider" "^4.2.11" + "@smithy/shared-ini-file-loader" "^4.4.6" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-web-identity@3.943.0": - version "3.943.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.943.0.tgz#2b4ec3a6580bb34c55707f567c63b2e1477569e4" - integrity sha512-VtyGKHxICSb4kKGuaqotxso8JVM8RjCS3UYdIMOxUt9TaFE/CZIfZKtjTr+IJ7M0P7t36wuSUb/jRLyNmGzUUA== - dependencies: - "@aws-sdk/core" "3.943.0" - "@aws-sdk/nested-clients" "3.943.0" - "@aws-sdk/types" "3.936.0" - "@smithy/property-provider" "^4.2.5" - "@smithy/shared-ini-file-loader" "^4.4.0" - "@smithy/types" "^4.9.0" +"@aws-sdk/credential-provider-web-identity@^3.972.18": + version "3.972.18" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.18.tgz#0e44b8dea94a5a054549f319a130ac66aac4cc00" + integrity sha512-OqlEQpJ+J3T5B96qtC1zLLwkBloechP+fezKbCH0sbd2cCc0Ra55XpxWpk/hRj69xAOYtHvoC4orx6eTa4zU7g== + dependencies: + "@aws-sdk/core" "^3.973.19" + "@aws-sdk/nested-clients" "^3.996.8" + "@aws-sdk/types" "^3.973.5" + "@smithy/property-provider" "^4.2.11" + "@smithy/shared-ini-file-loader" "^4.4.6" + "@smithy/types" "^4.13.0" tslib "^2.6.2" "@aws-sdk/credential-providers@^3.186.0": - version "3.943.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.943.0.tgz#8b91a783bfc06f20257355fb36561821975be8a9" - integrity sha512-uZurSNsS01ehhrSwEPwcKdqp9lmd/x9q++BYO351bXyjSj1LzA/2lfUIxI2tCz/wAjJWOdnnlUdJj6P9I1uNvw== - dependencies: - "@aws-sdk/client-cognito-identity" "3.943.0" - "@aws-sdk/core" "3.943.0" - "@aws-sdk/credential-provider-cognito-identity" "3.943.0" - "@aws-sdk/credential-provider-env" "3.943.0" - "@aws-sdk/credential-provider-http" "3.943.0" - "@aws-sdk/credential-provider-ini" "3.943.0" - "@aws-sdk/credential-provider-login" "3.943.0" - "@aws-sdk/credential-provider-node" "3.943.0" - "@aws-sdk/credential-provider-process" "3.943.0" - "@aws-sdk/credential-provider-sso" "3.943.0" - "@aws-sdk/credential-provider-web-identity" "3.943.0" - "@aws-sdk/nested-clients" "3.943.0" - "@aws-sdk/types" "3.936.0" - "@smithy/config-resolver" "^4.4.3" - "@smithy/core" "^3.18.5" - "@smithy/credential-provider-imds" "^4.2.5" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/property-provider" "^4.2.5" - "@smithy/types" "^4.9.0" + version "3.1005.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.1005.0.tgz#7d6e7f93276c4c2f5cc1abd0ac5460f2de953c1a" + integrity sha512-H6Prb37+8TdTkGsYH1WkWjupWdM4aHTmF6VLdyTwOWmg4WFkKAb1OJcMrxNCJ8Yy/UvxOca4jk6z2ej+T1pjtQ== + dependencies: + "@aws-sdk/client-cognito-identity" "3.1005.0" + "@aws-sdk/core" "^3.973.19" + "@aws-sdk/credential-provider-cognito-identity" "^3.972.11" + "@aws-sdk/credential-provider-env" "^3.972.17" + "@aws-sdk/credential-provider-http" "^3.972.19" + "@aws-sdk/credential-provider-ini" "^3.972.18" + "@aws-sdk/credential-provider-login" "^3.972.18" + "@aws-sdk/credential-provider-node" "^3.972.19" + "@aws-sdk/credential-provider-process" "^3.972.17" + "@aws-sdk/credential-provider-sso" "^3.972.18" + "@aws-sdk/credential-provider-web-identity" "^3.972.18" + "@aws-sdk/nested-clients" "^3.996.8" + "@aws-sdk/types" "^3.973.5" + "@smithy/config-resolver" "^4.4.10" + "@smithy/core" "^3.23.9" + "@smithy/credential-provider-imds" "^4.2.11" + "@smithy/node-config-provider" "^4.3.11" + "@smithy/property-provider" "^4.2.11" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@aws-sdk/middleware-host-header@3.936.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.936.0.tgz#ef1144d175f1f499afbbd92ad07e24f8ccc9e9ce" - integrity sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw== +"@aws-sdk/middleware-host-header@^3.972.7": + version "3.972.7" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.7.tgz#b18849cf807e0742fdf84db41c2258770bd1e452" + integrity sha512-aHQZgztBFEpDU1BB00VWCIIm85JjGjQW1OG9+98BdmaOpguJvzmXBGbnAiYcciCd+IS4e9BEq664lhzGnWJHgQ== dependencies: - "@aws-sdk/types" "3.936.0" - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" + "@aws-sdk/types" "^3.973.5" + "@smithy/protocol-http" "^5.3.11" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@aws-sdk/middleware-logger@3.936.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.936.0.tgz#691093bebb708b994be10f19358e8699af38a209" - integrity sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw== +"@aws-sdk/middleware-logger@^3.972.7": + version "3.972.7" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.972.7.tgz#ffea4e2ff1e9d86047c564c982d64ade8017791e" + integrity sha512-LXhiWlWb26txCU1vcI9PneESSeRp/RYY/McuM4SpdrimQR5NgwaPb4VJCadVeuGWgh6QmqZ6rAKSoL1ob16W6w== dependencies: - "@aws-sdk/types" "3.936.0" - "@smithy/types" "^4.9.0" + "@aws-sdk/types" "^3.973.5" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@aws-sdk/middleware-recursion-detection@3.936.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.936.0.tgz#141b6c92c1aa42bcd71aa854e0783b4f28e87a30" - integrity sha512-l4aGbHpXM45YNgXggIux1HgsCVAvvBoqHPkqLnqMl9QVapfuSTjJHfDYDsx1Xxct6/m7qSMUzanBALhiaGO2fA== +"@aws-sdk/middleware-recursion-detection@^3.972.7": + version "3.972.7" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.7.tgz#9d6376ee724c9b77d6518c51d0b2c8b18f1f72bf" + integrity sha512-l2VQdcBcYLzIzykCHtXlbpiVCZ94/xniLIkAj0jpnpjY4xlgZx7f56Ypn+uV1y3gG0tNVytJqo3K9bfMFee7SQ== dependencies: - "@aws-sdk/types" "3.936.0" - "@aws/lambda-invoke-store" "^0.2.0" - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" + "@aws-sdk/types" "^3.973.5" + "@aws/lambda-invoke-store" "^0.2.2" + "@smithy/protocol-http" "^5.3.11" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@aws-sdk/middleware-user-agent@3.943.0": - version "3.943.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.943.0.tgz#df81ae94cf928929e14f9e4ceb8176c82e32bfdb" - integrity sha512-956n4kVEwFNXndXfhSAN5wO+KRgqiWEEY+ECwLvxmmO8uQ0NWOa8l6l65nTtyuiWzMX81c9BvlyNR5EgUeeUvA== - dependencies: - "@aws-sdk/core" "3.943.0" - "@aws-sdk/types" "3.936.0" - "@aws-sdk/util-endpoints" "3.936.0" - "@smithy/core" "^3.18.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" +"@aws-sdk/middleware-user-agent@^3.972.20": + version "3.972.20" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.20.tgz#9c058871881b3c4adac27c28c7801bedbd530dac" + integrity sha512-3kNTLtpUdeahxtnJRnj/oIdLAUdzTfr9N40KtxNhtdrq+Q1RPMdCJINRXq37m4t5+r3H70wgC3opW46OzFcZYA== + dependencies: + "@aws-sdk/core" "^3.973.19" + "@aws-sdk/types" "^3.973.5" + "@aws-sdk/util-endpoints" "^3.996.4" + "@smithy/core" "^3.23.9" + "@smithy/protocol-http" "^5.3.11" + "@smithy/types" "^4.13.0" + "@smithy/util-retry" "^4.2.11" tslib "^2.6.2" -"@aws-sdk/nested-clients@3.943.0": - version "3.943.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.943.0.tgz#90fd20adb210926c204f6c0896d0531570e1213d" - integrity sha512-anFtB0p2FPuyUnbOULwGmKYqYKSq1M73c9uZ08jR/NCq6Trjq9cuF5TFTeHwjJyPRb4wMf2Qk859oiVfFqnQiw== +"@aws-sdk/nested-clients@^3.996.8": + version "3.996.8" + resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.996.8.tgz#e984e73a4f0183c6a21ea098ae1ea3f06eba6822" + integrity sha512-6HlLm8ciMW8VzfB80kfIx16PBA9lOa9Dl+dmCBi78JDhvGlx3I7Rorwi5PpVRkL31RprXnYna3yBf6UKkD/PqA== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.943.0" - "@aws-sdk/middleware-host-header" "3.936.0" - "@aws-sdk/middleware-logger" "3.936.0" - "@aws-sdk/middleware-recursion-detection" "3.936.0" - "@aws-sdk/middleware-user-agent" "3.943.0" - "@aws-sdk/region-config-resolver" "3.936.0" - "@aws-sdk/types" "3.936.0" - "@aws-sdk/util-endpoints" "3.936.0" - "@aws-sdk/util-user-agent-browser" "3.936.0" - "@aws-sdk/util-user-agent-node" "3.943.0" - "@smithy/config-resolver" "^4.4.3" - "@smithy/core" "^3.18.5" - "@smithy/fetch-http-handler" "^5.3.6" - "@smithy/hash-node" "^4.2.5" - "@smithy/invalid-dependency" "^4.2.5" - "@smithy/middleware-content-length" "^4.2.5" - "@smithy/middleware-endpoint" "^4.3.12" - "@smithy/middleware-retry" "^4.4.12" - "@smithy/middleware-serde" "^4.2.6" - "@smithy/middleware-stack" "^4.2.5" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/node-http-handler" "^4.4.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/smithy-client" "^4.9.8" - "@smithy/types" "^4.9.0" - "@smithy/url-parser" "^4.2.5" - "@smithy/util-base64" "^4.3.0" - "@smithy/util-body-length-browser" "^4.2.0" - "@smithy/util-body-length-node" "^4.2.1" - "@smithy/util-defaults-mode-browser" "^4.3.11" - "@smithy/util-defaults-mode-node" "^4.2.14" - "@smithy/util-endpoints" "^3.2.5" - "@smithy/util-middleware" "^4.2.5" - "@smithy/util-retry" "^4.2.5" - "@smithy/util-utf8" "^4.2.0" + "@aws-sdk/core" "^3.973.19" + "@aws-sdk/middleware-host-header" "^3.972.7" + "@aws-sdk/middleware-logger" "^3.972.7" + "@aws-sdk/middleware-recursion-detection" "^3.972.7" + "@aws-sdk/middleware-user-agent" "^3.972.20" + "@aws-sdk/region-config-resolver" "^3.972.7" + "@aws-sdk/types" "^3.973.5" + "@aws-sdk/util-endpoints" "^3.996.4" + "@aws-sdk/util-user-agent-browser" "^3.972.7" + "@aws-sdk/util-user-agent-node" "^3.973.5" + "@smithy/config-resolver" "^4.4.10" + "@smithy/core" "^3.23.9" + "@smithy/fetch-http-handler" "^5.3.13" + "@smithy/hash-node" "^4.2.11" + "@smithy/invalid-dependency" "^4.2.11" + "@smithy/middleware-content-length" "^4.2.11" + "@smithy/middleware-endpoint" "^4.4.23" + "@smithy/middleware-retry" "^4.4.40" + "@smithy/middleware-serde" "^4.2.12" + "@smithy/middleware-stack" "^4.2.11" + "@smithy/node-config-provider" "^4.3.11" + "@smithy/node-http-handler" "^4.4.14" + "@smithy/protocol-http" "^5.3.11" + "@smithy/smithy-client" "^4.12.3" + "@smithy/types" "^4.13.0" + "@smithy/url-parser" "^4.2.11" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-body-length-browser" "^4.2.2" + "@smithy/util-body-length-node" "^4.2.3" + "@smithy/util-defaults-mode-browser" "^4.3.39" + "@smithy/util-defaults-mode-node" "^4.2.42" + "@smithy/util-endpoints" "^3.3.2" + "@smithy/util-middleware" "^4.2.11" + "@smithy/util-retry" "^4.2.11" + "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" -"@aws-sdk/region-config-resolver@3.936.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.936.0.tgz#b02f20c4d62973731d42da1f1239a27fbbe53c0a" - integrity sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw== +"@aws-sdk/region-config-resolver@^3.972.7": + version "3.972.7" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.7.tgz#36fd0eba2bfedeb57b843b3cd8266fb7668a7e85" + integrity sha512-/Ev/6AI8bvt4HAAptzSjThGUMjcWaX3GX8oERkB0F0F9x2dLSBdgFDiyrRz3i0u0ZFZFQ1b28is4QhyqXTUsVA== dependencies: - "@aws-sdk/types" "3.936.0" - "@smithy/config-resolver" "^4.4.3" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/types" "^4.9.0" + "@aws-sdk/types" "^3.973.5" + "@smithy/config-resolver" "^4.4.10" + "@smithy/node-config-provider" "^4.3.11" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@aws-sdk/token-providers@3.943.0": - version "3.943.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.943.0.tgz#f3dbc0764f9372e47b1312c13d3070217c1767ed" - integrity sha512-cRKyIzwfkS+XztXIFPoWORuaxlIswP+a83BJzelX4S1gUZ7FcXB4+lj9Jxjn8SbQhR4TPU3Owbpu+S7pd6IRbQ== - dependencies: - "@aws-sdk/core" "3.943.0" - "@aws-sdk/nested-clients" "3.943.0" - "@aws-sdk/types" "3.936.0" - "@smithy/property-provider" "^4.2.5" - "@smithy/shared-ini-file-loader" "^4.4.0" - "@smithy/types" "^4.9.0" +"@aws-sdk/token-providers@3.1005.0": + version "3.1005.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.1005.0.tgz#ac8e4f094bf9fb7c5a8d351544daf732d26af447" + integrity sha512-vMxd+ivKqSxU9bHx5vmAlFKDAkjGotFU56IOkDa5DaTu1WWwbcse0yFHEm9I537oVvodaiwMl3VBwgHfzQ2rvw== + dependencies: + "@aws-sdk/core" "^3.973.19" + "@aws-sdk/nested-clients" "^3.996.8" + "@aws-sdk/types" "^3.973.5" + "@smithy/property-provider" "^4.2.11" + "@smithy/shared-ini-file-loader" "^4.4.6" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@aws-sdk/types@3.936.0", "@aws-sdk/types@^3.222.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.936.0.tgz#ecd3a4bec1a1bd4df834ab21fe52a76e332dc27a" - integrity sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg== +"@aws-sdk/types@^3.222.0", "@aws-sdk/types@^3.973.5": + version "3.973.5" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.973.5.tgz#0fc00f066dbaaa40c09f2b7efdd86781807b5c70" + integrity sha512-hl7BGwDCWsjH8NkZfx+HgS7H2LyM2lTMAI7ba9c8O0KqdBLTdNJivsHpqjg9rNlAlPyREb6DeDRXUl0s8uFdmQ== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@aws-sdk/util-endpoints@3.936.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.936.0.tgz#81c00be8cfd4f966e05defd739a720ce2c888ddf" - integrity sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w== +"@aws-sdk/util-endpoints@^3.996.4": + version "3.996.4" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.996.4.tgz#9fcfeccbd9d2a8217b66f711cf303883ec4442c0" + integrity sha512-Hek90FBmd4joCFj+Vc98KLJh73Zqj3s2W56gjAcTkrNLMDI5nIFkG9YpfcJiVI1YlE2Ne1uOQNe+IgQ/Vz2XRA== dependencies: - "@aws-sdk/types" "3.936.0" - "@smithy/types" "^4.9.0" - "@smithy/url-parser" "^4.2.5" - "@smithy/util-endpoints" "^3.2.5" + "@aws-sdk/types" "^3.973.5" + "@smithy/types" "^4.13.0" + "@smithy/url-parser" "^4.2.11" + "@smithy/util-endpoints" "^3.3.2" tslib "^2.6.2" "@aws-sdk/util-locate-window@^3.0.0": - version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz#5df15f24e1edbe12ff1fe8906f823b51cd53bae8" - integrity sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg== + version "3.965.5" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz#e30e6ff2aff6436209ed42c765dec2d2a48df7c0" + integrity sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ== dependencies: tslib "^2.6.2" -"@aws-sdk/util-user-agent-browser@3.936.0": - version "3.936.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.936.0.tgz#cbfcaeaba6d843b060183638699c0f20dcaed774" - integrity sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw== +"@aws-sdk/util-user-agent-browser@^3.972.7": + version "3.972.7" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.7.tgz#0e7205db8d47760df014fffddcbf0ccfc350e84d" + integrity sha512-7SJVuvhKhMF/BkNS1n0QAJYgvEwYbK2QLKBrzDiwQGiTRU6Yf1f3nehTzm/l21xdAOtWSfp2uWSddPnP2ZtsVw== dependencies: - "@aws-sdk/types" "3.936.0" - "@smithy/types" "^4.9.0" + "@aws-sdk/types" "^3.973.5" + "@smithy/types" "^4.13.0" bowser "^2.11.0" tslib "^2.6.2" -"@aws-sdk/util-user-agent-node@3.943.0": - version "3.943.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.943.0.tgz#c584caf251b06a6e46f0ad2417215e6d22bd1077" - integrity sha512-gn+ILprVRrgAgTIBk2TDsJLRClzIOdStQFeFTcN0qpL8Z4GBCqMFhw7O7X+MM55Stt5s4jAauQ/VvoqmCADnQg== +"@aws-sdk/util-user-agent-node@^3.973.5": + version "3.973.5" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.5.tgz#cbb11aae2d761e2cb3d3ad4be7b88f6d4726fb83" + integrity sha512-Dyy38O4GeMk7UQ48RupfHif//gqnOPbq/zlvRssc11E2mClT+aUfc3VS2yD8oLtzqO3RsqQ9I3gOBB4/+HjPOw== dependencies: - "@aws-sdk/middleware-user-agent" "3.943.0" - "@aws-sdk/types" "3.936.0" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/types" "^4.9.0" + "@aws-sdk/middleware-user-agent" "^3.972.20" + "@aws-sdk/types" "^3.973.5" + "@smithy/node-config-provider" "^4.3.11" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@aws-sdk/xml-builder@3.930.0": - version "3.930.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz#949a35219ca52cc769ffbfbf38f3324178ba74f9" - integrity sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA== +"@aws-sdk/xml-builder@^3.972.10": + version "3.972.10" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.972.10.tgz#d8a7171b70c8ee9354747f0ac7d368dd27d50e46" + integrity sha512-OnejAIVD+CxzyAUrVic7lG+3QRltyja9LoNqCE/1YVs8ichoTbJlVSaZ9iSMcnHLyzrSNtvaOGjSDRP+d/ouFA== dependencies: - "@smithy/types" "^4.9.0" - fast-xml-parser "5.2.5" + "@smithy/types" "^4.13.0" + fast-xml-parser "5.4.1" tslib "^2.6.2" -"@aws/lambda-invoke-store@^0.2.0": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.2.tgz#b00f7d6aedfe832ef6c84488f3a422cce6a47efa" - integrity sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg== +"@aws/lambda-invoke-store@^0.2.2": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz#f1137f56209ccc69c15f826242cbf37f828617dd" + integrity sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw== "@babel/cli@^7.2.3": version "7.28.3" @@ -3232,80 +3189,80 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@smithy/abort-controller@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.2.5.tgz#3386e8fff5a8d05930996d891d06803f2b7e5e2c" - integrity sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA== +"@smithy/abort-controller@^4.2.11": + version "4.2.11" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.2.11.tgz#b989e63615e5449c2ba90d80fcbe4fdd71123c54" + integrity sha512-Hj4WoYWMJnSpM6/kchsm4bUNTL9XiSyhvoMb2KIq4VJzyDt7JpGHUZHkVNPZVC7YE1tf8tPeVauxpFBKGW4/KQ== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@smithy/config-resolver@^4.4.3": - version "4.4.3" - resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.4.3.tgz#37b0e3cba827272e92612e998a2b17e841e20bab" - integrity sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw== - dependencies: - "@smithy/node-config-provider" "^4.3.5" - "@smithy/types" "^4.9.0" - "@smithy/util-config-provider" "^4.2.0" - "@smithy/util-endpoints" "^3.2.5" - "@smithy/util-middleware" "^4.2.5" +"@smithy/config-resolver@^4.4.10": + version "4.4.10" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.4.10.tgz#22529a2e8c23d979f69c3abca8d984c69d06ce4c" + integrity sha512-IRTkd6ps0ru+lTWnfnsbXzW80A8Od8p3pYiZnW98K2Hb20rqfsX7VTlfUwhrcOeSSy68Gn9WBofwPuw3e5CCsg== + dependencies: + "@smithy/node-config-provider" "^4.3.11" + "@smithy/types" "^4.13.0" + "@smithy/util-config-provider" "^4.2.2" + "@smithy/util-endpoints" "^3.3.2" + "@smithy/util-middleware" "^4.2.11" tslib "^2.6.2" -"@smithy/core@^3.18.5", "@smithy/core@^3.18.7": - version "3.18.7" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.18.7.tgz#88c67b9474eadf51a632e2956c8756d36c7072c8" - integrity sha512-axG9MvKhMWOhFbvf5y2DuyTxQueO0dkedY9QC3mAfndLosRI/9LJv8WaL0mw7ubNhsO4IuXX9/9dYGPFvHrqlw== - dependencies: - "@smithy/middleware-serde" "^4.2.6" - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" - "@smithy/util-base64" "^4.3.0" - "@smithy/util-body-length-browser" "^4.2.0" - "@smithy/util-middleware" "^4.2.5" - "@smithy/util-stream" "^4.5.6" - "@smithy/util-utf8" "^4.2.0" - "@smithy/uuid" "^1.1.0" +"@smithy/core@^3.23.9": + version "3.23.9" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.23.9.tgz#377c3e12187c9810a3f26d7904541770735785b5" + integrity sha512-1Vcut4LEL9HZsdpI0vFiRYIsaoPwZLjAxnVQDUMQK8beMS+EYPLDQCXtbzfxmM5GzSgjfe2Q9M7WaXwIMQllyQ== + dependencies: + "@smithy/middleware-serde" "^4.2.12" + "@smithy/protocol-http" "^5.3.11" + "@smithy/types" "^4.13.0" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-body-length-browser" "^4.2.2" + "@smithy/util-middleware" "^4.2.11" + "@smithy/util-stream" "^4.5.17" + "@smithy/util-utf8" "^4.2.2" + "@smithy/uuid" "^1.1.2" tslib "^2.6.2" -"@smithy/credential-provider-imds@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz#5acbcd1d02ae31700c2f027090c202d7315d70d3" - integrity sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ== +"@smithy/credential-provider-imds@^4.2.11": + version "4.2.11" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.11.tgz#106dda92b2a4275879e84f348826c311a1bb1b05" + integrity sha512-lBXrS6ku0kTj3xLmsJW0WwqWbGQ6ueooYyp/1L9lkyT0M02C+DWwYwc5aTyXFbRaK38ojALxNixg+LxKSHZc0g== dependencies: - "@smithy/node-config-provider" "^4.3.5" - "@smithy/property-provider" "^4.2.5" - "@smithy/types" "^4.9.0" - "@smithy/url-parser" "^4.2.5" + "@smithy/node-config-provider" "^4.3.11" + "@smithy/property-provider" "^4.2.11" + "@smithy/types" "^4.13.0" + "@smithy/url-parser" "^4.2.11" tslib "^2.6.2" -"@smithy/fetch-http-handler@^5.3.6": - version "5.3.6" - resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz#d9dcb8d8ca152918224492f4d1cc1b50df93ae13" - integrity sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg== +"@smithy/fetch-http-handler@^5.3.13": + version "5.3.13" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.13.tgz#9858e43ff009af6085cca326805c9d0c9a9579f5" + integrity sha512-U2Hcfl2s3XaYjikN9cT4mPu8ybDbImV3baXR0PkVlC0TTx808bRP3FaPGAzPtB8OByI+JqJ1kyS+7GEgae7+qQ== dependencies: - "@smithy/protocol-http" "^5.3.5" - "@smithy/querystring-builder" "^4.2.5" - "@smithy/types" "^4.9.0" - "@smithy/util-base64" "^4.3.0" + "@smithy/protocol-http" "^5.3.11" + "@smithy/querystring-builder" "^4.2.11" + "@smithy/types" "^4.13.0" + "@smithy/util-base64" "^4.3.2" tslib "^2.6.2" -"@smithy/hash-node@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.2.5.tgz#fb751ec4a4c6347612458430f201f878adc787f6" - integrity sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA== +"@smithy/hash-node@^4.2.11": + version "4.2.11" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.2.11.tgz#8b19d53661824ead9627b49a26e5555d6c8a98fd" + integrity sha512-T+p1pNynRkydpdL015ruIoyPSRw9e/SQOWmSAMmmprfswMrd5Ow5igOWNVlvyVFZlxXqGmyH3NQwfwy8r5Jx0A== dependencies: - "@smithy/types" "^4.9.0" - "@smithy/util-buffer-from" "^4.2.0" - "@smithy/util-utf8" "^4.2.0" + "@smithy/types" "^4.13.0" + "@smithy/util-buffer-from" "^4.2.2" + "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" -"@smithy/invalid-dependency@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz#58d997e91e7683ffc59882d8fcb180ed9aa9c7dd" - integrity sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A== +"@smithy/invalid-dependency@^4.2.11": + version "4.2.11" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.2.11.tgz#ded68aa2299474c3cf06695ebb28a343928086ee" + integrity sha512-cGNMrgykRmddrNhYy1yBdrp5GwIgEkniS7k9O1VLB38yxQtlvrxpZtUVvo6T4cKpeZsriukBuuxfJcdZQc/f/g== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.13.0" tslib "^2.6.2" "@smithy/is-array-buffer@^2.2.0": @@ -3315,200 +3272,200 @@ dependencies: tslib "^2.6.2" -"@smithy/is-array-buffer@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz#b0f874c43887d3ad44f472a0f3f961bcce0550c2" - integrity sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ== +"@smithy/is-array-buffer@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz#c401ce54b12a16529eb1c938a0b6c2247cb763b8" + integrity sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow== dependencies: tslib "^2.6.2" -"@smithy/middleware-content-length@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz#a6942ce2d7513b46f863348c6c6a8177e9ace752" - integrity sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A== +"@smithy/middleware-content-length@^4.2.11": + version "4.2.11" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.2.11.tgz#8a385fa77e8fa6ffea6b46e7af37b14d2678571f" + integrity sha512-UvIfKYAKhCzr4p6jFevPlKhQwyQwlJ6IeKLDhmV1PlYfcW3RL4ROjNEDtSik4NYMi9kDkH7eSwyTP3vNJ/u/Dw== dependencies: - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" + "@smithy/protocol-http" "^5.3.11" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@smithy/middleware-endpoint@^4.3.12", "@smithy/middleware-endpoint@^4.3.14": - version "4.3.14" - resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.14.tgz#da145b02f6a5d073595111bf73fa31da16e73773" - integrity sha512-v0q4uTKgBM8dsqGjqsabZQyH85nFaTnFcgpWU1uydKFsdyyMzfvOkNum9G7VK+dOP01vUnoZxIeRiJ6uD0kjIg== - dependencies: - "@smithy/core" "^3.18.7" - "@smithy/middleware-serde" "^4.2.6" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/shared-ini-file-loader" "^4.4.0" - "@smithy/types" "^4.9.0" - "@smithy/url-parser" "^4.2.5" - "@smithy/util-middleware" "^4.2.5" +"@smithy/middleware-endpoint@^4.4.23": + version "4.4.23" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.23.tgz#4d2d7f2c5e133608782b071b5244e74e1ff2f26a" + integrity sha512-UEFIejZy54T1EJn2aWJ45voB7RP2T+IRzUqocIdM6GFFa5ClZncakYJfcYnoXt3UsQrZZ9ZRauGm77l9UCbBLw== + dependencies: + "@smithy/core" "^3.23.9" + "@smithy/middleware-serde" "^4.2.12" + "@smithy/node-config-provider" "^4.3.11" + "@smithy/shared-ini-file-loader" "^4.4.6" + "@smithy/types" "^4.13.0" + "@smithy/url-parser" "^4.2.11" + "@smithy/util-middleware" "^4.2.11" tslib "^2.6.2" -"@smithy/middleware-retry@^4.4.12": - version "4.4.14" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.4.14.tgz#92e503946314278614f608537d77a04db6d7b810" - integrity sha512-Z2DG8Ej7FyWG1UA+7HceINtSLzswUgs2np3sZX0YBBxCt+CXG4QUxv88ZDS3+2/1ldW7LqtSY1UO/6VQ1pND8Q== - dependencies: - "@smithy/node-config-provider" "^4.3.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/service-error-classification" "^4.2.5" - "@smithy/smithy-client" "^4.9.10" - "@smithy/types" "^4.9.0" - "@smithy/util-middleware" "^4.2.5" - "@smithy/util-retry" "^4.2.5" - "@smithy/uuid" "^1.1.0" +"@smithy/middleware-retry@^4.4.40": + version "4.4.40" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.4.40.tgz#b10da39d8138f9a14953c2444ed9a737514d8bcf" + integrity sha512-YhEMakG1Ae57FajERdHNZ4ShOPIY7DsgV+ZoAxo/5BT0KIe+f6DDU2rtIymNNFIj22NJfeeI6LWIifrwM0f+rA== + dependencies: + "@smithy/node-config-provider" "^4.3.11" + "@smithy/protocol-http" "^5.3.11" + "@smithy/service-error-classification" "^4.2.11" + "@smithy/smithy-client" "^4.12.3" + "@smithy/types" "^4.13.0" + "@smithy/util-middleware" "^4.2.11" + "@smithy/util-retry" "^4.2.11" + "@smithy/uuid" "^1.1.2" tslib "^2.6.2" -"@smithy/middleware-serde@^4.2.6": - version "4.2.6" - resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz#7e710f43206e13a8c081a372b276e7b2c51bff5b" - integrity sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ== +"@smithy/middleware-serde@^4.2.12": + version "4.2.12" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.2.12.tgz#8f836f3edc85701b69df4f2819106a6e0ef50cf8" + integrity sha512-W9g1bOLui7Xn5FABRVS0o3rXL0gfN37d/8I/W7i0N7oxjx9QecUmXEMSUMADTODwdtka9cN43t5BI2CodLJpng== dependencies: - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" + "@smithy/protocol-http" "^5.3.11" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@smithy/middleware-stack@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz#2d13415ed3561c882594c8e6340b801d9a2eb222" - integrity sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ== +"@smithy/middleware-stack@^4.2.11": + version "4.2.11" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.2.11.tgz#cadd3ada5fa11fe8a192cd18444a77c4510c8bc3" + integrity sha512-s+eenEPW6RgliDk2IhjD2hWOxIx1NKrOHxEwNUaUXxYBxIyCcDfNULZ2Mu15E3kwcJWBedTET/kEASPV1A1Akg== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@smithy/node-config-provider@^4.3.5": - version "4.3.5" - resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz#c09137a79c2930dcc30e6c8bb4f2608d72c1e2c9" - integrity sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg== +"@smithy/node-config-provider@^4.3.11": + version "4.3.11" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.3.11.tgz#a6d246b67c10c6873169bae46e6d04261d548402" + integrity sha512-xD17eE7kaLgBBGf5CZQ58hh2YmwK1Z0O8YhffwB/De2jsL0U3JklmhVYJ9Uf37OtUDLF2gsW40Xwwag9U869Gg== dependencies: - "@smithy/property-provider" "^4.2.5" - "@smithy/shared-ini-file-loader" "^4.4.0" - "@smithy/types" "^4.9.0" + "@smithy/property-provider" "^4.2.11" + "@smithy/shared-ini-file-loader" "^4.4.6" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@smithy/node-http-handler@^4.4.5": - version "4.4.5" - resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz#2aea598fdf3dc4e32667d673d48abd4a073665f4" - integrity sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw== +"@smithy/node-http-handler@^4.4.14": + version "4.4.14" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.4.14.tgz#a40a6677b7cda2c100141833abee1401c2e1a74f" + integrity sha512-DamSqaU8nuk0xTJDrYnRzZndHwwRnyj/n/+RqGGCcBKB4qrQem0mSDiWdupaNWdwxzyMU91qxDmHOCazfhtO3A== dependencies: - "@smithy/abort-controller" "^4.2.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/querystring-builder" "^4.2.5" - "@smithy/types" "^4.9.0" + "@smithy/abort-controller" "^4.2.11" + "@smithy/protocol-http" "^5.3.11" + "@smithy/querystring-builder" "^4.2.11" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@smithy/property-provider@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.2.5.tgz#f75dc5735d29ca684abbc77504be9246340a43f0" - integrity sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg== +"@smithy/property-provider@^4.2.11": + version "4.2.11" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.2.11.tgz#7a1b16ae2083272f80e380ee7948ddc103301db1" + integrity sha512-14T1V64o6/ndyrnl1ze1ZhyLzIeYNN47oF/QU6P5m82AEtyOkMJTb0gO1dPubYjyyKuPD6OSVMPDKe+zioOnCg== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@smithy/protocol-http@^5.3.5": - version "5.3.5" - resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.3.5.tgz#a8f4296dd6d190752589e39ee95298d5c65a60db" - integrity sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ== +"@smithy/protocol-http@^5.3.11": + version "5.3.11" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.3.11.tgz#e4450af3ba9e52e8b99a9c3035c90c8cd853be27" + integrity sha512-hI+barOVDJBkNt4y0L2mu3Ugc0w7+BpJ2CZuLwXtSltGAAwCb3IvnalGlbDV/UCS6a9ZuT3+exd1WxNdLb5IlQ== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@smithy/querystring-builder@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz#00cafa5a4055600ab8058e26db42f580146b91f3" - integrity sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg== +"@smithy/querystring-builder@^4.2.11": + version "4.2.11" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.2.11.tgz#befb7753b142fab65edaee070096c1c5cb2ad917" + integrity sha512-7spdikrYiljpket6u0up2Ck2mxhy7dZ0+TDd+S53Dg2DHd6wg+YNJrTCHiLdgZmEXZKI7LJZcwL3721ZRDFiqA== dependencies: - "@smithy/types" "^4.9.0" - "@smithy/util-uri-escape" "^4.2.0" + "@smithy/types" "^4.13.0" + "@smithy/util-uri-escape" "^4.2.2" tslib "^2.6.2" -"@smithy/querystring-parser@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz#61d2e77c62f44196590fa0927dbacfbeaffe8c53" - integrity sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ== +"@smithy/querystring-parser@^4.2.11": + version "4.2.11" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.2.11.tgz#b1e85945bc3c80058e0b0114af391bb069b2393f" + integrity sha512-nE3IRNjDltvGcoThD2abTozI1dkSy8aX+a2N1Rs55en5UsdyyIXgGEmevUL3okZFoJC77JgRGe99xYohhsjivQ== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@smithy/service-error-classification@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz#a64eb78e096e59cc71141e3fea2b4194ce59b4fd" - integrity sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ== +"@smithy/service-error-classification@^4.2.11": + version "4.2.11" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.2.11.tgz#da2ee1af5c851380e6b0146b75416f0e5f64e1f7" + integrity sha512-HkMFJZJUhzU3HvND1+Yw/kYWXp4RPDLBWLcK1n+Vqw8xn4y2YiBhdww8IxhkQjP/QlZun5bwm3vcHc8AqIU3zw== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.13.0" -"@smithy/shared-ini-file-loader@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz#a2f8282f49982f00bafb1fa8cb7fc188a202a594" - integrity sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA== +"@smithy/shared-ini-file-loader@^4.4.6": + version "4.4.6" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.6.tgz#435dc6d907bc8c6f795212e944000de063b2cfe1" + integrity sha512-IB/M5I8G0EeXZTHsAxpx51tMQ5R719F3aq+fjEB6VtNcCHDc0ajFDIGDZw+FW9GxtEkgTduiPpjveJdA/CX7sw== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@smithy/signature-v4@^5.3.5": - version "5.3.5" - resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.3.5.tgz#13ab710653f9f16c325ee7e0a102a44f73f2643f" - integrity sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w== - dependencies: - "@smithy/is-array-buffer" "^4.2.0" - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" - "@smithy/util-hex-encoding" "^4.2.0" - "@smithy/util-middleware" "^4.2.5" - "@smithy/util-uri-escape" "^4.2.0" - "@smithy/util-utf8" "^4.2.0" +"@smithy/signature-v4@^5.3.11": + version "5.3.11" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.3.11.tgz#81fc2aba69994b23aff730b984418e9696bc36c4" + integrity sha512-V1L6N9aKOBAN4wEHLyqjLBnAz13mtILU0SeDrjOaIZEeN6IFa6DxwRt1NNpOdmSpQUfkBj0qeD3m6P77uzMhgQ== + dependencies: + "@smithy/is-array-buffer" "^4.2.2" + "@smithy/protocol-http" "^5.3.11" + "@smithy/types" "^4.13.0" + "@smithy/util-hex-encoding" "^4.2.2" + "@smithy/util-middleware" "^4.2.11" + "@smithy/util-uri-escape" "^4.2.2" + "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" -"@smithy/smithy-client@^4.9.10", "@smithy/smithy-client@^4.9.8": - version "4.9.10" - resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.9.10.tgz#a395bbc6ccf35cdbae44ce024909b6c5aec06283" - integrity sha512-Jaoz4Jw1QYHc1EFww/E6gVtNjhoDU+gwRKqXP6C3LKYqqH2UQhP8tMP3+t/ePrhaze7fhLE8vS2q6vVxBANFTQ== - dependencies: - "@smithy/core" "^3.18.7" - "@smithy/middleware-endpoint" "^4.3.14" - "@smithy/middleware-stack" "^4.2.5" - "@smithy/protocol-http" "^5.3.5" - "@smithy/types" "^4.9.0" - "@smithy/util-stream" "^4.5.6" +"@smithy/smithy-client@^4.12.3": + version "4.12.3" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.12.3.tgz#95370221bc5c2f30a25157b2df84a3630c81ec85" + integrity sha512-7k4UxjSpHmPN2AxVhvIazRSzFQjWnud3sOsXcFStzagww17j1cFQYqTSiQ8xuYK3vKLR1Ni8FzuT3VlKr3xCNw== + dependencies: + "@smithy/core" "^3.23.9" + "@smithy/middleware-endpoint" "^4.4.23" + "@smithy/middleware-stack" "^4.2.11" + "@smithy/protocol-http" "^5.3.11" + "@smithy/types" "^4.13.0" + "@smithy/util-stream" "^4.5.17" tslib "^2.6.2" -"@smithy/types@^4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.9.0.tgz#c6636ddfa142e1ddcb6e4cf5f3e1a628d420486f" - integrity sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA== +"@smithy/types@^4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.13.0.tgz#9787297a07ee72ef74d4f7d93c744d10ed664c21" + integrity sha512-COuLsZILbbQsdrwKQpkkpyep7lCsByxwj7m0Mg5v66/ZTyenlfBc40/QFQ5chO0YN/PNEH1Bi3fGtfXPnYNeDw== dependencies: tslib "^2.6.2" -"@smithy/url-parser@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.2.5.tgz#2fea006108f17f7761432c7ef98d6aa003421487" - integrity sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ== +"@smithy/url-parser@^4.2.11": + version "4.2.11" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.2.11.tgz#4c87eb5872c2ab0385086b38eee4b4a6e5a029b2" + integrity sha512-oTAGGHo8ZYc5VZsBREzuf5lf2pAurJQsccMusVZ85wDkX66ojEc/XauiGjzCj50A61ObFTPe6d7Pyt6UBYaing== dependencies: - "@smithy/querystring-parser" "^4.2.5" - "@smithy/types" "^4.9.0" + "@smithy/querystring-parser" "^4.2.11" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@smithy/util-base64@^4.3.0": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.3.0.tgz#5e287b528793aa7363877c1a02cd880d2e76241d" - integrity sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ== +"@smithy/util-base64@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.3.2.tgz#be02bcb29a87be744356467ea25ffa413e695cea" + integrity sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ== dependencies: - "@smithy/util-buffer-from" "^4.2.0" - "@smithy/util-utf8" "^4.2.0" + "@smithy/util-buffer-from" "^4.2.2" + "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" -"@smithy/util-body-length-browser@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz#04e9fc51ee7a3e7f648a4b4bcdf96c350cfa4d61" - integrity sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg== +"@smithy/util-body-length-browser@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz#c4404277d22039872abdb80e7800f9a63f263862" + integrity sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ== dependencies: tslib "^2.6.2" -"@smithy/util-body-length-node@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz#79c8a5d18e010cce6c42d5cbaf6c1958523e6fec" - integrity sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA== +"@smithy/util-body-length-node@^4.2.3": + version "4.2.3" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz#f923ca530defb86a9ac3ca2d3066bcca7b304fbc" + integrity sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g== dependencies: tslib "^2.6.2" @@ -3520,95 +3477,95 @@ "@smithy/is-array-buffer" "^2.2.0" tslib "^2.6.2" -"@smithy/util-buffer-from@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz#7abd12c4991b546e7cee24d1e8b4bfaa35c68a9d" - integrity sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew== +"@smithy/util-buffer-from@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz#2c6b7857757dfd88f6cd2d36016179a40ccc913b" + integrity sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q== dependencies: - "@smithy/is-array-buffer" "^4.2.0" + "@smithy/is-array-buffer" "^4.2.2" tslib "^2.6.2" -"@smithy/util-config-provider@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz#2e4722937f8feda4dcb09672c59925a4e6286cfc" - integrity sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q== +"@smithy/util-config-provider@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz#52ebf9d8942838d18bc5fb1520de1e8699d7aad6" + integrity sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ== dependencies: tslib "^2.6.2" -"@smithy/util-defaults-mode-browser@^4.3.11": - version "4.3.13" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.13.tgz#51e3cadfe772882f941f1dff07d2f8b7acb9c21e" - integrity sha512-hlVLdAGrVfyNei+pKIgqDTxfu/ZI2NSyqj4IDxKd5bIsIqwR/dSlkxlPaYxFiIaDVrBy0he8orsFy+Cz119XvA== +"@smithy/util-defaults-mode-browser@^4.3.39": + version "4.3.39" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.39.tgz#9f354b9dcd0c0e17aa507e6fc13b4785af31cd97" + integrity sha512-ui7/Ho/+VHqS7Km2wBw4/Ab4RktoiSshgcgpJzC4keFPs6tLJS4IQwbeahxQS3E/w98uq6E1mirCH/id9xIXeQ== dependencies: - "@smithy/property-provider" "^4.2.5" - "@smithy/smithy-client" "^4.9.10" - "@smithy/types" "^4.9.0" + "@smithy/property-provider" "^4.2.11" + "@smithy/smithy-client" "^4.12.3" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@smithy/util-defaults-mode-node@^4.2.14": - version "4.2.16" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.16.tgz#ab4abdebae65e8628473d1493b1de5f82aa0eec9" - integrity sha512-F1t22IUiJLHrxW9W1CQ6B9PN+skZ9cqSuzB18Eh06HrJPbjsyZ7ZHecAKw80DQtyGTRcVfeukKaCRYebFwclbg== - dependencies: - "@smithy/config-resolver" "^4.4.3" - "@smithy/credential-provider-imds" "^4.2.5" - "@smithy/node-config-provider" "^4.3.5" - "@smithy/property-provider" "^4.2.5" - "@smithy/smithy-client" "^4.9.10" - "@smithy/types" "^4.9.0" +"@smithy/util-defaults-mode-node@^4.2.42": + version "4.2.42" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.42.tgz#248a2d6a50b4480f3a2a4ce779409e90f0d16b96" + integrity sha512-QDA84CWNe8Akpj15ofLO+1N3Rfg8qa2K5uX0y6HnOp4AnRYRgWrKx/xzbYNbVF9ZsyJUYOfcoaN3y93wA/QJ2A== + dependencies: + "@smithy/config-resolver" "^4.4.10" + "@smithy/credential-provider-imds" "^4.2.11" + "@smithy/node-config-provider" "^4.3.11" + "@smithy/property-provider" "^4.2.11" + "@smithy/smithy-client" "^4.12.3" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@smithy/util-endpoints@^3.2.5": - version "3.2.5" - resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz#9e0fc34e38ddfbbc434d23a38367638dc100cb14" - integrity sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A== +"@smithy/util-endpoints@^3.3.2": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.3.2.tgz#a81ee98a2596248f6cdedc868d13cb6b9ea497b2" + integrity sha512-+4HFLpE5u29AbFlTdlKIT7jfOzZ8PDYZKTb3e+AgLz986OYwqTourQ5H+jg79/66DB69Un1+qKecLnkZdAsYcA== dependencies: - "@smithy/node-config-provider" "^4.3.5" - "@smithy/types" "^4.9.0" + "@smithy/node-config-provider" "^4.3.11" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@smithy/util-hex-encoding@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz#1c22ea3d1e2c3a81ff81c0a4f9c056a175068a7b" - integrity sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw== +"@smithy/util-hex-encoding@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz#4abf3335dd1eb884041d8589ca7628d81a6fd1d3" + integrity sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg== dependencies: tslib "^2.6.2" -"@smithy/util-middleware@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.2.5.tgz#1ace865afe678fd4b0f9217197e2fe30178d4835" - integrity sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA== +"@smithy/util-middleware@^4.2.11": + version "4.2.11" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.2.11.tgz#d2a89893fc2dfd500de412c5f7c7961716855f4d" + integrity sha512-r3dtF9F+TpSZUxpOVVtPfk09Rlo4lT6ORBqEvX3IBT6SkQAdDSVKR5GcfmZbtl7WKhKnmb3wbDTQ6ibR2XHClw== dependencies: - "@smithy/types" "^4.9.0" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@smithy/util-retry@^4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.2.5.tgz#70fe4fbbfb9ad43a9ce2ba4ed111ff7b30d7b333" - integrity sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg== +"@smithy/util-retry@^4.2.11": + version "4.2.11" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.2.11.tgz#59fc5364488d4c755eec5afb4054623f852cf0e6" + integrity sha512-XSZULmL5x6aCTTii59wJqKsY1l3eMIAomRAccW7Tzh9r8s7T/7rdo03oektuH5jeYRlJMPcNP92EuRDvk9aXbw== dependencies: - "@smithy/service-error-classification" "^4.2.5" - "@smithy/types" "^4.9.0" + "@smithy/service-error-classification" "^4.2.11" + "@smithy/types" "^4.13.0" tslib "^2.6.2" -"@smithy/util-stream@^4.5.6": - version "4.5.6" - resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.5.6.tgz#ebee9e52adeb6f88337778b2f3356a2cc615298c" - integrity sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ== - dependencies: - "@smithy/fetch-http-handler" "^5.3.6" - "@smithy/node-http-handler" "^4.4.5" - "@smithy/types" "^4.9.0" - "@smithy/util-base64" "^4.3.0" - "@smithy/util-buffer-from" "^4.2.0" - "@smithy/util-hex-encoding" "^4.2.0" - "@smithy/util-utf8" "^4.2.0" +"@smithy/util-stream@^4.5.17": + version "4.5.17" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.5.17.tgz#53073153deb890d91fd14fd2055e6582b627b0fd" + integrity sha512-793BYZ4h2JAQkNHcEnyFxDTcZbm9bVybD0UV/LEWmZ5bkTms7JqjfrLMi2Qy0E5WFcCzLwCAPgcvcvxoeALbAQ== + dependencies: + "@smithy/fetch-http-handler" "^5.3.13" + "@smithy/node-http-handler" "^4.4.14" + "@smithy/types" "^4.13.0" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-buffer-from" "^4.2.2" + "@smithy/util-hex-encoding" "^4.2.2" + "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" -"@smithy/util-uri-escape@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz#096a4cec537d108ac24a68a9c60bee73fc7e3a9e" - integrity sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA== +"@smithy/util-uri-escape@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz#48e40206e7fe9daefc8d44bb43a1ab17e76abf4a" + integrity sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw== dependencies: tslib "^2.6.2" @@ -3620,18 +3577,18 @@ "@smithy/util-buffer-from" "^2.2.0" tslib "^2.6.2" -"@smithy/util-utf8@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-4.2.0.tgz#8b19d1514f621c44a3a68151f3d43e51087fed9d" - integrity sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw== +"@smithy/util-utf8@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz#21db686982e6f3393ac262e49143b42370130f13" + integrity sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw== dependencies: - "@smithy/util-buffer-from" "^4.2.0" + "@smithy/util-buffer-from" "^4.2.2" tslib "^2.6.2" -"@smithy/uuid@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@smithy/uuid/-/uuid-1.1.0.tgz#9fd09d3f91375eab94f478858123387df1cda987" - integrity sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw== +"@smithy/uuid@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@smithy/uuid/-/uuid-1.1.2.tgz#b6e97c7158615e4a3c775e809c00d8c269b5a12e" + integrity sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g== dependencies: tslib "^2.6.2" @@ -5141,9 +5098,9 @@ bowser@^1.7.3: integrity sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ== bowser@^2.11.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.13.1.tgz#5a4c652de1d002f847dd011819f5fc729f308a7e" - integrity sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw== + version "2.14.1" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.14.1.tgz#4ea39bf31e305184522d7ad7bfd91389e4f0cb79" + integrity sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg== brace-expansion@^1.1.7: version "1.1.12" @@ -7060,12 +7017,20 @@ fast-text-encoding@^1.0.0: resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867" integrity sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w== -fast-xml-parser@5.2.5: - version "5.2.5" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz#4809fdfb1310494e341098c25cb1341a01a9144a" - integrity sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ== +fast-xml-builder@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-xml-builder/-/fast-xml-builder-1.1.0.tgz#6d103ebd731bc5d478cc5035a114b28cfb4b9b03" + integrity sha512-7mtITW/we2/wTUZqMyBOR2F8xP4CRxMiSEcQxPIqdRWdO2L/HZSOlzoNyghmyDwNB8BDxePooV1ZTJpkOUhdRg== dependencies: - strnum "^2.1.0" + path-expression-matcher "^1.1.2" + +fast-xml-parser@5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz#0c81b8ecfb3021e5ad83aa3df904af19a05bc601" + integrity sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A== + dependencies: + fast-xml-builder "^1.0.0" + strnum "^2.1.2" fastq@^1.6.0: version "1.19.1" @@ -10048,10 +10013,10 @@ mongoose-elasticsearch-xp@^5.8.0: dependencies: mongoose "^5.5.6" -mongoose@7.8.7, mongoose@^5.5.6, mongoose@^6.13.8: - version "6.13.8" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.13.8.tgz#6d57b513fde0b4351d1354fb2d86c446779570c0" - integrity sha512-JHKco/533CyVrqCbyQsnqMpLn8ZCiKrPDTd2mvo2W7ygIvhygWjX2wj+RPjn6upZZgw0jC6U51RD7kUsyK8NBg== +mongoose@7.8.7, mongoose@^5.5.6, mongoose@^6.13.8, mongoose@^8.23.0: + version "6.13.9" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.13.9.tgz#880294370404dda9c51eeaac00352f83e6a4a5b7" + integrity sha512-x8XpK0SEDJtAtMoOF2U9aGrGXN6kbu01TqhznGLnA4B1oPXNb4Lye0MgmfxF9J2Dva7wf49VOgClk2fuKQYGHw== dependencies: bson "^4.7.2" kareem "2.5.1" @@ -10556,6 +10521,11 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-expression-matcher@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/path-expression-matcher/-/path-expression-matcher-1.1.2.tgz#0102f74415abf183857532acd78bb7ad6ff6fa00" + integrity sha512-LXWqJmcpp2BKOEmgt4CyuESFmBfPuhJlAHKJsFzuJU6CxErWk75BrO+Ni77M9OxHN6dCYKM4vj+21Z6cOL96YQ== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -12497,10 +12467,10 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strnum@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.1.1.tgz#cf2a6e0cf903728b8b2c4b971b7e36b4e82d46ab" - integrity sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw== +strnum@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.2.0.tgz#8b582b637e4621f62ff714493e0ce30846f903a6" + integrity sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg== style-to-object@^0.4.0: version "0.4.4" From ed200f10d3630fffec0211035f0963647f40ba7f Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Mon, 16 Mar 2026 11:07:06 -0400 Subject: [PATCH 04/82] Updated searchClient names, imports, & usage -- draft --- api/src/health.js | 10 ++-- api/src/lastUpdated.js | 5 +- api/src/search.js | 5 +- api/src/services/elasticsearch.ts | 7 --- api/src/services/searchClient.ts | 8 +++ cms/src/hooks.js | 4 +- cms/src/routes/action.js | 8 +-- cms/src/routes/bulk.js | 24 ++++----- cms/src/routes/health.js | 2 +- cms/src/schemas/genes.js | 2 +- .../services/elastic-search/common/client.js | 7 --- cms/src/services/publish/Publisher.js | 2 +- .../services/searchClient/common/client.js | 11 ++++ .../common/schemas/model.js | 0 .../genomicVariants.js | 8 +-- .../publish.js | 29 +++++----- .../unpublish.js | 12 +++-- .../update.js | 4 +- pnpm-workspace.yaml | 6 +++ scripts/initializeExpanded.js | 4 +- scripts/utils/esUtils.js | 18 +++++-- scripts/utils/republishUtils.js | 6 +-- yarn.lock | 54 ++++++++++++------- 23 files changed, 138 insertions(+), 98 deletions(-) delete mode 100644 api/src/services/elasticsearch.ts create mode 100644 api/src/services/searchClient.ts delete mode 100644 cms/src/services/elastic-search/common/client.js create mode 100644 cms/src/services/searchClient/common/client.js rename cms/src/services/{elastic-search => searchClient}/common/schemas/model.js (100%) rename cms/src/services/{elastic-search => searchClient}/genomicVariants.js (98%) rename cms/src/services/{elastic-search => searchClient}/publish.js (86%) rename cms/src/services/{elastic-search => searchClient}/unpublish.js (77%) rename cms/src/services/{elastic-search => searchClient}/update.js (85%) create mode 100644 pnpm-workspace.yaml diff --git a/api/src/health.js b/api/src/health.js index a9f7f7b20..826bcde89 100644 --- a/api/src/health.js +++ b/api/src/health.js @@ -1,14 +1,9 @@ import express from 'express'; -import elasticsearch from '@opensearch-project/opensearch'; - import _ from 'lodash'; -const startTime = Date.now(); - -const client = new elasticsearch.Client({ - node: process.env.ES_URL, -}); +import getClient from './services/searchClient.ts'; +const startTime = Date.now(); const healthRouter = express.Router(); healthRouter.get('/', async (req, res) => { @@ -18,6 +13,7 @@ healthRouter.get('/', async (req, res) => { healthRouter.get('/es', async (req, res) => { try { + const client = await getClient(); const status = await client.ping(); if (_.get(status, 'statusCode') === 200) { const response = _.omit(status, 'meta'); diff --git a/api/src/lastUpdated.js b/api/src/lastUpdated.js index 78cdafd61..eec52a6aa 100644 --- a/api/src/lastUpdated.js +++ b/api/src/lastUpdated.js @@ -1,13 +1,14 @@ // @ts-check import express from 'express'; -import esClient from './services/elasticsearch'; +import getClient from './services/searchClient.ts'; const lastUpdatedRouter = express.Router(); lastUpdatedRouter.get('/', async (req, res) => { + const searchClient = await getClient(); try { - const response = await esClient.search({ + const response = await searchClient.search({ index: process.env.ES_UPDATE_INDEX, body: { query: { diff --git a/api/src/search.js b/api/src/search.js index c143ec75d..15e51c283 100644 --- a/api/src/search.js +++ b/api/src/search.js @@ -1,5 +1,5 @@ import express from 'express'; -import esClient from './services/elasticsearch'; +import getClient from './services/searchClient.ts'; import { get } from 'lodash'; const GENES_INDEX = 'genes'; @@ -28,7 +28,8 @@ geneSearchRouter.get('/gene', async (req, res) => { }, }; - const response = await esClient.search({ + const searchClient = await getClient(); + const response = await searchClient.search({ index: GENES_INDEX, body: { query }, }); diff --git a/api/src/services/elasticsearch.ts b/api/src/services/elasticsearch.ts deleted file mode 100644 index b6d2327a8..000000000 --- a/api/src/services/elasticsearch.ts +++ /dev/null @@ -1,7 +0,0 @@ -import elasticsearch, { Client } from '@opensearch-project/opensearch'; - -const client: Client = new elasticsearch.Client({ - node: process.env.ES_URL, -}); - -export default client; diff --git a/api/src/services/searchClient.ts b/api/src/services/searchClient.ts new file mode 100644 index 000000000..222f257d6 --- /dev/null +++ b/api/src/services/searchClient.ts @@ -0,0 +1,8 @@ +import { getSearchClient } from '@overture-stack/arranger-server'; + +const getClient = async () => + await getSearchClient({ + node: process.env.ES_URL || 'http://localhost:9200', + }); + +export default getClient; diff --git a/cms/src/hooks.js b/cms/src/hooks.js index 15c00c5d0..0a5077131 100644 --- a/cms/src/hooks.js +++ b/cms/src/hooks.js @@ -1,5 +1,5 @@ -import { publishModel } from './services/elastic-search/publish.js'; -import { unpublishModel } from './services/elastic-search/unpublish.js'; +import { publishModel } from './services/searchClient/publish.js'; +import { unpublishModel } from './services/searchClient/unpublish.js'; import { modelStatus, runYupValidatorFailFast } from './helpers/index.js'; import { deleteImage } from './routes/images.js'; import { getSaveValidation } from './validation/model.js'; diff --git a/cms/src/routes/action.js b/cms/src/routes/action.js index 04a7d6b3b..d807955c1 100644 --- a/cms/src/routes/action.js +++ b/cms/src/routes/action.js @@ -4,8 +4,8 @@ import express from 'express'; import Model from '../schemas/model.js'; import getPublishValidation from '../validation/model.js'; import { runYupValidatorFailFast } from '../helpers/index.js'; -import { publishModel } from '../services/elastic-search/publish.js'; -import { unpublishModel } from '../services/elastic-search/unpublish.js'; +import { publishModel } from '../services/searchClient/publish.js'; +import { unpublishModel } from '../services/searchClient/unpublish.js'; import { backupFields } from '../schemas/descriptions/modelVariant.js'; import csvStream from '../helpers/streamAsCSV.js'; @@ -22,10 +22,10 @@ actionRouter.post('/publish/:name', async (req, res) => { name, }) .populate('variants.variant') - .then(models => runYupValidatorFailFast(validation, models)) + .then((models) => runYupValidatorFailFast(validation, models)) .then(() => publishModel({ name })) .then(() => res.json({ success: `${name} has been successfully published` })) - .catch(error => { + .catch((error) => { logger.error(error); res.status(500).json({ error: error, diff --git a/cms/src/routes/bulk.js b/cms/src/routes/bulk.js index e7e5c0003..f0bc87090 100644 --- a/cms/src/routes/bulk.js +++ b/cms/src/routes/bulk.js @@ -4,11 +4,11 @@ import express from 'express'; import Model from '../schemas/model.js'; import getPublishValidation from '../validation/model.js'; import { runYupValidatorFailSlow, modelStatus } from '../helpers/index.js'; -import { indexOneToES, indexMatchedModelsToES } from '../services/elastic-search/publish.js'; -import { unpublishManyFromES } from '../services/elastic-search/unpublish.js'; +import { indexOneToES, indexMatchedModelsToES } from '../services/searchClient/publish.js'; +import { unpublishManyFromES } from '../services/searchClient/unpublish.js'; import csvStream from '../helpers/streamAsCSV.js'; import { backupFields } from '../schemas/descriptions/model.js'; -import { updateGeneSearchIndicies } from '../services/elastic-search/genomicVariants.js'; +import { updateGeneSearchIndicies } from '../services/searchClient/genomicVariants.js'; import getLogger from '../logger'; const logger = getLogger('routes/bulk'); @@ -23,8 +23,8 @@ bulkRouter.post('/publish', async (req, res) => { _id: { $in: req.body }, }) .populate('variants.variant') - .then(models => runYupValidatorFailSlow(validation, models)) - .then(validated => { + .then((models) => runYupValidatorFailSlow(validation, models)) + .then((validated) => { const validModelNames = validated .filter(({ success }) => success) .map(({ result: { name } }) => name); @@ -34,7 +34,7 @@ bulkRouter.post('/publish', async (req, res) => { return validModelNames; }) - .then(async validModelNames => { + .then(async (validModelNames) => { for (const name of validModelNames) { try { await indexOneToES({ name }); @@ -65,7 +65,7 @@ bulkRouter.post('/publish', async (req, res) => { errors: validationErrors, }); }) - .catch(error => { + .catch((error) => { logger.error(error); res.status(500).json({ error: error, @@ -77,8 +77,8 @@ bulkRouter.post('/unpublish', async (req, res) => { let deleteCount = 0; Model.find({ _id: { $in: req.body } }) - .then(models => unpublishManyFromES(models.map(({ name }) => name))) - .then(result => { + .then(async (models) => await unpublishManyFromES(models.map(({ name }) => name))) + .then((result) => { deleteCount = result.deleted; return Model.updateMany( { @@ -95,7 +95,7 @@ bulkRouter.post('/unpublish', async (req, res) => { await updateGeneSearchIndicies(); }) .then(() => res.json({ success: `${deleteCount} models unpublished` })) - .catch(error => { + .catch((error) => { logger.error(error); res.status(500).json({ error: error, @@ -105,7 +105,7 @@ bulkRouter.post('/unpublish', async (req, res) => { bulkRouter.post('/delete', async (req, res) => { Model.find({ _id: { $in: req.body } }) - .then(models => { + .then((models) => { const modelsToUnpublish = models .filter(({ status }) => status !== modelStatus.unpublished) .map(({ name }) => name); @@ -124,7 +124,7 @@ bulkRouter.post('/delete', async (req, res) => { }), ) .then(() => res.json({ success: `${req.body.length} models deleted` })) - .catch(error => { + .catch((error) => { logger.error(error); res.status(500).json({ error: error, diff --git a/cms/src/routes/health.js b/cms/src/routes/health.js index edb96b772..cd8c39010 100644 --- a/cms/src/routes/health.js +++ b/cms/src/routes/health.js @@ -1,7 +1,7 @@ import express from 'express'; import _ from 'lodash'; -import client from '../services/elastic-search/common/client.js'; +import client from '../services/searchClient/common/client.js'; import Model from '../schemas/model.js'; import { testS3Connection } from '../services/s3/index.js'; diff --git a/cms/src/schemas/genes.js b/cms/src/schemas/genes.js index f20d9fd2c..66b104899 100644 --- a/cms/src/schemas/genes.js +++ b/cms/src/schemas/genes.js @@ -1,7 +1,7 @@ import mongoose from 'mongoose'; import mongooseElasticsearch from 'mongoose-elasticsearch-xp'; -import elasticClient from '../services/elastic-search/common/client.js'; +import elasticClient from '../services/searchClient/common/client.js'; const GeneSchema = new mongoose.Schema( { diff --git a/cms/src/services/elastic-search/common/client.js b/cms/src/services/elastic-search/common/client.js deleted file mode 100644 index 17d85d472..000000000 --- a/cms/src/services/elastic-search/common/client.js +++ /dev/null @@ -1,7 +0,0 @@ -import { Client } from '@opensearch-project/opensearch'; -const eshost = `${process.env.ES_HOST || 'http://localhost'}:${process.env.ES_PORT || 9200}`; -const client = new Client({ - node: eshost, -}); - -export default client; diff --git a/cms/src/services/publish/Publisher.js b/cms/src/services/publish/Publisher.js index e62622f72..4527ec68b 100644 --- a/cms/src/services/publish/Publisher.js +++ b/cms/src/services/publish/Publisher.js @@ -3,7 +3,7 @@ import getPublishValidation from '../../validation/model.js'; import { runYupValidatorFailSlow } from '../../helpers/index.js'; import { PUBLISH_ERRORS } from './constants.js'; import { getPublishErrorMessage } from './helpers.js'; -import { publishModel, bulkUpdateGeneSearchIndices } from '../elastic-search/publish.js'; +import { publishModel, bulkUpdateGeneSearchIndices } from '../searchClient/publish.js'; import getLogger from '../../logger.js'; const logger = getLogger('services/publish/Publisher'); diff --git a/cms/src/services/searchClient/common/client.js b/cms/src/services/searchClient/common/client.js new file mode 100644 index 000000000..a1111a573 --- /dev/null +++ b/cms/src/services/searchClient/common/client.js @@ -0,0 +1,11 @@ +import { getSearchClient } from '@overture-stack/arranger-server'; + +const getClient = async () => { + const eshost = `${process.env.ES_HOST || 'http://localhost'}:${process.env.ES_PORT || 9200}`; + const client = await getSearchClient({ + node: eshost, + }); + return client; +}; + +export default getClient; diff --git a/cms/src/services/elastic-search/common/schemas/model.js b/cms/src/services/searchClient/common/schemas/model.js similarity index 100% rename from cms/src/services/elastic-search/common/schemas/model.js rename to cms/src/services/searchClient/common/schemas/model.js diff --git a/cms/src/services/elastic-search/genomicVariants.js b/cms/src/services/searchClient/genomicVariants.js similarity index 98% rename from cms/src/services/elastic-search/genomicVariants.js rename to cms/src/services/searchClient/genomicVariants.js index 69abd0bad..856c558aa 100644 --- a/cms/src/services/elastic-search/genomicVariants.js +++ b/cms/src/services/searchClient/genomicVariants.js @@ -1,10 +1,12 @@ +import _ from 'lodash'; + +import getLogger from '../../logger.js'; + import esClient from './common/client.js'; -import _ from 'lodash'; const { get, flatten, uniq } = _; -import getLogger from '../../logger.js'; -const logger = getLogger('services/elastic-search/genomicVariants'); +const logger = getLogger('services/searchClient/genomicVariants'); const MODEL_INDEX = process.env.ES_INDEX; const GENES_INDEX = 'genes'; diff --git a/cms/src/services/elastic-search/publish.js b/cms/src/services/searchClient/publish.js similarity index 86% rename from cms/src/services/elastic-search/publish.js rename to cms/src/services/searchClient/publish.js index dc7ac04e8..f2ad0ef4d 100644 --- a/cms/src/services/elastic-search/publish.js +++ b/cms/src/services/searchClient/publish.js @@ -1,13 +1,14 @@ -import { ModelES } from './common/schemas/model.js'; import Model from '../../schemas/model.js'; import getPublishValidation from '../../validation/model.js'; import { modelStatus } from '../../helpers/modelStatus.js'; import MatchUtils from '../../helpers/matchedModels.js'; +import getLogger from '../../logger.js'; + +import { ModelES } from './common/schemas/model.js'; import indexEsUpdate from './update.js'; import { updateGeneSearchIndicies } from './genomicVariants.js'; -import getLogger from '../../logger.js'; -const logger = getLogger('services/elastic-search/publish'); +const logger = getLogger('services/searchClient/publish'); export const publishModel = async (filter, individualPublish = true) => { await indexOneToES(filter); @@ -25,7 +26,7 @@ export const publishModel = async (filter, individualPublish = true) => { }; // For bulk publishes, update gene search indices after all models are published -export const bulkUpdateGeneSearchIndices = async modelNames => { +export const bulkUpdateGeneSearchIndices = async (modelNames) => { const modelsWithVariantChanges = await Model.find({ name: { $in: modelNames }, variants_modified: true, @@ -41,7 +42,7 @@ export const bulkUpdateGeneSearchIndices = async modelNames => { } }; -export const indexOneToES = filter => { +export const indexOneToES = (filter) => { return new Promise((resolve, reject) => { ModelES.findOne(filter) .populate('variants.variant') @@ -62,7 +63,7 @@ export const indexOneToES = filter => { _id: { $in: doc.matchedModels.models || [] }, }); const matches = matchedModels.filter( - model => model.status !== modelStatus.unpublished && model.name !== doc.name, + (model) => model.status !== modelStatus.unpublished && model.name !== doc.name, ); doc.populatedMatches = matches; } @@ -82,7 +83,7 @@ export const indexOneToES = filter => { async () => await Model.updateOne({ name: doc.name }, { status: modelStatus.published }), ) - .catch(err => reject(err)); + .catch((err) => reject(err)); }); }); }; @@ -103,9 +104,7 @@ export const indexMatchedModelsToES = async (filter, skipSelf = true) => { if (model.matchedModels && matchedModelIds.length <= 1) { // if list of matched models exists but only includes itself, we can remove the whole matched model set. logger.warn( - `Model ${model.name} is part of a small or empty matchedModel set of length ${ - matchedModelIds.length - }, deleting the set and the reference in the model.`, + `Model ${model.name} is part of a small or empty matchedModel set of length ${matchedModelIds.length}, deleting the set and the reference in the model.`, ); await MatchUtils.removeFromSet(model.name); } @@ -116,7 +115,9 @@ export const indexMatchedModelsToES = async (filter, skipSelf = true) => { } await updateMatchedModelsToES({ - _id: { $in: matchedModelIds.filter(id => id.toString() !== model._id.toString() || !skipSelf) }, + _id: { + $in: matchedModelIds.filter((id) => id.toString() !== model._id.toString() || !skipSelf), + }, }); if (model.updateOldMatchesOnPublish) { @@ -125,14 +126,14 @@ export const indexMatchedModelsToES = async (filter, skipSelf = true) => { } }; -export const updateMatchedModelsToES = async filter => { +export const updateMatchedModelsToES = async (filter) => { const models = await ModelES.find(filter); // filter this list only to models that are published or published with changes - const modelsToPublish = models.filter(model => model.status !== modelStatus.unpublished); + const modelsToPublish = models.filter((model) => model.status !== modelStatus.unpublished); logger.debug( - { matchedModels: modelsToPublish.map(model => model.name) }, + { matchedModels: modelsToPublish.map((model) => model.name) }, 'Updating matched models', ); for (let model of modelsToPublish) { diff --git a/cms/src/services/elastic-search/unpublish.js b/cms/src/services/searchClient/unpublish.js similarity index 77% rename from cms/src/services/elastic-search/unpublish.js rename to cms/src/services/searchClient/unpublish.js index fe32ea876..98f8fe493 100644 --- a/cms/src/services/elastic-search/unpublish.js +++ b/cms/src/services/searchClient/unpublish.js @@ -1,6 +1,6 @@ // @ts-check -import elasticClient from './common/client.js'; +import getClient from './common/client.js'; import indexEsUpdate from './update.js'; import Model from '../../schemas/model.js'; import { indexMatchedModelsToES } from './publish.js'; @@ -8,7 +8,7 @@ import { modelStatus } from '../../helpers/modelStatus.js'; import { updateGeneSearchIndicies } from './genomicVariants.js'; import getLogger from '../../logger.js'; -const logger = getLogger('services/elastic-search/unpublish'); +const logger = getLogger('services/searchClient/unpublish'); const index = process.env.ES_INDEX; @@ -22,7 +22,8 @@ export const unpublishOneFromES = async (name) => { // Not waiting for update promise to // resolve as this is just bookkeeping indexEsUpdate(); - await elasticClient.deleteByQuery({ + const searchClient = await getClient(); + await searchClient.deleteByQuery({ index, body: { query: { @@ -39,11 +40,12 @@ export const unpublishOneFromES = async (name) => { logger.audit({ model: name }, 'unpublish model', 'Model Unpublished from ES'); }; -export const unpublishManyFromES = (nameArr) => { +export const unpublishManyFromES = async (nameArr) => { // Not waiting for update promise to // resolve as this is just bookkeeping indexEsUpdate(); - return elasticClient.deleteByQuery({ + const searchClient = await getClient(); + return searchClient.deleteByQuery({ index, body: { query: { diff --git a/cms/src/services/elastic-search/update.js b/cms/src/services/searchClient/update.js similarity index 85% rename from cms/src/services/elastic-search/update.js rename to cms/src/services/searchClient/update.js index 75fea3b25..17f98199d 100644 --- a/cms/src/services/elastic-search/update.js +++ b/cms/src/services/searchClient/update.js @@ -2,7 +2,7 @@ import elasticClient from './common/client.js'; import getLogger from '../../logger.js'; -const logger = getLogger('services/elastic-search/update'); +const logger = getLogger('services/searchClient/update'); const index = process.env.ES_UPDATE_INDEX; @@ -15,7 +15,7 @@ const update = () => date: Date.now(), }, }) - .catch(error => + .catch((error) => // Catch here as we do not want an error here to block execution of the app logger.error(error, index, `Error creating a new update for index`), ); diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 000000000..5e6a74a61 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,6 @@ +overrides: + js-yaml: ^4.1.1 + mongoose: ^6.13.8 + node-fetch: ^2.6.7 + node-forge: ^1.3.2 + xml2js: ^0.5.0 diff --git a/scripts/initializeExpanded.js b/scripts/initializeExpanded.js index e3e4b5eaa..7d1e970f7 100644 --- a/scripts/initializeExpanded.js +++ b/scripts/initializeExpanded.js @@ -10,7 +10,7 @@ const conn = mongoose.createConnection(process.env.MONGODB_URI || 'mongodb://loc conn.once('open', async () => { try { const models = await conn.db - .collection(process.env.MONGO_COLLECTION) + .collection(MONGO_COLLECTION) .find({ expanded: { $exists: false } }); console.log('Models to update:'); let model; @@ -19,7 +19,7 @@ conn.once('open', async () => { } console.log('\nUpdating now...'); const updateResult = await conn.db - .collection(process.env.MONGO_COLLECTION) + .collection(MONGO_COLLECTION) .updateMany({ expanded: { $exists: false } }, { $set: { expanded: true } }); console.log('Models updated:', updateResult.modifiedCount); diff --git a/scripts/utils/esUtils.js b/scripts/utils/esUtils.js index 74cd247d6..37a675a3f 100644 --- a/scripts/utils/esUtils.js +++ b/scripts/utils/esUtils.js @@ -1,4 +1,4 @@ -import es from '@opensearch-project/opensearch'; +import { getSearchClient } from '@overture-stack/arranger-server'; /** Search index settings and mappings **/ import modelsIndexConfig from '../../elasticsearch/modelsIndex.json' with { type: "json" }; @@ -23,14 +23,13 @@ const modelsIndexName = process.env.ES_INDEX || pm2.ES_INDEX || 'hcmi'; const GENES_INDEX = 'genes'; const VARIANTS_INDEX = 'genomic_variants'; -const client = new es.Client({ - node: esHost, -}); - /* ******** Index creation and deletion ******** */ const createIndex = async (index, config) => { try { console.log(`\nCreating index: ${index}`); + const client = await getSearchClient({ + node: esHost, + }); await client.indices.create({ index, body: config, @@ -46,6 +45,9 @@ const createIndex = async (index, config) => { const deleteIndex = async index => { try { console.log(`\nDeleting existing index (if present): ${index}`); + const client = await getSearchClient({ + node: esHost, + }); await client.indices.delete({ index }); } catch (e) {} }; @@ -71,6 +73,9 @@ const deleteVariantsIndex = async () => await deleteIndex(VARIANTS_INDEX); const updateIndex = async ({ index, settings = {}, mappings = {} } = {}) => { try { console.log('Updating mapping for:', index); + const client = await getSearchClient({ + node: esHost, + }); await client.indices.close({ index, }); @@ -109,6 +114,9 @@ const updateSearchIndices = async () => { const configureArrangerSets = async () => { try { console.log(`\nDeleting existing index (if present): arranger-sets`); + const client = await getSearchClient({ + node: esHost, + }); await client.indices.delete({ index: `arranger-sets` }); } catch (e) {} try { diff --git a/scripts/utils/republishUtils.js b/scripts/utils/republishUtils.js index 53303479f..da5ff6317 100644 --- a/scripts/utils/republishUtils.js +++ b/scripts/utils/republishUtils.js @@ -5,14 +5,14 @@ process.env = esUtils.config; import 'babel-polyfill'; import mongoose from 'mongoose'; -import { publishModel } from '../../cms/src/services/elastic-search/publish.js'; -import { ModelES } from '../../cms/src/services/elastic-search/common/schemas/model.js'; +import { publishModel } from '../../cms/src/services/searchClient/publish.js'; +import { ModelES } from '../../cms/src/services/searchClient/common/schemas/model.js'; import '../../cms/src/schemas/variant.js'; import '../../cms/src/schemas/matchedModels.js'; import { modelStatus } from '../../cms/src/helpers/modelStatus.js'; -import indexEsUpdate from '../../cms/src/services/elastic-search/update.js'; +import indexEsUpdate from '../../cms/src/services/searchClient/update.js'; export const republishModels = async () => { console.log('Connecting to MongoDB...'); diff --git a/yarn.lock b/yarn.lock index aeee3fa3b..9f7e11143 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2121,11 +2121,11 @@ tslib "^2.4.0" "@graphql-tools/merge@^9.0.4": - version "9.1.6" - resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-9.1.6.tgz#95eb8bb5ae314bc07a62938b7a1b8c2622e1dc32" - integrity sha512-bTnP+4oom4nDjmkS3Ykbe+ljAp/RIiWP3R35COMmuucS24iQxGLa9Hn8VMkLIoaoPxgz6xk+dbC43jtkNsFoBw== + version "9.1.7" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-9.1.7.tgz#8040553c19aeadf6df41060b811e9c5df8716be1" + integrity sha512-Y5E1vTbTabvcXbkakdFUt4zUIzB1fyaEnVmIWN0l0GMed2gdD01TpZWLUm4RNAxpturvolrb24oGLQrBbPLSoQ== dependencies: - "@graphql-tools/utils" "^10.11.0" + "@graphql-tools/utils" "^11.0.0" tslib "^2.4.0" "@graphql-tools/mock@^8.1.2": @@ -2165,7 +2165,7 @@ dependencies: tslib "^2.4.0" -"@graphql-tools/utils@^10.11.0", "@graphql-tools/utils@^10.2.2": +"@graphql-tools/utils@^10.2.2": version "10.11.0" resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-10.11.0.tgz#2513dca9ca25bab5a2651da2d66c37b1e2616bdf" integrity sha512-iBFR9GXIs0gCD+yc3hoNswViL1O5josI33dUqiNStFI/MHLCEPduasceAcazRH77YONKNiviHBV8f7OgcT4o2Q== @@ -2175,6 +2175,16 @@ cross-inspect "1.0.1" tslib "^2.4.0" +"@graphql-tools/utils@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-11.0.0.tgz#f54a09372e96c32416fcbd0eb8e9e0f1338900bd" + integrity sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + "@whatwg-node/promise-helpers" "^1.0.0" + cross-inspect "1.0.1" + tslib "^2.4.0" + "@graphql-tools/utils@^9.2.1": version "9.2.1" resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-9.2.1.tgz#1b3df0ef166cfa3eae706e3518b17d5922721c57" @@ -2833,9 +2843,9 @@ uuid "^9.0.0" "@overture-stack/arranger-server@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@overture-stack/arranger-server/-/arranger-server-3.0.0.tgz#7fa0c3d74ad49172e5e8c0a709d3583e7f211d06" - integrity sha512-WOThlrmFyZlyZJgMJqy4XWSUy1zHq6RbN2j/4ugTAUTUmi5GlXc/+2VAWwUycQ56Mqw/8yi04yOKjqLGMl2BzA== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@overture-stack/arranger-server/-/arranger-server-3.0.2.tgz#c66cfce129a7d5ec89eab23b9b1b01949b716833" + integrity sha512-nJLZwgjCzy2k+MmXq0aAWP9RB57QojFGceE0a5Tnu4o7GhU2VaaPeEgBGNmtMIcrL2/E9hywVtjcJHzz3Ussdg== dependencies: "@elastic/elasticsearch" "^7.17.14" "@graphql-tools/merge" "^9.0.4" @@ -3974,9 +3984,9 @@ "@types/range-parser" "*" "@types/express-serve-static-core@^4.17.18": - version "4.19.7" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz#f1d306dcc03b1aafbfb6b4fe684cce8a31cffc10" - integrity sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg== + version "4.19.8" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz#99b960322a4d576b239a640ab52ef191989b036f" + integrity sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA== dependencies: "@types/node" "*" "@types/qs" "*" @@ -4105,9 +4115,9 @@ integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== "@types/qs@*": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.14.0.tgz#d8b60cecf62f2db0fb68e5e006077b9178b85de5" - integrity sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ== + version "6.15.0" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.15.0.tgz#963ab61779843fe910639a50661b48f162bc7f79" + integrity sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow== "@types/range-parser@*": version "1.2.7" @@ -5683,7 +5693,7 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cors@^2.8.4, cors@^2.8.5: +cors@^2.8.4: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== @@ -5691,6 +5701,14 @@ cors@^2.8.4, cors@^2.8.5: object-assign "^4" vary "^1" +cors@^2.8.5: + version "2.8.6" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.6.tgz#ff5dd69bd95e547503820d29aba4f8faf8dfec96" + integrity sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw== + dependencies: + object-assign "^4" + vary "^1" + cosmiconfig@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" @@ -7642,9 +7660,9 @@ graphql-type-json@^0.3.2: integrity sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg== graphql@^16.8.1: - version "16.12.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.12.0.tgz#28cc2462435b1ac3fdc6976d030cef83a0c13ac7" - integrity sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ== + version "16.13.1" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.13.1.tgz#38ae5c76fbc4a009e0004dca6c76c370a1da7b54" + integrity sha512-gGgrVCoDKlIZ8fIqXBBb0pPKqDgki0Z/FSKNiQzSGj2uEYHr1tq5wmBegGwJx6QB5S5cM0khSBpi/JFHMCvsmQ== growly@^1.3.0: version "1.3.0" From 650738e3f0336331c17ddc8d096b2096a0f70af9 Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Mon, 16 Mar 2026 11:24:07 -0400 Subject: [PATCH 05/82] Fixed configureSets --- scripts/utils/esUtils.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/utils/esUtils.js b/scripts/utils/esUtils.js index 37a675a3f..89654cc67 100644 --- a/scripts/utils/esUtils.js +++ b/scripts/utils/esUtils.js @@ -121,6 +121,9 @@ const configureArrangerSets = async () => { } catch (e) {} try { console.log(`Creating index: arranger-sets`); + const client = await getSearchClient({ + node: esHost, + }); await client.indices.create({ index: 'arranger-sets', body: { From f53c4037f8a3e3ea49db689a9b117b25b30c9f09 Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Thu, 19 Mar 2026 10:22:03 -0400 Subject: [PATCH 06/82] mongoosastic, publish, and promise updates --- api/src/lastUpdated.js | 6 +- cms/package.json | 1 + cms/src/routes/bulk.js | 56 +- cms/src/routes/publish.js | 24 +- cms/src/schemas/genes.js | 4 +- cms/src/services/publish/Publisher.js | 12 +- .../searchClient/common/schemas/model.js | 5 +- cms/src/services/searchClient/publish.js | 77 +- cms/src/services/searchClient/unpublish.js | 6 +- cms/src/services/searchClient/update.js | 8 +- .../Notifications/PublishNotifications.jsx | 24 +- .../admin/helpers/fetchTableData.js | 12 +- yarn.lock | 1231 +++++------------ 13 files changed, 446 insertions(+), 1020 deletions(-) diff --git a/api/src/lastUpdated.js b/api/src/lastUpdated.js index eec52a6aa..4feace268 100644 --- a/api/src/lastUpdated.js +++ b/api/src/lastUpdated.js @@ -1,9 +1,12 @@ // @ts-check import express from 'express'; + import getClient from './services/searchClient.ts'; +import getLogger from './logger'; const lastUpdatedRouter = express.Router(); +const logger = getLogger('lastUpdated Router'); lastUpdatedRouter.get('/', async (req, res) => { const searchClient = await getClient(); @@ -24,8 +27,9 @@ lastUpdatedRouter.get('/', async (req, res) => { ], }, }); - return res.json(response.body.hits.hits[0]._source); + return res.json(response.body?.hits?.hits[0]?._source); } catch (error) { + logger.error(`Error retrieving last updated date from Arranger: ${error}`); return res.status(500).json({ error: error, }); diff --git a/cms/package.json b/cms/package.json index 034e96639..4db52fcd2 100644 --- a/cms/package.json +++ b/cms/package.json @@ -32,6 +32,7 @@ "lodash": "^4.17.21", "map-stream": "^0.0.7", "method-override": "^2.3.10", + "mongoosastic": "^5.0.0", "mongoose": "7.8.7", "mongoose-elasticsearch-xp": "^5.8.0", "morgan": "^1.10.1", diff --git a/cms/src/routes/bulk.js b/cms/src/routes/bulk.js index f0bc87090..9a9cb2d8e 100644 --- a/cms/src/routes/bulk.js +++ b/cms/src/routes/bulk.js @@ -17,7 +17,7 @@ const bulkRouter = express.Router(); bulkRouter.post('/publish', async (req, res) => { const validation = await getPublishValidation(); - let validationErrors; + let validationErrors = []; // Validate models for publishing Model.find({ _id: { $in: req.body }, @@ -60,14 +60,14 @@ bulkRouter.post('/publish', async (req, res) => { { $set: { variants_modified: false } }, ); } - res.json({ + return res.json({ success: `${req.body.length - validationErrors.length} models published`, errors: validationErrors, }); }) .catch((error) => { logger.error(error); - res.status(500).json({ + return res.status(500).json({ error: error, }); }); @@ -76,31 +76,29 @@ bulkRouter.post('/publish', async (req, res) => { bulkRouter.post('/unpublish', async (req, res) => { let deleteCount = 0; - Model.find({ _id: { $in: req.body } }) - .then(async (models) => await unpublishManyFromES(models.map(({ name }) => name))) - .then((result) => { - deleteCount = result.deleted; - return Model.updateMany( - { - _id: { $in: req.body }, - }, - { status: modelStatus.unpublished }, - ); - }) - .then(async () => { - for (const _id of req.body) { - // Now that everything has been published, lets make sure all the matched models for these are also updated in ES - await indexMatchedModelsToES({ _id }); - } - await updateGeneSearchIndicies(); - }) - .then(() => res.json({ success: `${deleteCount} models unpublished` })) - .catch((error) => { - logger.error(error); - res.status(500).json({ - error: error, - }); + try { + const models = await Model.find({ _id: { $in: req.body } }); + const result = await unpublishManyFromES(models.map(({ name }) => name)); + deleteCount = result.deleted; + await Model.updateMany( + { + _id: { $in: req.body }, + }, + { status: modelStatus.unpublished }, + ); + + for (const _id of req.body) { + // Now that everything has been published, lets make sure all the matched models for these are also updated in ES + await indexMatchedModelsToES({ _id }); + } + await updateGeneSearchIndicies(); + return res.json({ success: `${deleteCount} models unpublished` }); + } catch (error) { + logger.error(error); + return res.status(500).json({ + error: error, }); + } }); bulkRouter.post('/delete', async (req, res) => { @@ -123,7 +121,9 @@ bulkRouter.post('/delete', async (req, res) => { _id: { $in: req.body }, }), ) - .then(() => res.json({ success: `${req.body.length} models deleted` })) + .then(() => { + return res.json({ success: `${req.body.length} models deleted` }); + }) .catch((error) => { logger.error(error); res.status(500).json({ diff --git a/cms/src/routes/publish.js b/cms/src/routes/publish.js index 950e00cb0..ea82a5ccf 100644 --- a/cms/src/routes/publish.js +++ b/cms/src/routes/publish.js @@ -64,11 +64,10 @@ publishRouter.get('/status', async (req, res) => { logger.debug(`Fetching Publisher status...`); const status = Publisher.getStatus(); - - res.status(200).json({ ...status }); + return res.status(200).json({ ...status }); } catch (error) { logger.error(error, `Error occurred during Publisher status fetch`); - res.status(500).json({ + return res.status(500).json({ success: false, error: error, }); @@ -154,11 +153,10 @@ publishRouter.post('/acknowledge/bulk', async (req, res) => { logger.debug(`Starting bulk acknowledge for models: ${models}`); const acknowledged = Publisher.acknowledgeBulk(models); - - res.status(200).json({ acknowledged, success: true }); + return res.status(200).json({ acknowledged, success: true }); } catch (error) { logger.error(error, `Error occurred during bulk model acknowledge`); - res.status(500).json({ + return res.status(500).json({ success: false, error: error, }); @@ -171,11 +169,11 @@ publishRouter.post('/acknowledge/:name', async (req, res) => { logger.debug(`Acknowledging publish status for model ${name}`); const acknowledged = Publisher.acknowledge(name); - - res.status(200).json({ acknowledged, success: true }); + console.log('acknowledge/:name', acknowledged); + return res.status(200).json({ acknowledged, success: true }); } catch (error) { logger.error(error, `Error occurred during publish status acknowledgement for model ${name}`); - res.status(500).json({ + return res.status(500).json({ success: false, error: error, }); @@ -188,10 +186,10 @@ publishRouter.post('/stop/all', async (req, res) => { const stopped = await Publisher.stopBulkPublish(); - res.status(200).json({ stopped, success: true }); + return res.status(200).json({ stopped, success: true }); } catch (error) { logger.error(error, `Error occurred during bulk publish stop`); - res.status(500).json({ + return res.status(500).json({ success: false, error: error, }); @@ -205,10 +203,10 @@ publishRouter.post('/stop/:name', async (req, res) => { const stopped = await Publisher.stopPublish(name); - res.status(200).json({ stopped, success: true }); + return res.status(200).json({ stopped, success: true }); } catch (error) { logger.error(error, `Error occurred during publish stop for model ${name}`); - res.status(500).json({ + return res.status(500).json({ success: false, error: error, }); diff --git a/cms/src/schemas/genes.js b/cms/src/schemas/genes.js index 66b104899..97dcea7aa 100644 --- a/cms/src/schemas/genes.js +++ b/cms/src/schemas/genes.js @@ -1,6 +1,6 @@ import mongoose from 'mongoose'; +import mongoosastic from 'mongoosastic'; -import mongooseElasticsearch from 'mongoose-elasticsearch-xp'; import elasticClient from '../services/searchClient/common/client.js'; const GeneSchema = new mongoose.Schema( @@ -17,7 +17,7 @@ const GeneSchema = new mongoose.Schema( }, ); -GeneSchema.plugin(mongooseElasticsearch.v7, { +GeneSchema.plugin(mongoosastic, { client: elasticClient, index: 'genes', type: '_doc', diff --git a/cms/src/services/publish/Publisher.js b/cms/src/services/publish/Publisher.js index 4527ec68b..c4c60cafd 100644 --- a/cms/src/services/publish/Publisher.js +++ b/cms/src/services/publish/Publisher.js @@ -145,7 +145,7 @@ const Publisher = (function () { } // Remove duplicate publish tasks - stopPublish(modelName); + await stopPublish(modelName); acknowledge(modelName); try { @@ -157,7 +157,7 @@ const Publisher = (function () { name: modelName, }) .populate('variants.variant') - .then((model) => runYupValidatorFailSlow(validation, model)) + .then(async (model) => await runYupValidatorFailSlow(validation, model)) .then((results) => { if (results[0].success) { // Create new publish task @@ -228,7 +228,7 @@ const Publisher = (function () { } // Remove duplicate imports - stopBulkPublish(models); + await stopBulkPublish(models); acknowledgeBulk(models); // Filter out models that don't exist within HCMI db @@ -410,9 +410,9 @@ const Publisher = (function () { running = false; }; - const start = () => { + const start = async () => { running = true; - run(); + await run(); }; const run = async () => { @@ -446,7 +446,7 @@ const Publisher = (function () { } if (running && queue.length > 0) { - run(); + await run(); } else { // Update gene search indices after bulk publish completes await updateBulkGeneSearchIndicies(); diff --git a/cms/src/services/searchClient/common/schemas/model.js b/cms/src/services/searchClient/common/schemas/model.js index 026329ae9..ba4be67fc 100644 --- a/cms/src/services/searchClient/common/schemas/model.js +++ b/cms/src/services/searchClient/common/schemas/model.js @@ -1,11 +1,12 @@ import mongoose from 'mongoose'; -import mongooseElasticsearch from 'mongoose-elasticsearch-xp'; +import mongoosastic from 'mongoosastic'; + import { ModelSchema } from '../../../../schemas/model.js'; import elasticClient from '../client.js'; const index = process.env.ES_INDEX; -ModelSchema.plugin(mongooseElasticsearch.v7, { +ModelSchema.plugin(mongoosastic, { client: elasticClient, index, type: '_doc', diff --git a/cms/src/services/searchClient/publish.js b/cms/src/services/searchClient/publish.js index f2ad0ef4d..e943bcd18 100644 --- a/cms/src/services/searchClient/publish.js +++ b/cms/src/services/searchClient/publish.js @@ -42,50 +42,39 @@ export const bulkUpdateGeneSearchIndices = async (modelNames) => { } }; -export const indexOneToES = (filter) => { - return new Promise((resolve, reject) => { - ModelES.findOne(filter) - .populate('variants.variant') - .populate('matchedModels') - .exec(async (err, doc) => { - if (err) { - reject(err); - } - const validation = await getPublishValidation(); - // Validate doc against publish schema - // for "on-demand" publishing - validation - .validate(doc) - .then(async () => { - // Need to populate and filter the matched models - if (doc.matchedModels) { - const matchedModels = await ModelES.find({ - _id: { $in: doc.matchedModels.models || [] }, - }); - const matches = matchedModels.filter( - (model) => model.status !== modelStatus.unpublished && model.name !== doc.name, - ); - doc.populatedMatches = matches; - } - doc.esIndex((err, res) => { - if (err) { - reject(err); - } else { - indexEsUpdate() && - resolve({ - status: `Indexing successful with status: ${res.result}`, - }); - logger.audit({ model: doc.name }, 'publish model', 'Model Published to ES'); - } - }); - }) - .then( - async () => - await Model.updateOne({ name: doc.name }, { status: modelStatus.published }), - ) - .catch((err) => reject(err)); - }); - }); +export const indexOneToES = async (filter) => { + const validation = await getPublishValidation(); + const doc = await ModelES.findOne(filter) + .populate('variants.variant') + .populate('matchedModels') + .exec(); + + // Validate doc against publish schema + // for "on-demand" publishing + return await validation + .validate(doc) + .then(async () => { + // Need to populate and filter the matched models + if (doc.matchedModels) { + const matchedModels = await ModelES.find({ + _id: { $in: doc.matchedModels.models || [] }, + }); + const matches = matchedModels.filter( + (model) => model.status !== modelStatus.unpublished && model.name !== doc.name, + ); + doc.populatedMatches = matches; + } + await indexEsUpdate(); + const res = await Model.updateOne({ name: doc.name }, { status: modelStatus.published }); + logger.audit({ model: doc.name }, 'publish model', 'Model Published to ES'); + return { + status: `Indexing successful with status: ${res.result}`, + }; + }) + .catch((err) => { + logger.error('Error at indexOneToES', err); + throw err; + }); }; /** diff --git a/cms/src/services/searchClient/unpublish.js b/cms/src/services/searchClient/unpublish.js index 98f8fe493..7658c67b9 100644 --- a/cms/src/services/searchClient/unpublish.js +++ b/cms/src/services/searchClient/unpublish.js @@ -15,13 +15,13 @@ const index = process.env.ES_INDEX; export const unpublishModel = async (name) => { await unpublishOneFromES(name); await indexMatchedModelsToES({ name }); - updateGeneSearchIndicies(); + await updateGeneSearchIndicies(); }; export const unpublishOneFromES = async (name) => { // Not waiting for update promise to // resolve as this is just bookkeeping - indexEsUpdate(); + await indexEsUpdate(); const searchClient = await getClient(); await searchClient.deleteByQuery({ index, @@ -43,7 +43,7 @@ export const unpublishOneFromES = async (name) => { export const unpublishManyFromES = async (nameArr) => { // Not waiting for update promise to // resolve as this is just bookkeeping - indexEsUpdate(); + await indexEsUpdate(); const searchClient = await getClient(); return searchClient.deleteByQuery({ index, diff --git a/cms/src/services/searchClient/update.js b/cms/src/services/searchClient/update.js index 17f98199d..15c6b1199 100644 --- a/cms/src/services/searchClient/update.js +++ b/cms/src/services/searchClient/update.js @@ -1,13 +1,14 @@ // @ts-check -import elasticClient from './common/client.js'; +import getClient from './common/client.js'; import getLogger from '../../logger.js'; const logger = getLogger('services/searchClient/update'); const index = process.env.ES_UPDATE_INDEX; -const update = () => - elasticClient +const update = async () => { + const searchClient = await getClient(); + return searchClient .index({ index, type: index, @@ -19,5 +20,6 @@ const update = () => // Catch here as we do not want an error here to block execution of the app logger.error(error, index, `Error creating a new update for index`), ); +}; export default update; diff --git a/ui/src/components/admin/Notifications/PublishNotifications.jsx b/ui/src/components/admin/Notifications/PublishNotifications.jsx index 3e7d939ac..021995722 100644 --- a/ui/src/components/admin/Notifications/PublishNotifications.jsx +++ b/ui/src/components/admin/Notifications/PublishNotifications.jsx @@ -105,8 +105,8 @@ export const PublishNotificationsProvider = ({ children }) => { linkText: 'View on model page to restart the publish.', timeout: false, modelName, - onClose: () => { - acknowledgeModelAndUpdateNotifications(modelName); + onClose: async () => { + await acknowledgeModelAndUpdateNotifications(modelName); }, }); }; @@ -124,8 +124,8 @@ export const PublishNotificationsProvider = ({ children }) => { details: `The model ${modelName} was not found in the HCMI database.`, timeout: false, modelName, - onClose: () => { - acknowledgeModelAndUpdateNotifications(modelName); + onClose: async () => { + await acknowledgeModelAndUpdateNotifications(modelName); }, }); break; @@ -136,8 +136,8 @@ export const PublishNotificationsProvider = ({ children }) => { details: `The publish request for ${modelName} was not formed correctly: ${error.error.message}`, timeout: false, modelName, - onClose: () => { - acknowledgeModelAndUpdateNotifications(modelName); + onClose: async () => { + await acknowledgeModelAndUpdateNotifications(modelName); }, }); break; @@ -163,8 +163,8 @@ export const PublishNotificationsProvider = ({ children }) => { ), timeout: false, modelName, - onClose: () => { - acknowledgeModelAndUpdateNotifications(modelName); + onClose: async () => { + await acknowledgeModelAndUpdateNotifications(modelName); }, }); break; @@ -176,8 +176,8 @@ export const PublishNotificationsProvider = ({ children }) => { details: error.error.message, timeout: false, modelName, - onClose: () => { - acknowledgeModelAndUpdateNotifications(modelName); + onClose: async () => { + await acknowledgeModelAndUpdateNotifications(modelName); }, }); break; @@ -209,10 +209,10 @@ export const PublishNotificationsProvider = ({ children }) => { const individualQueuedPublishes = (queue || []).filter( (x) => x.publishType === PUBLISH_TYPES.individual, ); - individualQueuedPublishes.forEach((publishTask) => { + individualQueuedPublishes.forEach(async (publishTask) => { const modelName = publishTask.modelName; if (!getPublishNotifications().find((x) => x.modelName === modelName)) { - addPublishNotification(modelName); + await addPublishNotification(modelName); } }); diff --git a/ui/src/components/admin/helpers/fetchTableData.js b/ui/src/components/admin/helpers/fetchTableData.js index c6c54a00c..a9b0243cf 100644 --- a/ui/src/components/admin/helpers/fetchTableData.js +++ b/ui/src/components/admin/helpers/fetchTableData.js @@ -4,12 +4,12 @@ import { makeOrDataQuery } from './queryFilters'; const sortQuery = (sorted) => (sorted.desc ? `-${sorted.id}` : `${sorted.id}`); const paginatedUrl = ({ baseUrl, page, pageSize, filterValue, tableColumns, sorted }) => (filterValue || '').length > 0 - ? `${baseUrl}?skip=${page * pageSize}&limit=${page * pageSize + pageSize}&sort=${sortQuery( - sorted, - )}&query=${makeOrDataQuery(tableColumns, filterValue)}` - : `${baseUrl}?skip=${page * pageSize}&limit=${page * pageSize + pageSize}&sort=${sortQuery( - sorted, - )}`; + ? `${baseUrl}?skip=${page && pageSize ? page * pageSize : 0}&limit=${ + page && pageSize ? page * pageSize + pageSize : 100 + }&sort=${sortQuery(sorted)}&query=${makeOrDataQuery(tableColumns, filterValue)}` + : `${baseUrl}?skip=${page && pageSize ? page * pageSize : 0}&limit=${ + page && pageSize ? page * pageSize + pageSize : 100 + }&sort=${sortQuery(sorted)}`; export const getPageData = ({ baseUrl, page, pageSize, filterValue, tableColumns, sorted }) => { let url = paginatedUrl({ baseUrl, page, pageSize, filterValue, tableColumns, sorted }); diff --git a/yarn.lock b/yarn.lock index 9f7e11143..e7b90c123 100644 --- a/yarn.lock +++ b/yarn.lock @@ -110,436 +110,6 @@ dependencies: xss "^1.0.8" -"@aws-crypto/sha256-browser@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e" - integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw== - dependencies: - "@aws-crypto/sha256-js" "^5.2.0" - "@aws-crypto/supports-web-crypto" "^5.2.0" - "@aws-crypto/util" "^5.2.0" - "@aws-sdk/types" "^3.222.0" - "@aws-sdk/util-locate-window" "^3.0.0" - "@smithy/util-utf8" "^2.0.0" - tslib "^2.6.2" - -"@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz#c4fdb773fdbed9a664fc1a95724e206cf3860042" - integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== - dependencies: - "@aws-crypto/util" "^5.2.0" - "@aws-sdk/types" "^3.222.0" - tslib "^2.6.2" - -"@aws-crypto/supports-web-crypto@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz#a1e399af29269be08e695109aa15da0a07b5b5fb" - integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== - dependencies: - tslib "^2.6.2" - -"@aws-crypto/util@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-5.2.0.tgz#71284c9cffe7927ddadac793c14f14886d3876da" - integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== - dependencies: - "@aws-sdk/types" "^3.222.0" - "@smithy/util-utf8" "^2.0.0" - tslib "^2.6.2" - -"@aws-sdk/client-cognito-identity@3.1005.0": - version "3.1005.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.1005.0.tgz#d18a9cb90238fcb6884a3a3944a5e2d91bcef1bc" - integrity sha512-vYZCaQPvawj2W76UtQCu2VCV0vEQnHxL1MOKri4jICLSRiFPlHTosUuwJDzJIIrvTuFgR2DolbcBLRSCLBo/oQ== - dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "^3.973.19" - "@aws-sdk/credential-provider-node" "^3.972.19" - "@aws-sdk/middleware-host-header" "^3.972.7" - "@aws-sdk/middleware-logger" "^3.972.7" - "@aws-sdk/middleware-recursion-detection" "^3.972.7" - "@aws-sdk/middleware-user-agent" "^3.972.20" - "@aws-sdk/region-config-resolver" "^3.972.7" - "@aws-sdk/types" "^3.973.5" - "@aws-sdk/util-endpoints" "^3.996.4" - "@aws-sdk/util-user-agent-browser" "^3.972.7" - "@aws-sdk/util-user-agent-node" "^3.973.5" - "@smithy/config-resolver" "^4.4.10" - "@smithy/core" "^3.23.9" - "@smithy/fetch-http-handler" "^5.3.13" - "@smithy/hash-node" "^4.2.11" - "@smithy/invalid-dependency" "^4.2.11" - "@smithy/middleware-content-length" "^4.2.11" - "@smithy/middleware-endpoint" "^4.4.23" - "@smithy/middleware-retry" "^4.4.40" - "@smithy/middleware-serde" "^4.2.12" - "@smithy/middleware-stack" "^4.2.11" - "@smithy/node-config-provider" "^4.3.11" - "@smithy/node-http-handler" "^4.4.14" - "@smithy/protocol-http" "^5.3.11" - "@smithy/smithy-client" "^4.12.3" - "@smithy/types" "^4.13.0" - "@smithy/url-parser" "^4.2.11" - "@smithy/util-base64" "^4.3.2" - "@smithy/util-body-length-browser" "^4.2.2" - "@smithy/util-body-length-node" "^4.2.3" - "@smithy/util-defaults-mode-browser" "^4.3.39" - "@smithy/util-defaults-mode-node" "^4.2.42" - "@smithy/util-endpoints" "^3.3.2" - "@smithy/util-middleware" "^4.2.11" - "@smithy/util-retry" "^4.2.11" - "@smithy/util-utf8" "^4.2.2" - tslib "^2.6.2" - -"@aws-sdk/core@^3.973.19": - version "3.973.19" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.973.19.tgz#ee67105ca00cdcd31d9921d338c2739442c8bc5b" - integrity sha512-56KePyOcZnKTWCd89oJS1G6j3HZ9Kc+bh/8+EbvtaCCXdP6T7O7NzCiPuHRhFLWnzXIaXX3CxAz0nI5My9spHQ== - dependencies: - "@aws-sdk/types" "^3.973.5" - "@aws-sdk/xml-builder" "^3.972.10" - "@smithy/core" "^3.23.9" - "@smithy/node-config-provider" "^4.3.11" - "@smithy/property-provider" "^4.2.11" - "@smithy/protocol-http" "^5.3.11" - "@smithy/signature-v4" "^5.3.11" - "@smithy/smithy-client" "^4.12.3" - "@smithy/types" "^4.13.0" - "@smithy/util-base64" "^4.3.2" - "@smithy/util-middleware" "^4.2.11" - "@smithy/util-utf8" "^4.2.2" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-cognito-identity@^3.972.11": - version "3.972.11" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.972.11.tgz#d310bb4f583a799aa7d5e80b5b1346a1cacb6b44" - integrity sha512-yHBjinYauxSvikf15EtgXyZ9TBIMVHUSWFPycQtPltTINpK+uv6K22zKkVsbxpB0gvsdRdIWP0UG5gejM+jPuQ== - dependencies: - "@aws-sdk/nested-clients" "^3.996.8" - "@aws-sdk/types" "^3.973.5" - "@smithy/property-provider" "^4.2.11" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-env@^3.972.17": - version "3.972.17" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.17.tgz#5fe65959faac017cdbefa34be05f09490fc856ab" - integrity sha512-MBAMW6YELzE1SdkOniqr51mrjapQUv8JXSGxtwRjQV0mwVDutVsn22OPAUt4RcLRvdiHQmNBDEFP9iTeSVCOlA== - dependencies: - "@aws-sdk/core" "^3.973.19" - "@aws-sdk/types" "^3.973.5" - "@smithy/property-provider" "^4.2.11" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-http@^3.972.19": - version "3.972.19" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.19.tgz#b9b0ee4a9388f3ed3013a1ec6b2bc269f04599e4" - integrity sha512-9EJROO8LXll5a7eUFqu48k6BChrtokbmgeMWmsH7lBb6lVbtjslUYz/ShLi+SHkYzTomiGBhmzTW7y+H4BxsnA== - dependencies: - "@aws-sdk/core" "^3.973.19" - "@aws-sdk/types" "^3.973.5" - "@smithy/fetch-http-handler" "^5.3.13" - "@smithy/node-http-handler" "^4.4.14" - "@smithy/property-provider" "^4.2.11" - "@smithy/protocol-http" "^5.3.11" - "@smithy/smithy-client" "^4.12.3" - "@smithy/types" "^4.13.0" - "@smithy/util-stream" "^4.5.17" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-ini@^3.972.18": - version "3.972.18" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.18.tgz#ff3f3536e752f8c47300b48a07309f9c12438221" - integrity sha512-vthIAXJISZnj2576HeyLBj4WTeX+I7PwWeRkbOa0mVX39K13SCGxCgOFuKj2ytm9qTlLOmXe4cdEnroteFtJfw== - dependencies: - "@aws-sdk/core" "^3.973.19" - "@aws-sdk/credential-provider-env" "^3.972.17" - "@aws-sdk/credential-provider-http" "^3.972.19" - "@aws-sdk/credential-provider-login" "^3.972.18" - "@aws-sdk/credential-provider-process" "^3.972.17" - "@aws-sdk/credential-provider-sso" "^3.972.18" - "@aws-sdk/credential-provider-web-identity" "^3.972.18" - "@aws-sdk/nested-clients" "^3.996.8" - "@aws-sdk/types" "^3.973.5" - "@smithy/credential-provider-imds" "^4.2.11" - "@smithy/property-provider" "^4.2.11" - "@smithy/shared-ini-file-loader" "^4.4.6" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-login@^3.972.18": - version "3.972.18" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.18.tgz#f580aeca507c4d383eaecf3d5db858f230a5816b" - integrity sha512-kINzc5BBxdYBkPZ0/i1AMPMOk5b5QaFNbYMElVw5QTX13AKj6jcxnv/YNl9oW9mg+Y08ti19hh01HhyEAxsSJQ== - dependencies: - "@aws-sdk/core" "^3.973.19" - "@aws-sdk/nested-clients" "^3.996.8" - "@aws-sdk/types" "^3.973.5" - "@smithy/property-provider" "^4.2.11" - "@smithy/protocol-http" "^5.3.11" - "@smithy/shared-ini-file-loader" "^4.4.6" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-node@^3.972.19": - version "3.972.19" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.19.tgz#0135ea6827ccec78f8440ed4e33cfa8188080aab" - integrity sha512-yDWQ9dFTr+IMxwanFe7+tbN5++q8psZBjlUwOiCXn1EzANoBgtqBwcpYcHaMGtn0Wlfj4NuXdf2JaEx1lz5RaQ== - dependencies: - "@aws-sdk/credential-provider-env" "^3.972.17" - "@aws-sdk/credential-provider-http" "^3.972.19" - "@aws-sdk/credential-provider-ini" "^3.972.18" - "@aws-sdk/credential-provider-process" "^3.972.17" - "@aws-sdk/credential-provider-sso" "^3.972.18" - "@aws-sdk/credential-provider-web-identity" "^3.972.18" - "@aws-sdk/types" "^3.973.5" - "@smithy/credential-provider-imds" "^4.2.11" - "@smithy/property-provider" "^4.2.11" - "@smithy/shared-ini-file-loader" "^4.4.6" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-process@^3.972.17": - version "3.972.17" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.17.tgz#c8ae4e2e1adb96b21d763c86a1c6562aa599145c" - integrity sha512-c8G8wT1axpJDgaP3xzcy+q8Y1fTi9A2eIQJvyhQ9xuXrUZhlCfXbC0vM9bM1CUXiZppFQ1p7g0tuUMvil/gCPg== - dependencies: - "@aws-sdk/core" "^3.973.19" - "@aws-sdk/types" "^3.973.5" - "@smithy/property-provider" "^4.2.11" - "@smithy/shared-ini-file-loader" "^4.4.6" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-sso@^3.972.18": - version "3.972.18" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.18.tgz#0d00e49ffca3760895ec46ec54532b479a2745d7" - integrity sha512-YHYEfj5S2aqInRt5ub8nDOX8vAxgMvd84wm2Y3WVNfFa/53vOv9T7WOAqXI25qjj3uEcV46xxfqdDQk04h5XQA== - dependencies: - "@aws-sdk/core" "^3.973.19" - "@aws-sdk/nested-clients" "^3.996.8" - "@aws-sdk/token-providers" "3.1005.0" - "@aws-sdk/types" "^3.973.5" - "@smithy/property-provider" "^4.2.11" - "@smithy/shared-ini-file-loader" "^4.4.6" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-web-identity@^3.972.18": - version "3.972.18" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.18.tgz#0e44b8dea94a5a054549f319a130ac66aac4cc00" - integrity sha512-OqlEQpJ+J3T5B96qtC1zLLwkBloechP+fezKbCH0sbd2cCc0Ra55XpxWpk/hRj69xAOYtHvoC4orx6eTa4zU7g== - dependencies: - "@aws-sdk/core" "^3.973.19" - "@aws-sdk/nested-clients" "^3.996.8" - "@aws-sdk/types" "^3.973.5" - "@smithy/property-provider" "^4.2.11" - "@smithy/shared-ini-file-loader" "^4.4.6" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@aws-sdk/credential-providers@^3.186.0": - version "3.1005.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.1005.0.tgz#7d6e7f93276c4c2f5cc1abd0ac5460f2de953c1a" - integrity sha512-H6Prb37+8TdTkGsYH1WkWjupWdM4aHTmF6VLdyTwOWmg4WFkKAb1OJcMrxNCJ8Yy/UvxOca4jk6z2ej+T1pjtQ== - dependencies: - "@aws-sdk/client-cognito-identity" "3.1005.0" - "@aws-sdk/core" "^3.973.19" - "@aws-sdk/credential-provider-cognito-identity" "^3.972.11" - "@aws-sdk/credential-provider-env" "^3.972.17" - "@aws-sdk/credential-provider-http" "^3.972.19" - "@aws-sdk/credential-provider-ini" "^3.972.18" - "@aws-sdk/credential-provider-login" "^3.972.18" - "@aws-sdk/credential-provider-node" "^3.972.19" - "@aws-sdk/credential-provider-process" "^3.972.17" - "@aws-sdk/credential-provider-sso" "^3.972.18" - "@aws-sdk/credential-provider-web-identity" "^3.972.18" - "@aws-sdk/nested-clients" "^3.996.8" - "@aws-sdk/types" "^3.973.5" - "@smithy/config-resolver" "^4.4.10" - "@smithy/core" "^3.23.9" - "@smithy/credential-provider-imds" "^4.2.11" - "@smithy/node-config-provider" "^4.3.11" - "@smithy/property-provider" "^4.2.11" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@aws-sdk/middleware-host-header@^3.972.7": - version "3.972.7" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.7.tgz#b18849cf807e0742fdf84db41c2258770bd1e452" - integrity sha512-aHQZgztBFEpDU1BB00VWCIIm85JjGjQW1OG9+98BdmaOpguJvzmXBGbnAiYcciCd+IS4e9BEq664lhzGnWJHgQ== - dependencies: - "@aws-sdk/types" "^3.973.5" - "@smithy/protocol-http" "^5.3.11" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@aws-sdk/middleware-logger@^3.972.7": - version "3.972.7" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.972.7.tgz#ffea4e2ff1e9d86047c564c982d64ade8017791e" - integrity sha512-LXhiWlWb26txCU1vcI9PneESSeRp/RYY/McuM4SpdrimQR5NgwaPb4VJCadVeuGWgh6QmqZ6rAKSoL1ob16W6w== - dependencies: - "@aws-sdk/types" "^3.973.5" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@aws-sdk/middleware-recursion-detection@^3.972.7": - version "3.972.7" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.7.tgz#9d6376ee724c9b77d6518c51d0b2c8b18f1f72bf" - integrity sha512-l2VQdcBcYLzIzykCHtXlbpiVCZ94/xniLIkAj0jpnpjY4xlgZx7f56Ypn+uV1y3gG0tNVytJqo3K9bfMFee7SQ== - dependencies: - "@aws-sdk/types" "^3.973.5" - "@aws/lambda-invoke-store" "^0.2.2" - "@smithy/protocol-http" "^5.3.11" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@aws-sdk/middleware-user-agent@^3.972.20": - version "3.972.20" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.20.tgz#9c058871881b3c4adac27c28c7801bedbd530dac" - integrity sha512-3kNTLtpUdeahxtnJRnj/oIdLAUdzTfr9N40KtxNhtdrq+Q1RPMdCJINRXq37m4t5+r3H70wgC3opW46OzFcZYA== - dependencies: - "@aws-sdk/core" "^3.973.19" - "@aws-sdk/types" "^3.973.5" - "@aws-sdk/util-endpoints" "^3.996.4" - "@smithy/core" "^3.23.9" - "@smithy/protocol-http" "^5.3.11" - "@smithy/types" "^4.13.0" - "@smithy/util-retry" "^4.2.11" - tslib "^2.6.2" - -"@aws-sdk/nested-clients@^3.996.8": - version "3.996.8" - resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.996.8.tgz#e984e73a4f0183c6a21ea098ae1ea3f06eba6822" - integrity sha512-6HlLm8ciMW8VzfB80kfIx16PBA9lOa9Dl+dmCBi78JDhvGlx3I7Rorwi5PpVRkL31RprXnYna3yBf6UKkD/PqA== - dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "^3.973.19" - "@aws-sdk/middleware-host-header" "^3.972.7" - "@aws-sdk/middleware-logger" "^3.972.7" - "@aws-sdk/middleware-recursion-detection" "^3.972.7" - "@aws-sdk/middleware-user-agent" "^3.972.20" - "@aws-sdk/region-config-resolver" "^3.972.7" - "@aws-sdk/types" "^3.973.5" - "@aws-sdk/util-endpoints" "^3.996.4" - "@aws-sdk/util-user-agent-browser" "^3.972.7" - "@aws-sdk/util-user-agent-node" "^3.973.5" - "@smithy/config-resolver" "^4.4.10" - "@smithy/core" "^3.23.9" - "@smithy/fetch-http-handler" "^5.3.13" - "@smithy/hash-node" "^4.2.11" - "@smithy/invalid-dependency" "^4.2.11" - "@smithy/middleware-content-length" "^4.2.11" - "@smithy/middleware-endpoint" "^4.4.23" - "@smithy/middleware-retry" "^4.4.40" - "@smithy/middleware-serde" "^4.2.12" - "@smithy/middleware-stack" "^4.2.11" - "@smithy/node-config-provider" "^4.3.11" - "@smithy/node-http-handler" "^4.4.14" - "@smithy/protocol-http" "^5.3.11" - "@smithy/smithy-client" "^4.12.3" - "@smithy/types" "^4.13.0" - "@smithy/url-parser" "^4.2.11" - "@smithy/util-base64" "^4.3.2" - "@smithy/util-body-length-browser" "^4.2.2" - "@smithy/util-body-length-node" "^4.2.3" - "@smithy/util-defaults-mode-browser" "^4.3.39" - "@smithy/util-defaults-mode-node" "^4.2.42" - "@smithy/util-endpoints" "^3.3.2" - "@smithy/util-middleware" "^4.2.11" - "@smithy/util-retry" "^4.2.11" - "@smithy/util-utf8" "^4.2.2" - tslib "^2.6.2" - -"@aws-sdk/region-config-resolver@^3.972.7": - version "3.972.7" - resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.7.tgz#36fd0eba2bfedeb57b843b3cd8266fb7668a7e85" - integrity sha512-/Ev/6AI8bvt4HAAptzSjThGUMjcWaX3GX8oERkB0F0F9x2dLSBdgFDiyrRz3i0u0ZFZFQ1b28is4QhyqXTUsVA== - dependencies: - "@aws-sdk/types" "^3.973.5" - "@smithy/config-resolver" "^4.4.10" - "@smithy/node-config-provider" "^4.3.11" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@aws-sdk/token-providers@3.1005.0": - version "3.1005.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.1005.0.tgz#ac8e4f094bf9fb7c5a8d351544daf732d26af447" - integrity sha512-vMxd+ivKqSxU9bHx5vmAlFKDAkjGotFU56IOkDa5DaTu1WWwbcse0yFHEm9I537oVvodaiwMl3VBwgHfzQ2rvw== - dependencies: - "@aws-sdk/core" "^3.973.19" - "@aws-sdk/nested-clients" "^3.996.8" - "@aws-sdk/types" "^3.973.5" - "@smithy/property-provider" "^4.2.11" - "@smithy/shared-ini-file-loader" "^4.4.6" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@aws-sdk/types@^3.222.0", "@aws-sdk/types@^3.973.5": - version "3.973.5" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.973.5.tgz#0fc00f066dbaaa40c09f2b7efdd86781807b5c70" - integrity sha512-hl7BGwDCWsjH8NkZfx+HgS7H2LyM2lTMAI7ba9c8O0KqdBLTdNJivsHpqjg9rNlAlPyREb6DeDRXUl0s8uFdmQ== - dependencies: - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@aws-sdk/util-endpoints@^3.996.4": - version "3.996.4" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.996.4.tgz#9fcfeccbd9d2a8217b66f711cf303883ec4442c0" - integrity sha512-Hek90FBmd4joCFj+Vc98KLJh73Zqj3s2W56gjAcTkrNLMDI5nIFkG9YpfcJiVI1YlE2Ne1uOQNe+IgQ/Vz2XRA== - dependencies: - "@aws-sdk/types" "^3.973.5" - "@smithy/types" "^4.13.0" - "@smithy/url-parser" "^4.2.11" - "@smithy/util-endpoints" "^3.3.2" - tslib "^2.6.2" - -"@aws-sdk/util-locate-window@^3.0.0": - version "3.965.5" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz#e30e6ff2aff6436209ed42c765dec2d2a48df7c0" - integrity sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ== - dependencies: - tslib "^2.6.2" - -"@aws-sdk/util-user-agent-browser@^3.972.7": - version "3.972.7" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.7.tgz#0e7205db8d47760df014fffddcbf0ccfc350e84d" - integrity sha512-7SJVuvhKhMF/BkNS1n0QAJYgvEwYbK2QLKBrzDiwQGiTRU6Yf1f3nehTzm/l21xdAOtWSfp2uWSddPnP2ZtsVw== - dependencies: - "@aws-sdk/types" "^3.973.5" - "@smithy/types" "^4.13.0" - bowser "^2.11.0" - tslib "^2.6.2" - -"@aws-sdk/util-user-agent-node@^3.973.5": - version "3.973.5" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.5.tgz#cbb11aae2d761e2cb3d3ad4be7b88f6d4726fb83" - integrity sha512-Dyy38O4GeMk7UQ48RupfHif//gqnOPbq/zlvRssc11E2mClT+aUfc3VS2yD8oLtzqO3RsqQ9I3gOBB4/+HjPOw== - dependencies: - "@aws-sdk/middleware-user-agent" "^3.972.20" - "@aws-sdk/types" "^3.973.5" - "@smithy/node-config-provider" "^4.3.11" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@aws-sdk/xml-builder@^3.972.10": - version "3.972.10" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.972.10.tgz#d8a7171b70c8ee9354747f0ac7d368dd27d50e46" - integrity sha512-OnejAIVD+CxzyAUrVic7lG+3QRltyja9LoNqCE/1YVs8ichoTbJlVSaZ9iSMcnHLyzrSNtvaOGjSDRP+d/ouFA== - dependencies: - "@smithy/types" "^4.13.0" - fast-xml-parser "5.4.1" - tslib "^2.6.2" - -"@aws/lambda-invoke-store@^0.2.2": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz#f1137f56209ccc69c15f826242cbf37f828617dd" - integrity sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw== - "@babel/cli@^7.2.3": version "7.28.3" resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.28.3.tgz#f33693753bc103ab0084a5776ccf8ab8a140038b" @@ -1694,6 +1264,16 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@elastic/elasticsearch@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@elastic/elasticsearch/-/elasticsearch-7.15.0.tgz#4b009a87e0b11b8cfd2e4f378f0292574bc17300" + integrity sha512-FUKvjV2IKtIiWsvBy7D+wLbSEONsmNR15RRN7P/Sb30g4ObZRHH2qGOP5PPnzxdntEkzZ8HzY7nKKXFS+3Du1g== + dependencies: + debug "^4.3.1" + hpagent "^0.1.1" + ms "^2.1.3" + secure-json-parse "^2.4.0" + "@elastic/elasticsearch@^7.17.14", "@elastic/elasticsearch@~7.17.0": version "7.17.14" resolved "https://registry.yarnpkg.com/@elastic/elasticsearch/-/elasticsearch-7.17.14.tgz#5ffd6d04e2be38b3dba56cf80af4359fc43b7f1f" @@ -2609,6 +2189,13 @@ dependencies: sparse-bitfield "^3.0.3" +"@mongodb-js/saslprep@^1.3.0": + version "1.4.6" + resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.4.6.tgz#2edf5819fa0e69d86059f44d1fe57ae9d7817c12" + integrity sha512-y+x3H1xBZd38n10NZF/rEBlvDOOMQ6LKUTHqr8R9VkJ+mmQOYtJFxIlkkK8fZrtOiL6VixbOBWMbZGBdal3Z1g== + dependencies: + sparse-bitfield "^3.0.3" + "@napi-rs/wasm-runtime@^1.0.7": version "1.1.0" resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz#c0180393d7862cff0d412e3e1a7c3bd5ea6d9b2f" @@ -3199,409 +2786,6 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@smithy/abort-controller@^4.2.11": - version "4.2.11" - resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.2.11.tgz#b989e63615e5449c2ba90d80fcbe4fdd71123c54" - integrity sha512-Hj4WoYWMJnSpM6/kchsm4bUNTL9XiSyhvoMb2KIq4VJzyDt7JpGHUZHkVNPZVC7YE1tf8tPeVauxpFBKGW4/KQ== - dependencies: - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@smithy/config-resolver@^4.4.10": - version "4.4.10" - resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.4.10.tgz#22529a2e8c23d979f69c3abca8d984c69d06ce4c" - integrity sha512-IRTkd6ps0ru+lTWnfnsbXzW80A8Od8p3pYiZnW98K2Hb20rqfsX7VTlfUwhrcOeSSy68Gn9WBofwPuw3e5CCsg== - dependencies: - "@smithy/node-config-provider" "^4.3.11" - "@smithy/types" "^4.13.0" - "@smithy/util-config-provider" "^4.2.2" - "@smithy/util-endpoints" "^3.3.2" - "@smithy/util-middleware" "^4.2.11" - tslib "^2.6.2" - -"@smithy/core@^3.23.9": - version "3.23.9" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.23.9.tgz#377c3e12187c9810a3f26d7904541770735785b5" - integrity sha512-1Vcut4LEL9HZsdpI0vFiRYIsaoPwZLjAxnVQDUMQK8beMS+EYPLDQCXtbzfxmM5GzSgjfe2Q9M7WaXwIMQllyQ== - dependencies: - "@smithy/middleware-serde" "^4.2.12" - "@smithy/protocol-http" "^5.3.11" - "@smithy/types" "^4.13.0" - "@smithy/util-base64" "^4.3.2" - "@smithy/util-body-length-browser" "^4.2.2" - "@smithy/util-middleware" "^4.2.11" - "@smithy/util-stream" "^4.5.17" - "@smithy/util-utf8" "^4.2.2" - "@smithy/uuid" "^1.1.2" - tslib "^2.6.2" - -"@smithy/credential-provider-imds@^4.2.11": - version "4.2.11" - resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.11.tgz#106dda92b2a4275879e84f348826c311a1bb1b05" - integrity sha512-lBXrS6ku0kTj3xLmsJW0WwqWbGQ6ueooYyp/1L9lkyT0M02C+DWwYwc5aTyXFbRaK38ojALxNixg+LxKSHZc0g== - dependencies: - "@smithy/node-config-provider" "^4.3.11" - "@smithy/property-provider" "^4.2.11" - "@smithy/types" "^4.13.0" - "@smithy/url-parser" "^4.2.11" - tslib "^2.6.2" - -"@smithy/fetch-http-handler@^5.3.13": - version "5.3.13" - resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.13.tgz#9858e43ff009af6085cca326805c9d0c9a9579f5" - integrity sha512-U2Hcfl2s3XaYjikN9cT4mPu8ybDbImV3baXR0PkVlC0TTx808bRP3FaPGAzPtB8OByI+JqJ1kyS+7GEgae7+qQ== - dependencies: - "@smithy/protocol-http" "^5.3.11" - "@smithy/querystring-builder" "^4.2.11" - "@smithy/types" "^4.13.0" - "@smithy/util-base64" "^4.3.2" - tslib "^2.6.2" - -"@smithy/hash-node@^4.2.11": - version "4.2.11" - resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.2.11.tgz#8b19d53661824ead9627b49a26e5555d6c8a98fd" - integrity sha512-T+p1pNynRkydpdL015ruIoyPSRw9e/SQOWmSAMmmprfswMrd5Ow5igOWNVlvyVFZlxXqGmyH3NQwfwy8r5Jx0A== - dependencies: - "@smithy/types" "^4.13.0" - "@smithy/util-buffer-from" "^4.2.2" - "@smithy/util-utf8" "^4.2.2" - tslib "^2.6.2" - -"@smithy/invalid-dependency@^4.2.11": - version "4.2.11" - resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.2.11.tgz#ded68aa2299474c3cf06695ebb28a343928086ee" - integrity sha512-cGNMrgykRmddrNhYy1yBdrp5GwIgEkniS7k9O1VLB38yxQtlvrxpZtUVvo6T4cKpeZsriukBuuxfJcdZQc/f/g== - dependencies: - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@smithy/is-array-buffer@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz#f84f0d9f9a36601a9ca9381688bd1b726fd39111" - integrity sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA== - dependencies: - tslib "^2.6.2" - -"@smithy/is-array-buffer@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz#c401ce54b12a16529eb1c938a0b6c2247cb763b8" - integrity sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow== - dependencies: - tslib "^2.6.2" - -"@smithy/middleware-content-length@^4.2.11": - version "4.2.11" - resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.2.11.tgz#8a385fa77e8fa6ffea6b46e7af37b14d2678571f" - integrity sha512-UvIfKYAKhCzr4p6jFevPlKhQwyQwlJ6IeKLDhmV1PlYfcW3RL4ROjNEDtSik4NYMi9kDkH7eSwyTP3vNJ/u/Dw== - dependencies: - "@smithy/protocol-http" "^5.3.11" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@smithy/middleware-endpoint@^4.4.23": - version "4.4.23" - resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.23.tgz#4d2d7f2c5e133608782b071b5244e74e1ff2f26a" - integrity sha512-UEFIejZy54T1EJn2aWJ45voB7RP2T+IRzUqocIdM6GFFa5ClZncakYJfcYnoXt3UsQrZZ9ZRauGm77l9UCbBLw== - dependencies: - "@smithy/core" "^3.23.9" - "@smithy/middleware-serde" "^4.2.12" - "@smithy/node-config-provider" "^4.3.11" - "@smithy/shared-ini-file-loader" "^4.4.6" - "@smithy/types" "^4.13.0" - "@smithy/url-parser" "^4.2.11" - "@smithy/util-middleware" "^4.2.11" - tslib "^2.6.2" - -"@smithy/middleware-retry@^4.4.40": - version "4.4.40" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.4.40.tgz#b10da39d8138f9a14953c2444ed9a737514d8bcf" - integrity sha512-YhEMakG1Ae57FajERdHNZ4ShOPIY7DsgV+ZoAxo/5BT0KIe+f6DDU2rtIymNNFIj22NJfeeI6LWIifrwM0f+rA== - dependencies: - "@smithy/node-config-provider" "^4.3.11" - "@smithy/protocol-http" "^5.3.11" - "@smithy/service-error-classification" "^4.2.11" - "@smithy/smithy-client" "^4.12.3" - "@smithy/types" "^4.13.0" - "@smithy/util-middleware" "^4.2.11" - "@smithy/util-retry" "^4.2.11" - "@smithy/uuid" "^1.1.2" - tslib "^2.6.2" - -"@smithy/middleware-serde@^4.2.12": - version "4.2.12" - resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.2.12.tgz#8f836f3edc85701b69df4f2819106a6e0ef50cf8" - integrity sha512-W9g1bOLui7Xn5FABRVS0o3rXL0gfN37d/8I/W7i0N7oxjx9QecUmXEMSUMADTODwdtka9cN43t5BI2CodLJpng== - dependencies: - "@smithy/protocol-http" "^5.3.11" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@smithy/middleware-stack@^4.2.11": - version "4.2.11" - resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.2.11.tgz#cadd3ada5fa11fe8a192cd18444a77c4510c8bc3" - integrity sha512-s+eenEPW6RgliDk2IhjD2hWOxIx1NKrOHxEwNUaUXxYBxIyCcDfNULZ2Mu15E3kwcJWBedTET/kEASPV1A1Akg== - dependencies: - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@smithy/node-config-provider@^4.3.11": - version "4.3.11" - resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.3.11.tgz#a6d246b67c10c6873169bae46e6d04261d548402" - integrity sha512-xD17eE7kaLgBBGf5CZQ58hh2YmwK1Z0O8YhffwB/De2jsL0U3JklmhVYJ9Uf37OtUDLF2gsW40Xwwag9U869Gg== - dependencies: - "@smithy/property-provider" "^4.2.11" - "@smithy/shared-ini-file-loader" "^4.4.6" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@smithy/node-http-handler@^4.4.14": - version "4.4.14" - resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.4.14.tgz#a40a6677b7cda2c100141833abee1401c2e1a74f" - integrity sha512-DamSqaU8nuk0xTJDrYnRzZndHwwRnyj/n/+RqGGCcBKB4qrQem0mSDiWdupaNWdwxzyMU91qxDmHOCazfhtO3A== - dependencies: - "@smithy/abort-controller" "^4.2.11" - "@smithy/protocol-http" "^5.3.11" - "@smithy/querystring-builder" "^4.2.11" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@smithy/property-provider@^4.2.11": - version "4.2.11" - resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.2.11.tgz#7a1b16ae2083272f80e380ee7948ddc103301db1" - integrity sha512-14T1V64o6/ndyrnl1ze1ZhyLzIeYNN47oF/QU6P5m82AEtyOkMJTb0gO1dPubYjyyKuPD6OSVMPDKe+zioOnCg== - dependencies: - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@smithy/protocol-http@^5.3.11": - version "5.3.11" - resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.3.11.tgz#e4450af3ba9e52e8b99a9c3035c90c8cd853be27" - integrity sha512-hI+barOVDJBkNt4y0L2mu3Ugc0w7+BpJ2CZuLwXtSltGAAwCb3IvnalGlbDV/UCS6a9ZuT3+exd1WxNdLb5IlQ== - dependencies: - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@smithy/querystring-builder@^4.2.11": - version "4.2.11" - resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.2.11.tgz#befb7753b142fab65edaee070096c1c5cb2ad917" - integrity sha512-7spdikrYiljpket6u0up2Ck2mxhy7dZ0+TDd+S53Dg2DHd6wg+YNJrTCHiLdgZmEXZKI7LJZcwL3721ZRDFiqA== - dependencies: - "@smithy/types" "^4.13.0" - "@smithy/util-uri-escape" "^4.2.2" - tslib "^2.6.2" - -"@smithy/querystring-parser@^4.2.11": - version "4.2.11" - resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.2.11.tgz#b1e85945bc3c80058e0b0114af391bb069b2393f" - integrity sha512-nE3IRNjDltvGcoThD2abTozI1dkSy8aX+a2N1Rs55en5UsdyyIXgGEmevUL3okZFoJC77JgRGe99xYohhsjivQ== - dependencies: - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@smithy/service-error-classification@^4.2.11": - version "4.2.11" - resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.2.11.tgz#da2ee1af5c851380e6b0146b75416f0e5f64e1f7" - integrity sha512-HkMFJZJUhzU3HvND1+Yw/kYWXp4RPDLBWLcK1n+Vqw8xn4y2YiBhdww8IxhkQjP/QlZun5bwm3vcHc8AqIU3zw== - dependencies: - "@smithy/types" "^4.13.0" - -"@smithy/shared-ini-file-loader@^4.4.6": - version "4.4.6" - resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.6.tgz#435dc6d907bc8c6f795212e944000de063b2cfe1" - integrity sha512-IB/M5I8G0EeXZTHsAxpx51tMQ5R719F3aq+fjEB6VtNcCHDc0ajFDIGDZw+FW9GxtEkgTduiPpjveJdA/CX7sw== - dependencies: - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@smithy/signature-v4@^5.3.11": - version "5.3.11" - resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.3.11.tgz#81fc2aba69994b23aff730b984418e9696bc36c4" - integrity sha512-V1L6N9aKOBAN4wEHLyqjLBnAz13mtILU0SeDrjOaIZEeN6IFa6DxwRt1NNpOdmSpQUfkBj0qeD3m6P77uzMhgQ== - dependencies: - "@smithy/is-array-buffer" "^4.2.2" - "@smithy/protocol-http" "^5.3.11" - "@smithy/types" "^4.13.0" - "@smithy/util-hex-encoding" "^4.2.2" - "@smithy/util-middleware" "^4.2.11" - "@smithy/util-uri-escape" "^4.2.2" - "@smithy/util-utf8" "^4.2.2" - tslib "^2.6.2" - -"@smithy/smithy-client@^4.12.3": - version "4.12.3" - resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.12.3.tgz#95370221bc5c2f30a25157b2df84a3630c81ec85" - integrity sha512-7k4UxjSpHmPN2AxVhvIazRSzFQjWnud3sOsXcFStzagww17j1cFQYqTSiQ8xuYK3vKLR1Ni8FzuT3VlKr3xCNw== - dependencies: - "@smithy/core" "^3.23.9" - "@smithy/middleware-endpoint" "^4.4.23" - "@smithy/middleware-stack" "^4.2.11" - "@smithy/protocol-http" "^5.3.11" - "@smithy/types" "^4.13.0" - "@smithy/util-stream" "^4.5.17" - tslib "^2.6.2" - -"@smithy/types@^4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.13.0.tgz#9787297a07ee72ef74d4f7d93c744d10ed664c21" - integrity sha512-COuLsZILbbQsdrwKQpkkpyep7lCsByxwj7m0Mg5v66/ZTyenlfBc40/QFQ5chO0YN/PNEH1Bi3fGtfXPnYNeDw== - dependencies: - tslib "^2.6.2" - -"@smithy/url-parser@^4.2.11": - version "4.2.11" - resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.2.11.tgz#4c87eb5872c2ab0385086b38eee4b4a6e5a029b2" - integrity sha512-oTAGGHo8ZYc5VZsBREzuf5lf2pAurJQsccMusVZ85wDkX66ojEc/XauiGjzCj50A61ObFTPe6d7Pyt6UBYaing== - dependencies: - "@smithy/querystring-parser" "^4.2.11" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@smithy/util-base64@^4.3.2": - version "4.3.2" - resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.3.2.tgz#be02bcb29a87be744356467ea25ffa413e695cea" - integrity sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ== - dependencies: - "@smithy/util-buffer-from" "^4.2.2" - "@smithy/util-utf8" "^4.2.2" - tslib "^2.6.2" - -"@smithy/util-body-length-browser@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz#c4404277d22039872abdb80e7800f9a63f263862" - integrity sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ== - dependencies: - tslib "^2.6.2" - -"@smithy/util-body-length-node@^4.2.3": - version "4.2.3" - resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz#f923ca530defb86a9ac3ca2d3066bcca7b304fbc" - integrity sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g== - dependencies: - tslib "^2.6.2" - -"@smithy/util-buffer-from@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz#6fc88585165ec73f8681d426d96de5d402021e4b" - integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== - dependencies: - "@smithy/is-array-buffer" "^2.2.0" - tslib "^2.6.2" - -"@smithy/util-buffer-from@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz#2c6b7857757dfd88f6cd2d36016179a40ccc913b" - integrity sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q== - dependencies: - "@smithy/is-array-buffer" "^4.2.2" - tslib "^2.6.2" - -"@smithy/util-config-provider@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz#52ebf9d8942838d18bc5fb1520de1e8699d7aad6" - integrity sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ== - dependencies: - tslib "^2.6.2" - -"@smithy/util-defaults-mode-browser@^4.3.39": - version "4.3.39" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.39.tgz#9f354b9dcd0c0e17aa507e6fc13b4785af31cd97" - integrity sha512-ui7/Ho/+VHqS7Km2wBw4/Ab4RktoiSshgcgpJzC4keFPs6tLJS4IQwbeahxQS3E/w98uq6E1mirCH/id9xIXeQ== - dependencies: - "@smithy/property-provider" "^4.2.11" - "@smithy/smithy-client" "^4.12.3" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@smithy/util-defaults-mode-node@^4.2.42": - version "4.2.42" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.42.tgz#248a2d6a50b4480f3a2a4ce779409e90f0d16b96" - integrity sha512-QDA84CWNe8Akpj15ofLO+1N3Rfg8qa2K5uX0y6HnOp4AnRYRgWrKx/xzbYNbVF9ZsyJUYOfcoaN3y93wA/QJ2A== - dependencies: - "@smithy/config-resolver" "^4.4.10" - "@smithy/credential-provider-imds" "^4.2.11" - "@smithy/node-config-provider" "^4.3.11" - "@smithy/property-provider" "^4.2.11" - "@smithy/smithy-client" "^4.12.3" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@smithy/util-endpoints@^3.3.2": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.3.2.tgz#a81ee98a2596248f6cdedc868d13cb6b9ea497b2" - integrity sha512-+4HFLpE5u29AbFlTdlKIT7jfOzZ8PDYZKTb3e+AgLz986OYwqTourQ5H+jg79/66DB69Un1+qKecLnkZdAsYcA== - dependencies: - "@smithy/node-config-provider" "^4.3.11" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@smithy/util-hex-encoding@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz#4abf3335dd1eb884041d8589ca7628d81a6fd1d3" - integrity sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg== - dependencies: - tslib "^2.6.2" - -"@smithy/util-middleware@^4.2.11": - version "4.2.11" - resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.2.11.tgz#d2a89893fc2dfd500de412c5f7c7961716855f4d" - integrity sha512-r3dtF9F+TpSZUxpOVVtPfk09Rlo4lT6ORBqEvX3IBT6SkQAdDSVKR5GcfmZbtl7WKhKnmb3wbDTQ6ibR2XHClw== - dependencies: - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@smithy/util-retry@^4.2.11": - version "4.2.11" - resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.2.11.tgz#59fc5364488d4c755eec5afb4054623f852cf0e6" - integrity sha512-XSZULmL5x6aCTTii59wJqKsY1l3eMIAomRAccW7Tzh9r8s7T/7rdo03oektuH5jeYRlJMPcNP92EuRDvk9aXbw== - dependencies: - "@smithy/service-error-classification" "^4.2.11" - "@smithy/types" "^4.13.0" - tslib "^2.6.2" - -"@smithy/util-stream@^4.5.17": - version "4.5.17" - resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.5.17.tgz#53073153deb890d91fd14fd2055e6582b627b0fd" - integrity sha512-793BYZ4h2JAQkNHcEnyFxDTcZbm9bVybD0UV/LEWmZ5bkTms7JqjfrLMi2Qy0E5WFcCzLwCAPgcvcvxoeALbAQ== - dependencies: - "@smithy/fetch-http-handler" "^5.3.13" - "@smithy/node-http-handler" "^4.4.14" - "@smithy/types" "^4.13.0" - "@smithy/util-base64" "^4.3.2" - "@smithy/util-buffer-from" "^4.2.2" - "@smithy/util-hex-encoding" "^4.2.2" - "@smithy/util-utf8" "^4.2.2" - tslib "^2.6.2" - -"@smithy/util-uri-escape@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz#48e40206e7fe9daefc8d44bb43a1ab17e76abf4a" - integrity sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw== - dependencies: - tslib "^2.6.2" - -"@smithy/util-utf8@^2.0.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5" - integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== - dependencies: - "@smithy/util-buffer-from" "^2.2.0" - tslib "^2.6.2" - -"@smithy/util-utf8@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz#21db686982e6f3393ac262e49143b42370130f13" - integrity sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw== - dependencies: - "@smithy/util-buffer-from" "^4.2.2" - tslib "^2.6.2" - -"@smithy/uuid@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@smithy/uuid/-/uuid-1.1.2.tgz#b6e97c7158615e4a3c775e809c00d8c269b5a12e" - integrity sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g== - dependencies: - tslib "^2.6.2" - "@styled-system/background@^5.1.2": version "5.1.2" resolved "https://registry.yarnpkg.com/@styled-system/background/-/background-5.1.2.tgz#75c63d06b497ab372b70186c0bf608d62847a2ba" @@ -3886,6 +3070,20 @@ "@types/connect" "*" "@types/node" "*" +"@types/bson@*": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@types/bson/-/bson-4.2.4.tgz#3bb08ab0de5dd07103fba355361814019ba2ae88" + integrity sha512-SG23E3JDH6y8qF20a4G9txLuUl+TCV16gxsKyntmGiJez2V9VBJr1Y8WxTBBD6OgBVcvspQ7sxgdNMkXFVcaEA== + dependencies: + bson "*" + +"@types/bson@1.x || 4.0.x": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/bson/-/bson-4.0.5.tgz#9e0e1d1a6f8866483f96868a9b33bc804926b1fc" + integrity sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg== + dependencies: + "@types/node" "*" + "@types/command-line-args@^5.2.3": version "5.2.3" resolved "https://registry.yarnpkg.com/@types/command-line-args/-/command-line-args-5.2.3.tgz#553ce2fd5acf160b448d307649b38ffc60d39639" @@ -4063,6 +3261,14 @@ dependencies: "@types/unist" "^2" +"@types/mongodb@^3.5.27": + version "3.6.20" + resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.6.20.tgz#b7c5c580644f6364002b649af1c06c3c0454e1d2" + integrity sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ== + dependencies: + "@types/bson" "*" + "@types/node" "*" + "@types/ms@*": version "2.1.0" resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" @@ -4192,6 +3398,13 @@ resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz#1306dbfa53768bcbcfc95a1c8cde367975581859" integrity sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA== +"@types/whatwg-url@^11.0.2": + version "11.0.5" + resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-11.0.5.tgz#aaa2546e60f0c99209ca13360c32c78caf2c409f" + integrity sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ== + dependencies: + "@types/webidl-conversions" "*" + "@types/whatwg-url@^8.2.1": version "8.2.2" resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-8.2.2.tgz#749d5b3873e845897ada99be4448041d4cc39e63" @@ -4584,6 +3797,13 @@ arg@^5.0.1: resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -5079,6 +4299,11 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" +bluebird@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== + body-parser@^1.19.0, body-parser@~1.20.3: version "1.20.4" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.4.tgz#f8e20f4d06ca8a50a71ed329c15dccad1cdc547f" @@ -5107,11 +4332,6 @@ bowser@^1.7.3: resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.9.4.tgz#890c58a2813a9d3243704334fa81b96a5c150c9a" integrity sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ== -bowser@^2.11.0: - version "2.14.1" - resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.14.1.tgz#4ea39bf31e305184522d7ad7bfd91389e4f0cb79" - integrity sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg== - brace-expansion@^1.1.7: version "1.1.12" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" @@ -5166,18 +4386,33 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +bson@*: + version "7.2.0" + resolved "https://registry.yarnpkg.com/bson/-/bson-7.2.0.tgz#1a496a42d9ff130b9f3ab8efd465459c758c747f" + integrity sha512-YCEo7KjMlbNlyHhz7zAZNDpIpQbd+wOEHJYezv0nMYTn4x31eIUM2yomNNubclAt63dObUzKHWsBLJ9QcZNSnQ== + bson@^1.1.4: version "1.1.6" resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.6.tgz#fb819be9a60cd677e0853aee4ca712a785d6618a" integrity sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg== -bson@^4.7.2: +bson@^4.2.2, bson@^4.5.4: version "4.7.2" resolved "https://registry.yarnpkg.com/bson/-/bson-4.7.2.tgz#320f4ad0eaf5312dd9b45dc369cc48945e2a5f2e" integrity sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ== dependencies: buffer "^5.6.0" +bson@^5.5.0: + version "5.5.1" + resolved "https://registry.yarnpkg.com/bson/-/bson-5.5.1.tgz#f5849d405711a7f23acdda9a442375df858e6833" + integrity sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g== + +bson@^6.10.4: + version "6.10.4" + resolved "https://registry.yarnpkg.com/bson/-/bson-6.10.4.tgz#d530733bb5bb16fb25c162e01a3344fab332fd2b" + integrity sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng== + buffer-alloc-unsafe@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" @@ -5973,6 +5208,13 @@ debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" +debug@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + debug@4, debug@4.x, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.1: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" @@ -6146,6 +5388,11 @@ denque@^1.4.1: resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf" integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw== +denque@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" + integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== + depd@2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -6306,6 +5553,13 @@ encodeurl@~2.0.0: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== +encoding@^0.1.11: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.5" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" @@ -6767,7 +6021,7 @@ espree@^10.0.1, espree@^10.4.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^4.2.1" -esprima@^4.0.1: +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -7035,21 +6289,6 @@ fast-text-encoding@^1.0.0: resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867" integrity sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w== -fast-xml-builder@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-xml-builder/-/fast-xml-builder-1.1.0.tgz#6d103ebd731bc5d478cc5035a114b28cfb4b9b03" - integrity sha512-7mtITW/we2/wTUZqMyBOR2F8xP4CRxMiSEcQxPIqdRWdO2L/HZSOlzoNyghmyDwNB8BDxePooV1ZTJpkOUhdRg== - dependencies: - path-expression-matcher "^1.1.2" - -fast-xml-parser@5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz#0c81b8ecfb3021e5ad83aa3df904af19a05bc601" - integrity sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A== - dependencies: - fast-xml-builder "^1.0.0" - strnum "^2.1.2" - fastq@^1.6.0: version "1.19.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" @@ -7941,6 +7180,13 @@ iconv-lite@0.4.24, iconv-lite@~0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ieee754@1.1.13: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" @@ -8321,7 +7567,7 @@ is-shared-array-buffer@^1.0.4: dependencies: call-bound "^1.0.3" -is-stream@^1.1.0: +is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== @@ -8909,7 +8155,15 @@ jquery@x.*: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1, js-yaml@^4.1.1: +js-yaml@^3.13.1: + version "3.14.2" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.2.tgz#77485ce1dd7f33c061fd1b16ecea23b55fcb04b0" + integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== @@ -9089,11 +8343,21 @@ jwt-decode@^4.0.0: resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-4.0.0.tgz#2270352425fd413785b2faf11f6e755c5151bd4b" integrity sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA== +kareem@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.2.tgz#78c4508894985b8d38a0dc15e1a8e11078f2ca93" + integrity sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ== + kareem@2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.5.1.tgz#7b8203e11819a8e77a34b3517d3ead206764d15d" integrity sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA== +kareem@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.6.3.tgz#23168ec8ffb6c1abfd31b7169a6fb1dd285992ac" + integrity sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q== + keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -9479,7 +8743,7 @@ lodash.topath@4.5.2: resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009" integrity sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg== -lodash@^4.17.10, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: +lodash@4.17.21, lodash@^4.17.10, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -9986,7 +9250,7 @@ moment@^2.29.4, moment@^2.30.1: resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== -mongodb-connection-string-url@^2.6.0: +mongodb-connection-string-url@^2.1.0, mongodb-connection-string-url@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz#57901bf352372abdde812c81be47b75c6b2ec5cf" integrity sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ== @@ -9994,19 +9258,15 @@ mongodb-connection-string-url@^2.6.0: "@types/whatwg-url" "^8.2.1" whatwg-url "^11.0.0" -mongodb@4.17.2: - version "4.17.2" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.17.2.tgz#237c0534e36a3449bd74c6bf6d32f87a1ca7200c" - integrity sha512-mLV7SEiov2LHleRJPMPrK2PMyhXFZt2UQLC4VD4pnth3jMjYKHhtqfwwkkvS/NXuo/Fp3vbhaNcXrIDaLRb9Tg== +mongodb-connection-string-url@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz#e223089dfa0a5fa9bf505f8aedcbc67b077b33e7" + integrity sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA== dependencies: - bson "^4.7.2" - mongodb-connection-string-url "^2.6.0" - socks "^2.7.1" - optionalDependencies: - "@aws-sdk/credential-providers" "^3.186.0" - "@mongodb-js/saslprep" "^1.1.0" + "@types/whatwg-url" "^11.0.2" + whatwg-url "^14.1.0 || ^13.0.0" -mongodb@^3.6.4: +mongodb@3.7.4, mongodb@^3.6.4: version "3.7.4" resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.7.4.tgz#119530d826361c3e12ac409b769796d6977037a4" integrity sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw== @@ -10019,6 +9279,46 @@ mongodb@^3.6.4: optionalDependencies: saslprep "^1.0.0" +mongodb@4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.1.4.tgz#ba8062c7c67e7a22db5a059dbac1e3044b48453b" + integrity sha512-Cv/sk8on/tpvvqbEvR1h03mdyNdyvvO+WhtFlL4jrZ+DSsN/oSQHVqmJQI/sBCqqbOArFcYCAYDfyzqFwV4GSQ== + dependencies: + bson "^4.5.4" + denque "^2.0.1" + mongodb-connection-string-url "^2.1.0" + optionalDependencies: + saslprep "^1.0.3" + +mongodb@5.9.2: + version "5.9.2" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-5.9.2.tgz#39a73b9fbc87ac9d9c1aaf8aab5c5bb69e2b913e" + integrity sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ== + dependencies: + bson "^5.5.0" + mongodb-connection-string-url "^2.6.0" + socks "^2.7.1" + optionalDependencies: + "@mongodb-js/saslprep" "^1.1.0" + +mongodb@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.20.0.tgz#5212dcf512719385287aa4574265352eefb01d8e" + integrity sha512-Tl6MEIU3K4Rq3TSHd+sZQqRBoGlFsOgNrH5ltAcFBV62Re3Fd+FcaVf8uSEQFOJ51SDowDVttBTONMfoYWrWlQ== + dependencies: + "@mongodb-js/saslprep" "^1.3.0" + bson "^6.10.4" + mongodb-connection-string-url "^3.0.2" + +mongoosastic@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/mongoosastic/-/mongoosastic-5.0.0.tgz#9b41268c52f3a91512e246620260f6c92e7a3691" + integrity sha512-Lj7bl6Rbc0+y44ZhBa1oMgaHPFAF5sOVg5ukvh3Gtd7iyDSM8Hy6hjGoYJBGVd14UCuDwLELt3oLfZEZ4mO+8Q== + dependencies: + "@elastic/elasticsearch" "7.15.0" + lodash "4.17.21" + mongoose "6.0.13" + mongoose-detective@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mongoose-detective/-/mongoose-detective-2.0.0.tgz#2c94c7a8ed7204e0468ed2e68e3ba1bf33381083" @@ -10031,19 +9331,72 @@ mongoose-elasticsearch-xp@^5.8.0: dependencies: mongoose "^5.5.6" -mongoose@7.8.7, mongoose@^5.5.6, mongoose@^6.13.8, mongoose@^8.23.0: - version "6.13.9" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.13.9.tgz#880294370404dda9c51eeaac00352f83e6a4a5b7" - integrity sha512-x8XpK0SEDJtAtMoOF2U9aGrGXN6kbu01TqhznGLnA4B1oPXNb4Lye0MgmfxF9J2Dva7wf49VOgClk2fuKQYGHw== - dependencies: - bson "^4.7.2" +mongoose-legacy-pluralize@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4" + integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ== + +mongoose@6.0.13: + version "6.0.13" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.0.13.tgz#e419c2ae0db3164e4c234ed783d8f8844f4bce53" + integrity sha512-/M/YKgx23fCX+j0lwObaHbCibXnMjyWeQrXZf0WaQeS/hL86wQVSmaOxh+kZXfyLOUr+vT2Hl44o50GZHUrKWw== + dependencies: + bson "^4.2.2" + kareem "2.3.2" + mongodb "4.1.4" + mpath "0.8.4" + mquery "4.0.0" + ms "2.1.2" + regexp-clone "1.0.0" + sift "13.5.2" + sliced "1.0.1" + +mongoose@7.8.7: + version "7.8.7" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-7.8.7.tgz#7a7ccbfd3da25990c88a8c41cd5b5abc30b913c7" + integrity sha512-5Bo4CrUxrPITrhMKsqUTOkXXo2CoRC5tXxVQhnddCzqDMwRXfyStrxj1oY865g8gaekSBhxAeNkYyUSJvGm9Hw== + dependencies: + bson "^5.5.0" kareem "2.5.1" - mongodb "4.17.2" + mongodb "5.9.2" mpath "0.9.0" - mquery "4.0.3" + mquery "5.0.0" ms "2.1.3" sift "16.0.1" +mongoose@^5.5.6: + version "5.13.23" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.13.23.tgz#befbe2f82247b0057c145900be871f37147d7f27" + integrity sha512-Q5bo1yYOcH2wbBPP4tGmcY5VKsFkQcjUDh66YjrbneAFB3vNKQwLvteRFLuLiU17rA5SDl3UMcMJLD9VS8ng2Q== + dependencies: + "@types/bson" "1.x || 4.0.x" + "@types/mongodb" "^3.5.27" + bson "^1.1.4" + kareem "2.3.2" + mongodb "3.7.4" + mongoose-legacy-pluralize "1.0.2" + mpath "0.8.4" + mquery "3.2.5" + ms "2.1.2" + optional-require "1.0.x" + regexp-clone "1.0.0" + safe-buffer "5.2.1" + sift "13.5.2" + sliced "1.0.1" + +mongoose@^8.23.0: + version "8.23.0" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-8.23.0.tgz#de88488ecdc68971f493b5f044f85bab316baa42" + integrity sha512-Bul4Ha6J8IqzFrb0B1xpVzkC3S0sk43dmLSnhFOn8eJlZiLwL5WO6cRymmjaADdCMjUcCpj2ce8hZI6O4ZFSug== + dependencies: + bson "^6.10.4" + kareem "2.6.3" + mongodb "~6.20.0" + mpath "0.9.0" + mquery "5.0.0" + ms "2.1.3" + sift "17.1.3" + moredots@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/moredots/-/moredots-1.0.1.tgz#3b8ae32a4d66d72751cb29033dd16eb2d155d98d" @@ -10062,15 +9415,40 @@ morgan@^1.10.0, morgan@^1.10.1: on-finished "~2.3.0" on-headers "~1.1.0" +mpath@0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.8.4.tgz#6b566d9581621d9e931dd3b142ed3618e7599313" + integrity sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g== + mpath@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.9.0.tgz#0c122fe107846e31fc58c75b09c35514b3871904" integrity sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew== -mquery@4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/mquery/-/mquery-4.0.3.tgz#4d15f938e6247d773a942c912d9748bd1965f89d" - integrity sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA== +mquery@3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/mquery/-/mquery-3.2.5.tgz#8f2305632e4bb197f68f60c0cffa21aaf4060c51" + integrity sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A== + dependencies: + bluebird "3.5.1" + debug "3.1.0" + regexp-clone "^1.0.0" + safe-buffer "5.1.2" + sliced "1.0.1" + +mquery@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mquery/-/mquery-4.0.0.tgz#6c62160ad25289e99e0840907757cdfd62bde775" + integrity sha512-nGjm89lHja+T/b8cybAby6H0YgA4qYC/lx6UlwvHGqvTq8bDaNeCwl1sY8uRELrNbVWJzIihxVd+vphGGn1vBw== + dependencies: + debug "4.x" + regexp-clone "^1.0.0" + sliced "1.0.1" + +mquery@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/mquery/-/mquery-5.0.0.tgz#a95be5dfc610b23862df34a47d3e5d60e110695d" + integrity sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg== dependencies: debug "4.x" @@ -10089,6 +9467,11 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" @@ -10159,14 +9542,22 @@ node-abort-controller@^3.0.1: resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== -node-fetch@^1.0.1, node-fetch@^2.6.7, node-fetch@^2.6.9: +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-fetch@^2.6.7, node-fetch@^2.6.9: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" -node-forge@^1.3.1, node-forge@^1.3.2: +node-forge@^1.3.1: version "1.3.3" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.3.tgz#0ad80f6333b3a0045e827ac20b7f735f93716751" integrity sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg== @@ -10392,6 +9783,11 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +optional-require@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/optional-require/-/optional-require-1.0.3.tgz#275b8e9df1dc6a17ad155369c2422a440f89cb07" + integrity sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA== + optional-require@^1.1.8: version "1.1.10" resolved "https://registry.yarnpkg.com/optional-require/-/optional-require-1.1.10.tgz#35ea423c5442df157c084f8d5a9d5250bba1de47" @@ -10539,11 +9935,6 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-expression-matcher@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/path-expression-matcher/-/path-expression-matcher-1.1.2.tgz#0102f74415abf183857532acd78bb7ad6ff6fa00" - integrity sha512-LXWqJmcpp2BKOEmgt4CyuESFmBfPuhJlAHKJsFzuJU6CxErWk75BrO+Ni77M9OxHN6dCYKM4vj+21Z6cOL96YQ== - path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -11453,6 +10844,16 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexp-clone@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-1.0.0.tgz#222db967623277056260b992626354a04ce9bf63" + integrity sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw== + +regexp-clone@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-1.2.0.tgz#f8d0745833f0d5ae19c0854ed99936555e34fcfc" + integrity sha512-d/LEfc+joiXe4uRyuXMJcOMoqTFKS3pSZUM8WWEqoQ51tZgCdgvu/HLMWaOslhR6igkCdeuc5DULADOK16glMA== + regexp.prototype.flags@^1.5.3, regexp.prototype.flags@^1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" @@ -11740,7 +11141,7 @@ safe-stable-stringify@^2.3.1: resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -11765,7 +11166,7 @@ sanitizer@0.1.3: resolved "https://registry.yarnpkg.com/sanitizer/-/sanitizer-0.1.3.tgz#d4f0af7475d9a7baf2a9e5a611718baa178a39e1" integrity sha512-j05vL56tR90rsYqm9ZD05v6K4HI7t4yMDEvvU0x4f+IADXM9Jx1x9mzatxOs5drJq6dGhugxDW99mcPvXVLl+Q== -saslprep@^1.0.0: +saslprep@^1.0.0, saslprep@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== @@ -12085,11 +11486,21 @@ side-channel@^1.1.0: side-channel-map "^1.0.1" side-channel-weakmap "^1.0.2" +sift@13.5.2: + version "13.5.2" + resolved "https://registry.yarnpkg.com/sift/-/sift-13.5.2.tgz#24a715e13c617b086166cd04917d204a591c9da6" + integrity sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA== + sift@16.0.1: version "16.0.1" resolved "https://registry.yarnpkg.com/sift/-/sift-16.0.1.tgz#e9c2ccc72191585008cf3e36fc447b2d2633a053" integrity sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ== +sift@17.1.3: + version "17.1.3" + resolved "https://registry.yarnpkg.com/sift/-/sift-17.1.3.tgz#9d2000d4d41586880b0079b5183d839c7a142bf7" + integrity sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ== + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -12124,6 +11535,11 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +sliced@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" + integrity sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA== + smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" @@ -12280,6 +11696,11 @@ split2@^4.0.0: resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + sqon-builder@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/sqon-builder/-/sqon-builder-2.0.1.tgz#77e3440d8f6c1be4c801f68d1ef5fdb2a5844a2f" @@ -12485,11 +11906,6 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strnum@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.2.0.tgz#8b582b637e4621f62ff714493e0ce30846f903a6" - integrity sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg== - style-to-object@^0.4.0: version "0.4.4" resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" @@ -12805,6 +12221,13 @@ tr46@^3.0.0: dependencies: punycode "^2.1.1" +tr46@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-5.1.1.tgz#96ae867cddb8fdb64a49cc3059a8d428bcf238ca" + integrity sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw== + dependencies: + punycode "^2.3.1" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -13439,6 +12862,14 @@ whatwg-url@^11.0.0: tr46 "^3.0.0" webidl-conversions "^7.0.0" +"whatwg-url@^14.1.0 || ^13.0.0": + version "14.2.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.2.0.tgz#4ee02d5d725155dae004f6ae95c73e7ef5d95663" + integrity sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw== + dependencies: + tr46 "^5.1.0" + webidl-conversions "^7.0.0" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -13577,10 +13008,10 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xml2js@0.6.2, xml2js@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7" - integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA== +xml2js@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.2.tgz#dd0b630083aa09c161e25a4d0901e2b2a929b499" + integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA== dependencies: sax ">=0.6.0" xmlbuilder "~11.0.0" From 05e748ed88036077a1f3f04e0b249bcb3be08224 Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Thu, 19 Mar 2026 11:11:58 -0400 Subject: [PATCH 07/82] Genes searchClient & async updates --- cms/src/routes/bulk.js | 4 ++-- cms/src/schemas/genes.js | 2 +- cms/src/services/searchClient/genomicVariants.js | 16 +++++++++++----- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/cms/src/routes/bulk.js b/cms/src/routes/bulk.js index 9a9cb2d8e..9d6b0e555 100644 --- a/cms/src/routes/bulk.js +++ b/cms/src/routes/bulk.js @@ -1,6 +1,7 @@ // @ts-check import express from 'express'; + import Model from '../schemas/model.js'; import getPublishValidation from '../validation/model.js'; import { runYupValidatorFailSlow, modelStatus } from '../helpers/index.js'; @@ -9,10 +10,9 @@ import { unpublishManyFromES } from '../services/searchClient/unpublish.js'; import csvStream from '../helpers/streamAsCSV.js'; import { backupFields } from '../schemas/descriptions/model.js'; import { updateGeneSearchIndicies } from '../services/searchClient/genomicVariants.js'; - import getLogger from '../logger'; -const logger = getLogger('routes/bulk'); +const logger = getLogger('routes/bulk'); const bulkRouter = express.Router(); bulkRouter.post('/publish', async (req, res) => { diff --git a/cms/src/schemas/genes.js b/cms/src/schemas/genes.js index 97dcea7aa..1aa769182 100644 --- a/cms/src/schemas/genes.js +++ b/cms/src/schemas/genes.js @@ -18,7 +18,7 @@ const GeneSchema = new mongoose.Schema( ); GeneSchema.plugin(mongoosastic, { - client: elasticClient, + client: elasticClient(), index: 'genes', type: '_doc', }); diff --git a/cms/src/services/searchClient/genomicVariants.js b/cms/src/services/searchClient/genomicVariants.js index 856c558aa..f1be860b6 100644 --- a/cms/src/services/searchClient/genomicVariants.js +++ b/cms/src/services/searchClient/genomicVariants.js @@ -1,8 +1,10 @@ +// @ts-check + import _ from 'lodash'; import getLogger from '../../logger.js'; -import esClient from './common/client.js'; +import getClient from './common/client.js'; const { get, flatten, uniq } = _; @@ -17,8 +19,9 @@ const getAllIndexedDocs = async (index) => { let startFrom = 0; let totalHits = 1; const requestSize = 100; + const searchClient = await getClient(); while (totalHits > startFrom) { - const esResponse = await esClient.search({ + const esResponse = await searchClient.search({ index: index, size: requestSize, from: startFrom, @@ -38,6 +41,7 @@ const getAllIndexedDocs = async (index) => { // Additionally, to know which genes to remove we have to compare this list to the currently published list in the genes index on ES const updateVariantIndex = async (desiredVariants) => { + const searchClient = await getClient(); // TEMP: Remove all usage of variantIdMafOnly and just use variant_id once the gene reference is reimplemented - Jon Eubank 2020-09 const variantIdMafOnly = (originalID) => `${originalID}_MAF`; logger.debug({ desiredVariants }, 'List of Variants that should be published'); @@ -90,7 +94,7 @@ const updateVariantIndex = async (desiredVariants) => { ); if (deleteRequests.length || addRequests.length) { - await esClient.bulk({ + await searchClient.bulk({ body: [...deleteRequests, ...addRequests], }); } else { @@ -99,6 +103,7 @@ const updateVariantIndex = async (desiredVariants) => { }; const updateGeneIndex = async (desiredGenes) => { + const searchClient = await getClient(); const desiredGeneIds = desiredGenes.map((gene) => gene.symbol); logger.debug({ desiredGenes: desiredGeneIds }, 'List of Genes that should be published'); @@ -139,7 +144,7 @@ const updateGeneIndex = async (desiredGenes) => { ); if (deleteRequests.length || addRequests.length) { - await esClient.bulk({ + await searchClient.bulk({ body: [...deleteRequests, ...addRequests], }); } else { @@ -148,9 +153,10 @@ const updateGeneIndex = async (desiredGenes) => { }; export const updateGeneSearchIndicies = async () => { + const searchClient = await getClient(); // This method reads from the es indices, and is prone to errors if we read it before updates have been indexed // so first, we refresh the model index :) - await esClient.indices.refresh({ index: MODEL_INDEX }); + await searchClient.indices.refresh({ index: MODEL_INDEX }); // 1. get models from ES const publishedModels = await getAllIndexedDocs(MODEL_INDEX); From 99cfd466bcd95adc3b69ba3e52f2762cc18ca83c Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Thu, 19 Mar 2026 14:26:23 -0400 Subject: [PATCH 08/82] Use module imports pt 1 --- cms/index.js | 10 +- cms/package.json | 1 + cms/src/helpers/dictionary.js | 53 ++++---- cms/src/helpers/genomicVariants.js | 16 +-- cms/src/helpers/matchedModels.js | 33 ++--- cms/src/hooks.js | 4 +- cms/src/routes/bulk.js | 2 +- cms/src/routes/dictionary.js | 45 +++---- cms/src/schemas/genes.js | 3 +- .../services/gdc-importer/VariantImporter.js | 113 +++++++++--------- cms/src/services/publish/Publisher.js | 4 +- cms/src/services/s3/s3.js | 26 ++-- .../searchClient/common/schemas/model.js | 5 +- cms/src/services/searchClient/publish.js | 2 +- cms/src/services/searchClient/unpublish.js | 15 +-- cms/src/services/searchClient/update.js | 3 +- .../admin/ModelsManager/ModelsManager.jsx | 47 ++++---- .../components/admin/helpers/bulkActions.js | 7 +- 18 files changed, 200 insertions(+), 189 deletions(-) diff --git a/cms/index.js b/cms/index.js index 52a38d85e..a8fac7d9d 100644 --- a/cms/index.js +++ b/cms/index.js @@ -1,6 +1,8 @@ -require('babel-polyfill'); -require('dotenv').config(); -require('@babel/register')({ +import 'babel-polyfill'; +import { config } from 'dotenv'; +config(); +import register from '@babel/register'; +register({ presets: ['@babel/env'], plugins: [ '@babel/plugin-proposal-optional-chaining', @@ -8,4 +10,4 @@ require('@babel/register')({ ], }); -require('./src/index'); +import './src/index.js'; diff --git a/cms/package.json b/cms/package.json index 4db52fcd2..41635a85e 100644 --- a/cms/package.json +++ b/cms/package.json @@ -4,6 +4,7 @@ "description": "Content Management services for HCMI Portal`", "private": true, "main": "index.js", + "type": "module", "scripts": { "start": "nodemon index.js | pino-pretty", "test": "echo \"Error: no test specified\" && exit 1", diff --git a/cms/src/helpers/dictionary.js b/cms/src/helpers/dictionary.js index 3d57807c2..ebdf77600 100644 --- a/cms/src/helpers/dictionary.js +++ b/cms/src/helpers/dictionary.js @@ -31,25 +31,26 @@ export const getDictionaryDraft = async () => export const getDictionaryOptions = async () => { const result = await getDictionary(); - const dictionary = result.fields; + console.log('dictionary result', result); + const dictionary = result?.fields; const output = dictionary.reduce((acc, field) => { let { name, values } = field; - acc[`${name}Options`] = values.map(i => i.value); + acc[`${name}Options`] = values.map((i) => i.value); return acc; }, {}); - const ctd = dictionary.find(i => i.name === 'clinicalTumorDiagnosis'); + const ctd = dictionary.find((i) => i.name === 'clinicalTumorDiagnosis'); const ctdDependentOptions = {}; - ctd.dependentValues.forEach(val => (ctdDependentOptions[val] = {})); + ctd.dependentValues.forEach((val) => (ctdDependentOptions[val] = {})); - ctd.values.forEach(val => { + ctd.values.forEach((val) => { const valueName = val.value; - val.dependents.forEach(dependent => { + val.dependents.forEach((dependent) => { const dependentName = dependent.name; - const dependentValues = dependent.values.map(val => val.value); + const dependentValues = dependent.values.map((val) => val.value); ctdDependentOptions[dependentName][valueName.toLowerCase()] = dependentValues; }); @@ -61,9 +62,10 @@ export const getDictionaryOptions = async () => { export const resetDraft = async () => { const dictionary = await Dictionary.findOne({}, {}, { sort: { created_at: -1 } }); - const draft = new Draft({ fields: dictionary.fields }); + console.log('dictionary draft', dictionary); + const draft = new Draft({ fields: dictionary?.fields }); await draft.save(); - logger.audit({}, 'reset draft', 'Dictionary draft reset'); + logger.info({}, 'reset draft', 'Dictionary draft reset'); return await Draft.findOne({}, {}, { sort: { created_at: -1 } }); }; @@ -74,15 +76,15 @@ export const resetDraft = async () => { export const publishDraft = async () => { logger.debug('Publishing data dictionary...'); const draft = await getDictionaryDraft(); - + console.log('draft', draft); // find edited values const edits = []; - draft.fields.forEach(field => { - if (field.dependentValues.length > 0) { + draft?.fields?.forEach((field) => { + if (field?.dependentValues.length > 0) { // dependent field case - field.values.forEach(value => { - value.dependents.forEach(dependent => { - dependent.values.forEach(dependentValue => { + field.values.forEach((value) => { + value.dependents.forEach((dependent) => { + dependent.values.forEach((dependentValue) => { if (dependentValue.status === draftStatus.edited) { edits.push({ field: field.name, @@ -97,7 +99,7 @@ export const publishDraft = async () => { }); } // basic field case - field.values.forEach(value => { + field?.values.forEach((value) => { if (value.status === draftStatus.edited) { edits.push({ field: field.name, @@ -119,19 +121,22 @@ export const publishDraft = async () => { const dictionary = new Dictionary({ fields: draft.fields }); await dictionary.save(); - logger.audit({ edits }, 'dictionary created', 'Created new dictionary from draft values'); + logger.info({ edits }, 'dictionary created', 'Created new dictionary from draft values'); - models.forEach(model => { + models.forEach((model) => { // Find these values in the models. let edited = false; - edits.forEach(edit => { + edits.forEach((edit) => { const editField = edit.dependentName ? edit.dependentName : edit.field; // - update those models and change their status if (editField === 'therapy' && model.therapy.includes(edit.original)) { // special case, therapy is an array - model.therapy.splice(model.therapy.indexOf(val => val === edit.original), 1); + model.therapy.splice( + model.therapy.indexOf((val) => val === edit.original), + 1, + ); model.therapy.push(edit.value); model.status = model.status === modelStatus.published ? modelStatus.unpublishedChanges : model.status; @@ -148,7 +153,7 @@ export const publishDraft = async () => { }); if (edited) { model.save(); - logger.audit( + logger.info( { model: model.name }, 'model saved', 'Model values updated due to dictionary publish', @@ -160,7 +165,7 @@ export const publishDraft = async () => { return { dictionary, updatedModels }; }; -export const countDraftStats = draft => { +export const countDraftStats = (draft) => { const output = { edited: 0, new: 0 }; const hasDependencies = draft.dependentValues && draft.dependentValues.length > 0; @@ -202,12 +207,12 @@ export const editValue = (target, original, updated) => { }; export const valueExists = (valuesList, value) => { - return !!valuesList.find(val => val.value === value); + return !!valuesList.find((val) => val.value === value); }; export const removeValueIfNew = (valueList, value) => { const index = valueList.indexOf( - valueList.find(i => i.status === draftStatus.new && i.value === value), + valueList.find((i) => i.status === draftStatus.new && i.value === value), ); if (index >= 0) { valueList.splice(index, 1); diff --git a/cms/src/helpers/genomicVariants.js b/cms/src/helpers/genomicVariants.js index ce90756c5..0f774df47 100644 --- a/cms/src/helpers/genomicVariants.js +++ b/cms/src/helpers/genomicVariants.js @@ -10,7 +10,7 @@ import { import getLogger from '../logger.js'; const logger = getLogger('helpers/genomicVariants'); -export const clearGenomicVariants = async name => { +export const clearGenomicVariants = async (name) => { // Stop any active imports, if any: try { await VariantImporter.stopImport(name); @@ -37,8 +37,8 @@ export const clearGenomicVariants = async name => { } }; -const titleCase = (text, filter = i => true) => { - return text.replace(/\w\S*/g, i => { +const titleCase = (text, filter = (i) => true) => { + return text.replace(/\w\S*/g, (i) => { if (filter(i)) { return i.charAt(0).toUpperCase() + i.substr(1); } @@ -68,9 +68,9 @@ const buildVariantId = ({ } }; -const buildModelUrl = caseId => `${BASE_GDC_URL}/cases/${caseId}`; -const buildMafUrl = fileId => `${BASE_GDC_URL}/files/${fileId}`; -const buildSequenceUrl = caseId => `${BASE_GDC_URL}/cases/${caseId}#files`; +const buildModelUrl = (caseId) => `${BASE_GDC_URL}/cases/${caseId}`; +const buildMafUrl = (fileId) => `${BASE_GDC_URL}/files/${fileId}`; +const buildSequenceUrl = (caseId) => `${BASE_GDC_URL}/cases/${caseId}#files`; export const addGenomicVariantsFromMaf = async (name, mafData, { filename, fileId }, caseId) => { const model = await Model.findOne({ name }); @@ -103,7 +103,7 @@ export const addGenomicVariantsFromMaf = async (name, mafData, { filename, fileI // Properties originally from Reference that are temporarily taken from MAF - Jon Eubank 2020-09-29 const gene = row.Hugo_Symbol; - const gene_biotype = titleCase(row.BIOTYPE.replace(/_/g, ' '), i => !i.includes('RNA')); + const gene_biotype = titleCase(row.BIOTYPE.replace(/_/g, ' '), (i) => !i.includes('RNA')); const name = `${row.Hugo_Symbol} ${aa_change}`; const synonyms = []; @@ -181,7 +181,7 @@ export const addGenomicVariantsFromMaf = async (name, mafData, { filename, fileI } await model.save(); - logger.audit( + logger.info( { model: model.name, genomic_variants: model.genomic_variants ? model.genomic_variants.length : 0, diff --git a/cms/src/helpers/matchedModels.js b/cms/src/helpers/matchedModels.js index a692807cc..9b5d19d9b 100644 --- a/cms/src/helpers/matchedModels.js +++ b/cms/src/helpers/matchedModels.js @@ -8,11 +8,11 @@ import getLogger from '../logger.js'; const logger = getLogger('helpers/matchedModels'); /* Worker methods, take models as inputs */ -const createMatchedModels = async models => { - const modelIds = models.map(model => model._id); +const createMatchedModels = async (models) => { + const modelIds = models.map((model) => model._id); const matchedModels = await MatchedModels.create({ models: modelIds }); - logger.audit( - { matchedModels, models: models.map(model => model.name) }, + logger.info( + { matchedModels, models: models.map((model) => model.name) }, 'matched model set created', 'Created matched models set', ); @@ -24,12 +24,12 @@ const createMatchedModels = async models => { ? modelStatus.unpublished : modelStatus.unpublishedChanges; model.save(); - logger.audit({ model: model.name }, 'model saved', 'Model updated to add matched model set'); + logger.info({ model: model.name }, 'model saved', 'Model updated to add matched model set'); } return matchedModels; }; -const clearModelFromSets = async model => { +const clearModelFromSets = async (model) => { // Get MatchedModels for this model if (!model.matchedModels) { @@ -42,7 +42,7 @@ const clearModelFromSets = async model => { if (matchedModels) { // only do operations on the matched set if we find it. if we didnt, no issue, we are removing this reference anyways matchedModels.models = matchedModels.models.filter( - modelId => modelId.toString() !== model._id.toString(), + (modelId) => modelId.toString() !== model._id.toString(), ); // We need to make sure that when these changes to our model are published, @@ -64,21 +64,21 @@ const clearModelFromSets = async model => { ? modelStatus.unpublished : modelStatus.unpublishedChanges; await otherModel.save(); - logger.audit( + logger.info( { model: otherModel.name }, 'model saved', 'Model updated to remove matched model set', ); } await MatchedModels.deleteOne({ _id: matchedModels._id }); - logger.audit( + logger.info( { matchedModels }, 'matched model set removed', 'Matched models set removed due to having 1 or fewer members after update', ); } else { await matchedModels.save(); - logger.audit({ matchedModels }, 'matched model set saved', 'Matched models set updated'); + logger.info({ matchedModels }, 'matched model set saved', 'Matched models set updated'); } } else { logger.warn( @@ -93,7 +93,7 @@ const clearModelFromSets = async model => { ? modelStatus.unpublished : modelStatus.unpublishedChanges; await model.save(); - logger.audit({ model: model.name }, 'model saved', 'Model updated to remove matched model set'); + logger.info({ model: model.name }, 'model saved', 'Model updated to remove matched model set'); return; }; @@ -103,7 +103,7 @@ const clearModelFromSets = async model => { * Clears the matchedModels for the given model and updates models in the old set to no longer include this model * @param {*} nameToAdd */ -const removeFromSet = async nameToRemove => { +const removeFromSet = async (nameToRemove) => { const model = await Model.findOne({ name: nameToRemove }); if (!model) { throw new Error(`Could not find model with the name: ${nameToRemove}.`); @@ -131,7 +131,8 @@ const connectWithMatchedModels = async (nameToAdd, setMemberName) => { ? await MatchedModels.findOne({ _id: modelToAdd.matchedModels }).populate('models') : null; const inCurrentSet = - currentMatchedModels && currentMatchedModels.models.find(model => model.name === setMemberName); + currentMatchedModels && + currentMatchedModels.models.find((model) => model.name === setMemberName); // Only continue if we have to, if: // a - the target model name (setMemberName) is not in the current matchedModels set @@ -152,7 +153,7 @@ const connectWithMatchedModels = async (nameToAdd, setMemberName) => { // Add model to the set matchedModels.models.push(modelToAdd._id); await matchedModels.save(); - logger.audit( + logger.info( { matchedModels, model: nameToAdd }, 'matched model set updated', 'Matched models set updated to add new model', @@ -165,7 +166,7 @@ const connectWithMatchedModels = async (nameToAdd, setMemberName) => { ? modelStatus.unpublished : modelStatus.unpublishedChanges; await modelToAdd.save(); - logger.audit( + logger.info( { model: modelToAdd.name }, 'model saved', 'Model updated to add to matched model set', @@ -181,7 +182,7 @@ const connectWithMatchedModels = async (nameToAdd, setMemberName) => { } } else { return { - models: currentMatchedModels.models.map(model => model._id), + models: currentMatchedModels.models.map((model) => model._id), _id: currentMatchedModels._id, __v: currentMatchedModels.__v, }; diff --git a/cms/src/hooks.js b/cms/src/hooks.js index 0a5077131..725ed4277 100644 --- a/cms/src/hooks.js +++ b/cms/src/hooks.js @@ -92,7 +92,7 @@ export const outputFn = async (req, res, next) => { }; export const postCreate = async (req, res, next) => { - logger.audit({ model: req.erm.result }, 'model created', 'Model created in mongo'); + logger.info({ model: req.erm.result }, 'model created', 'Model created in mongo'); return next(); }; @@ -106,7 +106,7 @@ export const postUpdate = async (req, res, next) => { }, } = req; - logger.audit({ model: modelName }, 'model saved', 'Model saved in mongo'); + logger.info({ model: modelName }, 'model saved', 'Model saved in mongo'); // Model updates that contain the status key we // treat as being a change in status and trigger diff --git a/cms/src/routes/bulk.js b/cms/src/routes/bulk.js index 9d6b0e555..5fa48a5de 100644 --- a/cms/src/routes/bulk.js +++ b/cms/src/routes/bulk.js @@ -10,7 +10,7 @@ import { unpublishManyFromES } from '../services/searchClient/unpublish.js'; import csvStream from '../helpers/streamAsCSV.js'; import { backupFields } from '../schemas/descriptions/model.js'; import { updateGeneSearchIndicies } from '../services/searchClient/genomicVariants.js'; -import getLogger from '../logger'; +import getLogger from '../logger.js'; const logger = getLogger('routes/bulk'); const bulkRouter = express.Router(); diff --git a/cms/src/routes/dictionary.js b/cms/src/routes/dictionary.js index 0794935e3..a72ec04a8 100644 --- a/cms/src/routes/dictionary.js +++ b/cms/src/routes/dictionary.js @@ -17,10 +17,11 @@ dictionaryRouter.use('/draft', draftRouter); dictionaryRouter.get('/', async (req, res) => { try { const dictionary = await DictionaryHelper.getDictionaryOptions(); - res.json(dictionary); + console.log('dictionary', dictionary); + return res.json(dictionary); } catch (error) { logger.error(error, 'Error fetching dictionary'); - res.status(500).json({ err: error }); + return res.status(500).json({ err: error }); } }); @@ -33,10 +34,10 @@ draftRouter.get('/', async (req, res) => { draft = await DictionaryHelper.resetDraft(); } - res.json(draft); + return res.json(draft); } catch (error) { logger.error(error, 'Error fetching dictionary draft'); - res.status(500).json({ err: error }); + return res.status(500).json({ err: error }); } }); @@ -44,10 +45,10 @@ draftRouter.get('/', async (req, res) => { draftRouter.delete('/', async (req, res) => { try { const output = await DictionaryHelper.resetDraft(); - res.json(output); + return res.json(output); } catch (error) { logger.error(error, 'Error deleting dictionary draft'); - res.status(500).json({ err: error }); + return res.status(500).json({ err: error }); } }); @@ -70,7 +71,7 @@ draftRouter.patch('/', async (req, res) => { } const draftDoc = await DictionaryHelper.getDictionaryDraft(); - const draft = draftDoc.fields.find(i => i.name === field); + const draft = draftDoc.fields.find((i) => i.name === field); if (!draft) { res.status(400).json({ err: `No dictionary field found named: ${field}` }); @@ -95,7 +96,7 @@ draftRouter.patch('/', async (req, res) => { return; } - const parentValue = draft.values.find(val => + const parentValue = draft.values.find((val) => val.original ? val.original === parent : val.value === parent, ); @@ -104,14 +105,14 @@ draftRouter.patch('/', async (req, res) => { return; } - const dependent = parentValue.dependents.find(dep => dep.name === dependentName); + const dependent = parentValue.dependents.find((dep) => dep.name === dependentName); if (!dependent) { res.status(400).json({ err: `Parent value has no values for this dependent name` }); return; } - const editValue = dependent.values.find(val => + const editValue = dependent.values.find((val) => val.original ? val.original === original : val.value === original, ); @@ -126,7 +127,7 @@ draftRouter.patch('/', async (req, res) => { DictionaryHelper.editValue(editValue, original, updated); } else { // handle basic case - const editValue = draft.values.find(val => + const editValue = draft.values.find((val) => val.original ? val.original === original : val.value === original, ); if (!editValue) { @@ -142,7 +143,7 @@ draftRouter.patch('/', async (req, res) => { draft.stats = DictionaryHelper.countDraftStats(draft); await draftDoc.save(); - logger.audit( + logger.info( { field, parent, dependentName, original, updated }, 'draft updated', 'Dictionary draft value edited', @@ -177,7 +178,7 @@ draftRouter.post('/', async (req, res) => { } const draftDoc = await DictionaryHelper.getDictionaryDraft(); - const draft = draftDoc.fields.find(i => i.name === field); + const draft = draftDoc.fields.find((i) => i.name === field); if (!draft) { res.status(400).json({ err: `No dictionary field found named: ${field}` }); @@ -202,7 +203,7 @@ draftRouter.post('/', async (req, res) => { return; } - const parentValue = draft.values.find(val => + const parentValue = draft.values.find((val) => val.original ? val.original === parent : val.value === parent, ); @@ -211,13 +212,13 @@ draftRouter.post('/', async (req, res) => { return; } - let dependent = parentValue.dependents.find(dep => dep.name === dependentName); + let dependent = parentValue.dependents.find((dep) => dep.name === dependentName); if (!dependent) { dependent = { name: dependentName, // displayName has a replace that does: To Title Case - displayName: dependentName.replace(/\w\S*/g, function(txt) { + displayName: dependentName.replace(/\w\S*/g, function (txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); }), values: [], @@ -244,7 +245,7 @@ draftRouter.post('/', async (req, res) => { } draft.stats = DictionaryHelper.countDraftStats(draft); await draftDoc.save(); - logger.audit( + logger.info( { field, parent, dependentName, value }, 'draft updated', 'Dictionary draft value added', @@ -277,7 +278,7 @@ draftRouter.post('/remove', async (req, res) => { } const draftDoc = await DictionaryHelper.getDictionaryDraft(); - const draft = draftDoc.fields.find(i => i.name === field); + const draft = draftDoc.fields.find((i) => i.name === field); if (!draft) { res.status(400).json({ err: `No dictionary field found named: ${field}` }); @@ -302,7 +303,7 @@ draftRouter.post('/remove', async (req, res) => { return; } - const parentValue = draft.values.find(val => + const parentValue = draft.values.find((val) => val.original ? val.original === parent : val.value === parent, ); @@ -311,13 +312,13 @@ draftRouter.post('/remove', async (req, res) => { return; } - let dependent = parentValue.dependents.find(dep => dep.name === dependentName); + let dependent = parentValue.dependents.find((dep) => dep.name === dependentName); if (!dependent) { dependent = { name: dependentName, // displayName has a replace that does: To Title Case - displayName: dependentName.replace(/\w\S*/g, function(txt) { + displayName: dependentName.replace(/\w\S*/g, function (txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); }), values: [], @@ -345,7 +346,7 @@ draftRouter.post('/remove', async (req, res) => { } draft.stats = DictionaryHelper.countDraftStats(draft); await draftDoc.save(); - logger.audit( + logger.info( { field, parent, dependentName, value }, 'draft updated', 'Dictionary draft new value removed', diff --git a/cms/src/schemas/genes.js b/cms/src/schemas/genes.js index 1aa769182..552f2eabb 100644 --- a/cms/src/schemas/genes.js +++ b/cms/src/schemas/genes.js @@ -18,9 +18,8 @@ const GeneSchema = new mongoose.Schema( ); GeneSchema.plugin(mongoosastic, { - client: elasticClient(), + esClient: await elasticClient(), index: 'genes', - type: '_doc', }); export default mongoose.model('Gene', GeneSchema); diff --git a/cms/src/services/gdc-importer/VariantImporter.js b/cms/src/services/gdc-importer/VariantImporter.js index 67c5e9cd3..6d33dd18b 100644 --- a/cms/src/services/gdc-importer/VariantImporter.js +++ b/cms/src/services/gdc-importer/VariantImporter.js @@ -9,7 +9,10 @@ import { getBulkMafStatus, getCancerModelFilesFromMafFileData, } from './mafFiles.js'; -import { addGenomicVariantsFromMaf, getGdcImportErrorMessage } from '../../helpers/genomicVariants.js'; +import { + addGenomicVariantsFromMaf, + getGdcImportErrorMessage, +} from '../../helpers/genomicVariants.js'; import getLogger from '../../logger.js'; const logger = getLogger('services/gdc-importer/VariantImporter'); @@ -27,7 +30,7 @@ const ImportTypes = { individual: 'INDIVIDUAL', }; -const getTissueStatus = async modelName => { +const getTissueStatus = async (modelName) => { const model = await Model.findOne({ name: modelName }); if (!model) { @@ -73,7 +76,7 @@ const Import = ({ logger.info({ startTime, stopTime, modelName }, 'Genomic Variant Import complete.'); }; - const errorStop = errorData => { + const errorStop = (errorData) => { status = ImportStatus.error; error = errorData; stopTime = Date.now(); @@ -115,7 +118,7 @@ const Import = ({ tissueStatus, }); - const parseMaf = maf => { + const parseMaf = (maf) => { // clear all the weird comments const withoutComments = maf.replace(/#.+\n/g, ''); return tsv.parse(withoutComments); @@ -138,7 +141,7 @@ const Import = ({ { time: Date.now(), startTime, fileId, filename, modelName }, 'Beginning MAF file download...', ); - const mafFile = await downloadMaf({ filename, fileId, modelName }).catch(error => { + const mafFile = await downloadMaf({ filename, fileId, modelName }).catch((error) => { errorStop({ code: IMPORT_ERRORS.manualImportError, message: error.message, @@ -186,7 +189,7 @@ const Import = ({ }; }; -const VariantImporter = (function() { +const VariantImporter = (function () { let queue = []; let failed = []; let stopped = []; @@ -194,13 +197,13 @@ const VariantImporter = (function() { let running = false; const cleanLists = () => { - failed = failed.filter(i => i && i.getData && !i.getData().acknowledged); - stopped = stopped.filter(i => i && i.getData && !i.getData().acknowledged); - success = success.filter(i => i && i.getData && !i.getData().acknowledged); + failed = failed.filter((i) => i && i.getData && !i.getData().acknowledged); + stopped = stopped.filter((i) => i && i.getData && !i.getData().acknowledged); + success = success.filter((i) => i && i.getData && !i.getData().acknowledged); // queue should never have anything acknowledged (should move to failed/stopped/success) // clearing just in case - queue = queue.filter(i => i && i.getData && !i.getData().acknowledged); + queue = queue.filter((i) => i && i.getData && !i.getData().acknowledged); }; const emptyQueue = () => { @@ -234,7 +237,7 @@ const VariantImporter = (function() { // Start queue if (!running) { - start(); + await start(); } return { success: true, startTime: Date.now() }; @@ -295,7 +298,7 @@ const VariantImporter = (function() { // Start queue if (!running) { - start(); + await start(); } return { success: true, startTime: Date.now() }; @@ -311,7 +314,7 @@ const VariantImporter = (function() { } }; - const queueBulkImport = async models => { + const queueBulkImport = async (models) => { if (!Array.isArray(models) || models.length < 1) { logger.error( 'queueBulkImport failed due to bad input. `models` must be an array of model names.', @@ -331,7 +334,7 @@ const VariantImporter = (function() { // Filter out models that don't exist within HCMI db let noMatchingModel = []; - models = models.filter(async modelName => { + models = models.filter(async (modelName) => { let match = await Model.findOne({ name: modelName }); if (!match) { @@ -352,7 +355,7 @@ const VariantImporter = (function() { failed = [ ...failed, // Non-actionable errors (no match, not found in GDC, no MAFs) - ...noMatchingModel.map(modelName => + ...noMatchingModel.map((modelName) => Import({ modelName, status: ImportStatus.error, @@ -363,7 +366,7 @@ const VariantImporter = (function() { importType: ImportTypes.bulk, }), ), - ...modelsStatus[GDC_MODEL_STATES.modelNotFound].map(modelName => + ...modelsStatus[GDC_MODEL_STATES.modelNotFound].map((modelName) => Import({ modelName, status: ImportStatus.error, @@ -374,7 +377,7 @@ const VariantImporter = (function() { importType: ImportTypes.bulk, }), ), - ...modelsStatus[GDC_MODEL_STATES.noMafs].map(modelName => + ...modelsStatus[GDC_MODEL_STATES.noMafs].map((modelName) => Import({ modelName, status: ImportStatus.error, @@ -387,7 +390,7 @@ const VariantImporter = (function() { ), // Actionable errors (multiple ngcm, no ngcm) ...(await Promise.all( - modelsStatus[GDC_MODEL_STATES.multipleNgcm].map(async modelName => + modelsStatus[GDC_MODEL_STATES.multipleNgcm].map(async (modelName) => Import({ modelName, caseId: modelsFileData[modelName].caseId, @@ -404,7 +407,7 @@ const VariantImporter = (function() { ), )), ...(await Promise.all( - modelsStatus[GDC_MODEL_STATES.noNgcm].map(async modelName => + modelsStatus[GDC_MODEL_STATES.noNgcm].map(async (modelName) => Import({ modelName, caseId: modelsFileData[modelName].caseId, @@ -425,7 +428,7 @@ const VariantImporter = (function() { // Queue imports for conflict-free models (single NGCM, single NGCM+) queue = [ ...queue, - ...modelsStatus[GDC_MODEL_STATES.singleNgcm].map(modelName => { + ...modelsStatus[GDC_MODEL_STATES.singleNgcm].map((modelName) => { const fileData = getCancerModelFilesFromMafFileData(modelsFileData[modelName], true)[0]; return Import({ modelName, @@ -435,7 +438,7 @@ const VariantImporter = (function() { importType: ImportTypes.bulk, }); }), - ...modelsStatus[GDC_MODEL_STATES.singleNgcmPlusEngcm].map(modelName => { + ...modelsStatus[GDC_MODEL_STATES.singleNgcmPlusEngcm].map((modelName) => { const fileData = getCancerModelFilesFromMafFileData(modelsFileData[modelName], true)[0]; return Import({ modelName, @@ -449,25 +452,25 @@ const VariantImporter = (function() { // Start queue if (!running) { - start(); + await start(); } return { success: true, startTime: Date.now() }; }; - const stopImport = async modelName => { + const stopImport = async (modelName) => { // In case we get into an invalid state with multiple imports for a given model name, // we'll use filter to get the whole list of them. - const targets = queue.filter(i => i && i.modelName === modelName); + const targets = queue.filter((i) => i && i.modelName === modelName); if (targets.length) { - targets.forEach(target => target.stop()); + targets.forEach((target) => target.stop()); stopped = [...stopped, ...targets]; - queue = queue.filter(i => i && i.modelName !== modelName); + queue = queue.filter((i) => i && i.modelName !== modelName); } cleanLists(); - return targets.map(target => target.getData()); + return targets.map((target) => target.getData()); }; const stopBulkImport = async (modelNames = []) => { @@ -475,73 +478,73 @@ const VariantImporter = (function() { let targets = []; if (modelNames.length) { - modelNames.forEach(modelName => { - targets = [...targets, ...queue.filter(i => i && i.modelName === modelName)]; + modelNames.forEach((modelName) => { + targets = [...targets, ...queue.filter((i) => i && i.modelName === modelName)]; }); } else { targets = queue; } if (targets.length) { - targets.forEach(target => target.stop()); + targets.forEach((target) => target.stop()); stopped = [...stopped, ...targets]; emptyQueue(); } cleanLists(); - return targets.map(target => target.getData()); + return targets.map((target) => target.getData()); }; const getStatus = () => { cleanLists(); return { - queue: queue.map(i => i.getData()), - failed: failed.map(i => i.getData()), - stopped: stopped.map(i => i.getData()), - success: success.map(i => i.getData()), + queue: queue.map((i) => i.getData()), + failed: failed.map((i) => i.getData()), + stopped: stopped.map((i) => i.getData()), + success: success.map((i) => i.getData()), running, }; }; - const acknowledge = modelName => { + const acknowledge = (modelName) => { const targets = [ - ...failed.filter(i => i && i.modelName === modelName), - ...stopped.filter(i => i && i.modelName === modelName), - ...success.filter(i => i && i.modelName === modelName), + ...failed.filter((i) => i && i.modelName === modelName), + ...stopped.filter((i) => i && i.modelName === modelName), + ...success.filter((i) => i && i.modelName === modelName), ]; if (targets.length) { - targets.forEach(target => target.acknowledge()); + targets.forEach((target) => target.acknowledge()); } cleanLists(); - return targets.map(target => target.getData()); + return targets.map((target) => target.getData()); }; - const acknowledgeBulk = modelNames => { + const acknowledgeBulk = (modelNames) => { let targets = []; - modelNames.forEach(modelName => { + modelNames.forEach((modelName) => { targets = [ ...targets, - ...failed.filter(i => i && i.modelName === modelName), - ...stopped.filter(i => i && i.modelName === modelName), - ...success.filter(i => i && i.modelName === modelName), + ...failed.filter((i) => i && i.modelName === modelName), + ...stopped.filter((i) => i && i.modelName === modelName), + ...success.filter((i) => i && i.modelName === modelName), ]; }); if (targets.length) { - targets.forEach(target => target.acknowledge()); + targets.forEach((target) => target.acknowledge()); } cleanLists(); - return targets.map(target => target.getData()); + return targets.map((target) => target.getData()); }; - const resolveConflict = (modelName, fileId, filename) => { - const targetIndex = failed.findIndex(i => i.modelName === modelName); + const resolveConflict = async (modelName, fileId, filename) => { + const targetIndex = failed.findIndex((i) => i.modelName === modelName); if (targetIndex < 0) { return { @@ -555,12 +558,12 @@ const VariantImporter = (function() { // Move resolved conflict from failed to queue const target = failed.splice(targetIndex, 1)[0]; - target.resolveConflict(fileId, filename); + await target.resolveConflict(fileId, filename); queue.push(target); // Start queue if (!running) { - start(); + await start(); } return target.getData(); @@ -570,9 +573,9 @@ const VariantImporter = (function() { running = false; }; - const start = () => { + const start = async () => { running = true; - run(); + await run(); }; const run = async () => { @@ -606,7 +609,7 @@ const VariantImporter = (function() { } if (running && queue.length > 0) { - run(); + await run(); } else { pause(); } diff --git a/cms/src/services/publish/Publisher.js b/cms/src/services/publish/Publisher.js index c4c60cafd..5a7087b39 100644 --- a/cms/src/services/publish/Publisher.js +++ b/cms/src/services/publish/Publisher.js @@ -185,7 +185,7 @@ const Publisher = (function () { // Start queue if (!running) { - start(); + await start(); } return { success: true, startTime: Date.now() }; @@ -305,7 +305,7 @@ const Publisher = (function () { // Start queue if (!running) { - start(); + await start(); } return { success: true, startTime: Date.now() }; diff --git a/cms/src/services/s3/s3.js b/cms/src/services/s3/s3.js index 3da666fcb..20ae67a85 100644 --- a/cms/src/services/s3/s3.js +++ b/cms/src/services/s3/s3.js @@ -1,12 +1,12 @@ // Use of require instead of import is used here because this file is used by the migrateImages script. // Scripts executed directly and not run through babel have issues with import statements. -import getLogger from '../../logger.js'; -const logger = getLogger('services/s3'); +import aws from 'aws-sdk'; +import { v4 as uuidv4 } from 'uuid'; -const aws = require('aws-sdk'); -const uuid = require('uuid'); +import getLogger from '../../logger.js'; +const logger = getLogger('services/s3'); const S3_BUCKET = process.env.S3_BUCKET; const IAM_USER_KEY = process.env.IAM_USER_KEY; const IAM_USER_SECRET = process.env.IAM_USER_SECRET; @@ -16,8 +16,8 @@ const s3 = new aws.S3({ secretAccessKey: IAM_USER_SECRET, }); -const uploadToS3 = async (fileName, fileStream, modelName) => { - const Key = `${uuid.v4()}-${fileName}`; +export const uploadToS3 = async (fileName, fileStream, modelName) => { + const Key = `${uuidv4()}-${fileName}`; const params = { Bucket: S3_BUCKET, Key, @@ -31,7 +31,7 @@ const uploadToS3 = async (fileName, fileStream, modelName) => { if (error) { reject({ error, fileName, modelName }); } else { - logger.audit( + logger.info( { Key, Bucket: S3_BUCKET, response: data }, 's3 upload', `Successfully uploaded object to S3`, @@ -42,7 +42,7 @@ const uploadToS3 = async (fileName, fileStream, modelName) => { }); }; -const deleteFromS3 = async (id) => { +export const deleteFromS3 = async (id) => { const params = { Bucket: S3_BUCKET, Key: id, @@ -56,7 +56,7 @@ const deleteFromS3 = async (id) => { msg: `image with id ${id} not found`, }; } else { - logger.audit(params, 's3 delete', 'Successfully deleted image from S3'); + logger.info(params, 's3 delete', 'Successfully deleted image from S3'); return { code: 200, msg: `image with id ${id} deleted`, @@ -65,7 +65,7 @@ const deleteFromS3 = async (id) => { }); }; -const testS3Connection = () => { +export const testS3Connection = () => { const params = { Bucket: S3_BUCKET, }; @@ -80,9 +80,3 @@ const testS3Connection = () => { }); }); }; - -module.exports = { - uploadToS3, - deleteFromS3, - testS3Connection, -}; diff --git a/cms/src/services/searchClient/common/schemas/model.js b/cms/src/services/searchClient/common/schemas/model.js index ba4be67fc..ecfa335fb 100644 --- a/cms/src/services/searchClient/common/schemas/model.js +++ b/cms/src/services/searchClient/common/schemas/model.js @@ -2,14 +2,13 @@ import mongoose from 'mongoose'; import mongoosastic from 'mongoosastic'; import { ModelSchema } from '../../../../schemas/model.js'; -import elasticClient from '../client.js'; +import getClient from '../client.js'; const index = process.env.ES_INDEX; ModelSchema.plugin(mongoosastic, { - client: elasticClient, + esClient: await getClient(), index, - type: '_doc', }); export const ModelES = mongoose.model('ModelES', ModelSchema); diff --git a/cms/src/services/searchClient/publish.js b/cms/src/services/searchClient/publish.js index e943bcd18..bbdb8661c 100644 --- a/cms/src/services/searchClient/publish.js +++ b/cms/src/services/searchClient/publish.js @@ -66,7 +66,7 @@ export const indexOneToES = async (filter) => { } await indexEsUpdate(); const res = await Model.updateOne({ name: doc.name }, { status: modelStatus.published }); - logger.audit({ model: doc.name }, 'publish model', 'Model Published to ES'); + logger.info({ model: doc.name }, 'publish model', 'Model Published to ES'); return { status: `Indexing successful with status: ${res.result}`, }; diff --git a/cms/src/services/searchClient/unpublish.js b/cms/src/services/searchClient/unpublish.js index 7658c67b9..19b4fd445 100644 --- a/cms/src/services/searchClient/unpublish.js +++ b/cms/src/services/searchClient/unpublish.js @@ -1,18 +1,19 @@ // @ts-check -import getClient from './common/client.js'; -import indexEsUpdate from './update.js'; import Model from '../../schemas/model.js'; -import { indexMatchedModelsToES } from './publish.js'; import { modelStatus } from '../../helpers/modelStatus.js'; +import getLogger from '../../logger.js'; + +import getClient from './common/client.js'; +import { indexMatchedModelsToES } from './publish.js'; +import indexEsUpdate from './update.js'; import { updateGeneSearchIndicies } from './genomicVariants.js'; -import getLogger from '../../logger.js'; const logger = getLogger('services/searchClient/unpublish'); - const index = process.env.ES_INDEX; export const unpublishModel = async (name) => { + console.log('unpublishModel', name); await unpublishOneFromES(name); await indexMatchedModelsToES({ name }); await updateGeneSearchIndicies(); @@ -37,7 +38,7 @@ export const unpublishOneFromES = async (name) => { }, { status: modelStatus.unpublished }, ); - logger.audit({ model: name }, 'unpublish model', 'Model Unpublished from ES'); + logger.info({ model: name }, 'unpublish model', 'Model Unpublished from ES'); }; export const unpublishManyFromES = async (nameArr) => { @@ -45,7 +46,7 @@ export const unpublishManyFromES = async (nameArr) => { // resolve as this is just bookkeeping await indexEsUpdate(); const searchClient = await getClient(); - return searchClient.deleteByQuery({ + return await searchClient.deleteByQuery({ index, body: { query: { diff --git a/cms/src/services/searchClient/update.js b/cms/src/services/searchClient/update.js index 15c6b1199..3241e48ce 100644 --- a/cms/src/services/searchClient/update.js +++ b/cms/src/services/searchClient/update.js @@ -8,10 +8,9 @@ const index = process.env.ES_UPDATE_INDEX; const update = async () => { const searchClient = await getClient(); - return searchClient + return await searchClient .index({ index, - type: index, body: { date: Date.now(), }, diff --git a/ui/src/components/admin/ModelsManager/ModelsManager.jsx b/ui/src/components/admin/ModelsManager/ModelsManager.jsx index fa657526b..fcafc7f73 100644 --- a/ui/src/components/admin/ModelsManager/ModelsManager.jsx +++ b/ui/src/components/admin/ModelsManager/ModelsManager.jsx @@ -26,27 +26,32 @@ const ModelsManager = () => { Model Management - {({ bulkImportVariants, state }) => ( - - {(modalState) => ( - - modalState.setModalState({ - component: , - shouldCloseOnOverlayClick: true, - styles: AdminModalStyle, - }) - } - disabled={(state && state.isLoading) || publishRunning} - > - - Check for GDC Variants - - )} - - )} + {(context) => { + const { bulkImportVariants, state } = context ?? {}; + return ( + + {(modalState) => ( + + modalState.setModalState({ + component: ( + + ), + shouldCloseOnOverlayClick: true, + styles: AdminModalStyle, + }) + } + disabled={(state && state.isLoading) || publishRunning} + > + + Check for GDC Variants + + )} + + ); + }} {({ uploadModelsFromSheet, state }) => ( diff --git a/ui/src/components/admin/helpers/bulkActions.js b/ui/src/components/admin/helpers/bulkActions.js index 93f03909a..c49b98046 100644 --- a/ui/src/components/admin/helpers/bulkActions.js +++ b/ui/src/components/admin/helpers/bulkActions.js @@ -1,15 +1,16 @@ // @ts-check - +import axios, { AxiosHeaders } from 'axios'; import { fetchData } from '../services/Fetcher'; import config from '../config'; export const bulkAction = async (action, data = []) => { if (!Array.isArray(data)) throw new Error('Data must be type Array'); - + // Fixes 'header name must be a non-empty string' errors + const defaultHeaders = new AxiosHeaders(new axios.AxiosHeaders().toJSON()); return fetchData({ url: `${config.urls.cmsBase}/bulk/${action}`, data, method: 'post', - headers: '', + headers: defaultHeaders, }); }; From bdb209a55108e5bf526d0a4dd929b6a43e2e44c0 Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Thu, 19 Mar 2026 14:33:08 -0400 Subject: [PATCH 09/82] Revert "Use module imports pt 1" This reverts commit 99cfd466bcd95adc3b69ba3e52f2762cc18ca83c. --- cms/index.js | 10 +- cms/package.json | 1 - cms/src/helpers/dictionary.js | 53 ++++---- cms/src/helpers/genomicVariants.js | 16 +-- cms/src/helpers/matchedModels.js | 33 +++-- cms/src/hooks.js | 4 +- cms/src/routes/bulk.js | 2 +- cms/src/routes/dictionary.js | 45 ++++--- cms/src/schemas/genes.js | 3 +- .../services/gdc-importer/VariantImporter.js | 113 +++++++++--------- cms/src/services/publish/Publisher.js | 4 +- cms/src/services/s3/s3.js | 26 ++-- .../searchClient/common/schemas/model.js | 5 +- cms/src/services/searchClient/publish.js | 2 +- cms/src/services/searchClient/unpublish.js | 15 ++- cms/src/services/searchClient/update.js | 3 +- .../admin/ModelsManager/ModelsManager.jsx | 47 ++++---- .../components/admin/helpers/bulkActions.js | 7 +- 18 files changed, 189 insertions(+), 200 deletions(-) diff --git a/cms/index.js b/cms/index.js index a8fac7d9d..52a38d85e 100644 --- a/cms/index.js +++ b/cms/index.js @@ -1,8 +1,6 @@ -import 'babel-polyfill'; -import { config } from 'dotenv'; -config(); -import register from '@babel/register'; -register({ +require('babel-polyfill'); +require('dotenv').config(); +require('@babel/register')({ presets: ['@babel/env'], plugins: [ '@babel/plugin-proposal-optional-chaining', @@ -10,4 +8,4 @@ register({ ], }); -import './src/index.js'; +require('./src/index'); diff --git a/cms/package.json b/cms/package.json index 41635a85e..4db52fcd2 100644 --- a/cms/package.json +++ b/cms/package.json @@ -4,7 +4,6 @@ "description": "Content Management services for HCMI Portal`", "private": true, "main": "index.js", - "type": "module", "scripts": { "start": "nodemon index.js | pino-pretty", "test": "echo \"Error: no test specified\" && exit 1", diff --git a/cms/src/helpers/dictionary.js b/cms/src/helpers/dictionary.js index ebdf77600..3d57807c2 100644 --- a/cms/src/helpers/dictionary.js +++ b/cms/src/helpers/dictionary.js @@ -31,26 +31,25 @@ export const getDictionaryDraft = async () => export const getDictionaryOptions = async () => { const result = await getDictionary(); - console.log('dictionary result', result); - const dictionary = result?.fields; + const dictionary = result.fields; const output = dictionary.reduce((acc, field) => { let { name, values } = field; - acc[`${name}Options`] = values.map((i) => i.value); + acc[`${name}Options`] = values.map(i => i.value); return acc; }, {}); - const ctd = dictionary.find((i) => i.name === 'clinicalTumorDiagnosis'); + const ctd = dictionary.find(i => i.name === 'clinicalTumorDiagnosis'); const ctdDependentOptions = {}; - ctd.dependentValues.forEach((val) => (ctdDependentOptions[val] = {})); + ctd.dependentValues.forEach(val => (ctdDependentOptions[val] = {})); - ctd.values.forEach((val) => { + ctd.values.forEach(val => { const valueName = val.value; - val.dependents.forEach((dependent) => { + val.dependents.forEach(dependent => { const dependentName = dependent.name; - const dependentValues = dependent.values.map((val) => val.value); + const dependentValues = dependent.values.map(val => val.value); ctdDependentOptions[dependentName][valueName.toLowerCase()] = dependentValues; }); @@ -62,10 +61,9 @@ export const getDictionaryOptions = async () => { export const resetDraft = async () => { const dictionary = await Dictionary.findOne({}, {}, { sort: { created_at: -1 } }); - console.log('dictionary draft', dictionary); - const draft = new Draft({ fields: dictionary?.fields }); + const draft = new Draft({ fields: dictionary.fields }); await draft.save(); - logger.info({}, 'reset draft', 'Dictionary draft reset'); + logger.audit({}, 'reset draft', 'Dictionary draft reset'); return await Draft.findOne({}, {}, { sort: { created_at: -1 } }); }; @@ -76,15 +74,15 @@ export const resetDraft = async () => { export const publishDraft = async () => { logger.debug('Publishing data dictionary...'); const draft = await getDictionaryDraft(); - console.log('draft', draft); + // find edited values const edits = []; - draft?.fields?.forEach((field) => { - if (field?.dependentValues.length > 0) { + draft.fields.forEach(field => { + if (field.dependentValues.length > 0) { // dependent field case - field.values.forEach((value) => { - value.dependents.forEach((dependent) => { - dependent.values.forEach((dependentValue) => { + field.values.forEach(value => { + value.dependents.forEach(dependent => { + dependent.values.forEach(dependentValue => { if (dependentValue.status === draftStatus.edited) { edits.push({ field: field.name, @@ -99,7 +97,7 @@ export const publishDraft = async () => { }); } // basic field case - field?.values.forEach((value) => { + field.values.forEach(value => { if (value.status === draftStatus.edited) { edits.push({ field: field.name, @@ -121,22 +119,19 @@ export const publishDraft = async () => { const dictionary = new Dictionary({ fields: draft.fields }); await dictionary.save(); - logger.info({ edits }, 'dictionary created', 'Created new dictionary from draft values'); + logger.audit({ edits }, 'dictionary created', 'Created new dictionary from draft values'); - models.forEach((model) => { + models.forEach(model => { // Find these values in the models. let edited = false; - edits.forEach((edit) => { + edits.forEach(edit => { const editField = edit.dependentName ? edit.dependentName : edit.field; // - update those models and change their status if (editField === 'therapy' && model.therapy.includes(edit.original)) { // special case, therapy is an array - model.therapy.splice( - model.therapy.indexOf((val) => val === edit.original), - 1, - ); + model.therapy.splice(model.therapy.indexOf(val => val === edit.original), 1); model.therapy.push(edit.value); model.status = model.status === modelStatus.published ? modelStatus.unpublishedChanges : model.status; @@ -153,7 +148,7 @@ export const publishDraft = async () => { }); if (edited) { model.save(); - logger.info( + logger.audit( { model: model.name }, 'model saved', 'Model values updated due to dictionary publish', @@ -165,7 +160,7 @@ export const publishDraft = async () => { return { dictionary, updatedModels }; }; -export const countDraftStats = (draft) => { +export const countDraftStats = draft => { const output = { edited: 0, new: 0 }; const hasDependencies = draft.dependentValues && draft.dependentValues.length > 0; @@ -207,12 +202,12 @@ export const editValue = (target, original, updated) => { }; export const valueExists = (valuesList, value) => { - return !!valuesList.find((val) => val.value === value); + return !!valuesList.find(val => val.value === value); }; export const removeValueIfNew = (valueList, value) => { const index = valueList.indexOf( - valueList.find((i) => i.status === draftStatus.new && i.value === value), + valueList.find(i => i.status === draftStatus.new && i.value === value), ); if (index >= 0) { valueList.splice(index, 1); diff --git a/cms/src/helpers/genomicVariants.js b/cms/src/helpers/genomicVariants.js index 0f774df47..ce90756c5 100644 --- a/cms/src/helpers/genomicVariants.js +++ b/cms/src/helpers/genomicVariants.js @@ -10,7 +10,7 @@ import { import getLogger from '../logger.js'; const logger = getLogger('helpers/genomicVariants'); -export const clearGenomicVariants = async (name) => { +export const clearGenomicVariants = async name => { // Stop any active imports, if any: try { await VariantImporter.stopImport(name); @@ -37,8 +37,8 @@ export const clearGenomicVariants = async (name) => { } }; -const titleCase = (text, filter = (i) => true) => { - return text.replace(/\w\S*/g, (i) => { +const titleCase = (text, filter = i => true) => { + return text.replace(/\w\S*/g, i => { if (filter(i)) { return i.charAt(0).toUpperCase() + i.substr(1); } @@ -68,9 +68,9 @@ const buildVariantId = ({ } }; -const buildModelUrl = (caseId) => `${BASE_GDC_URL}/cases/${caseId}`; -const buildMafUrl = (fileId) => `${BASE_GDC_URL}/files/${fileId}`; -const buildSequenceUrl = (caseId) => `${BASE_GDC_URL}/cases/${caseId}#files`; +const buildModelUrl = caseId => `${BASE_GDC_URL}/cases/${caseId}`; +const buildMafUrl = fileId => `${BASE_GDC_URL}/files/${fileId}`; +const buildSequenceUrl = caseId => `${BASE_GDC_URL}/cases/${caseId}#files`; export const addGenomicVariantsFromMaf = async (name, mafData, { filename, fileId }, caseId) => { const model = await Model.findOne({ name }); @@ -103,7 +103,7 @@ export const addGenomicVariantsFromMaf = async (name, mafData, { filename, fileI // Properties originally from Reference that are temporarily taken from MAF - Jon Eubank 2020-09-29 const gene = row.Hugo_Symbol; - const gene_biotype = titleCase(row.BIOTYPE.replace(/_/g, ' '), (i) => !i.includes('RNA')); + const gene_biotype = titleCase(row.BIOTYPE.replace(/_/g, ' '), i => !i.includes('RNA')); const name = `${row.Hugo_Symbol} ${aa_change}`; const synonyms = []; @@ -181,7 +181,7 @@ export const addGenomicVariantsFromMaf = async (name, mafData, { filename, fileI } await model.save(); - logger.info( + logger.audit( { model: model.name, genomic_variants: model.genomic_variants ? model.genomic_variants.length : 0, diff --git a/cms/src/helpers/matchedModels.js b/cms/src/helpers/matchedModels.js index 9b5d19d9b..a692807cc 100644 --- a/cms/src/helpers/matchedModels.js +++ b/cms/src/helpers/matchedModels.js @@ -8,11 +8,11 @@ import getLogger from '../logger.js'; const logger = getLogger('helpers/matchedModels'); /* Worker methods, take models as inputs */ -const createMatchedModels = async (models) => { - const modelIds = models.map((model) => model._id); +const createMatchedModels = async models => { + const modelIds = models.map(model => model._id); const matchedModels = await MatchedModels.create({ models: modelIds }); - logger.info( - { matchedModels, models: models.map((model) => model.name) }, + logger.audit( + { matchedModels, models: models.map(model => model.name) }, 'matched model set created', 'Created matched models set', ); @@ -24,12 +24,12 @@ const createMatchedModels = async (models) => { ? modelStatus.unpublished : modelStatus.unpublishedChanges; model.save(); - logger.info({ model: model.name }, 'model saved', 'Model updated to add matched model set'); + logger.audit({ model: model.name }, 'model saved', 'Model updated to add matched model set'); } return matchedModels; }; -const clearModelFromSets = async (model) => { +const clearModelFromSets = async model => { // Get MatchedModels for this model if (!model.matchedModels) { @@ -42,7 +42,7 @@ const clearModelFromSets = async (model) => { if (matchedModels) { // only do operations on the matched set if we find it. if we didnt, no issue, we are removing this reference anyways matchedModels.models = matchedModels.models.filter( - (modelId) => modelId.toString() !== model._id.toString(), + modelId => modelId.toString() !== model._id.toString(), ); // We need to make sure that when these changes to our model are published, @@ -64,21 +64,21 @@ const clearModelFromSets = async (model) => { ? modelStatus.unpublished : modelStatus.unpublishedChanges; await otherModel.save(); - logger.info( + logger.audit( { model: otherModel.name }, 'model saved', 'Model updated to remove matched model set', ); } await MatchedModels.deleteOne({ _id: matchedModels._id }); - logger.info( + logger.audit( { matchedModels }, 'matched model set removed', 'Matched models set removed due to having 1 or fewer members after update', ); } else { await matchedModels.save(); - logger.info({ matchedModels }, 'matched model set saved', 'Matched models set updated'); + logger.audit({ matchedModels }, 'matched model set saved', 'Matched models set updated'); } } else { logger.warn( @@ -93,7 +93,7 @@ const clearModelFromSets = async (model) => { ? modelStatus.unpublished : modelStatus.unpublishedChanges; await model.save(); - logger.info({ model: model.name }, 'model saved', 'Model updated to remove matched model set'); + logger.audit({ model: model.name }, 'model saved', 'Model updated to remove matched model set'); return; }; @@ -103,7 +103,7 @@ const clearModelFromSets = async (model) => { * Clears the matchedModels for the given model and updates models in the old set to no longer include this model * @param {*} nameToAdd */ -const removeFromSet = async (nameToRemove) => { +const removeFromSet = async nameToRemove => { const model = await Model.findOne({ name: nameToRemove }); if (!model) { throw new Error(`Could not find model with the name: ${nameToRemove}.`); @@ -131,8 +131,7 @@ const connectWithMatchedModels = async (nameToAdd, setMemberName) => { ? await MatchedModels.findOne({ _id: modelToAdd.matchedModels }).populate('models') : null; const inCurrentSet = - currentMatchedModels && - currentMatchedModels.models.find((model) => model.name === setMemberName); + currentMatchedModels && currentMatchedModels.models.find(model => model.name === setMemberName); // Only continue if we have to, if: // a - the target model name (setMemberName) is not in the current matchedModels set @@ -153,7 +152,7 @@ const connectWithMatchedModels = async (nameToAdd, setMemberName) => { // Add model to the set matchedModels.models.push(modelToAdd._id); await matchedModels.save(); - logger.info( + logger.audit( { matchedModels, model: nameToAdd }, 'matched model set updated', 'Matched models set updated to add new model', @@ -166,7 +165,7 @@ const connectWithMatchedModels = async (nameToAdd, setMemberName) => { ? modelStatus.unpublished : modelStatus.unpublishedChanges; await modelToAdd.save(); - logger.info( + logger.audit( { model: modelToAdd.name }, 'model saved', 'Model updated to add to matched model set', @@ -182,7 +181,7 @@ const connectWithMatchedModels = async (nameToAdd, setMemberName) => { } } else { return { - models: currentMatchedModels.models.map((model) => model._id), + models: currentMatchedModels.models.map(model => model._id), _id: currentMatchedModels._id, __v: currentMatchedModels.__v, }; diff --git a/cms/src/hooks.js b/cms/src/hooks.js index 725ed4277..0a5077131 100644 --- a/cms/src/hooks.js +++ b/cms/src/hooks.js @@ -92,7 +92,7 @@ export const outputFn = async (req, res, next) => { }; export const postCreate = async (req, res, next) => { - logger.info({ model: req.erm.result }, 'model created', 'Model created in mongo'); + logger.audit({ model: req.erm.result }, 'model created', 'Model created in mongo'); return next(); }; @@ -106,7 +106,7 @@ export const postUpdate = async (req, res, next) => { }, } = req; - logger.info({ model: modelName }, 'model saved', 'Model saved in mongo'); + logger.audit({ model: modelName }, 'model saved', 'Model saved in mongo'); // Model updates that contain the status key we // treat as being a change in status and trigger diff --git a/cms/src/routes/bulk.js b/cms/src/routes/bulk.js index 5fa48a5de..9d6b0e555 100644 --- a/cms/src/routes/bulk.js +++ b/cms/src/routes/bulk.js @@ -10,7 +10,7 @@ import { unpublishManyFromES } from '../services/searchClient/unpublish.js'; import csvStream from '../helpers/streamAsCSV.js'; import { backupFields } from '../schemas/descriptions/model.js'; import { updateGeneSearchIndicies } from '../services/searchClient/genomicVariants.js'; -import getLogger from '../logger.js'; +import getLogger from '../logger'; const logger = getLogger('routes/bulk'); const bulkRouter = express.Router(); diff --git a/cms/src/routes/dictionary.js b/cms/src/routes/dictionary.js index a72ec04a8..0794935e3 100644 --- a/cms/src/routes/dictionary.js +++ b/cms/src/routes/dictionary.js @@ -17,11 +17,10 @@ dictionaryRouter.use('/draft', draftRouter); dictionaryRouter.get('/', async (req, res) => { try { const dictionary = await DictionaryHelper.getDictionaryOptions(); - console.log('dictionary', dictionary); - return res.json(dictionary); + res.json(dictionary); } catch (error) { logger.error(error, 'Error fetching dictionary'); - return res.status(500).json({ err: error }); + res.status(500).json({ err: error }); } }); @@ -34,10 +33,10 @@ draftRouter.get('/', async (req, res) => { draft = await DictionaryHelper.resetDraft(); } - return res.json(draft); + res.json(draft); } catch (error) { logger.error(error, 'Error fetching dictionary draft'); - return res.status(500).json({ err: error }); + res.status(500).json({ err: error }); } }); @@ -45,10 +44,10 @@ draftRouter.get('/', async (req, res) => { draftRouter.delete('/', async (req, res) => { try { const output = await DictionaryHelper.resetDraft(); - return res.json(output); + res.json(output); } catch (error) { logger.error(error, 'Error deleting dictionary draft'); - return res.status(500).json({ err: error }); + res.status(500).json({ err: error }); } }); @@ -71,7 +70,7 @@ draftRouter.patch('/', async (req, res) => { } const draftDoc = await DictionaryHelper.getDictionaryDraft(); - const draft = draftDoc.fields.find((i) => i.name === field); + const draft = draftDoc.fields.find(i => i.name === field); if (!draft) { res.status(400).json({ err: `No dictionary field found named: ${field}` }); @@ -96,7 +95,7 @@ draftRouter.patch('/', async (req, res) => { return; } - const parentValue = draft.values.find((val) => + const parentValue = draft.values.find(val => val.original ? val.original === parent : val.value === parent, ); @@ -105,14 +104,14 @@ draftRouter.patch('/', async (req, res) => { return; } - const dependent = parentValue.dependents.find((dep) => dep.name === dependentName); + const dependent = parentValue.dependents.find(dep => dep.name === dependentName); if (!dependent) { res.status(400).json({ err: `Parent value has no values for this dependent name` }); return; } - const editValue = dependent.values.find((val) => + const editValue = dependent.values.find(val => val.original ? val.original === original : val.value === original, ); @@ -127,7 +126,7 @@ draftRouter.patch('/', async (req, res) => { DictionaryHelper.editValue(editValue, original, updated); } else { // handle basic case - const editValue = draft.values.find((val) => + const editValue = draft.values.find(val => val.original ? val.original === original : val.value === original, ); if (!editValue) { @@ -143,7 +142,7 @@ draftRouter.patch('/', async (req, res) => { draft.stats = DictionaryHelper.countDraftStats(draft); await draftDoc.save(); - logger.info( + logger.audit( { field, parent, dependentName, original, updated }, 'draft updated', 'Dictionary draft value edited', @@ -178,7 +177,7 @@ draftRouter.post('/', async (req, res) => { } const draftDoc = await DictionaryHelper.getDictionaryDraft(); - const draft = draftDoc.fields.find((i) => i.name === field); + const draft = draftDoc.fields.find(i => i.name === field); if (!draft) { res.status(400).json({ err: `No dictionary field found named: ${field}` }); @@ -203,7 +202,7 @@ draftRouter.post('/', async (req, res) => { return; } - const parentValue = draft.values.find((val) => + const parentValue = draft.values.find(val => val.original ? val.original === parent : val.value === parent, ); @@ -212,13 +211,13 @@ draftRouter.post('/', async (req, res) => { return; } - let dependent = parentValue.dependents.find((dep) => dep.name === dependentName); + let dependent = parentValue.dependents.find(dep => dep.name === dependentName); if (!dependent) { dependent = { name: dependentName, // displayName has a replace that does: To Title Case - displayName: dependentName.replace(/\w\S*/g, function (txt) { + displayName: dependentName.replace(/\w\S*/g, function(txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); }), values: [], @@ -245,7 +244,7 @@ draftRouter.post('/', async (req, res) => { } draft.stats = DictionaryHelper.countDraftStats(draft); await draftDoc.save(); - logger.info( + logger.audit( { field, parent, dependentName, value }, 'draft updated', 'Dictionary draft value added', @@ -278,7 +277,7 @@ draftRouter.post('/remove', async (req, res) => { } const draftDoc = await DictionaryHelper.getDictionaryDraft(); - const draft = draftDoc.fields.find((i) => i.name === field); + const draft = draftDoc.fields.find(i => i.name === field); if (!draft) { res.status(400).json({ err: `No dictionary field found named: ${field}` }); @@ -303,7 +302,7 @@ draftRouter.post('/remove', async (req, res) => { return; } - const parentValue = draft.values.find((val) => + const parentValue = draft.values.find(val => val.original ? val.original === parent : val.value === parent, ); @@ -312,13 +311,13 @@ draftRouter.post('/remove', async (req, res) => { return; } - let dependent = parentValue.dependents.find((dep) => dep.name === dependentName); + let dependent = parentValue.dependents.find(dep => dep.name === dependentName); if (!dependent) { dependent = { name: dependentName, // displayName has a replace that does: To Title Case - displayName: dependentName.replace(/\w\S*/g, function (txt) { + displayName: dependentName.replace(/\w\S*/g, function(txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); }), values: [], @@ -346,7 +345,7 @@ draftRouter.post('/remove', async (req, res) => { } draft.stats = DictionaryHelper.countDraftStats(draft); await draftDoc.save(); - logger.info( + logger.audit( { field, parent, dependentName, value }, 'draft updated', 'Dictionary draft new value removed', diff --git a/cms/src/schemas/genes.js b/cms/src/schemas/genes.js index 552f2eabb..1aa769182 100644 --- a/cms/src/schemas/genes.js +++ b/cms/src/schemas/genes.js @@ -18,8 +18,9 @@ const GeneSchema = new mongoose.Schema( ); GeneSchema.plugin(mongoosastic, { - esClient: await elasticClient(), + client: elasticClient(), index: 'genes', + type: '_doc', }); export default mongoose.model('Gene', GeneSchema); diff --git a/cms/src/services/gdc-importer/VariantImporter.js b/cms/src/services/gdc-importer/VariantImporter.js index 6d33dd18b..67c5e9cd3 100644 --- a/cms/src/services/gdc-importer/VariantImporter.js +++ b/cms/src/services/gdc-importer/VariantImporter.js @@ -9,10 +9,7 @@ import { getBulkMafStatus, getCancerModelFilesFromMafFileData, } from './mafFiles.js'; -import { - addGenomicVariantsFromMaf, - getGdcImportErrorMessage, -} from '../../helpers/genomicVariants.js'; +import { addGenomicVariantsFromMaf, getGdcImportErrorMessage } from '../../helpers/genomicVariants.js'; import getLogger from '../../logger.js'; const logger = getLogger('services/gdc-importer/VariantImporter'); @@ -30,7 +27,7 @@ const ImportTypes = { individual: 'INDIVIDUAL', }; -const getTissueStatus = async (modelName) => { +const getTissueStatus = async modelName => { const model = await Model.findOne({ name: modelName }); if (!model) { @@ -76,7 +73,7 @@ const Import = ({ logger.info({ startTime, stopTime, modelName }, 'Genomic Variant Import complete.'); }; - const errorStop = (errorData) => { + const errorStop = errorData => { status = ImportStatus.error; error = errorData; stopTime = Date.now(); @@ -118,7 +115,7 @@ const Import = ({ tissueStatus, }); - const parseMaf = (maf) => { + const parseMaf = maf => { // clear all the weird comments const withoutComments = maf.replace(/#.+\n/g, ''); return tsv.parse(withoutComments); @@ -141,7 +138,7 @@ const Import = ({ { time: Date.now(), startTime, fileId, filename, modelName }, 'Beginning MAF file download...', ); - const mafFile = await downloadMaf({ filename, fileId, modelName }).catch((error) => { + const mafFile = await downloadMaf({ filename, fileId, modelName }).catch(error => { errorStop({ code: IMPORT_ERRORS.manualImportError, message: error.message, @@ -189,7 +186,7 @@ const Import = ({ }; }; -const VariantImporter = (function () { +const VariantImporter = (function() { let queue = []; let failed = []; let stopped = []; @@ -197,13 +194,13 @@ const VariantImporter = (function () { let running = false; const cleanLists = () => { - failed = failed.filter((i) => i && i.getData && !i.getData().acknowledged); - stopped = stopped.filter((i) => i && i.getData && !i.getData().acknowledged); - success = success.filter((i) => i && i.getData && !i.getData().acknowledged); + failed = failed.filter(i => i && i.getData && !i.getData().acknowledged); + stopped = stopped.filter(i => i && i.getData && !i.getData().acknowledged); + success = success.filter(i => i && i.getData && !i.getData().acknowledged); // queue should never have anything acknowledged (should move to failed/stopped/success) // clearing just in case - queue = queue.filter((i) => i && i.getData && !i.getData().acknowledged); + queue = queue.filter(i => i && i.getData && !i.getData().acknowledged); }; const emptyQueue = () => { @@ -237,7 +234,7 @@ const VariantImporter = (function () { // Start queue if (!running) { - await start(); + start(); } return { success: true, startTime: Date.now() }; @@ -298,7 +295,7 @@ const VariantImporter = (function () { // Start queue if (!running) { - await start(); + start(); } return { success: true, startTime: Date.now() }; @@ -314,7 +311,7 @@ const VariantImporter = (function () { } }; - const queueBulkImport = async (models) => { + const queueBulkImport = async models => { if (!Array.isArray(models) || models.length < 1) { logger.error( 'queueBulkImport failed due to bad input. `models` must be an array of model names.', @@ -334,7 +331,7 @@ const VariantImporter = (function () { // Filter out models that don't exist within HCMI db let noMatchingModel = []; - models = models.filter(async (modelName) => { + models = models.filter(async modelName => { let match = await Model.findOne({ name: modelName }); if (!match) { @@ -355,7 +352,7 @@ const VariantImporter = (function () { failed = [ ...failed, // Non-actionable errors (no match, not found in GDC, no MAFs) - ...noMatchingModel.map((modelName) => + ...noMatchingModel.map(modelName => Import({ modelName, status: ImportStatus.error, @@ -366,7 +363,7 @@ const VariantImporter = (function () { importType: ImportTypes.bulk, }), ), - ...modelsStatus[GDC_MODEL_STATES.modelNotFound].map((modelName) => + ...modelsStatus[GDC_MODEL_STATES.modelNotFound].map(modelName => Import({ modelName, status: ImportStatus.error, @@ -377,7 +374,7 @@ const VariantImporter = (function () { importType: ImportTypes.bulk, }), ), - ...modelsStatus[GDC_MODEL_STATES.noMafs].map((modelName) => + ...modelsStatus[GDC_MODEL_STATES.noMafs].map(modelName => Import({ modelName, status: ImportStatus.error, @@ -390,7 +387,7 @@ const VariantImporter = (function () { ), // Actionable errors (multiple ngcm, no ngcm) ...(await Promise.all( - modelsStatus[GDC_MODEL_STATES.multipleNgcm].map(async (modelName) => + modelsStatus[GDC_MODEL_STATES.multipleNgcm].map(async modelName => Import({ modelName, caseId: modelsFileData[modelName].caseId, @@ -407,7 +404,7 @@ const VariantImporter = (function () { ), )), ...(await Promise.all( - modelsStatus[GDC_MODEL_STATES.noNgcm].map(async (modelName) => + modelsStatus[GDC_MODEL_STATES.noNgcm].map(async modelName => Import({ modelName, caseId: modelsFileData[modelName].caseId, @@ -428,7 +425,7 @@ const VariantImporter = (function () { // Queue imports for conflict-free models (single NGCM, single NGCM+) queue = [ ...queue, - ...modelsStatus[GDC_MODEL_STATES.singleNgcm].map((modelName) => { + ...modelsStatus[GDC_MODEL_STATES.singleNgcm].map(modelName => { const fileData = getCancerModelFilesFromMafFileData(modelsFileData[modelName], true)[0]; return Import({ modelName, @@ -438,7 +435,7 @@ const VariantImporter = (function () { importType: ImportTypes.bulk, }); }), - ...modelsStatus[GDC_MODEL_STATES.singleNgcmPlusEngcm].map((modelName) => { + ...modelsStatus[GDC_MODEL_STATES.singleNgcmPlusEngcm].map(modelName => { const fileData = getCancerModelFilesFromMafFileData(modelsFileData[modelName], true)[0]; return Import({ modelName, @@ -452,25 +449,25 @@ const VariantImporter = (function () { // Start queue if (!running) { - await start(); + start(); } return { success: true, startTime: Date.now() }; }; - const stopImport = async (modelName) => { + const stopImport = async modelName => { // In case we get into an invalid state with multiple imports for a given model name, // we'll use filter to get the whole list of them. - const targets = queue.filter((i) => i && i.modelName === modelName); + const targets = queue.filter(i => i && i.modelName === modelName); if (targets.length) { - targets.forEach((target) => target.stop()); + targets.forEach(target => target.stop()); stopped = [...stopped, ...targets]; - queue = queue.filter((i) => i && i.modelName !== modelName); + queue = queue.filter(i => i && i.modelName !== modelName); } cleanLists(); - return targets.map((target) => target.getData()); + return targets.map(target => target.getData()); }; const stopBulkImport = async (modelNames = []) => { @@ -478,73 +475,73 @@ const VariantImporter = (function () { let targets = []; if (modelNames.length) { - modelNames.forEach((modelName) => { - targets = [...targets, ...queue.filter((i) => i && i.modelName === modelName)]; + modelNames.forEach(modelName => { + targets = [...targets, ...queue.filter(i => i && i.modelName === modelName)]; }); } else { targets = queue; } if (targets.length) { - targets.forEach((target) => target.stop()); + targets.forEach(target => target.stop()); stopped = [...stopped, ...targets]; emptyQueue(); } cleanLists(); - return targets.map((target) => target.getData()); + return targets.map(target => target.getData()); }; const getStatus = () => { cleanLists(); return { - queue: queue.map((i) => i.getData()), - failed: failed.map((i) => i.getData()), - stopped: stopped.map((i) => i.getData()), - success: success.map((i) => i.getData()), + queue: queue.map(i => i.getData()), + failed: failed.map(i => i.getData()), + stopped: stopped.map(i => i.getData()), + success: success.map(i => i.getData()), running, }; }; - const acknowledge = (modelName) => { + const acknowledge = modelName => { const targets = [ - ...failed.filter((i) => i && i.modelName === modelName), - ...stopped.filter((i) => i && i.modelName === modelName), - ...success.filter((i) => i && i.modelName === modelName), + ...failed.filter(i => i && i.modelName === modelName), + ...stopped.filter(i => i && i.modelName === modelName), + ...success.filter(i => i && i.modelName === modelName), ]; if (targets.length) { - targets.forEach((target) => target.acknowledge()); + targets.forEach(target => target.acknowledge()); } cleanLists(); - return targets.map((target) => target.getData()); + return targets.map(target => target.getData()); }; - const acknowledgeBulk = (modelNames) => { + const acknowledgeBulk = modelNames => { let targets = []; - modelNames.forEach((modelName) => { + modelNames.forEach(modelName => { targets = [ ...targets, - ...failed.filter((i) => i && i.modelName === modelName), - ...stopped.filter((i) => i && i.modelName === modelName), - ...success.filter((i) => i && i.modelName === modelName), + ...failed.filter(i => i && i.modelName === modelName), + ...stopped.filter(i => i && i.modelName === modelName), + ...success.filter(i => i && i.modelName === modelName), ]; }); if (targets.length) { - targets.forEach((target) => target.acknowledge()); + targets.forEach(target => target.acknowledge()); } cleanLists(); - return targets.map((target) => target.getData()); + return targets.map(target => target.getData()); }; - const resolveConflict = async (modelName, fileId, filename) => { - const targetIndex = failed.findIndex((i) => i.modelName === modelName); + const resolveConflict = (modelName, fileId, filename) => { + const targetIndex = failed.findIndex(i => i.modelName === modelName); if (targetIndex < 0) { return { @@ -558,12 +555,12 @@ const VariantImporter = (function () { // Move resolved conflict from failed to queue const target = failed.splice(targetIndex, 1)[0]; - await target.resolveConflict(fileId, filename); + target.resolveConflict(fileId, filename); queue.push(target); // Start queue if (!running) { - await start(); + start(); } return target.getData(); @@ -573,9 +570,9 @@ const VariantImporter = (function () { running = false; }; - const start = async () => { + const start = () => { running = true; - await run(); + run(); }; const run = async () => { @@ -609,7 +606,7 @@ const VariantImporter = (function () { } if (running && queue.length > 0) { - await run(); + run(); } else { pause(); } diff --git a/cms/src/services/publish/Publisher.js b/cms/src/services/publish/Publisher.js index 5a7087b39..c4c60cafd 100644 --- a/cms/src/services/publish/Publisher.js +++ b/cms/src/services/publish/Publisher.js @@ -185,7 +185,7 @@ const Publisher = (function () { // Start queue if (!running) { - await start(); + start(); } return { success: true, startTime: Date.now() }; @@ -305,7 +305,7 @@ const Publisher = (function () { // Start queue if (!running) { - await start(); + start(); } return { success: true, startTime: Date.now() }; diff --git a/cms/src/services/s3/s3.js b/cms/src/services/s3/s3.js index 20ae67a85..3da666fcb 100644 --- a/cms/src/services/s3/s3.js +++ b/cms/src/services/s3/s3.js @@ -1,12 +1,12 @@ // Use of require instead of import is used here because this file is used by the migrateImages script. // Scripts executed directly and not run through babel have issues with import statements. -import aws from 'aws-sdk'; -import { v4 as uuidv4 } from 'uuid'; - import getLogger from '../../logger.js'; - const logger = getLogger('services/s3'); + +const aws = require('aws-sdk'); +const uuid = require('uuid'); + const S3_BUCKET = process.env.S3_BUCKET; const IAM_USER_KEY = process.env.IAM_USER_KEY; const IAM_USER_SECRET = process.env.IAM_USER_SECRET; @@ -16,8 +16,8 @@ const s3 = new aws.S3({ secretAccessKey: IAM_USER_SECRET, }); -export const uploadToS3 = async (fileName, fileStream, modelName) => { - const Key = `${uuidv4()}-${fileName}`; +const uploadToS3 = async (fileName, fileStream, modelName) => { + const Key = `${uuid.v4()}-${fileName}`; const params = { Bucket: S3_BUCKET, Key, @@ -31,7 +31,7 @@ export const uploadToS3 = async (fileName, fileStream, modelName) => { if (error) { reject({ error, fileName, modelName }); } else { - logger.info( + logger.audit( { Key, Bucket: S3_BUCKET, response: data }, 's3 upload', `Successfully uploaded object to S3`, @@ -42,7 +42,7 @@ export const uploadToS3 = async (fileName, fileStream, modelName) => { }); }; -export const deleteFromS3 = async (id) => { +const deleteFromS3 = async (id) => { const params = { Bucket: S3_BUCKET, Key: id, @@ -56,7 +56,7 @@ export const deleteFromS3 = async (id) => { msg: `image with id ${id} not found`, }; } else { - logger.info(params, 's3 delete', 'Successfully deleted image from S3'); + logger.audit(params, 's3 delete', 'Successfully deleted image from S3'); return { code: 200, msg: `image with id ${id} deleted`, @@ -65,7 +65,7 @@ export const deleteFromS3 = async (id) => { }); }; -export const testS3Connection = () => { +const testS3Connection = () => { const params = { Bucket: S3_BUCKET, }; @@ -80,3 +80,9 @@ export const testS3Connection = () => { }); }); }; + +module.exports = { + uploadToS3, + deleteFromS3, + testS3Connection, +}; diff --git a/cms/src/services/searchClient/common/schemas/model.js b/cms/src/services/searchClient/common/schemas/model.js index ecfa335fb..ba4be67fc 100644 --- a/cms/src/services/searchClient/common/schemas/model.js +++ b/cms/src/services/searchClient/common/schemas/model.js @@ -2,13 +2,14 @@ import mongoose from 'mongoose'; import mongoosastic from 'mongoosastic'; import { ModelSchema } from '../../../../schemas/model.js'; -import getClient from '../client.js'; +import elasticClient from '../client.js'; const index = process.env.ES_INDEX; ModelSchema.plugin(mongoosastic, { - esClient: await getClient(), + client: elasticClient, index, + type: '_doc', }); export const ModelES = mongoose.model('ModelES', ModelSchema); diff --git a/cms/src/services/searchClient/publish.js b/cms/src/services/searchClient/publish.js index bbdb8661c..e943bcd18 100644 --- a/cms/src/services/searchClient/publish.js +++ b/cms/src/services/searchClient/publish.js @@ -66,7 +66,7 @@ export const indexOneToES = async (filter) => { } await indexEsUpdate(); const res = await Model.updateOne({ name: doc.name }, { status: modelStatus.published }); - logger.info({ model: doc.name }, 'publish model', 'Model Published to ES'); + logger.audit({ model: doc.name }, 'publish model', 'Model Published to ES'); return { status: `Indexing successful with status: ${res.result}`, }; diff --git a/cms/src/services/searchClient/unpublish.js b/cms/src/services/searchClient/unpublish.js index 19b4fd445..7658c67b9 100644 --- a/cms/src/services/searchClient/unpublish.js +++ b/cms/src/services/searchClient/unpublish.js @@ -1,19 +1,18 @@ // @ts-check -import Model from '../../schemas/model.js'; -import { modelStatus } from '../../helpers/modelStatus.js'; -import getLogger from '../../logger.js'; - import getClient from './common/client.js'; -import { indexMatchedModelsToES } from './publish.js'; import indexEsUpdate from './update.js'; +import Model from '../../schemas/model.js'; +import { indexMatchedModelsToES } from './publish.js'; +import { modelStatus } from '../../helpers/modelStatus.js'; import { updateGeneSearchIndicies } from './genomicVariants.js'; +import getLogger from '../../logger.js'; const logger = getLogger('services/searchClient/unpublish'); + const index = process.env.ES_INDEX; export const unpublishModel = async (name) => { - console.log('unpublishModel', name); await unpublishOneFromES(name); await indexMatchedModelsToES({ name }); await updateGeneSearchIndicies(); @@ -38,7 +37,7 @@ export const unpublishOneFromES = async (name) => { }, { status: modelStatus.unpublished }, ); - logger.info({ model: name }, 'unpublish model', 'Model Unpublished from ES'); + logger.audit({ model: name }, 'unpublish model', 'Model Unpublished from ES'); }; export const unpublishManyFromES = async (nameArr) => { @@ -46,7 +45,7 @@ export const unpublishManyFromES = async (nameArr) => { // resolve as this is just bookkeeping await indexEsUpdate(); const searchClient = await getClient(); - return await searchClient.deleteByQuery({ + return searchClient.deleteByQuery({ index, body: { query: { diff --git a/cms/src/services/searchClient/update.js b/cms/src/services/searchClient/update.js index 3241e48ce..15c6b1199 100644 --- a/cms/src/services/searchClient/update.js +++ b/cms/src/services/searchClient/update.js @@ -8,9 +8,10 @@ const index = process.env.ES_UPDATE_INDEX; const update = async () => { const searchClient = await getClient(); - return await searchClient + return searchClient .index({ index, + type: index, body: { date: Date.now(), }, diff --git a/ui/src/components/admin/ModelsManager/ModelsManager.jsx b/ui/src/components/admin/ModelsManager/ModelsManager.jsx index fcafc7f73..fa657526b 100644 --- a/ui/src/components/admin/ModelsManager/ModelsManager.jsx +++ b/ui/src/components/admin/ModelsManager/ModelsManager.jsx @@ -26,32 +26,27 @@ const ModelsManager = () => { Model Management - {(context) => { - const { bulkImportVariants, state } = context ?? {}; - return ( - - {(modalState) => ( - - modalState.setModalState({ - component: ( - - ), - shouldCloseOnOverlayClick: true, - styles: AdminModalStyle, - }) - } - disabled={(state && state.isLoading) || publishRunning} - > - - Check for GDC Variants - - )} - - ); - }} + {({ bulkImportVariants, state }) => ( + + {(modalState) => ( + + modalState.setModalState({ + component: , + shouldCloseOnOverlayClick: true, + styles: AdminModalStyle, + }) + } + disabled={(state && state.isLoading) || publishRunning} + > + + Check for GDC Variants + + )} + + )} {({ uploadModelsFromSheet, state }) => ( diff --git a/ui/src/components/admin/helpers/bulkActions.js b/ui/src/components/admin/helpers/bulkActions.js index c49b98046..93f03909a 100644 --- a/ui/src/components/admin/helpers/bulkActions.js +++ b/ui/src/components/admin/helpers/bulkActions.js @@ -1,16 +1,15 @@ // @ts-check -import axios, { AxiosHeaders } from 'axios'; + import { fetchData } from '../services/Fetcher'; import config from '../config'; export const bulkAction = async (action, data = []) => { if (!Array.isArray(data)) throw new Error('Data must be type Array'); - // Fixes 'header name must be a non-empty string' errors - const defaultHeaders = new AxiosHeaders(new axios.AxiosHeaders().toJSON()); + return fetchData({ url: `${config.urls.cmsBase}/bulk/${action}`, data, method: 'post', - headers: defaultHeaders, + headers: '', }); }; From 18ba7a15b15f77d0777dd74e297e0d6ee38cd3e0 Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Thu, 19 Mar 2026 14:43:37 -0400 Subject: [PATCH 10/82] Replace use of logger.audit --- cms/src/helpers/dictionary.js | 43 ++++++++++++---------- cms/src/helpers/genomicVariants.js | 16 ++++---- cms/src/helpers/matchedModels.js | 33 +++++++++-------- cms/src/helpers/uploadTemplate.js | 43 ++++++++++------------ cms/src/hooks.js | 4 +- cms/src/routes/dictionary.js | 32 ++++++++-------- cms/src/services/s3/s3.js | 4 +- cms/src/services/searchClient/publish.js | 2 +- cms/src/services/searchClient/unpublish.js | 2 +- 9 files changed, 90 insertions(+), 89 deletions(-) diff --git a/cms/src/helpers/dictionary.js b/cms/src/helpers/dictionary.js index 3d57807c2..7547ca734 100644 --- a/cms/src/helpers/dictionary.js +++ b/cms/src/helpers/dictionary.js @@ -35,21 +35,21 @@ export const getDictionaryOptions = async () => { const output = dictionary.reduce((acc, field) => { let { name, values } = field; - acc[`${name}Options`] = values.map(i => i.value); + acc[`${name}Options`] = values.map((i) => i.value); return acc; }, {}); - const ctd = dictionary.find(i => i.name === 'clinicalTumorDiagnosis'); + const ctd = dictionary.find((i) => i.name === 'clinicalTumorDiagnosis'); const ctdDependentOptions = {}; - ctd.dependentValues.forEach(val => (ctdDependentOptions[val] = {})); + ctd.dependentValues.forEach((val) => (ctdDependentOptions[val] = {})); - ctd.values.forEach(val => { + ctd.values.forEach((val) => { const valueName = val.value; - val.dependents.forEach(dependent => { + val.dependents.forEach((dependent) => { const dependentName = dependent.name; - const dependentValues = dependent.values.map(val => val.value); + const dependentValues = dependent.values.map((val) => val.value); ctdDependentOptions[dependentName][valueName.toLowerCase()] = dependentValues; }); @@ -63,7 +63,7 @@ export const resetDraft = async () => { const dictionary = await Dictionary.findOne({}, {}, { sort: { created_at: -1 } }); const draft = new Draft({ fields: dictionary.fields }); await draft.save(); - logger.audit({}, 'reset draft', 'Dictionary draft reset'); + logger.info({}, 'reset draft', 'Dictionary draft reset'); return await Draft.findOne({}, {}, { sort: { created_at: -1 } }); }; @@ -77,12 +77,12 @@ export const publishDraft = async () => { // find edited values const edits = []; - draft.fields.forEach(field => { + draft.fields.forEach((field) => { if (field.dependentValues.length > 0) { // dependent field case - field.values.forEach(value => { - value.dependents.forEach(dependent => { - dependent.values.forEach(dependentValue => { + field.values.forEach((value) => { + value.dependents.forEach((dependent) => { + dependent.values.forEach((dependentValue) => { if (dependentValue.status === draftStatus.edited) { edits.push({ field: field.name, @@ -97,7 +97,7 @@ export const publishDraft = async () => { }); } // basic field case - field.values.forEach(value => { + field.values.forEach((value) => { if (value.status === draftStatus.edited) { edits.push({ field: field.name, @@ -119,19 +119,22 @@ export const publishDraft = async () => { const dictionary = new Dictionary({ fields: draft.fields }); await dictionary.save(); - logger.audit({ edits }, 'dictionary created', 'Created new dictionary from draft values'); + logger.info({ edits }, 'dictionary created', 'Created new dictionary from draft values'); - models.forEach(model => { + models.forEach((model) => { // Find these values in the models. let edited = false; - edits.forEach(edit => { + edits.forEach((edit) => { const editField = edit.dependentName ? edit.dependentName : edit.field; // - update those models and change their status if (editField === 'therapy' && model.therapy.includes(edit.original)) { // special case, therapy is an array - model.therapy.splice(model.therapy.indexOf(val => val === edit.original), 1); + model.therapy.splice( + model.therapy.indexOf((val) => val === edit.original), + 1, + ); model.therapy.push(edit.value); model.status = model.status === modelStatus.published ? modelStatus.unpublishedChanges : model.status; @@ -148,7 +151,7 @@ export const publishDraft = async () => { }); if (edited) { model.save(); - logger.audit( + logger.info( { model: model.name }, 'model saved', 'Model values updated due to dictionary publish', @@ -160,7 +163,7 @@ export const publishDraft = async () => { return { dictionary, updatedModels }; }; -export const countDraftStats = draft => { +export const countDraftStats = (draft) => { const output = { edited: 0, new: 0 }; const hasDependencies = draft.dependentValues && draft.dependentValues.length > 0; @@ -202,12 +205,12 @@ export const editValue = (target, original, updated) => { }; export const valueExists = (valuesList, value) => { - return !!valuesList.find(val => val.value === value); + return !!valuesList.find((val) => val.value === value); }; export const removeValueIfNew = (valueList, value) => { const index = valueList.indexOf( - valueList.find(i => i.status === draftStatus.new && i.value === value), + valueList.find((i) => i.status === draftStatus.new && i.value === value), ); if (index >= 0) { valueList.splice(index, 1); diff --git a/cms/src/helpers/genomicVariants.js b/cms/src/helpers/genomicVariants.js index ce90756c5..0f774df47 100644 --- a/cms/src/helpers/genomicVariants.js +++ b/cms/src/helpers/genomicVariants.js @@ -10,7 +10,7 @@ import { import getLogger from '../logger.js'; const logger = getLogger('helpers/genomicVariants'); -export const clearGenomicVariants = async name => { +export const clearGenomicVariants = async (name) => { // Stop any active imports, if any: try { await VariantImporter.stopImport(name); @@ -37,8 +37,8 @@ export const clearGenomicVariants = async name => { } }; -const titleCase = (text, filter = i => true) => { - return text.replace(/\w\S*/g, i => { +const titleCase = (text, filter = (i) => true) => { + return text.replace(/\w\S*/g, (i) => { if (filter(i)) { return i.charAt(0).toUpperCase() + i.substr(1); } @@ -68,9 +68,9 @@ const buildVariantId = ({ } }; -const buildModelUrl = caseId => `${BASE_GDC_URL}/cases/${caseId}`; -const buildMafUrl = fileId => `${BASE_GDC_URL}/files/${fileId}`; -const buildSequenceUrl = caseId => `${BASE_GDC_URL}/cases/${caseId}#files`; +const buildModelUrl = (caseId) => `${BASE_GDC_URL}/cases/${caseId}`; +const buildMafUrl = (fileId) => `${BASE_GDC_URL}/files/${fileId}`; +const buildSequenceUrl = (caseId) => `${BASE_GDC_URL}/cases/${caseId}#files`; export const addGenomicVariantsFromMaf = async (name, mafData, { filename, fileId }, caseId) => { const model = await Model.findOne({ name }); @@ -103,7 +103,7 @@ export const addGenomicVariantsFromMaf = async (name, mafData, { filename, fileI // Properties originally from Reference that are temporarily taken from MAF - Jon Eubank 2020-09-29 const gene = row.Hugo_Symbol; - const gene_biotype = titleCase(row.BIOTYPE.replace(/_/g, ' '), i => !i.includes('RNA')); + const gene_biotype = titleCase(row.BIOTYPE.replace(/_/g, ' '), (i) => !i.includes('RNA')); const name = `${row.Hugo_Symbol} ${aa_change}`; const synonyms = []; @@ -181,7 +181,7 @@ export const addGenomicVariantsFromMaf = async (name, mafData, { filename, fileI } await model.save(); - logger.audit( + logger.info( { model: model.name, genomic_variants: model.genomic_variants ? model.genomic_variants.length : 0, diff --git a/cms/src/helpers/matchedModels.js b/cms/src/helpers/matchedModels.js index a692807cc..9b5d19d9b 100644 --- a/cms/src/helpers/matchedModels.js +++ b/cms/src/helpers/matchedModels.js @@ -8,11 +8,11 @@ import getLogger from '../logger.js'; const logger = getLogger('helpers/matchedModels'); /* Worker methods, take models as inputs */ -const createMatchedModels = async models => { - const modelIds = models.map(model => model._id); +const createMatchedModels = async (models) => { + const modelIds = models.map((model) => model._id); const matchedModels = await MatchedModels.create({ models: modelIds }); - logger.audit( - { matchedModels, models: models.map(model => model.name) }, + logger.info( + { matchedModels, models: models.map((model) => model.name) }, 'matched model set created', 'Created matched models set', ); @@ -24,12 +24,12 @@ const createMatchedModels = async models => { ? modelStatus.unpublished : modelStatus.unpublishedChanges; model.save(); - logger.audit({ model: model.name }, 'model saved', 'Model updated to add matched model set'); + logger.info({ model: model.name }, 'model saved', 'Model updated to add matched model set'); } return matchedModels; }; -const clearModelFromSets = async model => { +const clearModelFromSets = async (model) => { // Get MatchedModels for this model if (!model.matchedModels) { @@ -42,7 +42,7 @@ const clearModelFromSets = async model => { if (matchedModels) { // only do operations on the matched set if we find it. if we didnt, no issue, we are removing this reference anyways matchedModels.models = matchedModels.models.filter( - modelId => modelId.toString() !== model._id.toString(), + (modelId) => modelId.toString() !== model._id.toString(), ); // We need to make sure that when these changes to our model are published, @@ -64,21 +64,21 @@ const clearModelFromSets = async model => { ? modelStatus.unpublished : modelStatus.unpublishedChanges; await otherModel.save(); - logger.audit( + logger.info( { model: otherModel.name }, 'model saved', 'Model updated to remove matched model set', ); } await MatchedModels.deleteOne({ _id: matchedModels._id }); - logger.audit( + logger.info( { matchedModels }, 'matched model set removed', 'Matched models set removed due to having 1 or fewer members after update', ); } else { await matchedModels.save(); - logger.audit({ matchedModels }, 'matched model set saved', 'Matched models set updated'); + logger.info({ matchedModels }, 'matched model set saved', 'Matched models set updated'); } } else { logger.warn( @@ -93,7 +93,7 @@ const clearModelFromSets = async model => { ? modelStatus.unpublished : modelStatus.unpublishedChanges; await model.save(); - logger.audit({ model: model.name }, 'model saved', 'Model updated to remove matched model set'); + logger.info({ model: model.name }, 'model saved', 'Model updated to remove matched model set'); return; }; @@ -103,7 +103,7 @@ const clearModelFromSets = async model => { * Clears the matchedModels for the given model and updates models in the old set to no longer include this model * @param {*} nameToAdd */ -const removeFromSet = async nameToRemove => { +const removeFromSet = async (nameToRemove) => { const model = await Model.findOne({ name: nameToRemove }); if (!model) { throw new Error(`Could not find model with the name: ${nameToRemove}.`); @@ -131,7 +131,8 @@ const connectWithMatchedModels = async (nameToAdd, setMemberName) => { ? await MatchedModels.findOne({ _id: modelToAdd.matchedModels }).populate('models') : null; const inCurrentSet = - currentMatchedModels && currentMatchedModels.models.find(model => model.name === setMemberName); + currentMatchedModels && + currentMatchedModels.models.find((model) => model.name === setMemberName); // Only continue if we have to, if: // a - the target model name (setMemberName) is not in the current matchedModels set @@ -152,7 +153,7 @@ const connectWithMatchedModels = async (nameToAdd, setMemberName) => { // Add model to the set matchedModels.models.push(modelToAdd._id); await matchedModels.save(); - logger.audit( + logger.info( { matchedModels, model: nameToAdd }, 'matched model set updated', 'Matched models set updated to add new model', @@ -165,7 +166,7 @@ const connectWithMatchedModels = async (nameToAdd, setMemberName) => { ? modelStatus.unpublished : modelStatus.unpublishedChanges; await modelToAdd.save(); - logger.audit( + logger.info( { model: modelToAdd.name }, 'model saved', 'Model updated to add to matched model set', @@ -181,7 +182,7 @@ const connectWithMatchedModels = async (nameToAdd, setMemberName) => { } } else { return { - models: currentMatchedModels.models.map(model => model._id), + models: currentMatchedModels.models.map((model) => model._id), _id: currentMatchedModels._id, __v: currentMatchedModels.__v, }; diff --git a/cms/src/helpers/uploadTemplate.js b/cms/src/helpers/uploadTemplate.js index f2a8d6111..21ef0eaf6 100644 --- a/cms/src/helpers/uploadTemplate.js +++ b/cms/src/helpers/uploadTemplate.js @@ -1,18 +1,21 @@ import { google } from 'googleapis'; import { getDictionary } from '../helpers/dictionary.js'; - -import { variantTypes, variantAssessmentType, variantExpressionLevel } from '../schemas/constants.js'; -import Variant from '../schemas/variant'; - +import { + variantTypes, + variantAssessmentType, + variantExpressionLevel, +} from '../schemas/constants.js'; +import Variant from '../schemas/variant.js'; import getLogger from '../logger.js'; + const logger = getLogger('helpers/uploadTemplate'); -const headerRowData = headerNames => ({ - values: headerNames.map(header => ({ userEnteredValue: { stringValue: header } })), +const headerRowData = (headerNames) => ({ + values: headerNames.map((header) => ({ userEnteredValue: { stringValue: header } })), }); -export const createModelUploadTemplate = async authClient => { +export const createModelUploadTemplate = async (authClient) => { const modelColumnHeaders = [ 'Name', 'Type', @@ -96,10 +99,7 @@ export const createModelUploadTemplate = async authClient => { const sheets = google.sheets({ version: 'v4', auth: authClient }); // Date formatted like: May-29-2020-13:51:42 - const dateStamp = Date() - .split(' ') - .splice(1, 4) - .join('-'); + const dateStamp = Date().split(' ').splice(1, 4).join('-'); const spreadsheet = { resource: { @@ -127,7 +127,7 @@ export const createModelUploadTemplate = async authClient => { }); const { spreadsheetId, spreadsheetUrl } = response.data; - const modelSheet = response.data.sheets.find(sheet => sheet.properties.title === 'Models'); + const modelSheet = response.data.sheets.find((sheet) => sheet.properties.title === 'Models'); // Add request for list validation for fields that have enum from data dictionary: const buildValidationRequest = (name, columnIndex) => ({ @@ -142,8 +142,8 @@ export const createModelUploadTemplate = async authClient => { condition: { type: 'ONE_OF_LIST', values: allDictionaryFields - .find(field => field.name === name) - .values.map(value => ({ userEnteredValue: value.value })), + .find((field) => field.name === name) + .values.map((value) => ({ userEnteredValue: value.value })), }, strict: 'true', showCustomUi: 'true', @@ -155,7 +155,7 @@ export const createModelUploadTemplate = async authClient => { for (const i in modelEnumNames) { const name = modelEnumNames[i]; - if (allDictionaryFields.find(field => field.name === name)) { + if (allDictionaryFields.find((field) => field.name === name)) { const request = buildValidationRequest(name, i); requests.push(request); } @@ -181,7 +181,7 @@ export const createModelUploadTemplate = async authClient => { }); }; -export const createVariantUploadTemplate = async authClient => { +export const createVariantUploadTemplate = async (authClient) => { const variantColumnHeaders = [ 'Model Name', 'Variant Name', @@ -191,15 +191,12 @@ export const createVariantUploadTemplate = async authClient => { ]; const variantData = await Variant.find({}); - const variantNames = variantData.map(variant => variant.name); + const variantNames = variantData.map((variant) => variant.name); const sheets = google.sheets({ version: 'v4', auth: authClient }); // Date formatted like: May-29-2020-13:51:42 - const dateStamp = Date() - .split(' ') - .splice(1, 4) - .join('-'); + const dateStamp = Date().split(' ').splice(1, 4).join('-'); const spreadsheet = { resource: { @@ -227,7 +224,7 @@ export const createVariantUploadTemplate = async authClient => { }); const { spreadsheetId, spreadsheetUrl } = response.data; - const variantSheet = response.data.sheets.find(sheet => sheet.properties.title === 'Variants'); + const variantSheet = response.data.sheets.find((sheet) => sheet.properties.title === 'Variants'); const buildValidationRequest = (columnIndex, values) => ({ setDataValidation: { @@ -240,7 +237,7 @@ export const createVariantUploadTemplate = async authClient => { rule: { condition: { type: 'ONE_OF_LIST', - values: values.map(value => ({ userEnteredValue: value })), + values: values.map((value) => ({ userEnteredValue: value })), }, strict: 'true', showCustomUi: 'true', diff --git a/cms/src/hooks.js b/cms/src/hooks.js index 0a5077131..725ed4277 100644 --- a/cms/src/hooks.js +++ b/cms/src/hooks.js @@ -92,7 +92,7 @@ export const outputFn = async (req, res, next) => { }; export const postCreate = async (req, res, next) => { - logger.audit({ model: req.erm.result }, 'model created', 'Model created in mongo'); + logger.info({ model: req.erm.result }, 'model created', 'Model created in mongo'); return next(); }; @@ -106,7 +106,7 @@ export const postUpdate = async (req, res, next) => { }, } = req; - logger.audit({ model: modelName }, 'model saved', 'Model saved in mongo'); + logger.info({ model: modelName }, 'model saved', 'Model saved in mongo'); // Model updates that contain the status key we // treat as being a change in status and trigger diff --git a/cms/src/routes/dictionary.js b/cms/src/routes/dictionary.js index 0794935e3..7862779da 100644 --- a/cms/src/routes/dictionary.js +++ b/cms/src/routes/dictionary.js @@ -70,7 +70,7 @@ draftRouter.patch('/', async (req, res) => { } const draftDoc = await DictionaryHelper.getDictionaryDraft(); - const draft = draftDoc.fields.find(i => i.name === field); + const draft = draftDoc.fields.find((i) => i.name === field); if (!draft) { res.status(400).json({ err: `No dictionary field found named: ${field}` }); @@ -95,7 +95,7 @@ draftRouter.patch('/', async (req, res) => { return; } - const parentValue = draft.values.find(val => + const parentValue = draft.values.find((val) => val.original ? val.original === parent : val.value === parent, ); @@ -104,14 +104,14 @@ draftRouter.patch('/', async (req, res) => { return; } - const dependent = parentValue.dependents.find(dep => dep.name === dependentName); + const dependent = parentValue.dependents.find((dep) => dep.name === dependentName); if (!dependent) { res.status(400).json({ err: `Parent value has no values for this dependent name` }); return; } - const editValue = dependent.values.find(val => + const editValue = dependent.values.find((val) => val.original ? val.original === original : val.value === original, ); @@ -126,7 +126,7 @@ draftRouter.patch('/', async (req, res) => { DictionaryHelper.editValue(editValue, original, updated); } else { // handle basic case - const editValue = draft.values.find(val => + const editValue = draft.values.find((val) => val.original ? val.original === original : val.value === original, ); if (!editValue) { @@ -142,7 +142,7 @@ draftRouter.patch('/', async (req, res) => { draft.stats = DictionaryHelper.countDraftStats(draft); await draftDoc.save(); - logger.audit( + logger.info( { field, parent, dependentName, original, updated }, 'draft updated', 'Dictionary draft value edited', @@ -177,7 +177,7 @@ draftRouter.post('/', async (req, res) => { } const draftDoc = await DictionaryHelper.getDictionaryDraft(); - const draft = draftDoc.fields.find(i => i.name === field); + const draft = draftDoc.fields.find((i) => i.name === field); if (!draft) { res.status(400).json({ err: `No dictionary field found named: ${field}` }); @@ -202,7 +202,7 @@ draftRouter.post('/', async (req, res) => { return; } - const parentValue = draft.values.find(val => + const parentValue = draft.values.find((val) => val.original ? val.original === parent : val.value === parent, ); @@ -211,13 +211,13 @@ draftRouter.post('/', async (req, res) => { return; } - let dependent = parentValue.dependents.find(dep => dep.name === dependentName); + let dependent = parentValue.dependents.find((dep) => dep.name === dependentName); if (!dependent) { dependent = { name: dependentName, // displayName has a replace that does: To Title Case - displayName: dependentName.replace(/\w\S*/g, function(txt) { + displayName: dependentName.replace(/\w\S*/g, function (txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); }), values: [], @@ -244,7 +244,7 @@ draftRouter.post('/', async (req, res) => { } draft.stats = DictionaryHelper.countDraftStats(draft); await draftDoc.save(); - logger.audit( + logger.info( { field, parent, dependentName, value }, 'draft updated', 'Dictionary draft value added', @@ -277,7 +277,7 @@ draftRouter.post('/remove', async (req, res) => { } const draftDoc = await DictionaryHelper.getDictionaryDraft(); - const draft = draftDoc.fields.find(i => i.name === field); + const draft = draftDoc.fields.find((i) => i.name === field); if (!draft) { res.status(400).json({ err: `No dictionary field found named: ${field}` }); @@ -302,7 +302,7 @@ draftRouter.post('/remove', async (req, res) => { return; } - const parentValue = draft.values.find(val => + const parentValue = draft.values.find((val) => val.original ? val.original === parent : val.value === parent, ); @@ -311,13 +311,13 @@ draftRouter.post('/remove', async (req, res) => { return; } - let dependent = parentValue.dependents.find(dep => dep.name === dependentName); + let dependent = parentValue.dependents.find((dep) => dep.name === dependentName); if (!dependent) { dependent = { name: dependentName, // displayName has a replace that does: To Title Case - displayName: dependentName.replace(/\w\S*/g, function(txt) { + displayName: dependentName.replace(/\w\S*/g, function (txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); }), values: [], @@ -345,7 +345,7 @@ draftRouter.post('/remove', async (req, res) => { } draft.stats = DictionaryHelper.countDraftStats(draft); await draftDoc.save(); - logger.audit( + logger.info( { field, parent, dependentName, value }, 'draft updated', 'Dictionary draft new value removed', diff --git a/cms/src/services/s3/s3.js b/cms/src/services/s3/s3.js index 3da666fcb..ffaf72e54 100644 --- a/cms/src/services/s3/s3.js +++ b/cms/src/services/s3/s3.js @@ -31,7 +31,7 @@ const uploadToS3 = async (fileName, fileStream, modelName) => { if (error) { reject({ error, fileName, modelName }); } else { - logger.audit( + logger.info( { Key, Bucket: S3_BUCKET, response: data }, 's3 upload', `Successfully uploaded object to S3`, @@ -56,7 +56,7 @@ const deleteFromS3 = async (id) => { msg: `image with id ${id} not found`, }; } else { - logger.audit(params, 's3 delete', 'Successfully deleted image from S3'); + logger.info(params, 's3 delete', 'Successfully deleted image from S3'); return { code: 200, msg: `image with id ${id} deleted`, diff --git a/cms/src/services/searchClient/publish.js b/cms/src/services/searchClient/publish.js index e943bcd18..bbdb8661c 100644 --- a/cms/src/services/searchClient/publish.js +++ b/cms/src/services/searchClient/publish.js @@ -66,7 +66,7 @@ export const indexOneToES = async (filter) => { } await indexEsUpdate(); const res = await Model.updateOne({ name: doc.name }, { status: modelStatus.published }); - logger.audit({ model: doc.name }, 'publish model', 'Model Published to ES'); + logger.info({ model: doc.name }, 'publish model', 'Model Published to ES'); return { status: `Indexing successful with status: ${res.result}`, }; diff --git a/cms/src/services/searchClient/unpublish.js b/cms/src/services/searchClient/unpublish.js index 7658c67b9..079a218cb 100644 --- a/cms/src/services/searchClient/unpublish.js +++ b/cms/src/services/searchClient/unpublish.js @@ -37,7 +37,7 @@ export const unpublishOneFromES = async (name) => { }, { status: modelStatus.unpublished }, ); - logger.audit({ model: name }, 'unpublish model', 'Model Unpublished from ES'); + logger.info({ model: name }, 'unpublish model', 'Model Unpublished from ES'); }; export const unpublishManyFromES = async (nameArr) => { From 115deae58f74ae206f59b431c395f29b39b5dcd4 Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Thu, 19 Mar 2026 14:54:53 -0400 Subject: [PATCH 11/82] Quick clean up --- cms/src/routes/bulk.js | 2 +- cms/src/routes/publish.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cms/src/routes/bulk.js b/cms/src/routes/bulk.js index 9d6b0e555..5fa48a5de 100644 --- a/cms/src/routes/bulk.js +++ b/cms/src/routes/bulk.js @@ -10,7 +10,7 @@ import { unpublishManyFromES } from '../services/searchClient/unpublish.js'; import csvStream from '../helpers/streamAsCSV.js'; import { backupFields } from '../schemas/descriptions/model.js'; import { updateGeneSearchIndicies } from '../services/searchClient/genomicVariants.js'; -import getLogger from '../logger'; +import getLogger from '../logger.js'; const logger = getLogger('routes/bulk'); const bulkRouter = express.Router(); diff --git a/cms/src/routes/publish.js b/cms/src/routes/publish.js index ea82a5ccf..0d6fc70b6 100644 --- a/cms/src/routes/publish.js +++ b/cms/src/routes/publish.js @@ -169,7 +169,7 @@ publishRouter.post('/acknowledge/:name', async (req, res) => { logger.debug(`Acknowledging publish status for model ${name}`); const acknowledged = Publisher.acknowledge(name); - console.log('acknowledge/:name', acknowledged); + return res.status(200).json({ acknowledged, success: true }); } catch (error) { logger.error(error, `Error occurred during publish status acknowledgement for model ${name}`); From 0569dcb6f3031a0fc862ccad67f1a95aee1bee58 Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Thu, 19 Mar 2026 16:39:59 -0400 Subject: [PATCH 12/82] First Working Publish --- cms/src/routes/action.js | 2 +- cms/src/schemas/genes.js | 4 +- .../searchClient/common/schemas/model.js | 4 +- .../{update.js => indexLastUpdated.js} | 5 +- cms/src/services/searchClient/indexModel.js | 25 + cms/src/services/searchClient/publish.js | 72 +- cms/src/services/searchClient/unpublish.js | 13 +- scripts/utils/republishUtils.js | 4 +- yarn.lock | 1213 ++++++++++++----- 9 files changed, 982 insertions(+), 360 deletions(-) rename cms/src/services/searchClient/{update.js => indexLastUpdated.js} (88%) create mode 100644 cms/src/services/searchClient/indexModel.js diff --git a/cms/src/routes/action.js b/cms/src/routes/action.js index d807955c1..959522ebe 100644 --- a/cms/src/routes/action.js +++ b/cms/src/routes/action.js @@ -23,7 +23,7 @@ actionRouter.post('/publish/:name', async (req, res) => { }) .populate('variants.variant') .then((models) => runYupValidatorFailFast(validation, models)) - .then(() => publishModel({ name })) + .then(async () => await publishModel({ name })) .then(() => res.json({ success: `${name} has been successfully published` })) .catch((error) => { logger.error(error); diff --git a/cms/src/schemas/genes.js b/cms/src/schemas/genes.js index 1aa769182..620c07d1c 100644 --- a/cms/src/schemas/genes.js +++ b/cms/src/schemas/genes.js @@ -1,7 +1,7 @@ import mongoose from 'mongoose'; import mongoosastic from 'mongoosastic'; -import elasticClient from '../services/searchClient/common/client.js'; +import getSearchClient from '../services/searchClient/common/client.js'; const GeneSchema = new mongoose.Schema( { @@ -18,7 +18,7 @@ const GeneSchema = new mongoose.Schema( ); GeneSchema.plugin(mongoosastic, { - client: elasticClient(), + esClient: getSearchClient(), index: 'genes', type: '_doc', }); diff --git a/cms/src/services/searchClient/common/schemas/model.js b/cms/src/services/searchClient/common/schemas/model.js index ba4be67fc..eba39cdf1 100644 --- a/cms/src/services/searchClient/common/schemas/model.js +++ b/cms/src/services/searchClient/common/schemas/model.js @@ -2,12 +2,12 @@ import mongoose from 'mongoose'; import mongoosastic from 'mongoosastic'; import { ModelSchema } from '../../../../schemas/model.js'; -import elasticClient from '../client.js'; +import getSearchClient from '../client.js'; const index = process.env.ES_INDEX; ModelSchema.plugin(mongoosastic, { - client: elasticClient, + esClient: getSearchClient(), index, type: '_doc', }); diff --git a/cms/src/services/searchClient/update.js b/cms/src/services/searchClient/indexLastUpdated.js similarity index 88% rename from cms/src/services/searchClient/update.js rename to cms/src/services/searchClient/indexLastUpdated.js index 15c6b1199..e455ad991 100644 --- a/cms/src/services/searchClient/update.js +++ b/cms/src/services/searchClient/indexLastUpdated.js @@ -6,12 +6,11 @@ const logger = getLogger('services/searchClient/update'); const index = process.env.ES_UPDATE_INDEX; -const update = async () => { +const indexLastUpdated = async () => { const searchClient = await getClient(); return searchClient .index({ index, - type: index, body: { date: Date.now(), }, @@ -22,4 +21,4 @@ const update = async () => { ); }; -export default update; +export default indexLastUpdated; diff --git a/cms/src/services/searchClient/indexModel.js b/cms/src/services/searchClient/indexModel.js new file mode 100644 index 000000000..28a39ee4f --- /dev/null +++ b/cms/src/services/searchClient/indexModel.js @@ -0,0 +1,25 @@ +// @ts-check + +import getClient from './common/client.js'; +import getLogger from '../../logger.js'; +const logger = getLogger('services/searchClient/update'); + +const index = process.env.ES_INDEX; + +const indexModel = async (model) => { + const searchClient = await getClient(); + console.log('model for index', model); + return searchClient + .index({ + index, + body: { + ...model, + }, + }) + .catch((error) => + // Catch here as we do not want an error here to block execution of the app + logger.error(error, index, `Error indexing Model data`), + ); +}; + +export default indexModel; diff --git a/cms/src/services/searchClient/publish.js b/cms/src/services/searchClient/publish.js index bbdb8661c..7a4f9da02 100644 --- a/cms/src/services/searchClient/publish.js +++ b/cms/src/services/searchClient/publish.js @@ -5,7 +5,8 @@ import MatchUtils from '../../helpers/matchedModels.js'; import getLogger from '../../logger.js'; import { ModelES } from './common/schemas/model.js'; -import indexEsUpdate from './update.js'; +import indexLastUpdated from './indexLastUpdated.js'; +import indexModel from './indexModel.js'; import { updateGeneSearchIndicies } from './genomicVariants.js'; const logger = getLogger('services/searchClient/publish'); @@ -43,38 +44,43 @@ export const bulkUpdateGeneSearchIndices = async (modelNames) => { }; export const indexOneToES = async (filter) => { - const validation = await getPublishValidation(); - const doc = await ModelES.findOne(filter) - .populate('variants.variant') - .populate('matchedModels') - .exec(); - - // Validate doc against publish schema - // for "on-demand" publishing - return await validation - .validate(doc) - .then(async () => { - // Need to populate and filter the matched models - if (doc.matchedModels) { - const matchedModels = await ModelES.find({ - _id: { $in: doc.matchedModels.models || [] }, - }); - const matches = matchedModels.filter( - (model) => model.status !== modelStatus.unpublished && model.name !== doc.name, - ); - doc.populatedMatches = matches; - } - await indexEsUpdate(); - const res = await Model.updateOne({ name: doc.name }, { status: modelStatus.published }); - logger.info({ model: doc.name }, 'publish model', 'Model Published to ES'); - return { - status: `Indexing successful with status: ${res.result}`, - }; - }) - .catch((err) => { - logger.error('Error at indexOneToES', err); - throw err; - }); + try { + const validation = await getPublishValidation(); + const doc = await ModelES.findOne(filter) + .populate('variants.variant') + .populate('matchedModels') + .exec(); + + // Validate doc against publish schema for "on-demand" publishing + await validation.validate(doc); + + // Index model into ElasticSearch + const { _doc } = doc; + delete _doc._id; + + await indexModel(_doc); + + // Need to populate and filter the matched models + if (doc.matchedModels) { + const matchedModels = await ModelES.find({ + _id: { $in: doc.matchedModels.models || [] }, + }); + const matches = matchedModels.filter( + (model) => model.status !== modelStatus.unpublished && model.name !== doc.name, + ); + doc.populatedMatches = matches; + } + await indexLastUpdated(); + const res = await Model.updateOne({ name: doc.name }, { status: modelStatus.published }); + + logger.info({ model: doc.name }, 'publish model', 'Model Published to ES'); + return { + status: `Indexing successful with status: ${res.result}`, + }; + } catch (err) { + logger.error('Error at indexOneToES', err); + throw err; + } }; /** diff --git a/cms/src/services/searchClient/unpublish.js b/cms/src/services/searchClient/unpublish.js index 079a218cb..b72d3a8f7 100644 --- a/cms/src/services/searchClient/unpublish.js +++ b/cms/src/services/searchClient/unpublish.js @@ -1,13 +1,14 @@ // @ts-check -import getClient from './common/client.js'; -import indexEsUpdate from './update.js'; import Model from '../../schemas/model.js'; -import { indexMatchedModelsToES } from './publish.js'; import { modelStatus } from '../../helpers/modelStatus.js'; +import getLogger from '../../logger.js'; + +import getClient from './common/client.js'; +import indexLastUpdated from './indexLastUpdated.js'; +import { indexMatchedModelsToES } from './publish.js'; import { updateGeneSearchIndicies } from './genomicVariants.js'; -import getLogger from '../../logger.js'; const logger = getLogger('services/searchClient/unpublish'); const index = process.env.ES_INDEX; @@ -21,7 +22,7 @@ export const unpublishModel = async (name) => { export const unpublishOneFromES = async (name) => { // Not waiting for update promise to // resolve as this is just bookkeeping - await indexEsUpdate(); + await indexLastUpdated(); const searchClient = await getClient(); await searchClient.deleteByQuery({ index, @@ -43,7 +44,7 @@ export const unpublishOneFromES = async (name) => { export const unpublishManyFromES = async (nameArr) => { // Not waiting for update promise to // resolve as this is just bookkeeping - await indexEsUpdate(); + await indexLastUpdated(); const searchClient = await getClient(); return searchClient.deleteByQuery({ index, diff --git a/scripts/utils/republishUtils.js b/scripts/utils/republishUtils.js index da5ff6317..46937c29d 100644 --- a/scripts/utils/republishUtils.js +++ b/scripts/utils/republishUtils.js @@ -12,7 +12,7 @@ import '../../cms/src/schemas/matchedModels.js'; import { modelStatus } from '../../cms/src/helpers/modelStatus.js'; -import indexEsUpdate from '../../cms/src/services/searchClient/update.js'; +import indexLastUpdated from '../../cms/src/services/searchClient/indexLastUpdate.js'; export const republishModels = async () => { console.log('Connecting to MongoDB...'); @@ -33,7 +33,7 @@ export const republishModels = async () => { await publishModel({ name: model.name }); } - indexEsUpdate(); + indexLastUpdated(); mongoose.disconnect(); }; diff --git a/yarn.lock b/yarn.lock index e7b90c123..36f857ec0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -110,6 +110,437 @@ dependencies: xss "^1.0.8" +"@aws-crypto/sha256-browser@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e" + integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw== + dependencies: + "@aws-crypto/sha256-js" "^5.2.0" + "@aws-crypto/supports-web-crypto" "^5.2.0" + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + +"@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz#c4fdb773fdbed9a664fc1a95724e206cf3860042" + integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + +"@aws-crypto/supports-web-crypto@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz#a1e399af29269be08e695109aa15da0a07b5b5fb" + integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== + dependencies: + tslib "^2.6.2" + +"@aws-crypto/util@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-5.2.0.tgz#71284c9cffe7927ddadac793c14f14886d3876da" + integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== + dependencies: + "@aws-sdk/types" "^3.222.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-cognito-identity@3.1012.0": + version "3.1012.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.1012.0.tgz#ec2e751811830ced9d72bf854da1bdf2546a3540" + integrity sha512-LTQtg7+aFF4aOex9Q68lOPxlvtneml8OGW3wDE4z44vT+XdmKRQf3+A8ROig++v7LwAQl5vfI40AMs5zJZc7GQ== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "^3.973.21" + "@aws-sdk/credential-provider-node" "^3.972.22" + "@aws-sdk/middleware-host-header" "^3.972.8" + "@aws-sdk/middleware-logger" "^3.972.8" + "@aws-sdk/middleware-recursion-detection" "^3.972.8" + "@aws-sdk/middleware-user-agent" "^3.972.22" + "@aws-sdk/region-config-resolver" "^3.972.8" + "@aws-sdk/types" "^3.973.6" + "@aws-sdk/util-endpoints" "^3.996.5" + "@aws-sdk/util-user-agent-browser" "^3.972.8" + "@aws-sdk/util-user-agent-node" "^3.973.8" + "@smithy/config-resolver" "^4.4.11" + "@smithy/core" "^3.23.12" + "@smithy/fetch-http-handler" "^5.3.15" + "@smithy/hash-node" "^4.2.12" + "@smithy/invalid-dependency" "^4.2.12" + "@smithy/middleware-content-length" "^4.2.12" + "@smithy/middleware-endpoint" "^4.4.26" + "@smithy/middleware-retry" "^4.4.43" + "@smithy/middleware-serde" "^4.2.15" + "@smithy/middleware-stack" "^4.2.12" + "@smithy/node-config-provider" "^4.3.12" + "@smithy/node-http-handler" "^4.5.0" + "@smithy/protocol-http" "^5.3.12" + "@smithy/smithy-client" "^4.12.6" + "@smithy/types" "^4.13.1" + "@smithy/url-parser" "^4.2.12" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-body-length-browser" "^4.2.2" + "@smithy/util-body-length-node" "^4.2.3" + "@smithy/util-defaults-mode-browser" "^4.3.42" + "@smithy/util-defaults-mode-node" "^4.2.45" + "@smithy/util-endpoints" "^3.3.3" + "@smithy/util-middleware" "^4.2.12" + "@smithy/util-retry" "^4.2.12" + "@smithy/util-utf8" "^4.2.2" + tslib "^2.6.2" + +"@aws-sdk/core@^3.973.21": + version "3.973.21" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.973.21.tgz#9e33ba3a6462492e5807a0336fcc4edd6f9a7ba2" + integrity sha512-OTUcDX9Yfz/FLKbHjiMaP9D4Hs44lYJzN7zBcrK2nDmBt0Wr8D6nYt12QoBkZsW0nVMFsTIGaZCrsU9zCcIMXQ== + dependencies: + "@aws-sdk/types" "^3.973.6" + "@aws-sdk/xml-builder" "^3.972.12" + "@smithy/core" "^3.23.12" + "@smithy/node-config-provider" "^4.3.12" + "@smithy/property-provider" "^4.2.12" + "@smithy/protocol-http" "^5.3.12" + "@smithy/signature-v4" "^5.3.12" + "@smithy/smithy-client" "^4.12.6" + "@smithy/types" "^4.13.1" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-middleware" "^4.2.12" + "@smithy/util-utf8" "^4.2.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-cognito-identity@^3.972.14": + version "3.972.14" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.972.14.tgz#590cef8b0727a7a1caa1739bc3f9a2c710ed8751" + integrity sha512-gvN2aWLe+uSzCB9ys/NcuJwWNCmBtPpP1Y6gAw8zJi772Glci6eTJ+Hvlyj3t838hoFbBvFUvz4eev7jW2a5Sw== + dependencies: + "@aws-sdk/nested-clients" "^3.996.11" + "@aws-sdk/types" "^3.973.6" + "@smithy/property-provider" "^4.2.12" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-env@^3.972.19": + version "3.972.19" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.19.tgz#01925d52e5fcc0da57c6012c98d1fc70287b757d" + integrity sha512-33NpkQtmnsjLr9QdZvL3w8bjy+WoBJ+jY8JwuzxIq38rDNi1kwpBWW7Yjh+8bMlksd+ZAWW0fH4S/6OeoAdU5A== + dependencies: + "@aws-sdk/core" "^3.973.21" + "@aws-sdk/types" "^3.973.6" + "@smithy/property-provider" "^4.2.12" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-http@^3.972.21": + version "3.972.21" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.21.tgz#53b42489f126dfd8e38de859cf95b7c8eff55d64" + integrity sha512-xFke7yjbON4unNOG0TApQwz+o1LH5VhVLgWlUuiLRWNDyBfeHIFje2ck8qHybvJ8Fkm5m3SsN+pvHtVo6PGWlQ== + dependencies: + "@aws-sdk/core" "^3.973.21" + "@aws-sdk/types" "^3.973.6" + "@smithy/fetch-http-handler" "^5.3.15" + "@smithy/node-http-handler" "^4.5.0" + "@smithy/property-provider" "^4.2.12" + "@smithy/protocol-http" "^5.3.12" + "@smithy/smithy-client" "^4.12.6" + "@smithy/types" "^4.13.1" + "@smithy/util-stream" "^4.5.20" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-ini@^3.972.21": + version "3.972.21" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.21.tgz#d324b1c86759bc57fa201637dd58c9e8b9454d14" + integrity sha512-fmJN7KhB7CoG65w9fC2LVOd2wZbR2d1yJIpZNe2J5CeDPu7nUHSmavuJAeGEoE3OL5UIBVPNhmK/fV/NQrs3Hw== + dependencies: + "@aws-sdk/core" "^3.973.21" + "@aws-sdk/credential-provider-env" "^3.972.19" + "@aws-sdk/credential-provider-http" "^3.972.21" + "@aws-sdk/credential-provider-login" "^3.972.21" + "@aws-sdk/credential-provider-process" "^3.972.19" + "@aws-sdk/credential-provider-sso" "^3.972.21" + "@aws-sdk/credential-provider-web-identity" "^3.972.21" + "@aws-sdk/nested-clients" "^3.996.11" + "@aws-sdk/types" "^3.973.6" + "@smithy/credential-provider-imds" "^4.2.12" + "@smithy/property-provider" "^4.2.12" + "@smithy/shared-ini-file-loader" "^4.4.7" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-login@^3.972.21": + version "3.972.21" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.21.tgz#91d131e707de09bde13bde7210146746a1f6ef19" + integrity sha512-ENU+YCiuQocQjfIf9bPxZ+ZY0wIBkl3SMH22optBQwy8UFpSfonHynXzGT27xQxer4cYTNOpwDqbfo57BusbpQ== + dependencies: + "@aws-sdk/core" "^3.973.21" + "@aws-sdk/nested-clients" "^3.996.11" + "@aws-sdk/types" "^3.973.6" + "@smithy/property-provider" "^4.2.12" + "@smithy/protocol-http" "^5.3.12" + "@smithy/shared-ini-file-loader" "^4.4.7" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-node@^3.972.22": + version "3.972.22" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.22.tgz#8d074c9d244120963a776732b52517f42e360bf8" + integrity sha512-VE6i8nkmrRyhKut7nnfCWRbdDf+CfyRr8ixSwdaPDguYlgvkAO2pHu9oK11XzbSuatB0io1ozI/vpYhelXn8Pg== + dependencies: + "@aws-sdk/credential-provider-env" "^3.972.19" + "@aws-sdk/credential-provider-http" "^3.972.21" + "@aws-sdk/credential-provider-ini" "^3.972.21" + "@aws-sdk/credential-provider-process" "^3.972.19" + "@aws-sdk/credential-provider-sso" "^3.972.21" + "@aws-sdk/credential-provider-web-identity" "^3.972.21" + "@aws-sdk/types" "^3.973.6" + "@smithy/credential-provider-imds" "^4.2.12" + "@smithy/property-provider" "^4.2.12" + "@smithy/shared-ini-file-loader" "^4.4.7" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-process@^3.972.19": + version "3.972.19" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.19.tgz#f9f2bc9e454a0b7b396a71b9668767b6e88bf3b0" + integrity sha512-hjj5bFo4kf5/WzAMjDEFByVOMbq5gZiagIpJexf7Kp9nIDaGzhCphMsx03NCA8s9zUJzHlD1lXazd7MS+e03Lg== + dependencies: + "@aws-sdk/core" "^3.973.21" + "@aws-sdk/types" "^3.973.6" + "@smithy/property-provider" "^4.2.12" + "@smithy/shared-ini-file-loader" "^4.4.7" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-sso@^3.972.21": + version "3.972.21" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.21.tgz#d5f3a631543fbfc40aabc6203508e8b5eb2c2bb4" + integrity sha512-9jWRCuMZpZKlqCZ46bvievqdfswsyB2yPAr9rOiN+FxaGgf8jrR5iYDqJgscvk1jrbAxiK4cIjHv3XjIAWAhzQ== + dependencies: + "@aws-sdk/core" "^3.973.21" + "@aws-sdk/nested-clients" "^3.996.11" + "@aws-sdk/token-providers" "3.1012.0" + "@aws-sdk/types" "^3.973.6" + "@smithy/property-provider" "^4.2.12" + "@smithy/shared-ini-file-loader" "^4.4.7" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-web-identity@^3.972.21": + version "3.972.21" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.21.tgz#3aaa4eee30579bb649c106bfcaa4b28bdfeccc2c" + integrity sha512-ShWQO/cQVZ+j3zUDK7Kj+m7grPzQCVA2iaZdJ+hJTGvVH5lR32Ip/rgZZ+zBdH6D6wczP9Upa4NMXoqJdGpK1g== + dependencies: + "@aws-sdk/core" "^3.973.21" + "@aws-sdk/nested-clients" "^3.996.11" + "@aws-sdk/types" "^3.973.6" + "@smithy/property-provider" "^4.2.12" + "@smithy/shared-ini-file-loader" "^4.4.7" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@aws-sdk/credential-providers@^3.186.0": + version "3.1012.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.1012.0.tgz#ac3b79712a5ac60196036a0cd8ee9b84332d2d75" + integrity sha512-sXXj6aiqDkwNSfsp2Qh89vX4BQwlI04MaHvynfxYkPWe93FDmD9Jy+qidsb2XU6i9oWLL6ptALgGFQwBzV0/cQ== + dependencies: + "@aws-sdk/client-cognito-identity" "3.1012.0" + "@aws-sdk/core" "^3.973.21" + "@aws-sdk/credential-provider-cognito-identity" "^3.972.14" + "@aws-sdk/credential-provider-env" "^3.972.19" + "@aws-sdk/credential-provider-http" "^3.972.21" + "@aws-sdk/credential-provider-ini" "^3.972.21" + "@aws-sdk/credential-provider-login" "^3.972.21" + "@aws-sdk/credential-provider-node" "^3.972.22" + "@aws-sdk/credential-provider-process" "^3.972.19" + "@aws-sdk/credential-provider-sso" "^3.972.21" + "@aws-sdk/credential-provider-web-identity" "^3.972.21" + "@aws-sdk/nested-clients" "^3.996.11" + "@aws-sdk/types" "^3.973.6" + "@smithy/config-resolver" "^4.4.11" + "@smithy/core" "^3.23.12" + "@smithy/credential-provider-imds" "^4.2.12" + "@smithy/node-config-provider" "^4.3.12" + "@smithy/property-provider" "^4.2.12" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@aws-sdk/middleware-host-header@^3.972.8": + version "3.972.8" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz#72186e96500b49b38fb5482d6b7bf95e5b985281" + integrity sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ== + dependencies: + "@aws-sdk/types" "^3.973.6" + "@smithy/protocol-http" "^5.3.12" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@aws-sdk/middleware-logger@^3.972.8": + version "3.972.8" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz#7fee4223afcb6f7828dbdf4ea745ce15027cf384" + integrity sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA== + dependencies: + "@aws-sdk/types" "^3.973.6" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@aws-sdk/middleware-recursion-detection@^3.972.8": + version "3.972.8" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.8.tgz#072f3f0960a666c7f5756661f9340f5544c2633a" + integrity sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA== + dependencies: + "@aws-sdk/types" "^3.973.6" + "@aws/lambda-invoke-store" "^0.2.2" + "@smithy/protocol-http" "^5.3.12" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@aws-sdk/middleware-user-agent@^3.972.22": + version "3.972.22" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.22.tgz#71eb373ae741a93c9c3634ffa179db656dcad8d6" + integrity sha512-pZPNGWZVQvgUIO/P9PXZNz7ciq9mLYb/wQEurg3phKTa3DiBIunIRcgA0eBNwmog6S3oy0KR1bv4EJ4ld9A5sQ== + dependencies: + "@aws-sdk/core" "^3.973.21" + "@aws-sdk/types" "^3.973.6" + "@aws-sdk/util-endpoints" "^3.996.5" + "@smithy/core" "^3.23.12" + "@smithy/protocol-http" "^5.3.12" + "@smithy/types" "^4.13.1" + "@smithy/util-retry" "^4.2.12" + tslib "^2.6.2" + +"@aws-sdk/nested-clients@^3.996.11": + version "3.996.11" + resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.996.11.tgz#54cb5fe1a36596608f1e43077327e9499ef7c753" + integrity sha512-i7SwoSR4JB/79JoGDUACnFUQOZwXGLWNX35lIb1Pq72nUGlVV+RFZp+BLa8S+mog2pbXU9+6Kc5YwGiMi5bKhQ== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "^3.973.21" + "@aws-sdk/middleware-host-header" "^3.972.8" + "@aws-sdk/middleware-logger" "^3.972.8" + "@aws-sdk/middleware-recursion-detection" "^3.972.8" + "@aws-sdk/middleware-user-agent" "^3.972.22" + "@aws-sdk/region-config-resolver" "^3.972.8" + "@aws-sdk/types" "^3.973.6" + "@aws-sdk/util-endpoints" "^3.996.5" + "@aws-sdk/util-user-agent-browser" "^3.972.8" + "@aws-sdk/util-user-agent-node" "^3.973.8" + "@smithy/config-resolver" "^4.4.11" + "@smithy/core" "^3.23.12" + "@smithy/fetch-http-handler" "^5.3.15" + "@smithy/hash-node" "^4.2.12" + "@smithy/invalid-dependency" "^4.2.12" + "@smithy/middleware-content-length" "^4.2.12" + "@smithy/middleware-endpoint" "^4.4.26" + "@smithy/middleware-retry" "^4.4.43" + "@smithy/middleware-serde" "^4.2.15" + "@smithy/middleware-stack" "^4.2.12" + "@smithy/node-config-provider" "^4.3.12" + "@smithy/node-http-handler" "^4.5.0" + "@smithy/protocol-http" "^5.3.12" + "@smithy/smithy-client" "^4.12.6" + "@smithy/types" "^4.13.1" + "@smithy/url-parser" "^4.2.12" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-body-length-browser" "^4.2.2" + "@smithy/util-body-length-node" "^4.2.3" + "@smithy/util-defaults-mode-browser" "^4.3.42" + "@smithy/util-defaults-mode-node" "^4.2.45" + "@smithy/util-endpoints" "^3.3.3" + "@smithy/util-middleware" "^4.2.12" + "@smithy/util-retry" "^4.2.12" + "@smithy/util-utf8" "^4.2.2" + tslib "^2.6.2" + +"@aws-sdk/region-config-resolver@^3.972.8": + version "3.972.8" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz#761475f0b06fab0bbba954477e66b51d2f780f50" + integrity sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw== + dependencies: + "@aws-sdk/types" "^3.973.6" + "@smithy/config-resolver" "^4.4.11" + "@smithy/node-config-provider" "^4.3.12" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@aws-sdk/token-providers@3.1012.0": + version "3.1012.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.1012.0.tgz#bd1b3951447a4050555213810ba9cec58fc75539" + integrity sha512-vzKwy020zjuiF4WTJzejx5nYcXJnRhHpb6i3lyZHIwfFwXG1yX4bzBVNMWYWF+bz1i2Pp2VhJbPyzpqj4VuJXQ== + dependencies: + "@aws-sdk/core" "^3.973.21" + "@aws-sdk/nested-clients" "^3.996.11" + "@aws-sdk/types" "^3.973.6" + "@smithy/property-provider" "^4.2.12" + "@smithy/shared-ini-file-loader" "^4.4.7" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@aws-sdk/types@^3.222.0", "@aws-sdk/types@^3.973.6": + version "3.973.6" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.973.6.tgz#1964a7c01b5cb18befa445998ad1d02f86c5432d" + integrity sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw== + dependencies: + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@aws-sdk/util-endpoints@^3.996.5": + version "3.996.5" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.996.5.tgz#6b12e80869ae6e84075bc24c2a4e6273ea87dfc2" + integrity sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw== + dependencies: + "@aws-sdk/types" "^3.973.6" + "@smithy/types" "^4.13.1" + "@smithy/url-parser" "^4.2.12" + "@smithy/util-endpoints" "^3.3.3" + tslib "^2.6.2" + +"@aws-sdk/util-locate-window@^3.0.0": + version "3.965.5" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz#e30e6ff2aff6436209ed42c765dec2d2a48df7c0" + integrity sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ== + dependencies: + tslib "^2.6.2" + +"@aws-sdk/util-user-agent-browser@^3.972.8": + version "3.972.8" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz#1044845c97c898cd68fc3f9c773494a6a98cdf80" + integrity sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA== + dependencies: + "@aws-sdk/types" "^3.973.6" + "@smithy/types" "^4.13.1" + bowser "^2.11.0" + tslib "^2.6.2" + +"@aws-sdk/util-user-agent-node@^3.973.8": + version "3.973.8" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.8.tgz#feae67ef8871ec02a2726324c80d106f9636cbd2" + integrity sha512-Kvb96TafGPLYo4Z2GRCzQTne77epXgiZEo0DDXwavzkWmgDV/1XD1tMA766gzRcHHFUraWsE+4T8DKtPTZUxgQ== + dependencies: + "@aws-sdk/middleware-user-agent" "^3.972.22" + "@aws-sdk/types" "^3.973.6" + "@smithy/node-config-provider" "^4.3.12" + "@smithy/types" "^4.13.1" + "@smithy/util-config-provider" "^4.2.2" + tslib "^2.6.2" + +"@aws-sdk/xml-builder@^3.972.12": + version "3.972.13" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.972.13.tgz#3ad84361fadca5011c6774ebabcf5dd1e8a36563" + integrity sha512-I/+BMxM4WE/6xL0tyV7tAUDOAXmyw/va1oGr/eSly43HmLUcD1G+v96vEKAA8VoLcZ03ZQo/PWzjmN9zQErqPQ== + dependencies: + "@smithy/types" "^4.13.1" + fast-xml-parser "5.5.6" + tslib "^2.6.2" + +"@aws/lambda-invoke-store@^0.2.2": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz#802f6a50f6b6589063ef63ba8acdee86fcb9f395" + integrity sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ== + "@babel/cli@^7.2.3": version "7.28.3" resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.28.3.tgz#f33693753bc103ab0084a5776ccf8ab8a140038b" @@ -2189,13 +2620,6 @@ dependencies: sparse-bitfield "^3.0.3" -"@mongodb-js/saslprep@^1.3.0": - version "1.4.6" - resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.4.6.tgz#2edf5819fa0e69d86059f44d1fe57ae9d7817c12" - integrity sha512-y+x3H1xBZd38n10NZF/rEBlvDOOMQ6LKUTHqr8R9VkJ+mmQOYtJFxIlkkK8fZrtOiL6VixbOBWMbZGBdal3Z1g== - dependencies: - sparse-bitfield "^3.0.3" - "@napi-rs/wasm-runtime@^1.0.7": version "1.1.0" resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz#c0180393d7862cff0d412e3e1a7c3bd5ea6d9b2f" @@ -2786,6 +3210,410 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@smithy/abort-controller@^4.2.12": + version "4.2.12" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.2.12.tgz#80c86416f232b0b4e79cef530877ef87d626ac42" + integrity sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q== + dependencies: + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@smithy/config-resolver@^4.4.11", "@smithy/config-resolver@^4.4.13": + version "4.4.13" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.4.13.tgz#8bffd41de647ec349b4a74bf02bdd1b32452bacd" + integrity sha512-iIzMC5NmOUP6WL6o8iPBjFhUhBZ9pPjpUpQYWMUFQqKyXXzOftbfK8zcQCz/jFV1Psmf05BK5ypx4K2r4Tnwdg== + dependencies: + "@smithy/node-config-provider" "^4.3.12" + "@smithy/types" "^4.13.1" + "@smithy/util-config-provider" "^4.2.2" + "@smithy/util-endpoints" "^3.3.3" + "@smithy/util-middleware" "^4.2.12" + tslib "^2.6.2" + +"@smithy/core@^3.23.12": + version "3.23.12" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.23.12.tgz#a16537bb03260337ac5adda31aedb325fcf9bb06" + integrity sha512-o9VycsYNtgC+Dy3I0yrwCqv9CWicDnke0L7EVOrZtJpjb2t0EjaEofmMrYc0T1Kn3yk32zm6cspxF9u9Bj7e5w== + dependencies: + "@smithy/protocol-http" "^5.3.12" + "@smithy/types" "^4.13.1" + "@smithy/url-parser" "^4.2.12" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-body-length-browser" "^4.2.2" + "@smithy/util-middleware" "^4.2.12" + "@smithy/util-stream" "^4.5.20" + "@smithy/util-utf8" "^4.2.2" + "@smithy/uuid" "^1.1.2" + tslib "^2.6.2" + +"@smithy/credential-provider-imds@^4.2.12": + version "4.2.12" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.12.tgz#fa2e52116cac7eaf5625e0bfd399a4927b598f66" + integrity sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg== + dependencies: + "@smithy/node-config-provider" "^4.3.12" + "@smithy/property-provider" "^4.2.12" + "@smithy/types" "^4.13.1" + "@smithy/url-parser" "^4.2.12" + tslib "^2.6.2" + +"@smithy/fetch-http-handler@^5.3.15": + version "5.3.15" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.15.tgz#acf69a8b3bab0396d2782fc901bad0b957c8c6a2" + integrity sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A== + dependencies: + "@smithy/protocol-http" "^5.3.12" + "@smithy/querystring-builder" "^4.2.12" + "@smithy/types" "^4.13.1" + "@smithy/util-base64" "^4.3.2" + tslib "^2.6.2" + +"@smithy/hash-node@^4.2.12": + version "4.2.12" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.2.12.tgz#0ee7f6a1d2958c313ee24b07159dcb9547792441" + integrity sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w== + dependencies: + "@smithy/types" "^4.13.1" + "@smithy/util-buffer-from" "^4.2.2" + "@smithy/util-utf8" "^4.2.2" + tslib "^2.6.2" + +"@smithy/invalid-dependency@^4.2.12": + version "4.2.12" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.2.12.tgz#1a28c13fb33684b91848d4d6ec5104a1c1413e7f" + integrity sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g== + dependencies: + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@smithy/is-array-buffer@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz#f84f0d9f9a36601a9ca9381688bd1b726fd39111" + integrity sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA== + dependencies: + tslib "^2.6.2" + +"@smithy/is-array-buffer@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz#c401ce54b12a16529eb1c938a0b6c2247cb763b8" + integrity sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow== + dependencies: + tslib "^2.6.2" + +"@smithy/middleware-content-length@^4.2.12": + version "4.2.12" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.2.12.tgz#dec97ea1444b12e734156b764e9953b2b37c70fd" + integrity sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA== + dependencies: + "@smithy/protocol-http" "^5.3.12" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@smithy/middleware-endpoint@^4.4.26", "@smithy/middleware-endpoint@^4.4.27": + version "4.4.27" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.27.tgz#cf2b334f7fc302e7ebf3fe00c1a1279ee9214afd" + integrity sha512-T3TFfUgXQlpcg+UdzcAISdZpj4Z+XECZ/cefgA6wLBd6V4lRi0svN2hBouN/be9dXQ31X4sLWz3fAQDf+nt6BA== + dependencies: + "@smithy/core" "^3.23.12" + "@smithy/middleware-serde" "^4.2.15" + "@smithy/node-config-provider" "^4.3.12" + "@smithy/shared-ini-file-loader" "^4.4.7" + "@smithy/types" "^4.13.1" + "@smithy/url-parser" "^4.2.12" + "@smithy/util-middleware" "^4.2.12" + tslib "^2.6.2" + +"@smithy/middleware-retry@^4.4.43": + version "4.4.44" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.4.44.tgz#5c678ea74bde3a480cb28d013156a24009063c5e" + integrity sha512-Y1Rav7m5CFRPQyM4CI0koD/bXjyjJu3EQxZZhtLGD88WIrBrQ7kqXM96ncd6rYnojwOo/u9MXu57JrEvu/nLrA== + dependencies: + "@smithy/node-config-provider" "^4.3.12" + "@smithy/protocol-http" "^5.3.12" + "@smithy/service-error-classification" "^4.2.12" + "@smithy/smithy-client" "^4.12.7" + "@smithy/types" "^4.13.1" + "@smithy/util-middleware" "^4.2.12" + "@smithy/util-retry" "^4.2.12" + "@smithy/uuid" "^1.1.2" + tslib "^2.6.2" + +"@smithy/middleware-serde@^4.2.15": + version "4.2.15" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.2.15.tgz#18c6ed60339389b62e7955e822abe88e6f53ea55" + integrity sha512-ExYhcltZSli0pgAKOpQQe1DLFBLryeZ22605y/YS+mQpdNWekum9Ujb/jMKfJKgjtz1AZldtwA/wCYuKJgjjlg== + dependencies: + "@smithy/core" "^3.23.12" + "@smithy/protocol-http" "^5.3.12" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@smithy/middleware-stack@^4.2.12": + version "4.2.12" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.2.12.tgz#96b43b2fab0d4a6723f813f76b72418b0fdb6ba0" + integrity sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw== + dependencies: + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@smithy/node-config-provider@^4.3.12": + version "4.3.12" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.3.12.tgz#bb722da6e2a130ae585754fa7bc8d909f9f5d702" + integrity sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw== + dependencies: + "@smithy/property-provider" "^4.2.12" + "@smithy/shared-ini-file-loader" "^4.4.7" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@smithy/node-http-handler@^4.5.0": + version "4.5.0" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.5.0.tgz#6a506a0da462c79e725fdbcfa55b0eed5b929727" + integrity sha512-Rnq9vQWiR1+/I6NZZMNzJHV6pZYyEHt2ZnuV3MG8z2NNenC4i/8Kzttz7CjZiHSmsN5frhXhg17z3Zqjjhmz1A== + dependencies: + "@smithy/abort-controller" "^4.2.12" + "@smithy/protocol-http" "^5.3.12" + "@smithy/querystring-builder" "^4.2.12" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@smithy/property-provider@^4.2.12": + version "4.2.12" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.2.12.tgz#e9f8e5ce125413973b16e39c87cf4acd41324e21" + integrity sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A== + dependencies: + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@smithy/protocol-http@^5.3.12": + version "5.3.12" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.3.12.tgz#c913053e7dfbac6cdd7f374f0b4f5aa7c518d0e1" + integrity sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw== + dependencies: + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@smithy/querystring-builder@^4.2.12": + version "4.2.12" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.2.12.tgz#20a0266b151a4b58409f901e1463257a72835c16" + integrity sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg== + dependencies: + "@smithy/types" "^4.13.1" + "@smithy/util-uri-escape" "^4.2.2" + tslib "^2.6.2" + +"@smithy/querystring-parser@^4.2.12": + version "4.2.12" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.2.12.tgz#918cb609b2d606ab81f2727bfde0265d2ebb2758" + integrity sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw== + dependencies: + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@smithy/service-error-classification@^4.2.12": + version "4.2.12" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.2.12.tgz#795e9484207acf63817a9e9cf67e90b42e720840" + integrity sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ== + dependencies: + "@smithy/types" "^4.13.1" + +"@smithy/shared-ini-file-loader@^4.4.7": + version "4.4.7" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.7.tgz#18cc5a21f871509fafbe535a7bf44bde5a500727" + integrity sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw== + dependencies: + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@smithy/signature-v4@^5.3.12": + version "5.3.12" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.3.12.tgz#b61ce40a94bdd91dfdd8f5f2136631c8eb67f253" + integrity sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw== + dependencies: + "@smithy/is-array-buffer" "^4.2.2" + "@smithy/protocol-http" "^5.3.12" + "@smithy/types" "^4.13.1" + "@smithy/util-hex-encoding" "^4.2.2" + "@smithy/util-middleware" "^4.2.12" + "@smithy/util-uri-escape" "^4.2.2" + "@smithy/util-utf8" "^4.2.2" + tslib "^2.6.2" + +"@smithy/smithy-client@^4.12.6", "@smithy/smithy-client@^4.12.7": + version "4.12.7" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.12.7.tgz#3867272c062e39d3d4b719bf83ba491c76e1ee93" + integrity sha512-q3gqnwml60G44FECaEEsdQMplYhDMZYCtYhMCzadCnRnnHIobZJjegmdoUo6ieLQlPUzvrMdIJUpx6DoPmzANQ== + dependencies: + "@smithy/core" "^3.23.12" + "@smithy/middleware-endpoint" "^4.4.27" + "@smithy/middleware-stack" "^4.2.12" + "@smithy/protocol-http" "^5.3.12" + "@smithy/types" "^4.13.1" + "@smithy/util-stream" "^4.5.20" + tslib "^2.6.2" + +"@smithy/types@^4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.13.1.tgz#8aaf15bb0f42b4e7c93c87018a3678a06d74691d" + integrity sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g== + dependencies: + tslib "^2.6.2" + +"@smithy/url-parser@^4.2.12": + version "4.2.12" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.2.12.tgz#e940557bf0b8e9a25538a421970f64bd827f456f" + integrity sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA== + dependencies: + "@smithy/querystring-parser" "^4.2.12" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@smithy/util-base64@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.3.2.tgz#be02bcb29a87be744356467ea25ffa413e695cea" + integrity sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ== + dependencies: + "@smithy/util-buffer-from" "^4.2.2" + "@smithy/util-utf8" "^4.2.2" + tslib "^2.6.2" + +"@smithy/util-body-length-browser@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz#c4404277d22039872abdb80e7800f9a63f263862" + integrity sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ== + dependencies: + tslib "^2.6.2" + +"@smithy/util-body-length-node@^4.2.3": + version "4.2.3" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz#f923ca530defb86a9ac3ca2d3066bcca7b304fbc" + integrity sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g== + dependencies: + tslib "^2.6.2" + +"@smithy/util-buffer-from@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz#6fc88585165ec73f8681d426d96de5d402021e4b" + integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== + dependencies: + "@smithy/is-array-buffer" "^2.2.0" + tslib "^2.6.2" + +"@smithy/util-buffer-from@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz#2c6b7857757dfd88f6cd2d36016179a40ccc913b" + integrity sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q== + dependencies: + "@smithy/is-array-buffer" "^4.2.2" + tslib "^2.6.2" + +"@smithy/util-config-provider@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz#52ebf9d8942838d18bc5fb1520de1e8699d7aad6" + integrity sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ== + dependencies: + tslib "^2.6.2" + +"@smithy/util-defaults-mode-browser@^4.3.42": + version "4.3.43" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.43.tgz#8e2667c31cacdc0d59d414863f9a475daef79b28" + integrity sha512-Qd/0wCKMaXxev/z00TvNzGCH2jlKKKxXP1aDxB6oKwSQthe3Og2dMhSayGCnsma1bK/kQX1+X7SMP99t6FgiiQ== + dependencies: + "@smithy/property-provider" "^4.2.12" + "@smithy/smithy-client" "^4.12.7" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@smithy/util-defaults-mode-node@^4.2.45": + version "4.2.47" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.47.tgz#95ab7663f21513dff5c13b5ab7fa2957418254c5" + integrity sha512-qSRbYp1EQ7th+sPFuVcVO05AE0QH635hycdEXlpzIahqHHf2Fyd/Zl+8v0XYMJ3cgDVPa0lkMefU7oNUjAP+DQ== + dependencies: + "@smithy/config-resolver" "^4.4.13" + "@smithy/credential-provider-imds" "^4.2.12" + "@smithy/node-config-provider" "^4.3.12" + "@smithy/property-provider" "^4.2.12" + "@smithy/smithy-client" "^4.12.7" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@smithy/util-endpoints@^3.3.3": + version "3.3.3" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.3.3.tgz#0119f15bcac30b3b9af1d3cc0a8477e7199d0185" + integrity sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig== + dependencies: + "@smithy/node-config-provider" "^4.3.12" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@smithy/util-hex-encoding@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz#4abf3335dd1eb884041d8589ca7628d81a6fd1d3" + integrity sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg== + dependencies: + tslib "^2.6.2" + +"@smithy/util-middleware@^4.2.12": + version "4.2.12" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.2.12.tgz#d6cb837c2390375e2b6957e7f917350ca4bd8757" + integrity sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ== + dependencies: + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@smithy/util-retry@^4.2.12": + version "4.2.12" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.2.12.tgz#be4805afee530f95b00a6ba771e18cb4c324f822" + integrity sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ== + dependencies: + "@smithy/service-error-classification" "^4.2.12" + "@smithy/types" "^4.13.1" + tslib "^2.6.2" + +"@smithy/util-stream@^4.5.20": + version "4.5.20" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.5.20.tgz#2d312ac8b9ea1780561a77048b027e7db1c6a3d4" + integrity sha512-4yXLm5n/B5SRBR2p8cZ90Sbv4zL4NKsgxdzCzp/83cXw2KxLEumt5p+GAVyRNZgQOSrzXn9ARpO0lUe8XSlSDw== + dependencies: + "@smithy/fetch-http-handler" "^5.3.15" + "@smithy/node-http-handler" "^4.5.0" + "@smithy/types" "^4.13.1" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-buffer-from" "^4.2.2" + "@smithy/util-hex-encoding" "^4.2.2" + "@smithy/util-utf8" "^4.2.2" + tslib "^2.6.2" + +"@smithy/util-uri-escape@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz#48e40206e7fe9daefc8d44bb43a1ab17e76abf4a" + integrity sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw== + dependencies: + tslib "^2.6.2" + +"@smithy/util-utf8@^2.0.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5" + integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== + dependencies: + "@smithy/util-buffer-from" "^2.2.0" + tslib "^2.6.2" + +"@smithy/util-utf8@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz#21db686982e6f3393ac262e49143b42370130f13" + integrity sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw== + dependencies: + "@smithy/util-buffer-from" "^4.2.2" + tslib "^2.6.2" + +"@smithy/uuid@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@smithy/uuid/-/uuid-1.1.2.tgz#b6e97c7158615e4a3c775e809c00d8c269b5a12e" + integrity sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g== + dependencies: + tslib "^2.6.2" + "@styled-system/background@^5.1.2": version "5.1.2" resolved "https://registry.yarnpkg.com/@styled-system/background/-/background-5.1.2.tgz#75c63d06b497ab372b70186c0bf608d62847a2ba" @@ -3070,20 +3898,6 @@ "@types/connect" "*" "@types/node" "*" -"@types/bson@*": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@types/bson/-/bson-4.2.4.tgz#3bb08ab0de5dd07103fba355361814019ba2ae88" - integrity sha512-SG23E3JDH6y8qF20a4G9txLuUl+TCV16gxsKyntmGiJez2V9VBJr1Y8WxTBBD6OgBVcvspQ7sxgdNMkXFVcaEA== - dependencies: - bson "*" - -"@types/bson@1.x || 4.0.x": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/bson/-/bson-4.0.5.tgz#9e0e1d1a6f8866483f96868a9b33bc804926b1fc" - integrity sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg== - dependencies: - "@types/node" "*" - "@types/command-line-args@^5.2.3": version "5.2.3" resolved "https://registry.yarnpkg.com/@types/command-line-args/-/command-line-args-5.2.3.tgz#553ce2fd5acf160b448d307649b38ffc60d39639" @@ -3261,14 +4075,6 @@ dependencies: "@types/unist" "^2" -"@types/mongodb@^3.5.27": - version "3.6.20" - resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.6.20.tgz#b7c5c580644f6364002b649af1c06c3c0454e1d2" - integrity sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ== - dependencies: - "@types/bson" "*" - "@types/node" "*" - "@types/ms@*": version "2.1.0" resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" @@ -3398,13 +4204,6 @@ resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz#1306dbfa53768bcbcfc95a1c8cde367975581859" integrity sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA== -"@types/whatwg-url@^11.0.2": - version "11.0.5" - resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-11.0.5.tgz#aaa2546e60f0c99209ca13360c32c78caf2c409f" - integrity sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ== - dependencies: - "@types/webidl-conversions" "*" - "@types/whatwg-url@^8.2.1": version "8.2.2" resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-8.2.2.tgz#749d5b3873e845897ada99be4448041d4cc39e63" @@ -3797,13 +4596,6 @@ arg@^5.0.1: resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -4299,11 +5091,6 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" -bluebird@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== - body-parser@^1.19.0, body-parser@~1.20.3: version "1.20.4" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.4.tgz#f8e20f4d06ca8a50a71ed329c15dccad1cdc547f" @@ -4332,6 +5119,11 @@ bowser@^1.7.3: resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.9.4.tgz#890c58a2813a9d3243704334fa81b96a5c150c9a" integrity sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ== +bowser@^2.11.0: + version "2.14.1" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.14.1.tgz#4ea39bf31e305184522d7ad7bfd91389e4f0cb79" + integrity sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg== + brace-expansion@^1.1.7: version "1.1.12" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" @@ -4386,33 +5178,18 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -bson@*: - version "7.2.0" - resolved "https://registry.yarnpkg.com/bson/-/bson-7.2.0.tgz#1a496a42d9ff130b9f3ab8efd465459c758c747f" - integrity sha512-YCEo7KjMlbNlyHhz7zAZNDpIpQbd+wOEHJYezv0nMYTn4x31eIUM2yomNNubclAt63dObUzKHWsBLJ9QcZNSnQ== - bson@^1.1.4: version "1.1.6" resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.6.tgz#fb819be9a60cd677e0853aee4ca712a785d6618a" integrity sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg== -bson@^4.2.2, bson@^4.5.4: +bson@^4.7.2: version "4.7.2" resolved "https://registry.yarnpkg.com/bson/-/bson-4.7.2.tgz#320f4ad0eaf5312dd9b45dc369cc48945e2a5f2e" integrity sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ== dependencies: buffer "^5.6.0" -bson@^5.5.0: - version "5.5.1" - resolved "https://registry.yarnpkg.com/bson/-/bson-5.5.1.tgz#f5849d405711a7f23acdda9a442375df858e6833" - integrity sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g== - -bson@^6.10.4: - version "6.10.4" - resolved "https://registry.yarnpkg.com/bson/-/bson-6.10.4.tgz#d530733bb5bb16fb25c162e01a3344fab332fd2b" - integrity sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng== - buffer-alloc-unsafe@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" @@ -5208,13 +5985,6 @@ debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - debug@4, debug@4.x, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.1: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" @@ -5388,11 +6158,6 @@ denque@^1.4.1: resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf" integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw== -denque@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" - integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== - depd@2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -5553,13 +6318,6 @@ encodeurl@~2.0.0: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -encoding@^0.1.11: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.5" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" @@ -6021,7 +6779,7 @@ espree@^10.0.1, espree@^10.4.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^4.2.1" -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -6289,6 +7047,22 @@ fast-text-encoding@^1.0.0: resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867" integrity sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w== +fast-xml-builder@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz#0c407a1d9d5996336c0cd76f7ff785cac6413017" + integrity sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg== + dependencies: + path-expression-matcher "^1.1.3" + +fast-xml-parser@5.5.6: + version "5.5.6" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.5.6.tgz#6fc61f5ae06a55a1f058abd6a4f4b5d3e9972cd0" + integrity sha512-3+fdZyBRVg29n4rXP0joHthhcHdPUHaIC16cuyyd1iLsuaO6Vea36MPrxgAzbZna8lhvZeRL8Bc9GP56/J9xEw== + dependencies: + fast-xml-builder "^1.1.4" + path-expression-matcher "^1.1.3" + strnum "^2.1.2" + fastq@^1.6.0: version "1.19.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" @@ -7180,13 +7954,6 @@ iconv-lite@0.4.24, iconv-lite@~0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - ieee754@1.1.13: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" @@ -7567,7 +8334,7 @@ is-shared-array-buffer@^1.0.4: dependencies: call-bound "^1.0.3" -is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== @@ -8155,15 +8922,7 @@ jquery@x.*: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1: - version "3.14.2" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.2.tgz#77485ce1dd7f33c061fd1b16ecea23b55fcb04b0" - integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.1: +js-yaml@^3.13.1, js-yaml@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== @@ -8343,21 +9102,11 @@ jwt-decode@^4.0.0: resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-4.0.0.tgz#2270352425fd413785b2faf11f6e755c5151bd4b" integrity sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA== -kareem@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.2.tgz#78c4508894985b8d38a0dc15e1a8e11078f2ca93" - integrity sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ== - kareem@2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.5.1.tgz#7b8203e11819a8e77a34b3517d3ead206764d15d" integrity sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA== -kareem@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.6.3.tgz#23168ec8ffb6c1abfd31b7169a6fb1dd285992ac" - integrity sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q== - keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -9250,7 +9999,7 @@ moment@^2.29.4, moment@^2.30.1: resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== -mongodb-connection-string-url@^2.1.0, mongodb-connection-string-url@^2.6.0: +mongodb-connection-string-url@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz#57901bf352372abdde812c81be47b75c6b2ec5cf" integrity sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ== @@ -9258,15 +10007,19 @@ mongodb-connection-string-url@^2.1.0, mongodb-connection-string-url@^2.6.0: "@types/whatwg-url" "^8.2.1" whatwg-url "^11.0.0" -mongodb-connection-string-url@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz#e223089dfa0a5fa9bf505f8aedcbc67b077b33e7" - integrity sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA== +mongodb@4.17.2: + version "4.17.2" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.17.2.tgz#237c0534e36a3449bd74c6bf6d32f87a1ca7200c" + integrity sha512-mLV7SEiov2LHleRJPMPrK2PMyhXFZt2UQLC4VD4pnth3jMjYKHhtqfwwkkvS/NXuo/Fp3vbhaNcXrIDaLRb9Tg== dependencies: - "@types/whatwg-url" "^11.0.2" - whatwg-url "^14.1.0 || ^13.0.0" + bson "^4.7.2" + mongodb-connection-string-url "^2.6.0" + socks "^2.7.1" + optionalDependencies: + "@aws-sdk/credential-providers" "^3.186.0" + "@mongodb-js/saslprep" "^1.1.0" -mongodb@3.7.4, mongodb@^3.6.4: +mongodb@^3.6.4: version "3.7.4" resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.7.4.tgz#119530d826361c3e12ac409b769796d6977037a4" integrity sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw== @@ -9279,37 +10032,6 @@ mongodb@3.7.4, mongodb@^3.6.4: optionalDependencies: saslprep "^1.0.0" -mongodb@4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.1.4.tgz#ba8062c7c67e7a22db5a059dbac1e3044b48453b" - integrity sha512-Cv/sk8on/tpvvqbEvR1h03mdyNdyvvO+WhtFlL4jrZ+DSsN/oSQHVqmJQI/sBCqqbOArFcYCAYDfyzqFwV4GSQ== - dependencies: - bson "^4.5.4" - denque "^2.0.1" - mongodb-connection-string-url "^2.1.0" - optionalDependencies: - saslprep "^1.0.3" - -mongodb@5.9.2: - version "5.9.2" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-5.9.2.tgz#39a73b9fbc87ac9d9c1aaf8aab5c5bb69e2b913e" - integrity sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ== - dependencies: - bson "^5.5.0" - mongodb-connection-string-url "^2.6.0" - socks "^2.7.1" - optionalDependencies: - "@mongodb-js/saslprep" "^1.1.0" - -mongodb@~6.20.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.20.0.tgz#5212dcf512719385287aa4574265352eefb01d8e" - integrity sha512-Tl6MEIU3K4Rq3TSHd+sZQqRBoGlFsOgNrH5ltAcFBV62Re3Fd+FcaVf8uSEQFOJ51SDowDVttBTONMfoYWrWlQ== - dependencies: - "@mongodb-js/saslprep" "^1.3.0" - bson "^6.10.4" - mongodb-connection-string-url "^3.0.2" - mongoosastic@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/mongoosastic/-/mongoosastic-5.0.0.tgz#9b41268c52f3a91512e246620260f6c92e7a3691" @@ -9331,72 +10053,19 @@ mongoose-elasticsearch-xp@^5.8.0: dependencies: mongoose "^5.5.6" -mongoose-legacy-pluralize@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4" - integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ== - -mongoose@6.0.13: - version "6.0.13" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.0.13.tgz#e419c2ae0db3164e4c234ed783d8f8844f4bce53" - integrity sha512-/M/YKgx23fCX+j0lwObaHbCibXnMjyWeQrXZf0WaQeS/hL86wQVSmaOxh+kZXfyLOUr+vT2Hl44o50GZHUrKWw== - dependencies: - bson "^4.2.2" - kareem "2.3.2" - mongodb "4.1.4" - mpath "0.8.4" - mquery "4.0.0" - ms "2.1.2" - regexp-clone "1.0.0" - sift "13.5.2" - sliced "1.0.1" - -mongoose@7.8.7: - version "7.8.7" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-7.8.7.tgz#7a7ccbfd3da25990c88a8c41cd5b5abc30b913c7" - integrity sha512-5Bo4CrUxrPITrhMKsqUTOkXXo2CoRC5tXxVQhnddCzqDMwRXfyStrxj1oY865g8gaekSBhxAeNkYyUSJvGm9Hw== - dependencies: - bson "^5.5.0" +mongoose@6.0.13, mongoose@7.8.7, mongoose@^5.5.6, mongoose@^6.13.8, mongoose@^8.23.0: + version "6.13.9" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.13.9.tgz#880294370404dda9c51eeaac00352f83e6a4a5b7" + integrity sha512-x8XpK0SEDJtAtMoOF2U9aGrGXN6kbu01TqhznGLnA4B1oPXNb4Lye0MgmfxF9J2Dva7wf49VOgClk2fuKQYGHw== + dependencies: + bson "^4.7.2" kareem "2.5.1" - mongodb "5.9.2" + mongodb "4.17.2" mpath "0.9.0" - mquery "5.0.0" + mquery "4.0.3" ms "2.1.3" sift "16.0.1" -mongoose@^5.5.6: - version "5.13.23" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.13.23.tgz#befbe2f82247b0057c145900be871f37147d7f27" - integrity sha512-Q5bo1yYOcH2wbBPP4tGmcY5VKsFkQcjUDh66YjrbneAFB3vNKQwLvteRFLuLiU17rA5SDl3UMcMJLD9VS8ng2Q== - dependencies: - "@types/bson" "1.x || 4.0.x" - "@types/mongodb" "^3.5.27" - bson "^1.1.4" - kareem "2.3.2" - mongodb "3.7.4" - mongoose-legacy-pluralize "1.0.2" - mpath "0.8.4" - mquery "3.2.5" - ms "2.1.2" - optional-require "1.0.x" - regexp-clone "1.0.0" - safe-buffer "5.2.1" - sift "13.5.2" - sliced "1.0.1" - -mongoose@^8.23.0: - version "8.23.0" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-8.23.0.tgz#de88488ecdc68971f493b5f044f85bab316baa42" - integrity sha512-Bul4Ha6J8IqzFrb0B1xpVzkC3S0sk43dmLSnhFOn8eJlZiLwL5WO6cRymmjaADdCMjUcCpj2ce8hZI6O4ZFSug== - dependencies: - bson "^6.10.4" - kareem "2.6.3" - mongodb "~6.20.0" - mpath "0.9.0" - mquery "5.0.0" - ms "2.1.3" - sift "17.1.3" - moredots@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/moredots/-/moredots-1.0.1.tgz#3b8ae32a4d66d72751cb29033dd16eb2d155d98d" @@ -9415,40 +10084,15 @@ morgan@^1.10.0, morgan@^1.10.1: on-finished "~2.3.0" on-headers "~1.1.0" -mpath@0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.8.4.tgz#6b566d9581621d9e931dd3b142ed3618e7599313" - integrity sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g== - mpath@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.9.0.tgz#0c122fe107846e31fc58c75b09c35514b3871904" integrity sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew== -mquery@3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/mquery/-/mquery-3.2.5.tgz#8f2305632e4bb197f68f60c0cffa21aaf4060c51" - integrity sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A== - dependencies: - bluebird "3.5.1" - debug "3.1.0" - regexp-clone "^1.0.0" - safe-buffer "5.1.2" - sliced "1.0.1" - -mquery@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mquery/-/mquery-4.0.0.tgz#6c62160ad25289e99e0840907757cdfd62bde775" - integrity sha512-nGjm89lHja+T/b8cybAby6H0YgA4qYC/lx6UlwvHGqvTq8bDaNeCwl1sY8uRELrNbVWJzIihxVd+vphGGn1vBw== - dependencies: - debug "4.x" - regexp-clone "^1.0.0" - sliced "1.0.1" - -mquery@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/mquery/-/mquery-5.0.0.tgz#a95be5dfc610b23862df34a47d3e5d60e110695d" - integrity sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg== +mquery@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/mquery/-/mquery-4.0.3.tgz#4d15f938e6247d773a942c912d9748bd1965f89d" + integrity sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA== dependencies: debug "4.x" @@ -9467,11 +10111,6 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" @@ -9542,22 +10181,14 @@ node-abort-controller@^3.0.1: resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-fetch@^2.6.7, node-fetch@^2.6.9: +node-fetch@^1.0.1, node-fetch@^2.6.7, node-fetch@^2.6.9: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" -node-forge@^1.3.1: +node-forge@^1.3.1, node-forge@^1.3.2: version "1.3.3" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.3.tgz#0ad80f6333b3a0045e827ac20b7f735f93716751" integrity sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg== @@ -9783,11 +10414,6 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" -optional-require@1.0.x: - version "1.0.3" - resolved "https://registry.yarnpkg.com/optional-require/-/optional-require-1.0.3.tgz#275b8e9df1dc6a17ad155369c2422a440f89cb07" - integrity sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA== - optional-require@^1.1.8: version "1.1.10" resolved "https://registry.yarnpkg.com/optional-require/-/optional-require-1.1.10.tgz#35ea423c5442df157c084f8d5a9d5250bba1de47" @@ -9935,6 +10561,11 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-expression-matcher@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz#8bf7c629dc1b114e42b633c071f06d14625b4e0d" + integrity sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -10844,16 +11475,6 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp-clone@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-1.0.0.tgz#222db967623277056260b992626354a04ce9bf63" - integrity sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw== - -regexp-clone@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-1.2.0.tgz#f8d0745833f0d5ae19c0854ed99936555e34fcfc" - integrity sha512-d/LEfc+joiXe4uRyuXMJcOMoqTFKS3pSZUM8WWEqoQ51tZgCdgvu/HLMWaOslhR6igkCdeuc5DULADOK16glMA== - regexp.prototype.flags@^1.5.3, regexp.prototype.flags@^1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" @@ -11141,7 +11762,7 @@ safe-stable-stringify@^2.3.1: resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -11166,7 +11787,7 @@ sanitizer@0.1.3: resolved "https://registry.yarnpkg.com/sanitizer/-/sanitizer-0.1.3.tgz#d4f0af7475d9a7baf2a9e5a611718baa178a39e1" integrity sha512-j05vL56tR90rsYqm9ZD05v6K4HI7t4yMDEvvU0x4f+IADXM9Jx1x9mzatxOs5drJq6dGhugxDW99mcPvXVLl+Q== -saslprep@^1.0.0, saslprep@^1.0.3: +saslprep@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== @@ -11486,21 +12107,11 @@ side-channel@^1.1.0: side-channel-map "^1.0.1" side-channel-weakmap "^1.0.2" -sift@13.5.2: - version "13.5.2" - resolved "https://registry.yarnpkg.com/sift/-/sift-13.5.2.tgz#24a715e13c617b086166cd04917d204a591c9da6" - integrity sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA== - sift@16.0.1: version "16.0.1" resolved "https://registry.yarnpkg.com/sift/-/sift-16.0.1.tgz#e9c2ccc72191585008cf3e36fc447b2d2633a053" integrity sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ== -sift@17.1.3: - version "17.1.3" - resolved "https://registry.yarnpkg.com/sift/-/sift-17.1.3.tgz#9d2000d4d41586880b0079b5183d839c7a142bf7" - integrity sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ== - signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -11535,11 +12146,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -sliced@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" - integrity sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA== - smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" @@ -11696,11 +12302,6 @@ split2@^4.0.0: resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - sqon-builder@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/sqon-builder/-/sqon-builder-2.0.1.tgz#77e3440d8f6c1be4c801f68d1ef5fdb2a5844a2f" @@ -11906,6 +12507,11 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strnum@^2.1.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.2.1.tgz#d28f896b4ef9985212494ce8bcf7ca304fad8368" + integrity sha512-BwRvNd5/QoAtyW1na1y1LsJGQNvRlkde6Q/ipqqEaivoMdV+B1OMOTVdwR+N/cwVUcIt9PYyHmV8HyexCZSupg== + style-to-object@^0.4.0: version "0.4.4" resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" @@ -12221,13 +12827,6 @@ tr46@^3.0.0: dependencies: punycode "^2.1.1" -tr46@^5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-5.1.1.tgz#96ae867cddb8fdb64a49cc3059a8d428bcf238ca" - integrity sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw== - dependencies: - punycode "^2.3.1" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -12862,14 +13461,6 @@ whatwg-url@^11.0.0: tr46 "^3.0.0" webidl-conversions "^7.0.0" -"whatwg-url@^14.1.0 || ^13.0.0": - version "14.2.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.2.0.tgz#4ee02d5d725155dae004f6ae95c73e7ef5d95663" - integrity sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw== - dependencies: - tr46 "^5.1.0" - webidl-conversions "^7.0.0" - whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -13008,10 +13599,10 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xml2js@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.2.tgz#dd0b630083aa09c161e25a4d0901e2b2a929b499" - integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA== +xml2js@0.6.2, xml2js@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7" + integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA== dependencies: sax ">=0.6.0" xmlbuilder "~11.0.0" From 92e2ae3101bf6c8e9d641218ea9ab51db347a1c6 Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Fri, 20 Mar 2026 16:28:00 -0400 Subject: [PATCH 13/82] Fixed Unpublish --- cms/src/routes/bulk.js | 2 +- cms/src/services/gdc-importer/mafFiles.js | 57 +++++++++++-------- cms/src/services/searchClient/publish.js | 1 + .../ModelsManager/ModelManagerController.jsx | 21 +++++-- .../admin/ModelsManager/ModelsManager.jsx | 2 +- .../components/admin/helpers/bulkActions.js | 1 - .../components/admin/helpers/singleActions.js | 1 - ui/src/components/admin/services/Fetcher.jsx | 2 +- 8 files changed, 51 insertions(+), 36 deletions(-) diff --git a/cms/src/routes/bulk.js b/cms/src/routes/bulk.js index 5fa48a5de..009183d80 100644 --- a/cms/src/routes/bulk.js +++ b/cms/src/routes/bulk.js @@ -79,7 +79,7 @@ bulkRouter.post('/unpublish', async (req, res) => { try { const models = await Model.find({ _id: { $in: req.body } }); const result = await unpublishManyFromES(models.map(({ name }) => name)); - deleteCount = result.deleted; + deleteCount = result.body.deleted; await Model.updateMany( { _id: { $in: req.body }, diff --git a/cms/src/services/gdc-importer/mafFiles.js b/cms/src/services/gdc-importer/mafFiles.js index 872a42e39..9e78f9317 100644 --- a/cms/src/services/gdc-importer/mafFiles.js +++ b/cms/src/services/gdc-importer/mafFiles.js @@ -5,7 +5,8 @@ import { PassThrough } from 'stream'; import decompress from 'decompress'; import zlib from 'zlib'; import _ from 'lodash'; -const { get, flattenDeep, intersection, isEmpty } = _; + +import getLogger from '../../logger.js'; import { GDC_MODEL_STATES, @@ -14,10 +15,10 @@ import { FETCH_MODEL_FILE_DATA_QUERY, } from './gdcConstants.js'; -import getLogger from '../../logger.js'; +const { get, flattenDeep, intersection, isEmpty } = _; const logger = getLogger('services/gdc-importer/mafFiles'); -export const fetchModelFileData = async modelNames => { +export const fetchModelFileData = async (modelNames) => { if (!Array.isArray(modelNames) || !modelNames.length) { logger.error('fetchModelFileData failed due to invalid input. `modelNames` must be an array.', { modelNames, @@ -76,15 +77,15 @@ export const fetchModelFileData = async modelNames => { const caseId = get(cases[i], 'node.case_id'); const modelName = get(cases[i], 'node.submitter_id'); - const samples = get(cases[i], 'node.samples.hits.edges', []).map(sampleEdge => { + const samples = get(cases[i], 'node.samples.hits.edges', []).map((sampleEdge) => { const sampleType = get(sampleEdge, 'node.sample_type'); const tissueType = get(sampleEdge, 'node.tissue_type'); const tumorDescriptor = get(sampleEdge, 'node.tumor_descriptor'); // aliquots will be an array of two ids const aliquots = flattenDeep( - get(sampleEdge, 'node.portions.hits.edges', []).map(portionEdge => - get(portionEdge, 'node.analytes.hits.edges', []).map(analyteEdge => - get(analyteEdge, 'node.aliquots.hits.edges', []).map(aliquot => + get(sampleEdge, 'node.portions.hits.edges', []).map((portionEdge) => + get(portionEdge, 'node.analytes.hits.edges', []).map((analyteEdge) => + get(analyteEdge, 'node.aliquots.hits.edges', []).map((aliquot) => get(aliquot, 'node.aliquot_id'), ), ), @@ -96,27 +97,27 @@ export const fetchModelFileData = async modelNames => { logger.debug({ caseId, samples }, `Case samples found for model ${modelName}`); const files = get(data, 'files.hits.edges', []) - .filter(fileEdge => { + .filter((fileEdge) => { const entitySubmitterIds = get(fileEdge, 'node.associated_entities.hits.edges', []).map( - entityEdge => get(entityEdge, 'node.entity_submitter_id'), + (entityEdge) => get(entityEdge, 'node.entity_submitter_id'), ); - return entitySubmitterIds.some(submitterId => submitterId.includes(modelName)); + return entitySubmitterIds.some((submitterId) => submitterId.includes(modelName)); }) - .map(fileEdge => { + .map((fileEdge) => { const fileId = get(fileEdge, 'node.file_id'); const filename = get(fileEdge, 'node.file_name'); const entityIds = get(fileEdge, 'node.associated_entities.hits.edges', []).map( - entityEdge => get(entityEdge, 'node.entity_id'), + (entityEdge) => get(entityEdge, 'node.entity_id'), ); const entities = entityIds - .filter(entity => { - return samples.some(sample => sample.aliquots.includes(entity)); + .filter((entity) => { + return samples.some((sample) => sample.aliquots.includes(entity)); }) - .map(entity => { - const matchingSample = samples.find(sample => sample.aliquots.includes(entity)); + .map((entity) => { + const matchingSample = samples.find((sample) => sample.aliquots.includes(entity)); const matchingEntity = get(fileEdge, 'node.associated_entities.hits.edges', []).find( - x => x.node.entity_id === entity, + (x) => x.node.entity_id === entity, ); return { entityId: entity, @@ -143,7 +144,7 @@ export const fetchModelFileData = async modelNames => { return results; }; -export const getMafStatus = mafFileData => { +export const getMafStatus = (mafFileData) => { if (!mafFileData.success) { // Model not found in GDC return GDC_MODEL_STATES.modelNotFound; @@ -169,7 +170,7 @@ export const getMafStatus = mafFileData => { (totals, currentModelFile) => { let currentNgcmCount = 0; let currentEngcmCount = 0; - currentModelFile.entities.forEach(entity => { + currentModelFile.entities.forEach((entity) => { switch (entity.sampleType) { case GDC_CANCER_MODEL_SAMPLE_TYPES.NGCM: currentNgcmCount++; @@ -206,7 +207,7 @@ export const getMafStatus = mafFileData => { } }; -export const getBulkMafStatus = bulkMafFileData => { +export const getBulkMafStatus = (bulkMafFileData) => { const models = Object.keys(bulkMafFileData); const results = Object.values(GDC_MODEL_STATES).reduce((o, key) => ({ ...o, [key]: [] }), {}); @@ -276,7 +277,13 @@ const filterMafFilesBySampleTypes = (files, sampleTypes) => { } return files.filter( - file => !isEmpty(intersection(file.entities.map(entity => entity.sampleType), sampleTypes)), + (file) => + !isEmpty( + intersection( + file.entities.map((entity) => entity.sampleType), + sampleTypes, + ), + ), ); }; @@ -306,15 +313,15 @@ export const downloadMaf = async ({ filename, fileId, modelName }) => { const streamToBuffer = new PassThrough(); const bufs = []; - streamToBuffer.on('data', data => { + streamToBuffer.on('data', (data) => { bufs.push(data); }); streamToBuffer.on('end', () => { decompress(Buffer.concat(bufs), { - filter: file => file.path.includes(filename), + filter: (file) => file.path.includes(filename), strip: 1, }) - .then(files => { + .then((files) => { try { const maf = zlib.gunzipSync(files[0].data).toString('utf8'); @@ -327,7 +334,7 @@ export const downloadMaf = async ({ filename, fileId, modelName }) => { reject(error); } }) - .catch(error => { + .catch((error) => { logger.error( { error, filename, fileId, modelName }, 'Failure decompressing file from GDC', diff --git a/cms/src/services/searchClient/publish.js b/cms/src/services/searchClient/publish.js index 7a4f9da02..203806dd8 100644 --- a/cms/src/services/searchClient/publish.js +++ b/cms/src/services/searchClient/publish.js @@ -56,6 +56,7 @@ export const indexOneToES = async (filter) => { // Index model into ElasticSearch const { _doc } = doc; + delete _doc.__v; delete _doc._id; await indexModel(_doc); diff --git a/ui/src/components/admin/ModelsManager/ModelManagerController.jsx b/ui/src/components/admin/ModelsManager/ModelManagerController.jsx index 20eb70796..a9270974d 100644 --- a/ui/src/components/admin/ModelsManager/ModelManagerController.jsx +++ b/ui/src/components/admin/ModelsManager/ModelManagerController.jsx @@ -66,13 +66,13 @@ const bulkActionCreator = bulkAction(action, state.selection) .then(({ data: { success, errors } }) => loadData(baseUrl, state).then(async ([dataResponse, countResponse]) => { - await setState(() => ({ + setState({ isLoading: false, - data: dataResponse.data, + data: dataResponse?.data, error: null, - rowCount: countResponse.data.count, + rowCount: countResponse?.data?.count, ...initPagingState, - })); + }); await appendNotification({ type: @@ -91,6 +91,7 @@ const bulkActionCreator = }), ) .catch(async (err) => { + console.error(err); const errorText = extractErrorText(err); await setState({ @@ -221,7 +222,11 @@ const ModelManagerController = ({ baseUrl, cmsBase, children, ...props }) => ( let modelNames; switch (overwriteVariants) { case VARIANT_OVERWRITE_OPTIONS.allModels: - modelNames = [...result?.new, ...result?.updated, ...result?.unchanged]; + modelNames = [ + ...result?.new, + ...result?.updated, + ...result?.unchanged, + ]; if (!modelNames.length) { return; } @@ -247,7 +252,11 @@ const ModelManagerController = ({ baseUrl, cmsBase, children, ...props }) => ( }); break; case VARIANT_OVERWRITE_OPTIONS.cleanOnly: - modelNames = [...result?.new, ...result?.updated, ...result?.unchanged]; + modelNames = [ + ...result?.new, + ...result?.updated, + ...result?.unchanged, + ]; if (!modelNames.length) { return; } diff --git a/ui/src/components/admin/ModelsManager/ModelsManager.jsx b/ui/src/components/admin/ModelsManager/ModelsManager.jsx index fa657526b..62e25724a 100644 --- a/ui/src/components/admin/ModelsManager/ModelsManager.jsx +++ b/ui/src/components/admin/ModelsManager/ModelsManager.jsx @@ -26,7 +26,7 @@ const ModelsManager = () => { Model Management - {({ bulkImportVariants, state }) => ( + {({ bulkImportVariants, state } = {}) => ( {(modalState) => ( { url: `${config.urls.cmsBase}/bulk/${action}`, data, method: 'post', - headers: '', }); }; diff --git a/ui/src/components/admin/helpers/singleActions.js b/ui/src/components/admin/helpers/singleActions.js index f970b8f41..17921a932 100644 --- a/ui/src/components/admin/helpers/singleActions.js +++ b/ui/src/components/admin/helpers/singleActions.js @@ -10,6 +10,5 @@ export const singleAction = async (action, name = '') => { url, data: '', method: action === 'delete' ? 'delete' : 'post', - headers: '', }); }; diff --git a/ui/src/components/admin/services/Fetcher.jsx b/ui/src/components/admin/services/Fetcher.jsx index 31b75c303..f55d381cc 100644 --- a/ui/src/components/admin/services/Fetcher.jsx +++ b/ui/src/components/admin/services/Fetcher.jsx @@ -2,7 +2,7 @@ import PropTypes from 'prop-types'; import Component from 'react-component-component'; import axios from 'axios'; -export const fetchData = async ({ url, data, method, headers }) => { +export const fetchData = async ({ url, data, method, headers = {} }) => { return await axios({ url, data, method, headers }); }; From 0ed00b0f6b463f6d4eafee054c78c93e0f23cafb Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Mon, 23 Mar 2026 17:09:54 -0400 Subject: [PATCH 14/82] Remove mongoosastic --- api/src/services/searchClient.ts | 12 +++++---- cms/package.json | 1 - cms/src/helpers/validation.js | 20 +++++++------- cms/src/routes/health.js | 2 +- cms/src/schemas/genes.js | 26 ------------------- cms/src/services/searchClient/client.js | 10 +++++++ .../services/searchClient/common/client.js | 11 -------- .../searchClient/common/schemas/model.js | 15 ----------- .../services/searchClient/genomicVariants.js | 2 +- .../services/searchClient/indexLastUpdated.js | 2 +- cms/src/services/searchClient/indexModel.js | 3 +-- cms/src/services/searchClient/publish.js | 22 +++++++--------- cms/src/services/searchClient/unpublish.js | 2 +- scripts/utils/esUtils.js | 18 ++++--------- ui/src/components/Model.jsx | 2 +- yarn.lock | 23 ++-------------- 16 files changed, 50 insertions(+), 121 deletions(-) delete mode 100644 cms/src/schemas/genes.js create mode 100644 cms/src/services/searchClient/client.js delete mode 100644 cms/src/services/searchClient/common/client.js delete mode 100644 cms/src/services/searchClient/common/schemas/model.js diff --git a/api/src/services/searchClient.ts b/api/src/services/searchClient.ts index 222f257d6..46252c15c 100644 --- a/api/src/services/searchClient.ts +++ b/api/src/services/searchClient.ts @@ -1,8 +1,10 @@ -import { getSearchClient } from '@overture-stack/arranger-server'; +import { buildSearchClient } from '@overture-stack/arranger-server'; -const getClient = async () => - await getSearchClient({ - node: process.env.ES_URL || 'http://localhost:9200', - }); +const getClient = async () => { + const host = process.env.ES_URL || 'http://localhost:9200'; + const user = process.env.ES_USER || ''; + const password = process.env.ES_PASS || ''; + return await buildSearchClient(host, user, password); +}; export default getClient; diff --git a/cms/package.json b/cms/package.json index 4db52fcd2..034e96639 100644 --- a/cms/package.json +++ b/cms/package.json @@ -32,7 +32,6 @@ "lodash": "^4.17.21", "map-stream": "^0.0.7", "method-override": "^2.3.10", - "mongoosastic": "^5.0.0", "mongoose": "7.8.7", "mongoose-elasticsearch-xp": "^5.8.0", "morgan": "^1.10.1", diff --git a/cms/src/helpers/validation.js b/cms/src/helpers/validation.js index a70e7408b..038db954a 100644 --- a/cms/src/helpers/validation.js +++ b/cms/src/helpers/validation.js @@ -3,12 +3,12 @@ import { ValidationError } from 'yup'; export const runYupValidatorFailSlow = (validator, data) => { - const validatePromises = data.map(p => - validator.validate(p, { abortEarly: false }).catch(Error => Error), + const validatePromises = data.map((p) => + validator.validate(p, { abortEarly: false }).catch((Error) => Error), ); - return Promise.all(validatePromises).then(results => - results.map(result => { + return Promise.all(validatePromises).then((results) => + results.map((result) => { if (!(result instanceof ValidationError)) { return { success: true, @@ -37,12 +37,12 @@ export const runYupValidatorFailSlow = (validator, data) => { }; export const runYupValidatorFailFast = (validator, data) => { - const validatePromises = data.map(p => - validator.validate(p, { abortEarly: false, strict: false }).catch(Error => Error), + const validatePromises = data.map((p) => + validator.validate(p, { abortEarly: false, strict: false }).catch((Error) => Error), ); - return Promise.all(validatePromises).then(results => { - const failed = results.filter(result => result instanceof Error); + return Promise.all(validatePromises).then((results) => { + const failed = results.filter((result) => result instanceof Error); if (failed.length > 0) { const errors = { validationErrors: failed.map(({ value, inner }) => ({ @@ -62,5 +62,5 @@ export const runYupValidatorFailFast = (validator, data) => { }); }; -const getErrorDetails = validationResult => - validationResult.inner.flatMap(({ errors, path }) => errors.map(error => `${path}: ${error}`)); +const getErrorDetails = (validationResult) => + validationResult.inner.flatMap(({ errors, path }) => errors.map((error) => `${path}: ${error}`)); diff --git a/cms/src/routes/health.js b/cms/src/routes/health.js index cd8c39010..58cf84ebc 100644 --- a/cms/src/routes/health.js +++ b/cms/src/routes/health.js @@ -1,7 +1,7 @@ import express from 'express'; import _ from 'lodash'; -import client from '../services/searchClient/common/client.js'; +import client from '../services/searchClient/client.js'; import Model from '../schemas/model.js'; import { testS3Connection } from '../services/s3/index.js'; diff --git a/cms/src/schemas/genes.js b/cms/src/schemas/genes.js deleted file mode 100644 index 620c07d1c..000000000 --- a/cms/src/schemas/genes.js +++ /dev/null @@ -1,26 +0,0 @@ -import mongoose from 'mongoose'; -import mongoosastic from 'mongoosastic'; - -import getSearchClient from '../services/searchClient/common/client.js'; - -const GeneSchema = new mongoose.Schema( - { - _gene_id: { type: String, unique: true, required: true, es_indexed: true }, - symbol: { type: String, unique: true, required: true, es_indexed: true }, - ensemble_id: { type: String, unique: true, required: true, es_indexed: true }, - name: { type: String, es_indexed: true }, - synonyms: { type: [String], es_indexewd: true }, - biotype: { type: String, es_indexed: false }, - }, - { - collection: 'genesReference', - }, -); - -GeneSchema.plugin(mongoosastic, { - esClient: getSearchClient(), - index: 'genes', - type: '_doc', -}); - -export default mongoose.model('Gene', GeneSchema); diff --git a/cms/src/services/searchClient/client.js b/cms/src/services/searchClient/client.js new file mode 100644 index 000000000..c9f032f54 --- /dev/null +++ b/cms/src/services/searchClient/client.js @@ -0,0 +1,10 @@ +import { buildSearchClient } from '@overture-stack/arranger-server'; + +const getClient = async () => { + const host = process.env.ES_HOST || 'http://localhost:9200'; + const user = process.env.ES_USER || ''; + const password = process.env.ES_PASS || ''; + return await buildSearchClient(host, user, password); +}; + +export default getClient; diff --git a/cms/src/services/searchClient/common/client.js b/cms/src/services/searchClient/common/client.js deleted file mode 100644 index a1111a573..000000000 --- a/cms/src/services/searchClient/common/client.js +++ /dev/null @@ -1,11 +0,0 @@ -import { getSearchClient } from '@overture-stack/arranger-server'; - -const getClient = async () => { - const eshost = `${process.env.ES_HOST || 'http://localhost'}:${process.env.ES_PORT || 9200}`; - const client = await getSearchClient({ - node: eshost, - }); - return client; -}; - -export default getClient; diff --git a/cms/src/services/searchClient/common/schemas/model.js b/cms/src/services/searchClient/common/schemas/model.js deleted file mode 100644 index eba39cdf1..000000000 --- a/cms/src/services/searchClient/common/schemas/model.js +++ /dev/null @@ -1,15 +0,0 @@ -import mongoose from 'mongoose'; -import mongoosastic from 'mongoosastic'; - -import { ModelSchema } from '../../../../schemas/model.js'; -import getSearchClient from '../client.js'; - -const index = process.env.ES_INDEX; - -ModelSchema.plugin(mongoosastic, { - esClient: getSearchClient(), - index, - type: '_doc', -}); - -export const ModelES = mongoose.model('ModelES', ModelSchema); diff --git a/cms/src/services/searchClient/genomicVariants.js b/cms/src/services/searchClient/genomicVariants.js index f1be860b6..c2cd00d39 100644 --- a/cms/src/services/searchClient/genomicVariants.js +++ b/cms/src/services/searchClient/genomicVariants.js @@ -4,7 +4,7 @@ import _ from 'lodash'; import getLogger from '../../logger.js'; -import getClient from './common/client.js'; +import getClient from './client.js'; const { get, flatten, uniq } = _; diff --git a/cms/src/services/searchClient/indexLastUpdated.js b/cms/src/services/searchClient/indexLastUpdated.js index e455ad991..c5b1ea1d3 100644 --- a/cms/src/services/searchClient/indexLastUpdated.js +++ b/cms/src/services/searchClient/indexLastUpdated.js @@ -1,6 +1,6 @@ // @ts-check -import getClient from './common/client.js'; +import getClient from './client.js'; import getLogger from '../../logger.js'; const logger = getLogger('services/searchClient/update'); diff --git a/cms/src/services/searchClient/indexModel.js b/cms/src/services/searchClient/indexModel.js index 28a39ee4f..044725ce9 100644 --- a/cms/src/services/searchClient/indexModel.js +++ b/cms/src/services/searchClient/indexModel.js @@ -1,6 +1,6 @@ // @ts-check -import getClient from './common/client.js'; +import getClient from './client.js'; import getLogger from '../../logger.js'; const logger = getLogger('services/searchClient/update'); @@ -8,7 +8,6 @@ const index = process.env.ES_INDEX; const indexModel = async (model) => { const searchClient = await getClient(); - console.log('model for index', model); return searchClient .index({ index, diff --git a/cms/src/services/searchClient/publish.js b/cms/src/services/searchClient/publish.js index 203806dd8..21ee3f2d5 100644 --- a/cms/src/services/searchClient/publish.js +++ b/cms/src/services/searchClient/publish.js @@ -4,7 +4,6 @@ import { modelStatus } from '../../helpers/modelStatus.js'; import MatchUtils from '../../helpers/matchedModels.js'; import getLogger from '../../logger.js'; -import { ModelES } from './common/schemas/model.js'; import indexLastUpdated from './indexLastUpdated.js'; import indexModel from './indexModel.js'; import { updateGeneSearchIndicies } from './genomicVariants.js'; @@ -46,7 +45,7 @@ export const bulkUpdateGeneSearchIndices = async (modelNames) => { export const indexOneToES = async (filter) => { try { const validation = await getPublishValidation(); - const doc = await ModelES.findOne(filter) + const doc = await Model.findOne(filter) .populate('variants.variant') .populate('matchedModels') .exec(); @@ -54,16 +53,9 @@ export const indexOneToES = async (filter) => { // Validate doc against publish schema for "on-demand" publishing await validation.validate(doc); - // Index model into ElasticSearch - const { _doc } = doc; - delete _doc.__v; - delete _doc._id; - - await indexModel(_doc); - // Need to populate and filter the matched models if (doc.matchedModels) { - const matchedModels = await ModelES.find({ + const matchedModels = await Model.find({ _id: { $in: doc.matchedModels.models || [] }, }); const matches = matchedModels.filter( @@ -71,6 +63,12 @@ export const indexOneToES = async (filter) => { ); doc.populatedMatches = matches; } + // Index model into ElasticSearch + const { _doc } = doc; + delete _doc.__v; + delete _doc._id; + + await indexModel(_doc); await indexLastUpdated(); const res = await Model.updateOne({ name: doc.name }, { status: modelStatus.published }); @@ -93,7 +91,7 @@ export const indexOneToES = async (filter) => { * matchedModel set will be republished. */ export const indexMatchedModelsToES = async (filter, skipSelf = true) => { - const model = await ModelES.findOne(filter).populate('matchedModels'); + const model = await Model.findOne(filter).populate('matchedModels'); // Get list of matched models if exists const matchedModelIds = model.matchedModels ? model.matchedModels.models : []; @@ -123,7 +121,7 @@ export const indexMatchedModelsToES = async (filter, skipSelf = true) => { }; export const updateMatchedModelsToES = async (filter) => { - const models = await ModelES.find(filter); + const models = await Model.find(filter); // filter this list only to models that are published or published with changes const modelsToPublish = models.filter((model) => model.status !== modelStatus.unpublished); diff --git a/cms/src/services/searchClient/unpublish.js b/cms/src/services/searchClient/unpublish.js index b72d3a8f7..c26e68a1a 100644 --- a/cms/src/services/searchClient/unpublish.js +++ b/cms/src/services/searchClient/unpublish.js @@ -4,7 +4,7 @@ import Model from '../../schemas/model.js'; import { modelStatus } from '../../helpers/modelStatus.js'; import getLogger from '../../logger.js'; -import getClient from './common/client.js'; +import getClient from './client.js'; import indexLastUpdated from './indexLastUpdated.js'; import { indexMatchedModelsToES } from './publish.js'; import { updateGeneSearchIndicies } from './genomicVariants.js'; diff --git a/scripts/utils/esUtils.js b/scripts/utils/esUtils.js index 89654cc67..d4efbcc04 100644 --- a/scripts/utils/esUtils.js +++ b/scripts/utils/esUtils.js @@ -1,4 +1,4 @@ -import { getSearchClient } from '@overture-stack/arranger-server'; +import getSearchClient from '../../cms/src/services/searchClient/client.js'; /** Search index settings and mappings **/ import modelsIndexConfig from '../../elasticsearch/modelsIndex.json' with { type: "json" }; @@ -27,9 +27,7 @@ const VARIANTS_INDEX = 'genomic_variants'; const createIndex = async (index, config) => { try { console.log(`\nCreating index: ${index}`); - const client = await getSearchClient({ - node: esHost, - }); + const client = await getSearchClient(); await client.indices.create({ index, body: config, @@ -45,9 +43,7 @@ const createIndex = async (index, config) => { const deleteIndex = async index => { try { console.log(`\nDeleting existing index (if present): ${index}`); - const client = await getSearchClient({ - node: esHost, - }); + const client = await getSearchClient(); await client.indices.delete({ index }); } catch (e) {} }; @@ -114,16 +110,12 @@ const updateSearchIndices = async () => { const configureArrangerSets = async () => { try { console.log(`\nDeleting existing index (if present): arranger-sets`); - const client = await getSearchClient({ - node: esHost, - }); + const client = await getSearchClient(); await client.indices.delete({ index: `arranger-sets` }); } catch (e) {} try { console.log(`Creating index: arranger-sets`); - const client = await getSearchClient({ - node: esHost, - }); + const client = await getSearchClient(); await client.indices.create({ index: 'arranger-sets', body: { diff --git a/ui/src/components/Model.jsx b/ui/src/components/Model.jsx index cca29dcaa..b8e6e91c8 100644 --- a/ui/src/components/Model.jsx +++ b/ui/src/components/Model.jsx @@ -289,7 +289,7 @@ const Model = ({ modelName }) => ( {({ state: queryState, modelImages = modelImageProcessor( - queryState.model?.files?.hits ? queryState.model.files.hits.edges : [], + queryState.model?.files?.hits ? queryState.model?.files?.hits?.edges : [], ), }) => { return ( diff --git a/yarn.lock b/yarn.lock index 36f857ec0..27e9201d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1695,16 +1695,6 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@elastic/elasticsearch@7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@elastic/elasticsearch/-/elasticsearch-7.15.0.tgz#4b009a87e0b11b8cfd2e4f378f0292574bc17300" - integrity sha512-FUKvjV2IKtIiWsvBy7D+wLbSEONsmNR15RRN7P/Sb30g4ObZRHH2qGOP5PPnzxdntEkzZ8HzY7nKKXFS+3Du1g== - dependencies: - debug "^4.3.1" - hpagent "^0.1.1" - ms "^2.1.3" - secure-json-parse "^2.4.0" - "@elastic/elasticsearch@^7.17.14", "@elastic/elasticsearch@~7.17.0": version "7.17.14" resolved "https://registry.yarnpkg.com/@elastic/elasticsearch/-/elasticsearch-7.17.14.tgz#5ffd6d04e2be38b3dba56cf80af4359fc43b7f1f" @@ -9492,7 +9482,7 @@ lodash.topath@4.5.2: resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009" integrity sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg== -lodash@4.17.21, lodash@^4.17.10, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: +lodash@^4.17.10, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -10032,15 +10022,6 @@ mongodb@^3.6.4: optionalDependencies: saslprep "^1.0.0" -mongoosastic@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/mongoosastic/-/mongoosastic-5.0.0.tgz#9b41268c52f3a91512e246620260f6c92e7a3691" - integrity sha512-Lj7bl6Rbc0+y44ZhBa1oMgaHPFAF5sOVg5ukvh3Gtd7iyDSM8Hy6hjGoYJBGVd14UCuDwLELt3oLfZEZ4mO+8Q== - dependencies: - "@elastic/elasticsearch" "7.15.0" - lodash "4.17.21" - mongoose "6.0.13" - mongoose-detective@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mongoose-detective/-/mongoose-detective-2.0.0.tgz#2c94c7a8ed7204e0468ed2e68e3ba1bf33381083" @@ -10053,7 +10034,7 @@ mongoose-elasticsearch-xp@^5.8.0: dependencies: mongoose "^5.5.6" -mongoose@6.0.13, mongoose@7.8.7, mongoose@^5.5.6, mongoose@^6.13.8, mongoose@^8.23.0: +mongoose@7.8.7, mongoose@^5.5.6, mongoose@^6.13.8, mongoose@^8.23.0: version "6.13.9" resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.13.9.tgz#880294370404dda9c51eeaac00352f83e6a4a5b7" integrity sha512-x8XpK0SEDJtAtMoOF2U9aGrGXN6kbu01TqhznGLnA4B1oPXNb4Lye0MgmfxF9J2Dva7wf49VOgClk2fuKQYGHw== From 72f61714ca00ecc46b9987b913c50f9cf835ee02 Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Mon, 23 Mar 2026 18:17:30 -0400 Subject: [PATCH 15/82] Fix lastUpdated index setup issue --- elasticsearch/lastUpdated.json | 10 ++++++++++ scripts/initializeEs.js | 18 +++++++++++++----- scripts/utils/esUtils.js | 6 ++++++ 3 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 elasticsearch/lastUpdated.json diff --git a/elasticsearch/lastUpdated.json b/elasticsearch/lastUpdated.json new file mode 100644 index 000000000..b4238056c --- /dev/null +++ b/elasticsearch/lastUpdated.json @@ -0,0 +1,10 @@ +{ + "mappings": { + "properties": { + "date": { + "type": "date", + "format": "epoch_millis" + } + } + } +} diff --git a/scripts/initializeEs.js b/scripts/initializeEs.js index 9aa2511a9..b4601e5ff 100644 --- a/scripts/initializeEs.js +++ b/scripts/initializeEs.js @@ -1,12 +1,20 @@ import esUtils from './utils/esUtils.js'; const run = async () => { - /** initialize search index */ - await esUtils.createModelsIndex(); - await esUtils.configureArrangerSets(); + const { + createLastUpdatedIndex, + createModelsIndex, + configureArrangerSets, + createGenesIndex, + createVariantsIndex, + } = esUtils; - await esUtils.createGenesIndex(); - await esUtils.createVariantsIndex(); + /** initialize search index */ + await createLastUpdatedIndex(); + await createModelsIndex(); + await configureArrangerSets(); + await createGenesIndex(); + await createVariantsIndex(); }; run(); diff --git a/scripts/utils/esUtils.js b/scripts/utils/esUtils.js index d4efbcc04..99c026693 100644 --- a/scripts/utils/esUtils.js +++ b/scripts/utils/esUtils.js @@ -2,6 +2,7 @@ import getSearchClient from '../../cms/src/services/searchClient/client.js'; /** Search index settings and mappings **/ import modelsIndexConfig from '../../elasticsearch/modelsIndex.json' with { type: "json" }; +import updateIndexConfig from '../../elasticsearch/lastUpdated.json' with { type: "json" }; import genesIndexConfig from '../../elasticsearch/genesIndex.json' with { type: "json" }; import variantsIndexConfig from '../../elasticsearch/variantsIndex.json' with { type: "json" }; @@ -18,6 +19,7 @@ const pm2ConfigForEnv = const pm2 = { ...pm2ConfigGeneric, ...pm2ConfigForEnv }; const esHost = process.env.ES_HOST || `${pm2.ES_HOST}:${pm2.ES_PORT}`; +const updateIndexName = process.env.ES_UPDATE_INDEX || pm2.ES_UPDATE_INDEX || 'hcmi-update'; const modelsIndexName = process.env.ES_INDEX || pm2.ES_INDEX || 'hcmi'; const GENES_INDEX = 'genes'; @@ -49,6 +51,9 @@ const deleteIndex = async index => { }; /* ******* Models Index ******** */ +const createLastUpdatedIndex = async () => + await createIndex(updateIndexName, updateIndexConfig); + const createModelsIndex = async () => await createIndex(modelsIndexName, modelsIndexConfig); @@ -155,6 +160,7 @@ const configureArrangerSets = async () => { const esUtils = { config: pm2, + createLastUpdatedIndex, createModelsIndex, deleteModelsIndex, createGenesIndex, From fb35762c4cf03eef59e18c179cf2fc7ea441dbc9 Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Tue, 24 Mar 2026 16:04:04 -0400 Subject: [PATCH 16/82] Fix cms client args --- cms/src/services/searchClient/client.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cms/src/services/searchClient/client.js b/cms/src/services/searchClient/client.js index c9f032f54..65d1fb107 100644 --- a/cms/src/services/searchClient/client.js +++ b/cms/src/services/searchClient/client.js @@ -1,9 +1,13 @@ import { buildSearchClient } from '@overture-stack/arranger-server'; const getClient = async () => { - const host = process.env.ES_HOST || 'http://localhost:9200'; + const host = + process.env.ES_HOST && process.env.ES_PORT + ? `${process.env.ES_HOST}:${process.env.ES_PORT}` + : 'https://localhost:9200'; const user = process.env.ES_USER || ''; const password = process.env.ES_PASS || ''; + return await buildSearchClient(host, user, password); }; From 688cacea953c609dab8bd195b77cda95de3ebc95 Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Tue, 24 Mar 2026 19:00:40 -0400 Subject: [PATCH 17/82] Fixed SelectAll Admin Table behaviour --- cms/src/services/searchClient/client.js | 2 +- .../ModelsManager/ModelManagerController.jsx | 6 ++-- .../components/admin/helpers/tableActions.js | 31 ++++++++++--------- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/cms/src/services/searchClient/client.js b/cms/src/services/searchClient/client.js index 65d1fb107..67019d3df 100644 --- a/cms/src/services/searchClient/client.js +++ b/cms/src/services/searchClient/client.js @@ -4,7 +4,7 @@ const getClient = async () => { const host = process.env.ES_HOST && process.env.ES_PORT ? `${process.env.ES_HOST}:${process.env.ES_PORT}` - : 'https://localhost:9200'; + : 'http://localhost:9200'; const user = process.env.ES_USER || ''; const password = process.env.ES_PASS || ''; diff --git a/ui/src/components/admin/ModelsManager/ModelManagerController.jsx b/ui/src/components/admin/ModelsManager/ModelManagerController.jsx index a9270974d..ab25c19a0 100644 --- a/ui/src/components/admin/ModelsManager/ModelManagerController.jsx +++ b/ui/src/components/admin/ModelsManager/ModelManagerController.jsx @@ -28,18 +28,18 @@ import { ModelTableColumns } from './ModelColumns'; export const ModelManagerContext = React.createContext(); const loadData = async (baseUrl, state) => { - const getData = getPageData({ + const getData = await getPageData({ baseUrl, ...state, tableColumns: ModelTableColumns, }); - const getCount = getCountData({ + const getCount = await getCountData({ baseUrl: `${baseUrl}/count`, ...state, tableColumns: ModelTableColumns, }); - return [await getData, await getCount]; + return [getData, getCount]; }; const initPagingState = { diff --git a/ui/src/components/admin/helpers/tableActions.js b/ui/src/components/admin/helpers/tableActions.js index 2be0e01fc..38d5f10c2 100644 --- a/ui/src/components/admin/helpers/tableActions.js +++ b/ui/src/components/admin/helpers/tableActions.js @@ -17,7 +17,11 @@ const nestedStateResolver = (state, update, key) => export const generateTableActions = (setState, data, nestedStateKey = false) => ({ onPageChange: (newPage) => setState((state) => - nestedStateResolver(state, { page: newPage, isLoading: true }, nestedStateKey), + nestedStateResolver( + state, + { page: newPage, isLoading: true, selection: [], selectAll: false }, + nestedStateKey, + ), ), onFilterValueChange: (newValue) => setState((state) => @@ -56,22 +60,21 @@ export const generateTableActions = (setState, data, nestedStateKey = false) => }, toggleAll: () => { const ids = data.map(({ _id }) => _id); - - return setState((state) => - nestedStateResolver( + return setState((state) => { + const selectAllState = get( + state, + // Because we can have a nested key we use the lodash get function to extract the correct value + nestedStateKey ? `${nestedStateKey}.selectAll` : 'selectAll', + ); + const selection = !selectAllState ? ids : []; + return nestedStateResolver( state, { - selection: - // Becasue we can have a nested key we use the lodash get function to extract the correct value - get(state, nestedStateKey ? `${nestedStateKey}.selection` : 'selection').length === - ids.length - ? [] - : ids, - // Becasue we can have a nested key we use the lodash get function to extract the correct value - selectAll: !get(state, nestedStateKey ? `${nestedStateKey}.selectAll` : 'selectAll'), + selection, + selectAll: !selectAllState, }, nestedStateKey, - ), - ); + ); + }); }, }); From 9e00f8e1052472e955d5c79314bec7fcef7809ff Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Wed, 25 Mar 2026 14:18:34 -0400 Subject: [PATCH 18/82] File import and organization changes --- ui/src/components/admin/AdminView.jsx | 8 +++-- .../admin/Model/actions/GenomicVariants.js | 32 +++++++++---------- .../GenomicVariantImportNotifications.jsx | 19 ++++++----- .../Notifications/NotificationToaster.jsx | 16 +++++----- .../components/admin/Notifications/index.js | 13 +++++--- ui/vite.config.ts | 2 +- 6 files changed, 50 insertions(+), 40 deletions(-) diff --git a/ui/src/components/admin/AdminView.jsx b/ui/src/components/admin/AdminView.jsx index b0bb1fb12..a0e43dcd3 100644 --- a/ui/src/components/admin/AdminView.jsx +++ b/ui/src/components/admin/AdminView.jsx @@ -27,10 +27,14 @@ const AdminView = ({ location }) => { // Check for active genomic variant imports or publishes on page load useEffect(() => { - if (!didMountRef || !didMountRef.current) { + const fetchStatus = async () => { fetchImportStatus(); - fetchPublishStatus(); + await fetchPublishStatus(); didMountRef.current = true; + }; + + if (!didMountRef || !didMountRef.current) { + fetchStatus(); } }, []); diff --git a/ui/src/components/admin/Model/actions/GenomicVariants.js b/ui/src/components/admin/Model/actions/GenomicVariants.js index 995aaa088..88c0eeea4 100644 --- a/ui/src/components/admin/Model/actions/GenomicVariants.js +++ b/ui/src/components/admin/Model/actions/GenomicVariants.js @@ -1,5 +1,5 @@ -import { get, post } from '../../services/Fetcher'; -import config from '../../config'; +import config from '../../config.js'; +import { get, post } from '../../services/Fetcher.jsx'; const GENOMIC_VARIANTS_URL = `${config.urls.cmsBase}/genomic-variants`; @@ -36,9 +36,9 @@ export const auditGenomicVariantsSpecificModels = async (models) => { }; export const clearGenomicVariants = async (modelName) => { - return new Promise(async (resolve, reject) => { + return new Promise((resolve, reject) => { const url = `${GENOMIC_VARIANTS_URL}/clear/${modelName}`; - await post({ url }) + post({ url }) .then((res) => { resolve(res.data); }) @@ -49,9 +49,9 @@ export const clearGenomicVariants = async (modelName) => { }; export const checkImportStatus = async () => { - return new Promise(async (resolve, reject) => { + return new Promise((resolve, reject) => { const url = `${GENOMIC_VARIANTS_URL}/status`; - await get({ url }) + get({ url }) .then((res) => { resolve(res.data); }) @@ -62,9 +62,9 @@ export const checkImportStatus = async () => { }; export const acknowledgeImportStatus = async (modelName) => { - return new Promise(async (resolve, reject) => { + return new Promise((resolve, reject) => { const url = `${GENOMIC_VARIANTS_URL}/acknowledge/${modelName}`; - await post({ url }) + post({ url }) .then((res) => { resolve(res.data); }) @@ -75,9 +75,9 @@ export const acknowledgeImportStatus = async (modelName) => { }; export const acknowledgeBulkImportStatus = async (models) => { - return new Promise(async (resolve, reject) => { + return new Promise((resolve, reject) => { const url = `${GENOMIC_VARIANTS_URL}/acknowledge/bulk`; - await post({ + post({ url, data: { models, @@ -93,9 +93,9 @@ export const acknowledgeBulkImportStatus = async (models) => { }; export const resolveMafFileConflict = async (modelName, fileId, filename) => { - return new Promise(async (resolve, reject) => { + return new Promise((resolve, reject) => { const url = `${GENOMIC_VARIANTS_URL}/resolve`; - await post({ + post({ url, data: { name: modelName, @@ -113,9 +113,9 @@ export const resolveMafFileConflict = async (modelName, fileId, filename) => { }; export const stopAllImports = async () => { - return new Promise(async (resolve, reject) => { + return new Promise((resolve, reject) => { const url = `${GENOMIC_VARIANTS_URL}/stop/all`; - await post({ url }) + post({ url }) .then((res) => { resolve(res.data); }) @@ -126,9 +126,9 @@ export const stopAllImports = async () => { }; export const manualMafImport = async (modelName, fileId, filename) => { - return new Promise(async (resolve, reject) => { + return new Promise((resolve, reject) => { const url = `${GENOMIC_VARIANTS_URL}/import/${modelName}`; - await post({ + post({ url, data: { fileId: fileId, diff --git a/ui/src/components/admin/Notifications/GenomicVariantImportNotifications.jsx b/ui/src/components/admin/Notifications/GenomicVariantImportNotifications.jsx index 5ac81fc73..119887503 100644 --- a/ui/src/components/admin/Notifications/GenomicVariantImportNotifications.jsx +++ b/ui/src/components/admin/Notifications/GenomicVariantImportNotifications.jsx @@ -1,19 +1,21 @@ import { useContext, useEffect, useState } from 'react'; +import { ButtonPill } from '~/theme/adminControlsStyles.js'; +import { + NotificationTableHeaderRow, + NotificationTableHeaderCol, +} from '~/theme/adminNotificationStyles.js'; +import { Row } from '~/theme/system.jsx'; + import { BULK_NONACTIONABLE_ERROR_ID, GDC_MODEL_STATES, GENOMIC_VARIANTS_IMPORT_ERRORS, VARIANT_IMPORT_TYPES, -} from '~/utils/constants'; -import { ButtonPill } from '~/theme/adminControlsStyles'; -import { - NotificationTableHeaderRow, - NotificationTableHeaderCol, -} from '~/theme/adminNotificationStyles'; -import { Row } from '~/theme/system'; +} from '~/utils/constants.js'; + +import withConfirmMafFileModal from '../../modals/ConfirmMafFileModal.jsx'; -import withConfirmMafFileModal from '../../modals/ConfirmMafFileModal'; import { acknowledgeImportStatus, acknowledgeBulkImportStatus, @@ -537,6 +539,7 @@ const useGenomicVariantImportNotifications = () => { setImportProgress(importStatus); }) .catch((error) => { + console.error('fetchImportStatus error', error); showUnexpectedImportError(error); }); }; diff --git a/ui/src/components/admin/Notifications/NotificationToaster.jsx b/ui/src/components/admin/Notifications/NotificationToaster.jsx index 9035162ad..bf0459662 100644 --- a/ui/src/components/admin/Notifications/NotificationToaster.jsx +++ b/ui/src/components/admin/Notifications/NotificationToaster.jsx @@ -23,16 +23,16 @@ import { ShowHideButtonLabel, PlusMinusIcon, } from '~/theme/adminNotificationStyles'; -import { Col } from '~/theme/system'; -import base from '~/theme/index'; +import base from '~/theme/index.js'; +import { Col } from '~/theme/system.jsx'; import { PUBLISH_TYPES, VARIANT_IMPORT_TYPES } from '~/utils/constants'; -import { NotificationsContext } from './NotificationsController'; -import useGenomicVariantImportNotifications from './GenomicVariantImportNotifications'; -import usePublishNotifications from './PublishNotifications'; -import NOTIFICATION_TYPES from './NotificationTypes'; -import ProgressBanner from './ProgressBanner'; -import PublishProgress from './PublishProgress'; +import useGenomicVariantImportNotifications from './GenomicVariantImportNotifications.jsx'; +import { NotificationsContext } from './NotificationsController.jsx'; +import NOTIFICATION_TYPES from './NotificationTypes.js'; +import ProgressBanner from './ProgressBanner.jsx'; +import usePublishNotifications from './PublishNotifications.jsx'; +import PublishProgress from './PublishProgress.jsx'; const { keyedPalette: { alizarinCrimson, pelorousapprox, trout, yellowOrange }, diff --git a/ui/src/components/admin/Notifications/index.js b/ui/src/components/admin/Notifications/index.js index e949a0aaf..583907aa3 100644 --- a/ui/src/components/admin/Notifications/index.js +++ b/ui/src/components/admin/Notifications/index.js @@ -1,9 +1,12 @@ -export { default as NotificationToaster } from './NotificationToaster'; -export { default as NotificationsProvider, NotificationsContext } from './NotificationsController'; -export { default as NOTIFICATION_TYPES } from './NotificationTypes'; -export { default as useGenomicVariantImportNotifications } from './GenomicVariantImportNotifications'; +export { default as NotificationToaster } from './NotificationToaster.jsx'; +export { + default as NotificationsProvider, + NotificationsContext, +} from './NotificationsController.jsx'; +export { default as NOTIFICATION_TYPES } from './NotificationTypes.js'; +export { default as useGenomicVariantImportNotifications } from './GenomicVariantImportNotifications.jsx'; export { default as usePublishNotifications, PublishNotificationsContext, PublishNotificationsProvider, -} from './PublishNotifications'; +} from './PublishNotifications.jsx'; diff --git a/ui/vite.config.ts b/ui/vite.config.ts index fcec787aa..e7291c023 100644 --- a/ui/vite.config.ts +++ b/ui/vite.config.ts @@ -1,5 +1,5 @@ -import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; +import { defineConfig } from 'vite'; import tsconfigPaths from 'vite-tsconfig-paths'; export default defineConfig(() => { From cbffa7761396c5bc1ef37f118f6cf14a3ad74122 Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Wed, 25 Mar 2026 16:27:46 -0400 Subject: [PATCH 19/82] Fixed bulk publish/unpublish toggle all & counts --- cms/src/routes/bulk.js | 51 +- cms/src/services/searchClient/unpublish.js | 2 +- ui/src/components/admin/AdminView.jsx | 4 +- .../ModelsManager/ModelManagerController.jsx | 522 +++++++++--------- .../admin/ModelsManager/ModelsManager.jsx | 56 +- .../admin/Notifications/PublishProgress.jsx | 18 +- .../components/admin/helpers/tableActions.js | 4 +- 7 files changed, 334 insertions(+), 323 deletions(-) diff --git a/cms/src/routes/bulk.js b/cms/src/routes/bulk.js index 009183d80..6fe738555 100644 --- a/cms/src/routes/bulk.js +++ b/cms/src/routes/bulk.js @@ -102,34 +102,31 @@ bulkRouter.post('/unpublish', async (req, res) => { }); bulkRouter.post('/delete', async (req, res) => { - Model.find({ _id: { $in: req.body } }) - .then((models) => { - const modelsToUnpublish = models - .filter(({ status }) => status !== modelStatus.unpublished) - .map(({ name }) => name); - return unpublishManyFromES(modelsToUnpublish); - }) - .then(async () => { - for (const _id of req.body) { - // Now that everything has been published, lets make sure all the matched models for these are also updated in ES - await indexMatchedModelsToES({ _id }); - } - await updateGeneSearchIndicies(); - }) - .then(() => - Model.deleteMany({ - _id: { $in: req.body }, - }), - ) - .then(() => { - return res.json({ success: `${req.body.length} models deleted` }); - }) - .catch((error) => { - logger.error(error); - res.status(500).json({ - error: error, - }); + try { + const models = await Model.find({ _id: { $in: req.body } }); + const modelsToUnpublish = models + .filter(({ status }) => status !== modelStatus.unpublished) + .map(({ name }) => name); + await unpublishManyFromES(modelsToUnpublish); + + for (const _id of req.body) { + // Now that everything has been published, lets make sure all the matched models for these are also updated in ES + await indexMatchedModelsToES({ _id }); + } + + await updateGeneSearchIndicies(); + + await Model.deleteMany({ + _id: { $in: req.body }, }); + + return res.json({ success: `${req.body.length} models deleted` }); + } catch (error) { + logger.error(error); + return res.status(500).json({ + error: error, + }); + } }); bulkRouter.get('/backup', async (req, res) => { diff --git a/cms/src/services/searchClient/unpublish.js b/cms/src/services/searchClient/unpublish.js index c26e68a1a..a5736bbf1 100644 --- a/cms/src/services/searchClient/unpublish.js +++ b/cms/src/services/searchClient/unpublish.js @@ -46,7 +46,7 @@ export const unpublishManyFromES = async (nameArr) => { // resolve as this is just bookkeeping await indexLastUpdated(); const searchClient = await getClient(); - return searchClient.deleteByQuery({ + return await searchClient.deleteByQuery({ index, body: { query: { diff --git a/ui/src/components/admin/AdminView.jsx b/ui/src/components/admin/AdminView.jsx index a0e43dcd3..ed213e3c4 100644 --- a/ui/src/components/admin/AdminView.jsx +++ b/ui/src/components/admin/AdminView.jsx @@ -29,14 +29,14 @@ const AdminView = ({ location }) => { useEffect(() => { const fetchStatus = async () => { fetchImportStatus(); - await fetchPublishStatus(); + fetchPublishStatus && (await fetchPublishStatus()); didMountRef.current = true; }; if (!didMountRef || !didMountRef.current) { fetchStatus(); } - }, []); + }, [didMountRef, fetchImportStatus, fetchPublishStatus]); // Poll for status changes on any active imports useInterval( diff --git a/ui/src/components/admin/ModelsManager/ModelManagerController.jsx b/ui/src/components/admin/ModelsManager/ModelManagerController.jsx index ab25c19a0..91aa681dc 100644 --- a/ui/src/components/admin/ModelsManager/ModelManagerController.jsx +++ b/ui/src/components/admin/ModelsManager/ModelManagerController.jsx @@ -157,6 +157,7 @@ const ModelManagerController = ({ baseUrl, cmsBase, children, ...props }) => ( if ( state.pageSize !== prevState.pageSize || state.page !== prevState.page || + state.toggleAll !== prevState.toggleAll || state.filterValue !== prevState.filterValue || state.sorted !== prevState.sorted ) { @@ -185,291 +186,296 @@ const ModelManagerController = ({ baseUrl, cmsBase, children, ...props }) => ( { maxWait: 1000, trailing: true }, )} > - {({ state, setState }) => ( - { - // Set loading true (lock UI) - await setState({ - isLoading: true, - }); + {({ state, setState }) => + state ? ( + { + // Set loading true (lock UI) + await setState({ + isLoading: true, + }); - uploadModelsFromSheet(sheetURL, overwrite) - .then(({ data: { result } }) => - loadData(baseUrl, state).then(async ([dataResponse, countResponse]) => { - await setState({ - isLoading: false, - data: dataResponse.data, - error: null, - rowCount: countResponse.data.count, - ...initPagingState, - }); - const anyUpdatesDone = isEmptyResult(result); - const notificationMessage = anyUpdatesDone - ? `No suitable data is available to upload. No changes were made.` - : `Bulk Upload of models has successfully completed. New models or updated fields are saved but not yet published.`; - await appendNotification({ - type: - result?.errors?.length > 0 - ? NOTIFICATION_TYPES.WARNING - : NOTIFICATION_TYPES.SUCCESS, - message: notificationMessage, - details: anyUpdatesDone ? '' : extractResultText(result), - bulkErrors: result?.errors, - timeout: false, // do not auto-remove this notification - }); - let modelNames; - switch (overwriteVariants) { - case VARIANT_OVERWRITE_OPTIONS.allModels: - modelNames = [ - ...result?.new, - ...result?.updated, - ...result?.unchanged, - ]; - if (!modelNames.length) { - return; - } + uploadModelsFromSheet(sheetURL, overwrite) + .then(({ data: { result } }) => + loadData(baseUrl, state).then(async ([dataResponse, countResponse]) => { + await setState({ + isLoading: false, + data: dataResponse.data, + error: null, + rowCount: countResponse.data.count, + ...initPagingState, + }); + const anyUpdatesDone = isEmptyResult(result); + const notificationMessage = anyUpdatesDone + ? `No suitable data is available to upload. No changes were made.` + : `Bulk Upload of models has successfully completed. New models or updated fields are saved but not yet published.`; + await appendNotification({ + type: + result?.errors?.length > 0 + ? NOTIFICATION_TYPES.WARNING + : NOTIFICATION_TYPES.SUCCESS, + message: notificationMessage, + details: anyUpdatesDone ? '' : extractResultText(result), + bulkErrors: result?.errors, + timeout: false, // do not auto-remove this notification + }); + let modelNames; + switch (overwriteVariants) { + case VARIANT_OVERWRITE_OPTIONS.allModels: + modelNames = [ + ...result?.new, + ...result?.updated, + ...result?.unchanged, + ]; + if (!modelNames.length) { + return; + } - await importBulkGenomicVariants(modelNames) - .then((response) => { - if (response.data.success) { - setImportProgress({ - ...importProgress, - running: true, + await importBulkGenomicVariants(modelNames) + .then((response) => { + if (response.data.success) { + setImportProgress({ + ...importProgress, + running: true, + }); + } + }) + .catch(async (error) => { + await appendNotification({ + type: NOTIFICATION_TYPES.ERROR, + message: 'Bulk Import of Research Somatic Variants Failed.', + details: error.response + ? error.response.data.error.message + : error.message, + timeout: false, }); - } - }) - .catch(async (error) => { - await appendNotification({ - type: NOTIFICATION_TYPES.ERROR, - message: 'Bulk Import of Research Somatic Variants Failed.', - details: error.response - ? error.response.data.error.message - : error.message, - timeout: false, }); - }); - break; - case VARIANT_OVERWRITE_OPTIONS.cleanOnly: - modelNames = [ - ...result?.new, - ...result?.updated, - ...result?.unchanged, - ]; - if (!modelNames.length) { - return; - } + break; + case VARIANT_OVERWRITE_OPTIONS.cleanOnly: + modelNames = [ + ...result?.new, + ...result?.updated, + ...result?.unchanged, + ]; + if (!modelNames.length) { + return; + } - const checkVariantsResponse = - await auditGenomicVariantsSpecificModels(modelNames); - await importBulkGenomicVariants(checkVariantsResponse.data.clean) - .then((response) => { - if (response.data.success) { - setImportProgress({ - ...importProgress, - running: true, + const checkVariantsResponse = + await auditGenomicVariantsSpecificModels(modelNames); + await importBulkGenomicVariants(checkVariantsResponse.data.clean) + .then((response) => { + if (response.data.success) { + setImportProgress({ + ...importProgress, + running: true, + }); + } + }) + .catch(async (error) => { + await appendNotification({ + type: NOTIFICATION_TYPES.ERROR, + message: 'Bulk Import of Research Somatic Variants Failed.', + details: error.response + ? error.response.data.error.message + : error.message, + timeout: false, }); - } - }) - .catch(async (error) => { - await appendNotification({ - type: NOTIFICATION_TYPES.ERROR, - message: 'Bulk Import of Research Somatic Variants Failed.', - details: error.response - ? error.response.data.error.message - : error.message, - timeout: false, }); - }); - break; - case VARIANT_OVERWRITE_OPTIONS.none: - default: - break; - } - }), - ) - .catch(async (err) => { - const errorText = extractErrorText(err); + break; + case VARIANT_OVERWRITE_OPTIONS.none: + default: + break; + } + }), + ) + .catch(async (err) => { + const errorText = extractErrorText(err); - await setState({ - isLoading: false, - }); + await setState({ + isLoading: false, + }); - await appendNotification({ - type: NOTIFICATION_TYPES.ERROR, - message: 'Model Upload Error.', - details: errorText.length > 0 ? errorText : 'Unknown error has occurred.', + await appendNotification({ + type: NOTIFICATION_TYPES.ERROR, + message: 'Model Upload Error.', + details: + errorText.length > 0 ? errorText : 'Unknown error has occurred.', + }); }); - }); - }, - bulkImportVariants: async (modelNames) => { - return importBulkGenomicVariants(modelNames) - .then((response) => { - if (response.data.success) { - setImportProgress({ - ...importProgress, - running: true, + }, + bulkImportVariants: async (modelNames) => { + return importBulkGenomicVariants(modelNames) + .then((response) => { + if (response.data.success) { + setImportProgress({ + ...importProgress, + running: true, + }); + } + }) + .catch(async (error) => { + await appendNotification({ + type: NOTIFICATION_TYPES.ERROR, + message: 'Bulk Import of Research Somatic Variants Failed.', + details: error.response + ? error.response.data.error.message + : error.message, + timeout: false, }); - } - }) - .catch(async (error) => { - await appendNotification({ - type: NOTIFICATION_TYPES.ERROR, - message: 'Bulk Import of Research Somatic Variants Failed.', - details: error.response - ? error.response.data.error.message - : error.message, - timeout: false, }); + }, + bulkPublish: async () => { + // display a temporary notification immediately while waiting for the server response + const tempNotification = await appendNotification({ + type: NOTIFICATION_TYPES.LOADING, + message: 'Initiating Bulk Publish...', + details: + 'You can continue to use the CMS and will be notified when the publish is complete. Please note that some functions are unavailable during the publish process.', + timeout: false, }); - }, - bulkPublish: async () => { - // display a temporary notification immediately while waiting for the server response - const tempNotification = await appendNotification({ - type: NOTIFICATION_TYPES.LOADING, - message: 'Initiating Bulk Publish...', - details: - 'You can continue to use the CMS and will be notified when the publish is complete. Please note that some functions are unavailable during the publish process.', - timeout: false, - }); - await publishBulk(state.selection) - .then(async (response) => { - if (response.data.success) { - await setPublishProgress({ - ...publishProgress, - running: true, + await publishBulk(state.selection) + .then(async (response) => { + if (response.data.success) { + await setPublishProgress({ + ...publishProgress, + running: true, + }); + await tempNotification.clear(); + } + }) + .catch(async (error) => { + await appendNotification({ + type: NOTIFICATION_TYPES.ERROR, + message: 'Bulk Publish Failed.', + details: error.response + ? error.response.data.error.message + : error?.error?.message || error?.message || error, + timeout: false, }); await tempNotification.clear(); - } - }) - .catch(async (error) => { - await appendNotification({ - type: NOTIFICATION_TYPES.ERROR, - message: 'Bulk Publish Failed.', - details: error.response - ? error.response.data.error.message - : error?.error?.message || error?.message || error, - timeout: false, }); - await tempNotification.clear(); - }); - }, - bulkUnpublish: bulkActionCreator({ - action: 'unpublish', - baseUrl, - state, - setState, - appendNotification, - }), - bulkDelete: bulkActionCreator({ - action: 'delete', - baseUrl, - state, - setState, - appendNotification, - }), - publishOne: async (name) => { - await publish(name) - .then(async () => { - await addPublishNotification(name); - }) - .catch(async (error) => { - const data = error.response ? error.response.data : error; - showErrorPublishNotification(name, data); + }, + bulkUnpublish: bulkActionCreator({ + action: 'unpublish', + baseUrl, + state, + setState, + appendNotification, + }), + bulkDelete: bulkActionCreator({ + action: 'delete', + baseUrl, + state, + setState, + appendNotification, + }), + publishOne: async (name) => { + await publish(name) + .then(async () => { + await addPublishNotification(name); + }) + .catch(async (error) => { + const data = error.response ? error.response.data : error; + showErrorPublishNotification(name, data); + }); + }, + unpublishOne: async (name) => { + // Set loading true (lock UI) + await setState({ + isLoading: true, }); - }, - unpublishOne: async (name) => { - // Set loading true (lock UI) - await setState({ - isLoading: true, - }); - singleAction('unpublish', name) - .then(() => loadData(baseUrl, state)) - .then(async ([dataResponse, countResponse]) => { - await setState(() => ({ - isLoading: false, - data: dataResponse.data, - error: null, - rowCount: countResponse.data.count, - })); + singleAction('unpublish', name) + .then(() => loadData(baseUrl, state)) + .then(async ([dataResponse, countResponse]) => { + await setState(() => ({ + isLoading: false, + data: dataResponse.data, + error: null, + rowCount: countResponse.data.count, + })); - await appendNotification({ - type: NOTIFICATION_TYPES.SUCCESS, - message: `Unpublish Successful!`, - details: `${name} has been successfully unpublished`, - }); - }) - .catch(async (err) => { - const errorText = extractErrorText(err); + await appendNotification({ + type: NOTIFICATION_TYPES.SUCCESS, + message: `Unpublish Successful!`, + details: `${name} has been successfully unpublished`, + }); + }) + .catch(async (err) => { + const errorText = extractErrorText(err); - await setState({ - isLoading: false, - error: err, - }); + await setState({ + isLoading: false, + error: err, + }); - await appendNotification({ - type: NOTIFICATION_TYPES.ERROR, - message: `Unpublish Error.`, - details: errorText.length > 0 ? errorText : 'Unknown error has occurred.', - timeout: false, // do not auto-remove this notification when unpublishing + await appendNotification({ + type: NOTIFICATION_TYPES.ERROR, + message: `Unpublish Error.`, + details: + errorText.length > 0 ? errorText : 'Unknown error has occurred.', + timeout: false, // do not auto-remove this notification when unpublishing + }); }); - }); - }, - deleteOne: async (name) => { - // Set loading true (lock UI) - await setState({ isLoading: true }); + }, + deleteOne: async (name) => { + // Set loading true (lock UI) + await setState({ isLoading: true }); - singleAction('delete', name) - .then(() => loadData(baseUrl, state)) - .then(async ([dataResponse, countResponse]) => { - await setState(() => ({ - isLoading: false, - data: dataResponse.data, - error: null, - rowCount: countResponse.data.count, - })); + singleAction('delete', name) + .then(() => loadData(baseUrl, state)) + .then(async ([dataResponse, countResponse]) => { + await setState(() => ({ + isLoading: false, + data: dataResponse.data, + error: null, + rowCount: countResponse.data.count, + })); - await appendNotification({ - type: NOTIFICATION_TYPES.SUCCESS, - message: `Delete Successful!`, - details: `${name} has been successfully deleted`, - }); - }) - .catch(async (err) => { - const errorText = extractErrorText(err); + await appendNotification({ + type: NOTIFICATION_TYPES.SUCCESS, + message: `Delete Successful!`, + details: `${name} has been successfully deleted`, + }); + }) + .catch(async (err) => { + const errorText = extractErrorText(err); - await setState({ - isLoading: false, - error: err, - }); + await setState({ + isLoading: false, + error: err, + }); - await appendNotification({ - type: NOTIFICATION_TYPES.ERROR, - message: `Delete Error.`, - details: errorText.length > 0 ? errorText : 'Unknown error has occurred.', - timeout: false, // do not auto-remove this notification when deleting + await appendNotification({ + type: NOTIFICATION_TYPES.ERROR, + message: `Delete Error.`, + details: + errorText.length > 0 ? errorText : 'Unknown error has occurred.', + timeout: false, // do not auto-remove this notification when deleting + }); }); - }); - }, - refreshModelsTable: async () => { - const [dataResponse, countResponse] = await loadData(baseUrl, state); - setState(() => ({ - isLoading: false, - data: dataResponse.data, - error: null, - rowCount: countResponse.data.count, - ...initPagingState, - })); - }, - ...generateTableActions(setState, state.data), - }} - {...props} - > - {children} - - )} + }, + refreshModelsTable: async () => { + const [dataResponse, countResponse] = await loadData(baseUrl, state); + setState(() => ({ + isLoading: false, + data: dataResponse.data, + error: null, + rowCount: countResponse.data.count, + ...initPagingState, + })); + }, + ...generateTableActions(setState, state.data), + }} + {...props} + > + {children} + + ) : null + } )} diff --git a/ui/src/components/admin/ModelsManager/ModelsManager.jsx b/ui/src/components/admin/ModelsManager/ModelsManager.jsx index 62e25724a..261fe23cc 100644 --- a/ui/src/components/admin/ModelsManager/ModelsManager.jsx +++ b/ui/src/components/admin/ModelsManager/ModelsManager.jsx @@ -49,33 +49,35 @@ const ModelsManager = () => { )} - {({ uploadModelsFromSheet, state }) => ( - - {(modalState) => ( - - modalState.setModalState({ - component: ( - - ), - shouldCloseOnOverlayClick: true, - styles: AdminModalStyle, - }) - } - disabled={(state && state.isLoading) || publishRunning} - > - - Add Bulk - - )} - - )} + {({ uploadModelsFromSheet, state }) => + state ? ( + + {(modalState) => ( + + modalState.setModalState({ + component: ( + + ), + shouldCloseOnOverlayClick: true, + styles: AdminModalStyle, + }) + } + disabled={(state && state.isLoading) || publishRunning} + > + + Add Bulk + + )} + + ) : null + } diff --git a/ui/src/components/admin/Notifications/PublishProgress.jsx b/ui/src/components/admin/Notifications/PublishProgress.jsx index f5dcc73e3..ea5aaf9c1 100644 --- a/ui/src/components/admin/Notifications/PublishProgress.jsx +++ b/ui/src/components/admin/Notifications/PublishProgress.jsx @@ -107,18 +107,21 @@ const PublishProgress = ({ renderIcon }) => { const getProgressBannerMessage = () => { let completePublishes; - switch (getBulkPublishState()) { + const bulkPublishState = getBulkPublishState(); + const bulkPublishes = getBulkPublishes(); + + switch (bulkPublishState) { case BulkPublishState.complete: - completePublishes = getBulkPublishes().filter((x) => x.status === PUBLISH_STATUS.complete); + completePublishes = bulkPublishes.filter((x) => x.status === PUBLISH_STATUS.complete); return `Bulk Publish Complete: ${completePublishes.length} model${ completePublishes.length === 1 ? ' has' : 's have' } been published.`; case BulkPublishState.publishing: - return `Publishing: ${getBulkPublishes().length} model${ - getBulkPublishes().length === 1 ? ' is' : 's are' + return `Publishing: ${bulkPublishes.length} model${ + bulkPublishes.length === 1 ? ' is' : 's are' } currently publishing.`; case BulkPublishState.stopped: - completePublishes = getBulkPublishes().filter((x) => x.status === PUBLISH_STATUS.complete); + completePublishes = bulkPublishes.filter((x) => x.status === PUBLISH_STATUS.complete); return `Bulk Publish Stopped: ${completePublishes.length} model${ completePublishes.length === 1 ? ' has' : 's have' } successfully published.`; @@ -129,6 +132,7 @@ const PublishProgress = ({ renderIcon }) => { }; const ProgressBar = () => { + const bulkPublishState = getBulkPublishState(); const success = getBulkPublishes().filter((x) => x.status === PUBLISH_STATUS.complete); const failed = getBulkPublishes().filter((x) => x.status === PUBLISH_STATUS.error); const incomplete = getBulkPublishes().filter( @@ -139,7 +143,7 @@ const PublishProgress = ({ renderIcon }) => { ); const meta = () => { - switch (getBulkPublishState()) { + switch (bulkPublishState) { case BulkPublishState.publishing: return `In Progress: ${incomplete.length}`; case BulkPublishState.complete: @@ -163,7 +167,7 @@ const PublishProgress = ({ renderIcon }) => { } prevPublishState.current = getBulkPublishState(); - }, [publishProgress]); + }, [bulkPublishState]); return ( diff --git a/ui/src/components/admin/helpers/tableActions.js b/ui/src/components/admin/helpers/tableActions.js index 38d5f10c2..3509ff71d 100644 --- a/ui/src/components/admin/helpers/tableActions.js +++ b/ui/src/components/admin/helpers/tableActions.js @@ -61,12 +61,14 @@ export const generateTableActions = (setState, data, nestedStateKey = false) => toggleAll: () => { const ids = data.map(({ _id }) => _id); return setState((state) => { + const { pageSize } = state; const selectAllState = get( state, // Because we can have a nested key we use the lodash get function to extract the correct value nestedStateKey ? `${nestedStateKey}.selectAll` : 'selectAll', ); - const selection = !selectAllState ? ids : []; + const paginatedIds = ids.slice(0, pageSize); + const selection = !selectAllState ? paginatedIds : []; return nestedStateResolver( state, { From a637dc8ae80f5eef46fef31e3cdb1e882e98b4d1 Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Thu, 26 Mar 2026 11:34:03 -0400 Subject: [PATCH 20/82] Update searchClient definition --- api/src/services/searchClient.ts | 4 ++-- cms/src/services/searchClient/client.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api/src/services/searchClient.ts b/api/src/services/searchClient.ts index 46252c15c..bdb28949d 100644 --- a/api/src/services/searchClient.ts +++ b/api/src/services/searchClient.ts @@ -1,10 +1,10 @@ import { buildSearchClient } from '@overture-stack/arranger-server'; const getClient = async () => { - const host = process.env.ES_URL || 'http://localhost:9200'; + const node = process.env.ES_URL || 'http://localhost:9200'; const user = process.env.ES_USER || ''; const password = process.env.ES_PASS || ''; - return await buildSearchClient(host, user, password); + return await buildSearchClient({ node, user, password }); }; export default getClient; diff --git a/cms/src/services/searchClient/client.js b/cms/src/services/searchClient/client.js index 67019d3df..3b07a560e 100644 --- a/cms/src/services/searchClient/client.js +++ b/cms/src/services/searchClient/client.js @@ -1,14 +1,14 @@ import { buildSearchClient } from '@overture-stack/arranger-server'; const getClient = async () => { - const host = + const node = process.env.ES_HOST && process.env.ES_PORT ? `${process.env.ES_HOST}:${process.env.ES_PORT}` : 'http://localhost:9200'; const user = process.env.ES_USER || ''; const password = process.env.ES_PASS || ''; - return await buildSearchClient(host, user, password); + return await buildSearchClient({ node, user, password }); }; export default getClient; From 4bf3c8e3dc2e4a086efcd2cb96d76bfd356050fb Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Thu, 26 Mar 2026 14:20:09 -0400 Subject: [PATCH 21/82] Fix duplicate indexing bug --- cms/src/services/searchClient/indexModel.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cms/src/services/searchClient/indexModel.js b/cms/src/services/searchClient/indexModel.js index 044725ce9..987c34ae6 100644 --- a/cms/src/services/searchClient/indexModel.js +++ b/cms/src/services/searchClient/indexModel.js @@ -6,11 +6,12 @@ const logger = getLogger('services/searchClient/update'); const index = process.env.ES_INDEX; -const indexModel = async (model) => { +const indexModel = async (id, model) => { const searchClient = await getClient(); return searchClient .index({ index, + id, body: { ...model, }, From 129c69195e1b83ebd61a61b059a274a409ca09ec Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Thu, 26 Mar 2026 15:00:44 -0400 Subject: [PATCH 22/82] Fix Somatic Variant Search --- api/src/search.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/src/search.js b/api/src/search.js index 15e51c283..bbc32ad4c 100644 --- a/api/src/search.js +++ b/api/src/search.js @@ -58,7 +58,8 @@ geneSearchRouter.get('/variant', async (req, res) => { }, }; - const response = await esClient.search({ + const searchClient = await getClient(); + const response = await searchClient.search({ index: VARIANTS_INDEX, body: { query }, }); From fed215b3e211d7455b25580a43272b46dc59fc4f Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Mon, 30 Mar 2026 12:23:39 -0400 Subject: [PATCH 23/82] Genomic Variant falsy handling --- .../services/searchClient/genomicVariants.js | 6 +- ui/src/components/charts/TopVariantsChart.jsx | 298 +++++++++--------- 2 files changed, 152 insertions(+), 152 deletions(-) diff --git a/cms/src/services/searchClient/genomicVariants.js b/cms/src/services/searchClient/genomicVariants.js index c2cd00d39..bdb4d2cd9 100644 --- a/cms/src/services/searchClient/genomicVariants.js +++ b/cms/src/services/searchClient/genomicVariants.js @@ -164,7 +164,7 @@ export const updateGeneSearchIndicies = async () => { // 1a. collect set of genes and variants from those model variants const desiredGenomicVariants = flatten( publishedModels.map((model) => { - return (model._source.genomic_variants || []).map((variant) => ({ + return (model?._source?.genomic_variants || []).map((variant) => ({ variant: { transcript_id: variant.transcript_id, variant_id: variant.variant_id, @@ -179,7 +179,9 @@ export const updateGeneSearchIndicies = async () => { ); const clinicalVariantGenes = flatten( - publishedModels.map((model) => flatten(model._source.variants.map((variant) => variant.genes))), + publishedModels?.map((model) => + flatten(model?._source?.variants?.map((variant) => variant.genes) || []), + ), ); logger.debug({ clinicalVariantGenes }, 'Genes found in published model variants'); diff --git a/ui/src/components/charts/TopVariantsChart.jsx b/ui/src/components/charts/TopVariantsChart.jsx index ed2524d16..4aab64364 100644 --- a/ui/src/components/charts/TopVariantsChart.jsx +++ b/ui/src/components/charts/TopVariantsChart.jsx @@ -21,161 +21,159 @@ const TopVariantsChart = ({ sqon, setSQON }) => ( `} > - {({ state: aggState }) => { - return ( - b.key !== '__missing__') - .sort((a, b) => { - if (b.doc_count === a.doc_count) { - if (a.key > b.key) { - return 1; - } - if (a.key < b.key) { - return -1; - } - return 0; - } else { - return b.doc_count - a.doc_count; + {({ state: aggState }) => ( + b.key !== '__missing__') + .sort((a, b) => { + if (b.doc_count === a.doc_count) { + if (a.key > b.key) { + return 1; } - }) - .slice(0, 10)} - initialState={{ coloredTop10: [] }} - loading={aggState.loading} - shouldUpdate={({ props, nextProps, state, nextState }) => { - return ( - !isEqual(props.top10, nextProps.top10) || - !isEqual(state.coloredTop10, nextState.coloredTop10) - ); - }} - didUpdate={({ setState, props, prevState }) => { - const byKey = prevState.coloredTop10.reduce( - (acc, { key, color }) => ({ ...acc, [key]: color }), - {}, - ); - const { coloredTop10 } = props.top10.reduce( - (acc, bucket) => { - const color = byKey[bucket.key] || acc.palette[0]; - const palette = acc.palette.filter((pColor) => pColor !== color); - return { - coloredTop10: [ - ...acc.coloredTop10, - { - ...bucket, - color, - }, - ], - palette, - }; - }, - { coloredTop10: [], palette: theme.mutatedGenesChartPalette }, - ); - setState({ - coloredTop10, - }); - }} - > - {({ - state: { coloredTop10, loading }, - largestCount = coloredTop10.reduce( - (largest, { doc_count }) => (doc_count > largest ? doc_count : largest), - 0, - ), - yGridValues = largestCount > 0 ? [0, largestCount] : [], - }) => { - return loading ? ( - Loading... - ) : ( - <> - - Most Frequently Mutated Genes - - (data || { data: { color: 'white' } }).data.color} - axisBottom={{ - tickSize: 0, - tickPadding: 5, - tickRotation: 45, - legendOffset: 50, - format: (value) => { - const cutoffLength = 6; - const dashIndex = value.indexOf('-'); - const spaceIndex = value.indexOf(' '); + if (a.key < b.key) { + return -1; + } + return 0; + } else { + return b.doc_count - a.doc_count; + } + }) + .slice(0, 10)} + initialState={{ coloredTop10: [] }} + loading={aggState.loading} + shouldUpdate={({ props, nextProps, state, nextState }) => { + return ( + !isEqual(props.top10, nextProps.top10) || + !isEqual(state.coloredTop10, nextState.coloredTop10) + ); + }} + didUpdate={({ setState, props, prevState }) => { + const byKey = prevState.coloredTop10.reduce( + (acc, { key, color }) => ({ ...acc, [key]: color }), + {}, + ); + const { coloredTop10 } = props.top10.reduce( + (acc, bucket) => { + const color = byKey[bucket.key] || acc.palette[0]; + const palette = acc.palette.filter((pColor) => pColor !== color); + return { + coloredTop10: [ + ...acc.coloredTop10, + { + ...bucket, + color, + }, + ], + palette, + }; + }, + { coloredTop10: [], palette: theme.mutatedGenesChartPalette }, + ); + setState({ + coloredTop10, + }); + }} + > + {({ + state: { coloredTop10, loading }, + largestCount = coloredTop10.reduce( + (largest, { doc_count }) => (doc_count > largest ? doc_count : largest), + 0, + ), + yGridValues = largestCount > 0 ? [0, largestCount] : [], + }) => { + return loading ? ( + Loading... + ) : ( + <> + + Most Frequently Mutated Genes + + (data || { data: { color: 'white' } }).data.color} + axisBottom={{ + tickSize: 0, + tickPadding: 5, + tickRotation: 45, + legendOffset: 50, + format: (value) => { + const cutoffLength = 6; + const dashIndex = value.indexOf('-'); + const spaceIndex = value.indexOf(' '); - return value.substring( - 0, - Math.min( - cutoffLength, - value.length, - dashIndex > 0 ? dashIndex : 999, - spaceIndex > 0 ? spaceIndex : 999, - ), - ); - }, - }} - axisLeft={{ - orient: 'left', - tickSize: 0, - tickPadding: 5, - tickRotation: 0, - legendOffset: -40, - legendPosition: 'middle', - legend: '# models affected', - tickValues: yGridValues, - }} - enableGridY={false} - gridYValues={yGridValues} - theme={{ - ...theme.chart, - axis: { - domain: { - line: { - stroke: '#dcdde1', - strokeWidth: 1, - }, + return value.substring( + 0, + Math.min( + cutoffLength, + value.length, + dashIndex > 0 ? dashIndex : 999, + spaceIndex > 0 ? spaceIndex : 999, + ), + ); + }, + }} + axisLeft={{ + orient: 'left', + tickSize: 0, + tickPadding: 5, + tickRotation: 0, + legendOffset: -40, + legendPosition: 'middle', + legend: '# models affected', + tickValues: yGridValues, + }} + enableGridY={false} + gridYValues={yGridValues} + theme={{ + ...theme.chart, + axis: { + domain: { + line: { + stroke: '#dcdde1', + strokeWidth: 1, }, }, - }} - tooltip={({ value, data }) => ChartTooltip({ value, label: data.key })} - isInteractive={true} - onClick={(data) => { - setSQON( - addInSQON( - { - op: 'and', - content: [ - { - op: 'in', - content: { - fieldName: 'gene_metadata.mutated_genes', - value: [].concat(data.data.key || []), - }, + }, + }} + tooltip={({ value, data }) => ChartTooltip({ value, label: data.key })} + isInteractive={true} + onClick={(data) => { + setSQON( + addInSQON( + { + op: 'and', + content: [ + { + op: 'in', + content: { + fieldName: 'gene_metadata.mutated_genes', + value: [].concat(data.data.key || []), }, - ], - }, - sqon, - ), - ); - }} - /> - - ); - }} - - ); - }} + }, + ], + }, + sqon, + ), + ); + }} + /> + + ); + }} + + )} ); From d0b2bacce64c487458492cb9e684507a047ee6fe Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Wed, 1 Apr 2026 15:39:44 -0400 Subject: [PATCH 24/82] Fixed Matched Models Publishing --- cms/src/services/searchClient/indexModel.js | 8 +-- cms/src/services/searchClient/publish.js | 60 ++++++++++++++++----- 2 files changed, 52 insertions(+), 16 deletions(-) diff --git a/cms/src/services/searchClient/indexModel.js b/cms/src/services/searchClient/indexModel.js index 987c34ae6..544843325 100644 --- a/cms/src/services/searchClient/indexModel.js +++ b/cms/src/services/searchClient/indexModel.js @@ -16,10 +16,10 @@ const indexModel = async (id, model) => { ...model, }, }) - .catch((error) => - // Catch here as we do not want an error here to block execution of the app - logger.error(error, index, `Error indexing Model data`), - ); + .catch((error) => { + logger.error(error, index, `Error indexing Model data`); + throw error; + }); }; export default indexModel; diff --git a/cms/src/services/searchClient/publish.js b/cms/src/services/searchClient/publish.js index 21ee3f2d5..5c1941251 100644 --- a/cms/src/services/searchClient/publish.js +++ b/cms/src/services/searchClient/publish.js @@ -1,3 +1,6 @@ +import _ from 'lodash'; +import mongoose from 'mongoose'; + import Model from '../../schemas/model.js'; import getPublishValidation from '../../validation/model.js'; import { modelStatus } from '../../helpers/modelStatus.js'; @@ -42,6 +45,36 @@ export const bulkUpdateGeneSearchIndices = async (modelNames) => { } }; +/**** + * Removes Mongoose specific keys & values to prepare data for Search indexing + */ +const cleanMongoDoc = (doc) => { + const mongoKeys = ['_id', '__v']; + let cleanedDoc = _.omit(doc, mongoKeys); + for (const key in cleanedDoc) { + const value = cleanedDoc[key]; + if (value && typeof value === 'object') { + if (Array.isArray(value)) { + const firstEntry = value[0]; + const cleanedVals = + firstEntry && typeof firstEntry === 'object' + ? value.map((val) => { + const cleanedValue = _.omit(val, mongoKeys); + return cleanedValue; + }) + : value; + cleanedDoc[key] = cleanedVals; + } else if (value instanceof mongoose.Types.ObjectId) { + cleanedDoc[key] = value.toString(); + } else if (!(value instanceof Date)) { + const cleanedValue = _.omit(value, mongoKeys); + cleanedDoc[key] = cleanedValue; + } + } + } + return cleanedDoc; +}; + export const indexOneToES = async (filter) => { try { const validation = await getPublishValidation(); @@ -53,23 +86,26 @@ export const indexOneToES = async (filter) => { // Validate doc against publish schema for "on-demand" publishing await validation.validate(doc); - // Need to populate and filter the matched models - if (doc.matchedModels) { + // Need to populate and filter the matched models, and format data for indexing + const modelRecord = doc.toObject(); + if (modelRecord.matchedModels) { const matchedModels = await Model.find({ - _id: { $in: doc.matchedModels.models || [] }, + _id: { $in: modelRecord.matchedModels.models || [] }, }); - const matches = matchedModels.filter( - (model) => model.status !== modelStatus.unpublished && model.name !== doc.name, - ); - doc.populatedMatches = matches; + const matches = matchedModels + .filter((model) => model.status !== modelStatus.unpublished && model.name !== doc.name) + .map((record) => cleanMongoDoc(record.toObject())); + + modelRecord.populatedMatches = matches; + modelRecord.has_matched_models = true; } - // Index model into ElasticSearch - const { _doc } = doc; - delete _doc.__v; - delete _doc._id; - await indexModel(_doc); + const cleanedDoc = cleanMongoDoc(modelRecord); + + // Index model into ElasticSearch + await indexModel(doc._id, cleanedDoc); await indexLastUpdated(); + const res = await Model.updateOne({ name: doc.name }, { status: modelStatus.published }); logger.info({ model: doc.name }, 'publish model', 'Model Published to ES'); From d47660cbec0ea94e29317c39539d12a870fcd773 Mon Sep 17 00:00:00 2001 From: Dan DeMaria Date: Thu, 2 Apr 2026 15:46:00 -0400 Subject: [PATCH 25/82] MatchedModels UI improvements --- .../services/gdc-importer/VariantImporter.js | 97 ++++++++++--------- elasticsearch/arranger_metadata/table.json | 8 +- ui/src/components/TableMatchedModelsCell.jsx | 2 +- ui/src/components/search/Search.jsx | 9 +- ui/src/theme/index.js | 2 +- 5 files changed, 58 insertions(+), 60 deletions(-) diff --git a/cms/src/services/gdc-importer/VariantImporter.js b/cms/src/services/gdc-importer/VariantImporter.js index 67c5e9cd3..d602d189a 100644 --- a/cms/src/services/gdc-importer/VariantImporter.js +++ b/cms/src/services/gdc-importer/VariantImporter.js @@ -9,7 +9,10 @@ import { getBulkMafStatus, getCancerModelFilesFromMafFileData, } from './mafFiles.js'; -import { addGenomicVariantsFromMaf, getGdcImportErrorMessage } from '../../helpers/genomicVariants.js'; +import { + addGenomicVariantsFromMaf, + getGdcImportErrorMessage, +} from '../../helpers/genomicVariants.js'; import getLogger from '../../logger.js'; const logger = getLogger('services/gdc-importer/VariantImporter'); @@ -27,7 +30,7 @@ const ImportTypes = { individual: 'INDIVIDUAL', }; -const getTissueStatus = async modelName => { +const getTissueStatus = async (modelName) => { const model = await Model.findOne({ name: modelName }); if (!model) { @@ -73,7 +76,7 @@ const Import = ({ logger.info({ startTime, stopTime, modelName }, 'Genomic Variant Import complete.'); }; - const errorStop = errorData => { + const errorStop = (errorData) => { status = ImportStatus.error; error = errorData; stopTime = Date.now(); @@ -115,7 +118,7 @@ const Import = ({ tissueStatus, }); - const parseMaf = maf => { + const parseMaf = (maf) => { // clear all the weird comments const withoutComments = maf.replace(/#.+\n/g, ''); return tsv.parse(withoutComments); @@ -138,7 +141,7 @@ const Import = ({ { time: Date.now(), startTime, fileId, filename, modelName }, 'Beginning MAF file download...', ); - const mafFile = await downloadMaf({ filename, fileId, modelName }).catch(error => { + const mafFile = await downloadMaf({ filename, fileId, modelName }).catch((error) => { errorStop({ code: IMPORT_ERRORS.manualImportError, message: error.message, @@ -186,7 +189,7 @@ const Import = ({ }; }; -const VariantImporter = (function() { +const VariantImporter = (function () { let queue = []; let failed = []; let stopped = []; @@ -194,13 +197,13 @@ const VariantImporter = (function() { let running = false; const cleanLists = () => { - failed = failed.filter(i => i && i.getData && !i.getData().acknowledged); - stopped = stopped.filter(i => i && i.getData && !i.getData().acknowledged); - success = success.filter(i => i && i.getData && !i.getData().acknowledged); + failed = failed.filter((i) => i && i.getData && !i.getData().acknowledged); + stopped = stopped.filter((i) => i && i.getData && !i.getData().acknowledged); + success = success.filter((i) => i && i.getData && !i.getData().acknowledged); // queue should never have anything acknowledged (should move to failed/stopped/success) // clearing just in case - queue = queue.filter(i => i && i.getData && !i.getData().acknowledged); + queue = queue.filter((i) => i && i.getData && !i.getData().acknowledged); }; const emptyQueue = () => { @@ -311,7 +314,7 @@ const VariantImporter = (function() { } }; - const queueBulkImport = async models => { + const queueBulkImport = async (models) => { if (!Array.isArray(models) || models.length < 1) { logger.error( 'queueBulkImport failed due to bad input. `models` must be an array of model names.', @@ -326,12 +329,12 @@ const VariantImporter = (function() { } // Remove duplicate imports - stopBulkImport(models); + await stopBulkImport(models); acknowledgeBulk(models); // Filter out models that don't exist within HCMI db let noMatchingModel = []; - models = models.filter(async modelName => { + models = models.filter(async (modelName) => { let match = await Model.findOne({ name: modelName }); if (!match) { @@ -352,7 +355,7 @@ const VariantImporter = (function() { failed = [ ...failed, // Non-actionable errors (no match, not found in GDC, no MAFs) - ...noMatchingModel.map(modelName => + ...noMatchingModel.map((modelName) => Import({ modelName, status: ImportStatus.error, @@ -363,7 +366,7 @@ const VariantImporter = (function() { importType: ImportTypes.bulk, }), ), - ...modelsStatus[GDC_MODEL_STATES.modelNotFound].map(modelName => + ...modelsStatus[GDC_MODEL_STATES.modelNotFound].map((modelName) => Import({ modelName, status: ImportStatus.error, @@ -374,7 +377,7 @@ const VariantImporter = (function() { importType: ImportTypes.bulk, }), ), - ...modelsStatus[GDC_MODEL_STATES.noMafs].map(modelName => + ...modelsStatus[GDC_MODEL_STATES.noMafs].map((modelName) => Import({ modelName, status: ImportStatus.error, @@ -387,7 +390,7 @@ const VariantImporter = (function() { ), // Actionable errors (multiple ngcm, no ngcm) ...(await Promise.all( - modelsStatus[GDC_MODEL_STATES.multipleNgcm].map(async modelName => + modelsStatus[GDC_MODEL_STATES.multipleNgcm].map(async (modelName) => Import({ modelName, caseId: modelsFileData[modelName].caseId, @@ -404,7 +407,7 @@ const VariantImporter = (function() { ), )), ...(await Promise.all( - modelsStatus[GDC_MODEL_STATES.noNgcm].map(async modelName => + modelsStatus[GDC_MODEL_STATES.noNgcm].map(async (modelName) => Import({ modelName, caseId: modelsFileData[modelName].caseId, @@ -425,7 +428,7 @@ const VariantImporter = (function() { // Queue imports for conflict-free models (single NGCM, single NGCM+) queue = [ ...queue, - ...modelsStatus[GDC_MODEL_STATES.singleNgcm].map(modelName => { + ...modelsStatus[GDC_MODEL_STATES.singleNgcm].map((modelName) => { const fileData = getCancerModelFilesFromMafFileData(modelsFileData[modelName], true)[0]; return Import({ modelName, @@ -435,7 +438,7 @@ const VariantImporter = (function() { importType: ImportTypes.bulk, }); }), - ...modelsStatus[GDC_MODEL_STATES.singleNgcmPlusEngcm].map(modelName => { + ...modelsStatus[GDC_MODEL_STATES.singleNgcmPlusEngcm].map((modelName) => { const fileData = getCancerModelFilesFromMafFileData(modelsFileData[modelName], true)[0]; return Import({ modelName, @@ -455,19 +458,19 @@ const VariantImporter = (function() { return { success: true, startTime: Date.now() }; }; - const stopImport = async modelName => { + const stopImport = async (modelName) => { // In case we get into an invalid state with multiple imports for a given model name, // we'll use filter to get the whole list of them. - const targets = queue.filter(i => i && i.modelName === modelName); + const targets = queue.filter((i) => i && i.modelName === modelName); if (targets.length) { - targets.forEach(target => target.stop()); + targets.forEach((target) => target.stop()); stopped = [...stopped, ...targets]; - queue = queue.filter(i => i && i.modelName !== modelName); + queue = queue.filter((i) => i && i.modelName !== modelName); } cleanLists(); - return targets.map(target => target.getData()); + return targets.map((target) => target.getData()); }; const stopBulkImport = async (modelNames = []) => { @@ -475,73 +478,73 @@ const VariantImporter = (function() { let targets = []; if (modelNames.length) { - modelNames.forEach(modelName => { - targets = [...targets, ...queue.filter(i => i && i.modelName === modelName)]; + modelNames.forEach((modelName) => { + targets = [...targets, ...queue.filter((i) => i && i.modelName === modelName)]; }); } else { targets = queue; } if (targets.length) { - targets.forEach(target => target.stop()); + targets.forEach((target) => target.stop()); stopped = [...stopped, ...targets]; emptyQueue(); } cleanLists(); - return targets.map(target => target.getData()); + return targets.map((target) => target.getData()); }; const getStatus = () => { cleanLists(); return { - queue: queue.map(i => i.getData()), - failed: failed.map(i => i.getData()), - stopped: stopped.map(i => i.getData()), - success: success.map(i => i.getData()), + queue: queue.map((i) => i.getData()), + failed: failed.map((i) => i.getData()), + stopped: stopped.map((i) => i.getData()), + success: success.map((i) => i.getData()), running, }; }; - const acknowledge = modelName => { + const acknowledge = (modelName) => { const targets = [ - ...failed.filter(i => i && i.modelName === modelName), - ...stopped.filter(i => i && i.modelName === modelName), - ...success.filter(i => i && i.modelName === modelName), + ...failed.filter((i) => i && i.modelName === modelName), + ...stopped.filter((i) => i && i.modelName === modelName), + ...success.filter((i) => i && i.modelName === modelName), ]; if (targets.length) { - targets.forEach(target => target.acknowledge()); + targets.forEach((target) => target.acknowledge()); } cleanLists(); - return targets.map(target => target.getData()); + return targets.map((target) => target.getData()); }; - const acknowledgeBulk = modelNames => { + const acknowledgeBulk = (modelNames) => { let targets = []; - modelNames.forEach(modelName => { + modelNames.forEach((modelName) => { targets = [ ...targets, - ...failed.filter(i => i && i.modelName === modelName), - ...stopped.filter(i => i && i.modelName === modelName), - ...success.filter(i => i && i.modelName === modelName), + ...failed.filter((i) => i && i.modelName === modelName), + ...stopped.filter((i) => i && i.modelName === modelName), + ...success.filter((i) => i && i.modelName === modelName), ]; }); if (targets.length) { - targets.forEach(target => target.acknowledge()); + targets.forEach((target) => target.acknowledge()); } cleanLists(); - return targets.map(target => target.getData()); + return targets.map((target) => target.getData()); }; const resolveConflict = (modelName, fileId, filename) => { - const targetIndex = failed.findIndex(i => i.modelName === modelName); + const targetIndex = failed.findIndex((i) => i.modelName === modelName); if (targetIndex < 0) { return { diff --git a/elasticsearch/arranger_metadata/table.json b/elasticsearch/arranger_metadata/table.json index 8d1397bfe..aecf97300 100644 --- a/elasticsearch/arranger_metadata/table.json +++ b/elasticsearch/arranger_metadata/table.json @@ -161,11 +161,11 @@ "jsonPath": null }, { - "fieldName": "matched_models_list", - "accessor": "matched_models_list", + "fieldName": "has_matched_models", + "accessor": "has_matched_models", "show": true, - "type": "matched_models", - "sortable": false, + "type": "boolean", + "sortable": true, "canChangeShow": true, "query": null, "jsonPath": null diff --git a/ui/src/components/TableMatchedModelsCell.jsx b/ui/src/components/TableMatchedModelsCell.jsx index d80c06c96..9cf8fa731 100644 --- a/ui/src/components/TableMatchedModelsCell.jsx +++ b/ui/src/components/TableMatchedModelsCell.jsx @@ -8,7 +8,7 @@ const TableMatchedModelsCell = ({ row, savedSetsContext, value, history }) => { const { sorting } = useTableContext({ callerName: 'TableMatchedModelsCell', }); - const matches = (value && value.split(',')) || []; + const matches = row.original.matched_models?.models || []; const matchCount = matches.length; return matchCount > 1 ? (