diff --git a/package.json b/package.json index 1d9e37268..5ce640abf 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "build": "yarn clean && yarn vite:build && yarn build:i18n && yarn build:server", "start": "node ./build/server/index.js", "dev": "NODE_ENV=development yarn concurrently -n api,collaboration -c \"blue,magenta\" \"node --inspect=0.0.0.0 build/server/index.js --services=cron,collaboration,websockets,admin,web,worker\"", - "dev:backend": "NODE_ENV=development nodemon --exec \"yarn build:server && yarn dev\" -e js,ts,tsx --ignore *.test.ts --ignore build/ --ignore app/ --ignore shared/editor --ignore server/migrations", + "dev:backend": "NODE_ENV=development nodemon --exec \"yarn build:server && yarn dev\" -e js,ts,tsx --ignore *.test.ts --ignore data/ --ignore build/ --ignore app/ --ignore shared/editor --ignore server/migrations", "dev:watch": "NODE_ENV=development yarn concurrently -n backend,frontend \"yarn dev:backend\" \"yarn vite:dev\"", "lint": "eslint app server shared plugins", "prepare": "husky install", diff --git a/server/models/Attachment.ts b/server/models/Attachment.ts index 22f11e49f..68055819b 100644 --- a/server/models/Attachment.ts +++ b/server/models/Attachment.ts @@ -103,7 +103,7 @@ class Attachment extends IdModel< * Get a url that can be used to download a private attachment if the user has a valid session. */ get redirectUrl() { - return `/api/attachments.redirect?id=${this.id}`; + return Attachment.getRedirectUrl(this.id); } /** @@ -175,6 +175,17 @@ class Attachment extends IdModel< return parseInt(result?.[0]?.total ?? "0", 10); } + /** + * Get the redirect URL for a private attachment. Use `attachment.redirectUrl` if you already have + * an instance of the attachment. + * + * @param id The ID of the attachment to get the redirect URL for. + * @returns The redirect URL for the attachment. + */ + static getRedirectUrl(id: string) { + return `/api/attachments.redirect?id=${id}`; + } + // associations @BelongsTo(() => Team, "teamId") diff --git a/server/models/Document.ts b/server/models/Document.ts index 4fe0d406e..0255af91e 100644 --- a/server/models/Document.ts +++ b/server/models/Document.ts @@ -1006,22 +1006,25 @@ class Document extends ParanoidModel< toNavigationNode = async ( options?: FindOptions ): Promise => { - const childDocuments = await (this.constructor as typeof Document) - .unscoped() - .scope("withoutState") - .findAll({ - where: { - teamId: this.teamId, - parentDocumentId: this.id, - archivedAt: { - [Op.is]: null, - }, - publishedAt: { - [Op.ne]: null, - }, - }, - transaction: options?.transaction, - }); + // Checking if the record is new is a performance optimization – new docs cannot have children + const childDocuments = this.isNewRecord + ? [] + : await (this.constructor as typeof Document) + .unscoped() + .scope("withoutState") + .findAll({ + where: { + teamId: this.teamId, + parentDocumentId: this.id, + archivedAt: { + [Op.is]: null, + }, + publishedAt: { + [Op.ne]: null, + }, + }, + transaction: options?.transaction, + }); const children = await Promise.all( childDocuments.map((child) => child.toNavigationNode(options)) diff --git a/server/queues/processors/FileOperationDeletedProcessor.ts b/server/queues/processors/FileOperationDeletedProcessor.ts index 6543cae73..7b921b684 100644 --- a/server/queues/processors/FileOperationDeletedProcessor.ts +++ b/server/queues/processors/FileOperationDeletedProcessor.ts @@ -7,7 +7,10 @@ import { Event as TEvent, FileOperationEvent } from "@server/types"; import BaseProcessor from "./BaseProcessor"; export default class FileOperationDeletedProcessor extends BaseProcessor { - static applicableEvents: TEvent["name"][] = ["fileOperations.delete"]; + static applicableEvents: TEvent["name"][] = [ + "fileOperations.delete", + "fileOperations.update", + ]; async perform(event: FileOperationEvent) { await sequelize.transaction(async (transaction) => { @@ -16,9 +19,22 @@ export default class FileOperationDeletedProcessor extends BaseProcessor { paranoid: false, transaction, }); + if (fileOperation.type === FileOperationType.Export) { + return; + } + if ( - fileOperation.type === FileOperationType.Export || - fileOperation.state !== FileOperationState.Complete + event.name === "fileOperations.update" && + fileOperation.state !== FileOperationState.Error + ) { + return; + } + + if ( + event.name === "fileOperations.delete" && + ![FileOperationState.Complete, FileOperationState.Error].includes( + fileOperation.state + ) ) { return; } diff --git a/server/queues/tasks/CollectionCreatedNotificationsTask.ts b/server/queues/tasks/CollectionCreatedNotificationsTask.ts index ff506d112..308436be8 100644 --- a/server/queues/tasks/CollectionCreatedNotificationsTask.ts +++ b/server/queues/tasks/CollectionCreatedNotificationsTask.ts @@ -13,6 +13,10 @@ export default class CollectionCreatedNotificationsTask extends BaseTask child.title === "index") + ) { + return this.parseFileTree( + fileOperation, + tree.children[0].children.filter((child) => child.title !== "index") + ); + } + return this.parseFileTree(fileOperation, tree.children); } diff --git a/server/queues/tasks/ImportTask.ts b/server/queues/tasks/ImportTask.ts index 9af8b92ad..ffe2a3fad 100644 --- a/server/queues/tasks/ImportTask.ts +++ b/server/queues/tasks/ImportTask.ts @@ -1,5 +1,6 @@ import path from "path"; import fs from "fs-extra"; +import chunk from "lodash/chunk"; import truncate from "lodash/truncate"; import tmp from "tmp"; import { @@ -288,39 +289,19 @@ export default abstract class ImportTask extends BaseTask { const documents = new Map(); const attachments = new Map(); + const user = await User.findByPk(fileOperation.userId, { + rejectOnEmpty: true, + }); + const ip = user.lastActiveIp || undefined; + try { - return await sequelize.transaction(async (transaction) => { - const user = await User.findByPk(fileOperation.userId, { - transaction, - rejectOnEmpty: true, - }); - - const ip = user.lastActiveIp || undefined; - - // Attachments - await Promise.all( - data.attachments.map(async (item) => { - Logger.debug("task", `ImportTask persisting attachment ${item.id}`); - const attachment = await attachmentCreator({ - source: "import", - preset: AttachmentPreset.DocumentAttachment, - id: item.id, - name: item.name, - type: item.mimeType, - buffer: await item.buffer(), - user, - ip, - transaction, - }); - if (attachment) { - attachments.set(item.id, attachment); - } - }) - ); - - // Collections - for (const item of data.collections) { - Logger.debug("task", `ImportTask persisting collection ${item.id}`); + // Collections + for (const item of data.collections) { + await sequelize.transaction(async (transaction) => { + Logger.debug( + "task", + `ImportTask persisting collection ${item.name} (${item.id})` + ); let description = item.description; // Description can be markdown text or a Prosemirror object if coming @@ -333,13 +314,9 @@ export default abstract class ImportTask extends BaseTask { // Check all of the attachments we've created against urls in the text // and replace them out with attachment redirect urls before saving. for (const aitem of data.attachments) { - const attachment = attachments.get(aitem.id); - if (!attachment) { - continue; - } description = description.replace( - new RegExp(`<<${attachment.id}>>`, "g"), - attachment.redirectUrl + new RegExp(`<<${aitem.id}>>`, "g"), + Attachment.getRedirectUrl(aitem.id) ); } @@ -437,89 +414,114 @@ export default abstract class ImportTask extends BaseTask { ); collections.set(item.id, collection); - } - // Documents - for (const item of data.documents) { - Logger.debug("task", `ImportTask persisting document ${item.id}`); - let text = item.text; + // Documents + for (const item of data.documents.filter( + (d) => d.collectionId === collection.id + )) { + Logger.debug( + "task", + `ImportTask persisting document ${item.title} (${item.id})` + ); + let text = item.text; - // Check all of the attachments we've created against urls in the text - // and replace them out with attachment redirect urls before saving. - for (const aitem of data.attachments) { - const attachment = attachments.get(aitem.id); - if (!attachment) { - continue; + // Check all of the attachments we've created against urls in the text + // and replace them out with attachment redirect urls before saving. + for (const aitem of data.attachments) { + text = text.replace( + new RegExp(`<<${aitem.id}>>`, "g"), + Attachment.getRedirectUrl(aitem.id) + ); } - text = text.replace( - new RegExp(`<<${attachment.id}>>`, "g"), - attachment.redirectUrl - ); - } - // Check all of the document we've created against urls in the text - // and replace them out with a valid internal link. Because we are doing - // this before saving, we can't use the document slug, but we can take - // advantage of the fact that the document id will redirect in the client - for (const ditem of data.documents) { - text = text.replace( - new RegExp(`<<${ditem.id}>>`, "g"), - `/doc/${ditem.id}` - ); - } + // Check all of the document we've created against urls in the text + // and replace them out with a valid internal link. Because we are doing + // this before saving, we can't use the document slug, but we can take + // advantage of the fact that the document id will redirect in the client + for (const ditem of data.documents) { + text = text.replace( + new RegExp(`<<${ditem.id}>>`, "g"), + `/doc/${ditem.id}` + ); + } - const options: { urlId?: string } = {}; - if (item.urlId) { - const existing = await Document.unscoped().findOne({ - attributes: ["id"], - paranoid: false, - transaction, - where: { - urlId: item.urlId, + const options: { urlId?: string } = {}; + if (item.urlId) { + const existing = await Document.unscoped().findOne({ + attributes: ["id"], + paranoid: false, + transaction, + where: { + urlId: item.urlId, + }, + }); + + if (!existing) { + options.urlId = item.urlId; + } + } + + const document = await documentCreator({ + ...options, + sourceMetadata: { + fileName: path.basename(item.path), + mimeType: item.mimeType, + externalId: item.externalId, }, + id: item.id, + title: item.title, + text, + collectionId: item.collectionId, + createdAt: item.createdAt, + updatedAt: item.updatedAt ?? item.createdAt, + publishedAt: item.updatedAt ?? item.createdAt ?? new Date(), + parentDocumentId: item.parentDocumentId, + importId: fileOperation.id, + user, + ip, + transaction, }); + documents.set(item.id, document); - if (!existing) { - options.urlId = item.urlId; - } - } - - const document = await documentCreator({ - ...options, - sourceMetadata: { - fileName: path.basename(item.path), - mimeType: item.mimeType, - externalId: item.externalId, - }, - id: item.id, - title: item.title, - text, - collectionId: item.collectionId, - createdAt: item.createdAt, - updatedAt: item.updatedAt ?? item.createdAt, - publishedAt: item.updatedAt ?? item.createdAt ?? new Date(), - parentDocumentId: item.parentDocumentId, - importId: fileOperation.id, - user, - ip, - transaction, - }); - documents.set(item.id, document); - - const collection = collections.get(item.collectionId); - if (collection) { await collection.addDocumentToStructure(document, 0, { transaction, + save: false, }); } - } - // Return value is only used for testing - return { - collections, - documents, - attachments, - }; + await collection.save({ transaction }); + }); + } + + // Attachments + await sequelize.transaction(async (transaction) => { + const chunks = chunk(data.attachments, 10); + + for (const chunk of chunks) { + // Parallelize 10 uploads at a time + await Promise.all( + chunk.map(async (item) => { + Logger.debug( + "task", + `ImportTask persisting attachment ${item.name} (${item.id})` + ); + const attachment = await attachmentCreator({ + source: "import", + preset: AttachmentPreset.DocumentAttachment, + id: item.id, + name: item.name, + type: item.mimeType, + buffer: await item.buffer(), + user, + ip, + transaction, + }); + if (attachment) { + attachments.set(item.id, attachment); + } + }) + ); + } }); } catch (err) { Logger.info( @@ -534,6 +536,13 @@ export default abstract class ImportTask extends BaseTask { ); throw err; } + + // Return value is only used for testing + return { + collections, + documents, + attachments, + }; } /** diff --git a/yarn.lock b/yarn.lock index f3808b8a7..63b674119 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3870,15 +3870,7 @@ aria-query@^5.1.3: dependencies: dequal "^2.0.3" -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity "sha1-+r6LwZP+qGXzF/54Bwhe4N7lrq0= sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==" - dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" - -array-buffer-byte-length@^1.0.1: +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== @@ -3955,18 +3947,6 @@ array.prototype.tosorted@^1.1.1: es-shim-unscopables "^1.0.0" get-intrinsic "^1.2.1" -arraybuffer.prototype.slice@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" - integrity "sha1-m16jhopu68MCc9pXfriIOBwARLs= sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==" - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" - is-shared-array-buffer "^1.0.2" - arraybuffer.prototype.slice@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" @@ -4049,12 +4029,7 @@ autotrack@^2.4.1: rollup-plugin-node-resolve "^3.0.0" source-map "^0.5.6" -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity "sha1-kvlWFlAQadB9EO2y/DfT4cZRI7c= sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" - -available-typed-arrays@^1.0.6: +available-typed-arrays@^1.0.5, available-typed-arrays@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz#ac812d8ce5a6b976d738e1c45f08d0b00bc7d725" integrity sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg== @@ -4546,7 +4521,7 @@ cache-content-type@^1.0.0: mime-types "^2.1.18" ylru "^1.2.0" -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" integrity "sha1-b6K3hFzg6km/TYue9kcnosLi5RM= sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==" @@ -6104,52 +6079,7 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" - integrity "sha1-i05fxc79fxZg8PjhpSkA37ydnMw= sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==" - dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.1" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.1" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.10" - is-weakref "^1.0.2" - object-inspect "^1.12.3" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - safe-array-concat "^1.0.0" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.10" - -es-abstract@^1.22.3: +es-abstract@^1.22.1, es-abstract@^1.22.3: version "1.22.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== @@ -7103,17 +7033,7 @@ function-bind@^1.1.1, function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity "sha1-LALYZNl/PqbIgwxGTL0Rq26rehw= sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity "sha1-zOBQX+H/uAUD5vnkbMZORqEqliE= sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==" - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -function.prototype.name@^1.1.6: +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== @@ -7123,7 +7043,7 @@ function.prototype.name@^1.1.6: es-abstract "^1.22.1" functions-have-names "^1.2.3" -functions-have-names@^1.2.2, functions-have-names@^1.2.3: +functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity "sha1-BAT+TuK6L2B/Dg7DyAuumUEzuDQ= sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" @@ -7143,17 +7063,7 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34= sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" - integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== - dependencies: - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-intrinsic@^1.2.3: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.3.tgz#9d2d284a238e62672f556361e7d4e1a4686ae50e" integrity sha512-JIcZczvcMVE7AUOP+X72bh8HqHBRxFdz5PDHYtNG/lE3yk9b3KZBJlwFcTyPYjg3L4RLLmZJzvjxhaZVapxFrQ== @@ -7397,14 +7307,7 @@ has-symbols@^1.0.2, has-symbols@^1.0.3: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity "sha1-u3ssQ0klHc6HsSX3vfh0qnyLOfg= sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity "sha1-fhM4GKfTlHNPlB5zw9P5KR5liyU= sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==" - dependencies: - has-symbols "^1.0.2" - -has-tostringtag@^1.0.1: +has-tostringtag@^1.0.0, has-tostringtag@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== @@ -7866,16 +7769,7 @@ is-arguments@^1.0.4, is-arguments@^1.1.1: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity "sha1-8mU87YQSCBY47LDrvQxBxuCuy74= sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==" - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - -is-array-buffer@^3.0.4: +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== @@ -8142,18 +8036,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity "sha1-NqW1y0GJtXXRo+SwhTa/tIWAHj8= sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==" - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -is-typed-array@^1.1.12: +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.3, is-typed-array@^1.1.9: version "1.1.13" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== @@ -10021,12 +9904,7 @@ object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity "sha1-umLf/WfuJWyMCG365p4BbNHxmLk= sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" - -object-inspect@^1.13.1: +object-inspect@^1.13.1, object-inspect@^1.9.0: version "1.13.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== @@ -11720,7 +11598,7 @@ rxjs@^7.0.0: dependencies: tslib "^2.1.0" -safe-array-concat@^1.0.0, safe-array-concat@^1.0.1: +safe-array-concat@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" integrity "sha1-kWhqY8462+oU1hsUyZVyqP+EdUw= sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==" @@ -12291,15 +12169,6 @@ string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: set-function-name "^2.0.0" side-channel "^1.0.4" -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity "sha1-poNSdAhZ9ok/FM4+8bswN/epBTM= sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==" - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - string.prototype.trim@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" @@ -12309,15 +12178,6 @@ string.prototype.trim@^1.2.8: define-properties "^1.2.0" es-abstract "^1.22.1" -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity "sha1-xKJ/oCbZedecBPFzl/JQpGKURTM= sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==" - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - string.prototype.trimend@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" @@ -12327,15 +12187,6 @@ string.prototype.trimend@^1.0.7: define-properties "^1.2.0" es-abstract "^1.22.1" -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity "sha1-6Qq2aqjkAH2S71kbvzzUIsVr3PQ= sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==" - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - string.prototype.trimstart@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" @@ -13445,18 +13296,7 @@ which-collection@^1.0.1: is-weakmap "^2.0.1" is-weakset "^2.0.1" -which-typed-array@^1.1.10, which-typed-array@^1.1.13, which-typed-array@^1.1.2, which-typed-array@^1.1.9: - version "1.1.13" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" - integrity "sha1-hwzVvgbdthb1BOewOcTCSJgYTTY= sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==" - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.4" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -which-typed-array@^1.1.14: +which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.2, which-typed-array@^1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.14.tgz#1f78a111aee1e131ca66164d8bdc3ab062c95a06" integrity sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==