From 4fb249709d0c2d0adcd2ebefebf616d5a1df82fd Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Mon, 15 Jun 2026 23:40:03 -0500 Subject: [PATCH 1/2] rename the compare worker/operation --- .../OperationDefinition-ValueSet-related.json | 133 ------------------ tx/tx.js | 30 ++-- tx/workers/{related.js => compare.js} | 54 +++---- tx/workers/metadata.js | 4 +- 4 files changed, 44 insertions(+), 177 deletions(-) delete mode 100644 tx/data/OperationDefinition-ValueSet-related.json rename tx/workers/{related.js => compare.js} (94%) diff --git a/tx/data/OperationDefinition-ValueSet-related.json b/tx/data/OperationDefinition-ValueSet-related.json deleted file mode 100644 index 36859d83..00000000 --- a/tx/data/OperationDefinition-ValueSet-related.json +++ /dev/null @@ -1,133 +0,0 @@ -{ - "resourceType": "OperationDefinition", - "id": "ValueSet-related", - "url": "http://hl7.org/fhir/OperationDefinition/ValueSet-related", - "version": "5.0.0", - "name": "ValueSetRelated", - "title": "Value Set Related Determination", - "status": "active", - "kind": "operation", - "experimental": false, - "date": "2023-03-26T15:21:02+11:00", - "publisher": "FHIRsmith", - "description": "Determine the relationship between two value sets. Different versions of code systems are considered compatible unless versionNeeded = true for the code system", - "jurisdiction": [ - { - "coding": [ - { - "system": "http://unstats.un.org/unsd/methods/m49/m49.htm", - "code": "001", - "display": "World" - } - ] - } - ], - "affectsState": false, - "code": "related", - "comment": "An $expand will be performed internally if needed.", - "resource": [ - "ValueSet" - ], - "system": false, - "type": true, - "instance": false, - "parameter": [ - { - "name": "thisUrl", - "use": "in", - "scope": [ - "type" - ], - "min": 0, - "max": "1", - "documentation": "Value set Canonical URL for the first value set of the pair (the base). The server must know the value set (e.g. it is provided as an attached resource, it is defined explicitly in the server's value sets, or it is defined implicitly by some code system known to the server", - "type": "uri" - }, - { - "name": "otherUrl", - "use": "in", - "scope": [ - "type" - ], - "min": 0, - "max": "1", - "documentation": "Value set Canonical URL for the second value set of the pair (the one being compared to base). The server must know the value set (e.g. it is provided as an attached resource, it is defined explicitly in the server's value sets, or it is defined implicitly by some code system known to the server", - "type": "uri" - }, - { - "name": "thisValueSet", - "use": "in", - "scope": [ - "type" - ], - "min": 0, - "max": "1", - "documentation": "The first value set is provided directly as part of the request. Servers may choose not to accept value sets in this fashion. This parameter is used when the client wants the server to expand a value set that is not stored on the server", - "type": "ValueSet" - }, - { - "name": "otherValueSet", - "use": "in", - "scope": [ - "type" - ], - "min": 0, - "max": "1", - "documentation": "The other value set is provided directly as part of the request. Servers may choose not to accept value sets in this fashion. This parameter is used when the client wants the server to expand a value set that is not stored on the server", - "type": "ValueSet" - }, - { - "name": "thisVersion", - "use": "in", - "scope": [ - "type" - ], - "min": 0, - "max": "1", - "documentation": "The identifier that is used to identify a specific version of the value set to be used when validating the code. This is an arbitrary value managed by the value set author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available.", - "type": "string" - }, - { - "name": "otherVersion", - "use": "in", - "scope": [ - "type" - ], - "min": 0, - "max": "1", - "documentation": "The identifier that is used to identify a specific version of the value set to be used when validating the code. This is an arbitrary value managed by the value set author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available.", - "type": "string" - }, - { - "name": "useSupplement", - "use": "in", - "min": 0, - "max": "*", - "documentation": "The supplement must be used when validating the code. Use of this parameter should result in $validate-code behaving the same way as if the supplements were included in the value set definition using the [http://hl7.org/fhir/StructureDefinition/valueset-supplement](http://hl7.org/fhir/extensions/StructureDefinition-valueset-supplement.html)", - "type": "canonical" - }, - { - "name": "diagnostics", - "use": "in", - "min": 0, - "max": "1", - "documentation": "Whether to return information about the reasoning process" - }, - { - "name": "result", - "use": "out", - "min": 1, - "max": "1", - "documentation": "The relationship between the ValueSets. One of: same, superset, subset, overlapping, dsjoint, empty, and indeterminate", - "type": "boolean" - }, - { - "name": "message", - "use": "out", - "min": 0, - "max": "1", - "documentation": "Explanation of the code, with reason if appropriate", - "type": "string" - } - ] -} \ No newline at end of file diff --git a/tx/tx.js b/tx/tx.js index 29f59dfe..3f829031 100644 --- a/tx/tx.js +++ b/tx/tx.js @@ -37,7 +37,7 @@ const {ConceptMapXML} = require("./xml/conceptmap-xml"); const {TxHtmlRenderer} = require("./tx-html"); const {Renderer} = require("./library/renderer"); const {OperationsWorker} = require("./workers/operations"); -const {RelatedWorker} = require("./workers/related"); +const {CompareWorker} = require("./workers/compare"); const {codeSystemFromR5} = require("./xversion/xv-codesystem"); const {operationOutcomeFromR5} = require("./xversion/xv-operationoutcome"); const {parametersFromR5} = require("./xversion/xv-parameters"); @@ -602,23 +602,23 @@ class TXModule { } }); - // ValueSet/$related(GET and POST) - router.get('/ValueSet/\\$related', async (req, res) => { + // ValueSet/$compare(GET and POST) + router.get('/ValueSet/\\$compare', async (req, res) => { const start = Date.now(); try { - let worker = new RelatedWorker(req.txOpContext, this.log, req.txProvider, this.languages, this.i18n); + let worker = new CompareWorker(req.txOpContext, this.log, req.txProvider, this.languages, this.i18n); await worker.handle(req, res); } finally { - this.countRequest('$related', Date.now() - start); + this.countRequest('$compare', Date.now() - start); } }); - router.post('/ValueSet/\\$related', async (req, res) => { + router.post('/ValueSet/\\$compare', async (req, res) => { const start = Date.now(); try { - let worker = new RelatedWorker(req.txOpContext, this.log, req.txProvider, this.languages, this.i18n); + let worker = new CompareWorker(req.txOpContext, this.log, req.txProvider, this.languages, this.i18n); await worker.handle(req, res); } finally { - this.countRequest('$related', Date.now() - start); + this.countRequest('$compare', Date.now() - start); } }); @@ -806,23 +806,23 @@ class TXModule { }); - // ValueSet/[id]/$related - router.get('/ValueSet/:id/\\$related', async (req, res) => { + // ValueSet/[id]/$compare + router.get('/ValueSet/:id/\\$compare', async (req, res) => { const start = Date.now(); try { - let worker = new RelatedWorker(req.txOpContext, this.log, req.txProvider, this.languages, this.i18n); + let worker = new CompareWorker(req.txOpContext, this.log, req.txProvider, this.languages, this.i18n); await worker.handleInstance(req, res, this.log); } finally { - this.countRequest('$related', Date.now() - start); + this.countRequest('$compare', Date.now() - start); } }); - router.post('/ValueSet/:id/\\$related', async (req, res) => { + router.post('/ValueSet/:id/\\$compare', async (req, res) => { const start = Date.now(); try { - let worker = new RelatedWorker(req.txOpContext, this.log, req.txProvider, this.languages, this.i18n); + let worker = new CompareWorker(req.txOpContext, this.log, req.txProvider, this.languages, this.i18n); await worker.handleInstance(req, res, this.log); } finally { - this.countRequest('$related', Date.now() - start); + this.countRequest('$compare', Date.now() - start); } }); diff --git a/tx/workers/related.js b/tx/workers/compare.js similarity index 94% rename from tx/workers/related.js rename to tx/workers/compare.js index 08e96c81..fafc825f 100644 --- a/tx/workers/related.js +++ b/tx/workers/compare.js @@ -1,11 +1,11 @@ // -// Related Worker - Handles ValueSet $related operation +// Compare Worker - Handles ValueSet $compare operation // -// GET /ValueSet/{id}/$related -// GET /ValueSet/$related?url=...&version=... -// POST /ValueSet/$related (form body or Parameters with url) -// POST /ValueSet/$related (body is ValueSet resource) -// POST /ValueSet/$related (body is Parameters with valueSet parameter) +// GET /ValueSet/{id}/$compare +// GET /ValueSet/$compare?url=...&version=... +// POST /ValueSet/$compare (form body or Parameters with url) +// POST /ValueSet/$compare (body is ValueSet resource) +// POST /ValueSet/$compare (body is Parameters with valueSet parameter) // const { TerminologyWorker } = require('./worker'); @@ -18,7 +18,7 @@ const {SearchFilterText} = require("../library/designations"); const {ArrayMatcher} = require("../../library/utilities"); const {debugLog} = require("../operation-context"); -class RelatedWorker extends TerminologyWorker { +class CompareWorker extends TerminologyWorker { showLogic = false; /** @@ -37,18 +37,18 @@ class RelatedWorker extends TerminologyWorker { * @returns {string} */ opName() { - return 'related'; + return 'compare'; } /** - * Handle a type-level $related request - * GET/POST /ValueSet/$related + * Handle a type-level $compare request + * GET/POST /ValueSet/$compare * @param {express.Request} req - Express request * @param {express.Response} res - Express response */ async handle(req, res) { try { - await this.handleTypeLevelRelated(req, res); + await this.handleTypeLevelCompare(req, res); } catch (error) { this.log.error(error); debugLog(error); @@ -76,14 +76,14 @@ class RelatedWorker extends TerminologyWorker { } /** - * Handle an instance-level $related request - * GET/POST /ValueSet/{id}/$related + * Handle an instance-level $compare request + * GET/POST /ValueSet/{id}/$compare * @param {express.Request} req - Express request * @param {express.Response} res - Express response */ async handleInstance(req, res) { try { - await this.handleInstanceLevelRelated(req, res); + await this.handleInstanceLevelCompare(req, res); } catch (error) { this.log.error(error); debugLog(error); @@ -105,11 +105,11 @@ class RelatedWorker extends TerminologyWorker { } /** - * Handle type-level $related: /ValueSet/$related + * Handle type-level $compare: /ValueSet/$compare * ValueSet identified by url, or provided directly in body */ - async handleTypeLevelRelated(req, res) { - this.deadCheck('related-type-level'); + async handleTypeLevelCompare(req, res) { + this.deadCheck('compare-type-level'); let params = req.body; this.addHttpParams(req, params); @@ -121,16 +121,16 @@ class RelatedWorker extends TerminologyWorker { let thisVS = await this.readValueSet(res, "this", params, txp); let otherVS = await this.readValueSet(res, "other", params, txp); - const result = await this.doRelated(txp, thisVS, otherVS); + const result = await this.doCompare(txp, thisVS, otherVS); return res.json(result); } /** - * Handle instance-level related: /ValueSet/{id}/$related + * Handle instance-level compare: /ValueSet/{id}/$compare * ValueSet identified by resource ID */ - async handleInstanceLevelRelated(req, res) { - this.deadCheck('related-instance-level'); + async handleInstanceLevelCompare(req, res) { + this.deadCheck('compare-instance-level'); let params = req.body; this.addHttpParams(req, params); @@ -147,7 +147,7 @@ class RelatedWorker extends TerminologyWorker { } let otherVS = await this.readValueSet(res, "other", params, txp); - const result = await this.doRelated(txp, thisVS, otherVS); + const result = await this.doCompare(txp, thisVS, otherVS); return res.json(result); } @@ -198,7 +198,7 @@ class RelatedWorker extends TerminologyWorker { } } - async doRelated(txp, thisVS, otherVS) { + async doCompare(txp, thisVS, otherVS) { // ok, we have to compare the composes. we don't care about anything else const thisC = thisVS.jsonObj.compose; @@ -206,12 +206,12 @@ class RelatedWorker extends TerminologyWorker { if (!thisC) { return this.makeOutcome("indeterminate", `The ValueSet ${thisVS.vurl} has no compose`); } - Extensions.checkNoModifiers(thisC, 'RelatedWorker.doRelated', 'compose', thisVS.vurl) + Extensions.checkNoModifiers(thisC, 'CompareWorker.doCompare', 'compose', thisVS.vurl) this.checkNoLockedDate(thisVS.vurl, thisC); if (!otherC) { return this.makeOutcome("indeterminate", `The ValueSet ${otherVS.vurl} has no compose`); } - Extensions.checkNoModifiers(otherC, 'RelatedWorker.doRelated', 'compose', otherVS.vurl) + Extensions.checkNoModifiers(otherC, 'CompareWorker.doCompare', 'compose', otherVS.vurl) this.checkNoLockedDate(otherVS.vurl, otherC); let systems = new Map(); // tracks whether the comparison is version dependent or not @@ -268,7 +268,7 @@ class RelatedWorker extends TerminologyWorker { } else if (status.left) { outcome = this.makeOutcome("superset", `The valueSet ${thisVS.vurl} is a super-set of the valueSet ${otherVS.vurl}`); } else { - outcome = this.makeOutcome("subset", `The valueSet ${thisVS.vurl} is a seb-set of the valueSet ${otherVS.vurl}`); + outcome = this.makeOutcome("subset", `The valueSet ${thisVS.vurl} is a sub-set of the valueSet ${otherVS.vurl}`); } if (txp.diagnostics) { outcome.parameter.push({name: 'performed-expansion', valueBoolean: exp ? true : false}) @@ -712,5 +712,5 @@ class RelatedWorker extends TerminologyWorker { } module.exports = { - RelatedWorker + CompareWorker }; \ No newline at end of file diff --git a/tx/workers/metadata.js b/tx/workers/metadata.js index 7e788f0c..d2933dab 100644 --- a/tx/workers/metadata.js +++ b/tx/workers/metadata.js @@ -233,7 +233,7 @@ class MetadataHandler { operation: [ { name: 'expand', definition: 'http://hl7.org/fhir/OperationDefinition/ValueSet-expand' }, { name: 'validate-code', definition: 'http://hl7.org/fhir/OperationDefinition/ValueSet-validate-code' }, - { name: 'related', definition: 'https://raw.githubusercontent.com/HealthIntersections/FHIRsmith/refs/heads/main/tx/data/OperationDefinition-ValueSet-related.json' } + { name: 'compare', definition: 'http://hl7.org/fhir/tools/OperationDefinition/ValueSet-compare' } ] }, { @@ -266,7 +266,7 @@ class MetadataHandler { { name: 'validate-code', definition: 'http://hl7.org/fhir/OperationDefinition/Resource-validate-code' }, { name: 'translate', definition: 'http://hl7.org/fhir/OperationDefinition/ConceptMap-translate' }, { name: 'closure', definition: 'http://hl7.org/fhir/OperationDefinition/ConceptMap-closure' }, - { name: 'related', definition: 'https://raw.githubusercontent.com/HealthIntersections/FHIRsmith/refs/heads/main/tx/data/OperationDefinition-ValueSet-related.json' }, + { name: 'compare', definition: 'http://hl7.org/fhir/tools/OperationDefinition/ValueSet-compare' }, { name: 'cache-control', definition: 'http://hl7.org/fhir/tools/OperationDefinition/cache-control' }, { name: 'versions', definition: 'http://hl7.org/fhir/OperationDefinition/fhir-versions' } ] From c0168ff95b856544b5176ff581bb65319b50ee0b Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Tue, 16 Jun 2026 01:15:25 -0500 Subject: [PATCH 2/2] npm audit --- package-lock.json | 250 ++++++++++++++++++++++++---------------------- 1 file changed, 133 insertions(+), 117 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3588e73c..0943b31b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -72,13 +72,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -87,9 +87,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", "engines": { @@ -97,21 +97,21 @@ } }, "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -138,14 +138,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -155,14 +155,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -182,9 +182,9 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", "engines": { @@ -192,29 +192,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -234,9 +234,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", "engines": { @@ -244,9 +244,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { @@ -254,9 +254,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "engines": { @@ -264,27 +264,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", - "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -533,33 +533,33 @@ } }, "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", "debug": "^4.3.1" }, "engines": { @@ -567,14 +567,14 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -2462,13 +2462,16 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.9.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", - "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "version": "2.10.37", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.37.tgz", + "integrity": "sha512-girxaJ7WZssDOFhzCGZTDKoTa1gk6A1TbflaYTpykLJ4UU9Fz9kx1aREM8JCuoVHbL8X8T/mJg7w2oYSq72Oig==", "dev": true, "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/bcrypt": { @@ -2591,9 +2594,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "dev": true, "funding": [ { @@ -2611,11 +2614,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -2800,9 +2803,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001769", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", - "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", "dev": true, "funding": [ { @@ -3541,9 +3544,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.286", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", - "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "version": "1.5.372", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.372.tgz", + "integrity": "sha512-M3yhbAlilnwqC8D21t28UCDGHyitShTmmLRU/H+b74P6Ski16Nb9HONYEaVpMj/pwC7BEo5B95FpjODLCWbtfA==", "dev": true, "license": "ISC" }, @@ -4446,16 +4449,16 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -4854,9 +4857,9 @@ "optional": true }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -5996,9 +5999,19 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -6935,11 +6948,14 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", + "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/nodemon": { "version": "3.1.14", @@ -9005,9 +9021,9 @@ } }, "node_modules/tar": { - "version": "7.5.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz", - "integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==", + "version": "7.5.16", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz", + "integrity": "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0",