diff --git a/packages/_example/package.json b/packages/_example/package.json index 875620208e..3809b2e725 100644 --- a/packages/_example/package.json +++ b/packages/_example/package.json @@ -24,7 +24,7 @@ "fastify4": "npm:fastify@^4.29.0", "koa": "^3.0.1", "mariadb": "^3.0.2", - "mongoose": "8.8.4", + "mongoose": "9.1.4", "mysql2": "^3.0.1", "pg": "^8.8.0", "reflect-metadata": "^0.1.13", diff --git a/packages/datasource-mongo/package.json b/packages/datasource-mongo/package.json index b425a85129..e9e3cf1dcb 100644 --- a/packages/datasource-mongo/package.json +++ b/packages/datasource-mongo/package.json @@ -15,7 +15,7 @@ "@forestadmin/datasource-mongoose": "1.12.5", "@forestadmin/datasource-toolkit": "1.50.1", "json-stringify-pretty-compact": "^3.0.0", - "mongoose": "8.8.4", + "mongoose": "9.1.4", "tunnel-ssh": "^5.2.0" }, "files": [ diff --git a/packages/datasource-mongoose/package.json b/packages/datasource-mongoose/package.json index 88fcb74fa1..05acc781cf 100644 --- a/packages/datasource-mongoose/package.json +++ b/packages/datasource-mongoose/package.json @@ -20,10 +20,10 @@ "luxon": "^3.2.1" }, "devDependencies": { - "mongoose": "8.8.4" + "mongoose": "9.1.4" }, "peerDependencies": { - "mongoose": "6.x || 7.x || >=8.0.0 <=8.8.x" + "mongoose": "6.x || 7.x || >=8.0.0 <=8.8.x || 9.x" }, "scripts": { "build": "tsc", diff --git a/packages/datasource-mongoose/src/collection.ts b/packages/datasource-mongoose/src/collection.ts index b8a02bf2ad..5787693ce9 100644 --- a/packages/datasource-mongoose/src/collection.ts +++ b/packages/datasource-mongoose/src/collection.ts @@ -205,8 +205,8 @@ export default class MongooseCollection extends BaseCollection { if (this.stack.length < 2) { // We are updating a real document, we can delegate the work to mongoose directly. await (ids.length > 1 - ? this.model.updateMany({ _id: ids }, patch, { rawResult: true }) - : this.model.updateOne({ _id: ids }, patch, { rawResult: true })); + ? this.model.updateMany({ _id: ids }, patch) + : this.model.updateOne({ _id: ids }, patch)); } else if (patch.parentId && ids.some(id => !id.startsWith(patch.parentId))) { // When we update subdocuments, we need to make sure that the new parent is the same as the // old one: reparenting is not supported. @@ -238,8 +238,8 @@ export default class MongooseCollection extends BaseCollection { if (!Object.keys(subdocPatch).length) return null; return ids.length > 1 - ? this.model.updateMany({ _id: rootIds }, subdocPatch, { rawResult: true }) - : this.model.updateOne({ _id: rootIds }, subdocPatch, { rawResult: true }); + ? this.model.updateMany({ _id: rootIds }, subdocPatch) + : this.model.updateOne({ _id: rootIds }, subdocPatch); }); await Promise.all(promises); @@ -251,7 +251,7 @@ export default class MongooseCollection extends BaseCollection { const ids = records.map(record => record._id); if (this.stack.length < 2) { - await this.model.deleteMany({ _id: ids }, { rawResult: true }); + await this.model.deleteMany({ _id: ids }); return; } diff --git a/packages/datasource-mongoose/src/mongoose/schema.ts b/packages/datasource-mongoose/src/mongoose/schema.ts index 744c391a8e..7d25039a4e 100644 --- a/packages/datasource-mongoose/src/mongoose/schema.ts +++ b/packages/datasource-mongoose/src/mongoose/schema.ts @@ -186,21 +186,26 @@ export default class MongooseSchema { for (const [subName, subField] of Object.entries(subPaths)) { recursiveSet(paths, `${name}.${subName}`, subField); } - } else if (field.constructor.name === 'DocumentArrayPath') { + } else if ( + field.constructor.name === 'DocumentArrayPath' || + field.constructor.name === 'SchemaDocumentArray' + ) { const subPaths = this.buildFields(field.schema as Schema, level + 1); for (const [subName, subField] of Object.entries(subPaths)) { recursiveSet(paths, `${name}.[].${subName}`, subField); } } else if (VersionManager.isSubDocumentArray(field)) { - if (VersionManager.isSubDocument(field.caster)) { - const subPaths = this.buildFields((field as any).caster.schema, level + 1); + const embeddedType = VersionManager.getEmbeddedSchemaType(field); + + if (embeddedType && VersionManager.isSubDocument(embeddedType)) { + const subPaths = this.buildFields((embeddedType as any).schema, level + 1); for (const [subName, subField] of Object.entries(subPaths)) { recursiveSet(paths, `${name}.[].${subName}`, subField); } - } else { - recursiveSet(paths, `${name}.[]`, (field as any).caster); + } else if (embeddedType) { + recursiveSet(paths, `${name}.[]`, embeddedType); } } else { recursiveSet(paths, name, field); diff --git a/packages/datasource-mongoose/src/utils/helpers.ts b/packages/datasource-mongoose/src/utils/helpers.ts index b1cb72f000..c08c4bf9d6 100644 --- a/packages/datasource-mongoose/src/utils/helpers.ts +++ b/packages/datasource-mongoose/src/utils/helpers.ts @@ -142,6 +142,10 @@ export function replaceMongoTypes(data: any): any { if (data instanceof Types.ObjectId) return data.toHexString(); if (data instanceof Types.Decimal128) return data.toString(); + // eslint-disable-next-line no-underscore-dangle + if (data?._bsontype === 'ObjectId') return data.toHexString(); + // eslint-disable-next-line no-underscore-dangle + if (data?._bsontype === 'Decimal128') return data.toString(); // eslint-disable-next-line no-underscore-dangle if (data?._bsontype === 'Binary') return data.buffer; diff --git a/packages/datasource-mongoose/src/utils/version-manager.ts b/packages/datasource-mongoose/src/utils/version-manager.ts index 69c7f535bd..7c7ae44271 100644 --- a/packages/datasource-mongoose/src/utils/version-manager.ts +++ b/packages/datasource-mongoose/src/utils/version-manager.ts @@ -10,8 +10,11 @@ export default class VersionManager { public static isSubDocument(field): field is Schema.Types.Subdocument { return ( field?.name === 'EmbeddedDocument' || - field?.constructor?.name === 'SubdocumentPath' || - (field?.instance === 'Embedded' && isSchemaType(field)) + field?.constructor?.name === 'SubdocumentPath' || // Mongoose 8 and below + field?.constructor?.name === 'SchemaSubdocument' || // Mongoose 9+ (single nested) + field?.constructor?.name === 'SchemaDocumentArrayElement' || // Mongoose 9+ (array element) + (field?.instance === 'Embedded' && isSchemaType(field)) || + (field?.instance === 'DocumentArrayElement' && isSchemaType(field)) ); } @@ -20,4 +23,22 @@ export default class VersionManager { (field?.instance === 'Array' || field?.instance === 'DocumentArray') && isSchemaType(field) ); } + + /** + * Get the embedded schema type from an array field. + * In Mongoose 9+, use `embeddedSchemaType` property. + * In Mongoose 8 and below, use `caster` property. + */ + public static getEmbeddedSchemaType( + field: Schema.Types.DocumentArray, + ): Schema.Types.Subdocument { + // Mongoose 9+ uses embeddedSchemaType + if (field.embeddedSchemaType !== undefined) { + return field.embeddedSchemaType; + } + + // Mongoose 8 and below use caster + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return (field as any).caster; + } } diff --git a/packages/datasource-mongoose/test/integration/flattener/collection_create.test.ts b/packages/datasource-mongoose/test/integration/flattener/collection_create.test.ts index ea4cb27538..b270244ffc 100644 --- a/packages/datasource-mongoose/test/integration/flattener/collection_create.test.ts +++ b/packages/datasource-mongoose/test/integration/flattener/collection_create.test.ts @@ -59,7 +59,7 @@ describe('create collection', () => { { parentId: car._id, date: '2020-01-01', comment: 'my comment 2' }, ]); - const doc = await connection.model('cars').findOne({ _id: car._id }); + const doc = await connection.model('cars').findOne({ _id: car._id }).lean(); expect(car).toEqual( expect.objectContaining({ @@ -75,7 +75,7 @@ describe('create collection', () => { expect.objectContaining({ _id: `${car._id}.engine.comments.1` }), ]); - expect(doc).toEqual( + expect(doc as any).toEqual( expect.objectContaining({ name: 'my fiesta', wheelSize: 12, @@ -125,9 +125,9 @@ describe('create collection', () => { { capacity: 12, category: 'EXPLOSION' }, ); - const doc = await connection.model('cars').findOne({ _id: car._id }); + const doc = await connection.model('cars').findOne({ _id: car._id }).lean(); - expect(doc).toEqual( + expect(doc as any).toEqual( expect.objectContaining({ name: 'my fiesta', wheelSize: 12, @@ -165,10 +165,10 @@ describe('create collection', () => { .getCollection('cars_engine_comments') .create(caller, [{ parentId: car._id, ...flatRecord }]); - const carSeenFromDb = await connection.model('cars').findOne({ _id: car._id }); + const carSeenFromDb = await connection.model('cars').findOne({ _id: car._id }).lean(); expect(carCommentFromApp).toMatchObject(flatRecord); - expect(carSeenFromDb.engine.comments[0]).toEqual( + expect((carSeenFromDb as any).engine.comments[0]).toEqual( expect.objectContaining({ date: expect.any(Date), comment: 'hi!', @@ -192,7 +192,7 @@ describe('create collection', () => { .getCollection('cars_engine') .create(caller, [{ parentId: car._id, horsePower: '12' }]); - const doc = await connection.model('cars').findOne({ _id: car._id }); + const doc = await connection.model('cars').findOne({ _id: car._id }).lean(); expect(result).toEqual( expect.arrayContaining([ @@ -202,7 +202,7 @@ describe('create collection', () => { ]), ); - expect(doc).toEqual( + expect(doc as any).toEqual( expect.objectContaining({ name: 'my fiesta', wheelSize: 12, diff --git a/packages/datasource-mongoose/test/integration/flattener/collection_update.test.ts b/packages/datasource-mongoose/test/integration/flattener/collection_update.test.ts index 074905daac..ab743c10ca 100644 --- a/packages/datasource-mongoose/test/integration/flattener/collection_update.test.ts +++ b/packages/datasource-mongoose/test/integration/flattener/collection_update.test.ts @@ -63,9 +63,9 @@ describe('Complex flattening', () => { }), ).rejects.toThrow(ValidationError); - const doc = await connection.model('cars').findOne({ _id: car._id }); + const doc = await connection.model('cars').findOne({ _id: car._id }).lean(); - expect(doc).toEqual( + expect(doc as any).toEqual( expect.objectContaining({ engine: expect.objectContaining({ // Check that manufacturer was updated diff --git a/yarn.lock b/yarn.lock index 42b2c3fd91..7796116d22 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2697,10 +2697,10 @@ dependencies: sparse-bitfield "^3.0.3" -"@mongodb-js/saslprep@^1.1.5": - version "1.4.4" - resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.4.4.tgz#34a946ff6ae142e8f2259b87f2935f8284ba874d" - integrity sha512-p7X/ytJDIdwUfFL/CLOhKgdfJe1Fa8uw9seJYvdOmnP9JBWGWHW69HkOixXS6Wy9yvGf1MbhcS6lVmrhy4jm2g== +"@mongodb-js/saslprep@^1.3.0": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.4.5.tgz#0f53a6c5a350fbe4bfa12cc80b69e8d358f1bbc0" + integrity sha512-k64Lbyb7ycCSXHSLzxVdb2xsKGPMvYZfCICXvDsI8Z65CeWQzTEKS4YmGbnqw+U9RBvLPTsB6UCmwkgsDTGWIw== dependencies: sparse-bitfield "^3.0.3" @@ -5264,10 +5264,10 @@ 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== +"@types/whatwg-url@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-13.0.0.tgz#2b11e32772fd321c0dedf4d655953ea8ce587b2a" + integrity sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q== dependencies: "@types/webidl-conversions" "*" @@ -6348,10 +6348,10 @@ bson@^4.7.2: dependencies: buffer "^5.6.0" -bson@^6.7.0: - version "6.10.4" - resolved "https://registry.yarnpkg.com/bson/-/bson-6.10.4.tgz#d530733bb5bb16fb25c162e01a3344fab332fd2b" - integrity sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng== +bson@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/bson/-/bson-7.1.1.tgz#19965d9138e1c4d88e4690414d91c84f217c84e8" + integrity sha512-TtJgBB+QyOlWjrbM+8bRgH84VM/xrDjyBFgSgGrfZF4xvt6gbEDtcswm27Tn9F9TWsjQybxT8b8VpCP/oJK4Dw== buffer-equal-constant-time@1.0.1, buffer-equal-constant-time@^1.0.1: version "1.0.1" @@ -7468,7 +7468,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@4.x, debug@^4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.4.0: +debug@4, debug@^4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== @@ -11823,10 +11823,10 @@ jwt-decode@2.2.0: resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-2.2.0.tgz#7d86bd56679f58ce6a84704a657dd392bba81a79" integrity sha512-86GgN2vzfUu7m9Wcj63iUkuDzFNYFVmjeDm2GzWpUk+opB0pEpMsw6ePCMrhYkumz2C1ihqtZzOMAg7FiXcNoQ== -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== +kareem@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/kareem/-/kareem-3.0.0.tgz#b1abcd504a01d45d712d311bf2178ce2bc0081bb" + integrity sha512-RKhaOBSPN8L7y4yAgNhDT2602G5FD6QbOIISbjN9D6mjHPeqeg7K+EB5IGSU5o81/X2Gzm3ICnAvQW3x3OP8HA== keygrip@~1.1.0: version "1.1.0" @@ -13277,13 +13277,13 @@ mongodb-connection-string-url@^2.6.0: "@types/whatwg-url" "^8.2.1" whatwg-url "^11.0.0" -mongodb-connection-string-url@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz#c13e6ac284ae401752ebafdb8cd7f16c6723b141" - integrity sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg== +mongodb-connection-string-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-7.0.0.tgz#aad7291d191c52e3b5e2765eb9d218b6efcad655" + integrity sha512-irhhjRVLE20hbkRl4zpAYLnDMM+zIZnp0IDB9akAFFUZp/3XdOfwwddc7y6cNvF2WCEtfTYRwYbIfYa2kVY0og== dependencies: - "@types/whatwg-url" "^11.0.2" - whatwg-url "^13.0.0" + "@types/whatwg-url" "^13.0.0" + whatwg-url "^14.1.0" mongodb@4.17.2: version "4.17.2" @@ -13297,25 +13297,24 @@ mongodb@4.17.2: "@aws-sdk/credential-providers" "^3.186.0" "@mongodb-js/saslprep" "^1.1.0" -mongodb@~6.10.0: - version "6.10.0" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.10.0.tgz#20a9f1cf3c6829e75fc39e6d8c1c19f164209c2e" - integrity sha512-gP9vduuYWb9ZkDM546M+MP2qKVk5ZG2wPF63OvSRuUbqCR+11ZCAE1mOfllhlAG0wcoJY5yDL/rV3OmYEwXIzg== +mongodb@~7.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-7.0.0.tgz#33b381dc9fdca208a38ea03340d57244c776573f" + integrity sha512-vG/A5cQrvGGvZm2mTnCSz1LUcbOPl83hfB6bxULKQ8oFZauyox/2xbZOoGNl+64m8VBrETkdGCDBdOsCr3F3jg== dependencies: - "@mongodb-js/saslprep" "^1.1.5" - bson "^6.7.0" - mongodb-connection-string-url "^3.0.0" + "@mongodb-js/saslprep" "^1.3.0" + bson "^7.0.0" + mongodb-connection-string-url "^7.0.0" -mongoose@8.8.4: - version "8.8.4" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-8.8.4.tgz#11e3991a7fd03596a79bc9f9b2fe8f3e75b7a30d" - integrity sha512-yJbn695qCsqDO+xyPII29x2R7flzXhxCDv09mMZPSGllf0sm4jKw3E9s9uvQ9hjO6bL2xjU8KKowYqcY9eSTMQ== +mongoose@9.1.4: + version "9.1.4" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-9.1.4.tgz#f5930be44cfa7c2141c07b5945fb91d3f464a13f" + integrity sha512-V8JIyoWKWW+R2COlOsh6gaYw9TvczSiP/cN3Yuk1pv7ws5VNFAy5GPrK8jfz9tVYovmqdWOJRurMjL4ilYn9wA== dependencies: - bson "^6.7.0" - kareem "2.6.3" - mongodb "~6.10.0" + kareem "3.0.0" + mongodb "~7.0" mpath "0.9.0" - mquery "5.0.0" + mquery "6.0.0" ms "2.1.3" sift "17.1.3" @@ -13324,12 +13323,10 @@ mpath@0.9.0: resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.9.0.tgz#0c122fe107846e31fc58c75b09c35514b3871904" integrity sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew== -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" +mquery@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/mquery/-/mquery-6.0.0.tgz#ef6d744619ff13368c1b137d09a7adc5530fce9e" + integrity sha512-b2KQNsmgtkscfeDgkYMcWGn9vZI9YoXh802VDEwE6qc50zxBFQ0Oo8ROkawbPAsXCY1/Z1yp0MagqsZStPWJjw== ms@2.0.0: version "2.0.0" @@ -15408,7 +15405,7 @@ punycode.js@^2.3.1: resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== -punycode@2.x.x, punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.0: +punycode@2.x.x, punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== @@ -17455,12 +17452,12 @@ tr46@^3.0.0: dependencies: punycode "^2.1.1" -tr46@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" - integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== +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.0" + punycode "^2.3.1" tr46@~0.0.3: version "0.0.3" @@ -18326,12 +18323,12 @@ whatwg-url@^11.0.0: tr46 "^3.0.0" webidl-conversions "^7.0.0" -whatwg-url@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-13.0.0.tgz#b7b536aca48306394a34e44bda8e99f332410f8f" - integrity sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig== +whatwg-url@^14.1.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 "^4.1.1" + tr46 "^5.1.0" webidl-conversions "^7.0.0" whatwg-url@^5.0.0: