From 071ff42689f3f2e9d21505438f46177add20ae17 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 17:46:26 +0000 Subject: [PATCH 01/13] Bump version to 9.2.4 --- app/mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/mix.exs b/app/mix.exs index a863db208..42d2ef2f1 100644 --- a/app/mix.exs +++ b/app/mix.exs @@ -3,7 +3,7 @@ Code.require_file("lib/env.ex") defmodule Meadow.MixProject do use Mix.Project - @app_version "9.2.3" + @app_version "9.2.4" def project do [ From 0888fc9564901cdf037a5a2727305ade0abeb9cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Apr 2024 11:22:59 +0000 Subject: [PATCH 02/13] Bump react-dom from 18.2.0 to 18.3.1 in /app/assets Bumps [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) from 18.2.0 to 18.3.1. - [Release notes](https://github.com/facebook/react/releases) - [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md) - [Commits](https://github.com/facebook/react/commits/v18.3.1/packages/react-dom) --- updated-dependencies: - dependency-name: react-dom dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- app/assets/package-lock.json | 20 ++++++++++---------- app/assets/package.json | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/assets/package-lock.json b/app/assets/package-lock.json index 854087ac3..d6bc70d46 100644 --- a/app/assets/package-lock.json +++ b/app/assets/package-lock.json @@ -7,7 +7,7 @@ "license": "MIT", "dependencies": { "@absinthe/socket-apollo-link": "^0.2.1", - "@apollo/client": "latest", + "@apollo/client": "*", "@apollo/react-hooks": "^4.0.0", "@apollo/react-testing": "^4.0.0", "@appbaseio/reactivesearch": "3.23.1", @@ -96,7 +96,7 @@ "node-fetch": "^2.6.1", "prettier": "^3.2.5", "react": "^18.2.0", - "react-dom": "^18.2.0", + "react-dom": "^18.3.1", "react-router-dom": "^5.3.0", "react-router-prop-types": "^1.0.5", "sass": "^1.72.0", @@ -18927,15 +18927,15 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-dropzone": { @@ -20028,9 +20028,9 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dependencies": { "loose-envify": "^1.1.0" } diff --git a/app/assets/package.json b/app/assets/package.json index 4b3da1fcb..4688a8176 100644 --- a/app/assets/package.json +++ b/app/assets/package.json @@ -106,7 +106,7 @@ "node-fetch": "^2.6.1", "prettier": "^3.2.5", "react": "^18.2.0", - "react-dom": "^18.2.0", + "react-dom": "^18.3.1", "react-router-dom": "^5.3.0", "react-router-prop-types": "^1.0.5", "sass": "^1.72.0", From dcb161057847036231df22523fbc01ec0595e723 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Apr 2024 11:24:26 +0000 Subject: [PATCH 03/13] Bump @testing-library/dom from 10.0.0 to 10.1.0 in /app/assets Bumps [@testing-library/dom](https://github.com/testing-library/dom-testing-library) from 10.0.0 to 10.1.0. - [Release notes](https://github.com/testing-library/dom-testing-library/releases) - [Changelog](https://github.com/testing-library/dom-testing-library/blob/main/CHANGELOG.md) - [Commits](https://github.com/testing-library/dom-testing-library/compare/v10.0.0...v10.1.0) --- updated-dependencies: - dependency-name: "@testing-library/dom" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- app/assets/package-lock.json | 10 +++++----- app/assets/package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/assets/package-lock.json b/app/assets/package-lock.json index 854087ac3..831f1b731 100644 --- a/app/assets/package-lock.json +++ b/app/assets/package-lock.json @@ -7,7 +7,7 @@ "license": "MIT", "dependencies": { "@absinthe/socket-apollo-link": "^0.2.1", - "@apollo/client": "latest", + "@apollo/client": "*", "@apollo/react-hooks": "^4.0.0", "@apollo/react-testing": "^4.0.0", "@appbaseio/reactivesearch": "3.23.1", @@ -74,7 +74,7 @@ "@graphql-typed-document-node/core": "^3.2.0", "@nulib/dcapi-types": "^2.1.0", "@nulib/prettier-config": "^1.2.0", - "@testing-library/dom": "^10.0.0", + "@testing-library/dom": "^10.1.0", "@testing-library/jest-dom": "^6.4.2", "@testing-library/react": "^15.0.4", "@testing-library/user-event": "^14.5.2", @@ -7239,9 +7239,9 @@ } }, "node_modules/@testing-library/dom": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.0.0.tgz", - "integrity": "sha512-PmJPnogldqoVFf+EwbHvbBJ98MmqASV8kLrBYgsDNxQcFMeIS7JFL48sfyXvuMtgmWO/wMhh25odr+8VhDmn4g==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.1.0.tgz", + "integrity": "sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", diff --git a/app/assets/package.json b/app/assets/package.json index 4b3da1fcb..fd34cc0b8 100644 --- a/app/assets/package.json +++ b/app/assets/package.json @@ -84,7 +84,7 @@ "@graphql-typed-document-node/core": "^3.2.0", "@nulib/dcapi-types": "^2.1.0", "@nulib/prettier-config": "^1.2.0", - "@testing-library/dom": "^10.0.0", + "@testing-library/dom": "^10.1.0", "@testing-library/jest-dom": "^6.4.2", "@testing-library/react": "^15.0.4", "@testing-library/user-event": "^14.5.2", From 7ee4568fdfb812ecaab75aeff6700fbad193c7be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 11:59:46 +0000 Subject: [PATCH 04/13] Bump @babel/preset-env from 7.24.4 to 7.24.5 in /app/assets Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.24.4 to 7.24.5. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.24.5/packages/babel-preset-env) --- updated-dependencies: - dependency-name: "@babel/preset-env" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- app/assets/package-lock.json | 156 +++++++++++++++++------------------ app/assets/package.json | 2 +- 2 files changed, 79 insertions(+), 79 deletions(-) diff --git a/app/assets/package-lock.json b/app/assets/package-lock.json index 854087ac3..187325f34 100644 --- a/app/assets/package-lock.json +++ b/app/assets/package-lock.json @@ -7,7 +7,7 @@ "license": "MIT", "dependencies": { "@absinthe/socket-apollo-link": "^0.2.1", - "@apollo/client": "latest", + "@apollo/client": "*", "@apollo/react-hooks": "^4.0.0", "@apollo/react-testing": "^4.0.0", "@appbaseio/reactivesearch": "3.23.1", @@ -62,7 +62,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.17.3", "@babel/plugin-proposal-optional-chaining": "^7.16.7", "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/preset-env": "^7.24.0", + "@babel/preset-env": "^7.24.5", "@babel/preset-react": "^7.23.3", "@babel/preset-typescript": "^7.23.3", "@babel/runtime": "^7.24.4", @@ -712,19 +712,19 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", - "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", + "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.24.5", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "semver": "^6.3.1" }, "engines": { @@ -799,12 +799,12 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", + "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -852,9 +852,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -918,11 +918,11 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -937,9 +937,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "engines": { "node": ">=6.9.0" } @@ -1005,13 +1005,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", - "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", + "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1493,12 +1493,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", - "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", + "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1541,18 +1541,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", + "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "globals": "^11.1.0" }, "engines": { @@ -1579,12 +1579,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", + "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1914,15 +1914,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", + "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" + "@babel/plugin-transform-parameters": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1964,12 +1964,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", + "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1981,12 +1981,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", + "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -2012,14 +2012,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", + "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -2202,12 +2202,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", + "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -2298,16 +2298,16 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", - "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", + "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", @@ -2334,12 +2334,12 @@ "@babel/plugin-transform-async-generator-functions": "^7.24.3", "@babel/plugin-transform-async-to-generator": "^7.24.1", "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.4", + "@babel/plugin-transform-block-scoping": "^7.24.5", "@babel/plugin-transform-class-properties": "^7.24.1", "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-classes": "^7.24.5", "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.5", "@babel/plugin-transform-dotall-regex": "^7.24.1", "@babel/plugin-transform-duplicate-keys": "^7.24.1", "@babel/plugin-transform-dynamic-import": "^7.24.1", @@ -2359,13 +2359,13 @@ "@babel/plugin-transform-new-target": "^7.24.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.5", "@babel/plugin-transform-object-super": "^7.24.1", "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.5", + "@babel/plugin-transform-parameters": "^7.24.5", "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.5", "@babel/plugin-transform-property-literals": "^7.24.1", "@babel/plugin-transform-regenerator": "^7.24.1", "@babel/plugin-transform-reserved-words": "^7.24.1", @@ -2373,7 +2373,7 @@ "@babel/plugin-transform-spread": "^7.24.1", "@babel/plugin-transform-sticky-regex": "^7.24.1", "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.5", "@babel/plugin-transform-unicode-escapes": "^7.24.1", "@babel/plugin-transform-unicode-property-regex": "^7.24.1", "@babel/plugin-transform-unicode-regex": "^7.24.1", @@ -2496,12 +2496,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { diff --git a/app/assets/package.json b/app/assets/package.json index 4b3da1fcb..41122f99e 100644 --- a/app/assets/package.json +++ b/app/assets/package.json @@ -72,7 +72,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.17.3", "@babel/plugin-proposal-optional-chaining": "^7.16.7", "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/preset-env": "^7.24.0", + "@babel/preset-env": "^7.24.5", "@babel/preset-react": "^7.23.3", "@babel/preset-typescript": "^7.23.3", "@babel/runtime": "^7.24.4", From 489f25f3c7011a6f16693733b0c0a6b587465880 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 12:00:27 +0000 Subject: [PATCH 05/13] Bump @babel/runtime from 7.24.4 to 7.24.5 in /app/assets Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.24.4 to 7.24.5. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.24.5/packages/babel-runtime) --- updated-dependencies: - dependency-name: "@babel/runtime" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- app/assets/package-lock.json | 10 +++++----- app/assets/package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/assets/package-lock.json b/app/assets/package-lock.json index 854087ac3..109b91617 100644 --- a/app/assets/package-lock.json +++ b/app/assets/package-lock.json @@ -7,7 +7,7 @@ "license": "MIT", "dependencies": { "@absinthe/socket-apollo-link": "^0.2.1", - "@apollo/client": "latest", + "@apollo/client": "*", "@apollo/react-hooks": "^4.0.0", "@apollo/react-testing": "^4.0.0", "@appbaseio/reactivesearch": "3.23.1", @@ -65,7 +65,7 @@ "@babel/preset-env": "^7.24.0", "@babel/preset-react": "^7.23.3", "@babel/preset-typescript": "^7.23.3", - "@babel/runtime": "^7.24.4", + "@babel/runtime": "^7.24.5", "@creativebulma/bulma-divider": "^1.1.0", "@creativebulma/bulma-tooltip": "^1.2.0", "@elastic/elasticsearch-mock": "^2.0.0", @@ -2452,9 +2452,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", - "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", "dependencies": { "regenerator-runtime": "^0.14.0" }, diff --git a/app/assets/package.json b/app/assets/package.json index 4b3da1fcb..c49584247 100644 --- a/app/assets/package.json +++ b/app/assets/package.json @@ -75,7 +75,7 @@ "@babel/preset-env": "^7.24.0", "@babel/preset-react": "^7.23.3", "@babel/preset-typescript": "^7.23.3", - "@babel/runtime": "^7.24.4", + "@babel/runtime": "^7.24.5", "@creativebulma/bulma-divider": "^1.1.0", "@creativebulma/bulma-tooltip": "^1.2.0", "@elastic/elasticsearch-mock": "^2.0.0", From a034b156f082901de587f59e25f23d65025c89ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 12:01:45 +0000 Subject: [PATCH 06/13] Bump @babel/core from 7.24.4 to 7.24.5 in /app/assets Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.24.4 to 7.24.5. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.24.5/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- app/assets/package-lock.json | 108 +++++++++++++++++------------------ app/assets/package.json | 2 +- 2 files changed, 55 insertions(+), 55 deletions(-) diff --git a/app/assets/package-lock.json b/app/assets/package-lock.json index 854087ac3..d38c59de6 100644 --- a/app/assets/package-lock.json +++ b/app/assets/package-lock.json @@ -7,7 +7,7 @@ "license": "MIT", "dependencies": { "@absinthe/socket-apollo-link": "^0.2.1", - "@apollo/client": "latest", + "@apollo/client": "*", "@apollo/react-hooks": "^4.0.0", "@apollo/react-testing": "^4.0.0", "@appbaseio/reactivesearch": "3.23.1", @@ -57,7 +57,7 @@ "use-clipboard-copy": "^0.2.0" }, "devDependencies": { - "@babel/core": "^7.24.4", + "@babel/core": "^7.24.5", "@babel/plugin-proposal-class-properties": "^7.17.12", "@babel/plugin-proposal-object-rest-spread": "^7.17.3", "@babel/plugin-proposal-optional-chaining": "^7.16.7", @@ -630,20 +630,20 @@ } }, "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", + "@babel/generator": "^7.24.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -659,11 +659,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.24.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -822,15 +822,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -895,11 +895,11 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -918,11 +918,11 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -937,9 +937,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "engines": { "node": ">=6.9.0" } @@ -967,13 +967,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", "dependencies": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -994,9 +994,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -2476,18 +2476,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2496,12 +2496,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { diff --git a/app/assets/package.json b/app/assets/package.json index 4b3da1fcb..8918ba984 100644 --- a/app/assets/package.json +++ b/app/assets/package.json @@ -67,7 +67,7 @@ "use-clipboard-copy": "^0.2.0" }, "devDependencies": { - "@babel/core": "^7.24.4", + "@babel/core": "^7.24.5", "@babel/plugin-proposal-class-properties": "^7.17.12", "@babel/plugin-proposal-object-rest-spread": "^7.17.3", "@babel/plugin-proposal-optional-chaining": "^7.16.7", From b1c0c1dccce1c20cf1fba4ac3d106263afdf4470 Mon Sep 17 00:00:00 2001 From: Karen Shaw Date: Wed, 1 May 2024 12:06:49 -0700 Subject: [PATCH 07/13] Auxiliary files can be pdf (#3913) * Auxiliary files can be pdf * Adds create-derivative-copy sqs queue to terraform * Ingest sheet validation permits zip or pdf aux files --- .../Work/Fileset/ActionButtons/Auxillary.jsx | 64 ++++++++++-- .../js/components/Work/Fileset/ListItem.jsx | 31 ++++-- app/assets/js/hooks/useAcceptedMimeTypes.js | 10 +- app/assets/js/hooks/useFileSet.js | 37 +++++++ app/assets/static/images/placeholder-pdf.png | Bin 0 -> 15422 bytes app/assets/static/images/placeholder-zip.png | Bin 0 -> 11201 bytes app/config/pipeline.exs | 9 ++ app/lib/meadow/data/file_sets.ex | 32 ++++++ app/lib/meadow/data/works.ex | 7 ++ app/lib/meadow/indexing/v2/file_set.ex | 1 + app/lib/meadow/indexing/v2/work.ex | 1 + app/lib/meadow/ingest/validator.ex | 3 + .../actions/create_derivative_copy.ex | 97 ++++++++++++++++++ app/lib/meadow/pipeline/dispatcher.ex | 27 +++++ app/lib/meadow/search/index.ex | 2 +- app/lib/meadow/utils/pairtree.ex | 12 +++ app/test/fixtures/placeholders/04-pyramid.tif | Bin 0 -> 57794 bytes app/test/fixtures/placeholders/05-pyramid.tif | Bin 0 -> 55330 bytes app/test/fixtures/test.pdf | Bin 0 -> 12956 bytes app/test/meadow/data/file_sets_test.exs | 38 +++++++ .../actions/create_derivative_copy_test.exs | 96 +++++++++++++++++ infrastructure/deploy/pipeline.tf | 2 +- 22 files changed, 448 insertions(+), 21 deletions(-) create mode 100644 app/assets/static/images/placeholder-pdf.png create mode 100644 app/assets/static/images/placeholder-zip.png create mode 100644 app/lib/meadow/pipeline/actions/create_derivative_copy.ex create mode 100644 app/test/fixtures/placeholders/04-pyramid.tif create mode 100644 app/test/fixtures/placeholders/05-pyramid.tif create mode 100644 app/test/fixtures/test.pdf create mode 100644 app/test/pipeline/actions/create_derivative_copy_test.exs diff --git a/app/assets/js/components/Work/Fileset/ActionButtons/Auxillary.jsx b/app/assets/js/components/Work/Fileset/ActionButtons/Auxillary.jsx index 17323e46e..4acbaeb58 100644 --- a/app/assets/js/components/Work/Fileset/ActionButtons/Auxillary.jsx +++ b/app/assets/js/components/Work/Fileset/ActionButtons/Auxillary.jsx @@ -3,23 +3,67 @@ import PropTypes from "prop-types"; import { IIIFContext } from "@js/components/IIIF/IIIFProvider"; import { IIIF_SIZES } from "@js/services/global-vars"; import { ImageDownloader } from "@samvera/image-downloader"; +import useFileSet from "@js/hooks/useFileSet"; +import { Button } from "@nulib/design-system"; +import { IconDownload } from "@js/components/Icon"; +import { toastWrapper } from "@js/services/helpers"; +import { useWorkState } from "@js/context/work-context"; +import { AuthContext } from "@js/components/Auth/Auth"; +import { GET_DCAPI_ENDPOINT } from "@js/components/UI/ui.gql"; +import { getApiResponse } from "@js/services/get-api-response"; +import { useQuery } from "@apollo/client"; const WorkFilesetActionButtonsAuxiliary = ({ fileSet }) => { const iiifServerUrl = useContext(IIIFContext); const url = `${iiifServerUrl}${fileSet.id}${IIIF_SIZES.IIIF_FULL}`; + const { altFileFormat, isImage, isAltFormat } = useFileSet(); + const { dcApiToken } = useWorkState(); + const currentUser = useContext(AuthContext); + const { data: dataDcApiEndpoint } = useQuery(GET_DCAPI_ENDPOINT); + + const handleDownloadFile = async () => { + const dcApiFileSet = `${dataDcApiEndpoint?.dcapiEndpoint?.url}/file-sets/${fileSet.id}`; + const uri = `${dcApiFileSet}/download?email=${currentUser?.email}`; + + try { + const response = await getApiResponse(uri, dcApiToken); + if (response?.status !== 200) throw Error(response); + window.location.href = response.url; + } catch (error) { + console.error(error); + toastWrapper("is-danger", `The download request failed.`); + } + }; return ( +
- - View Aux File - - - Download JPG - + {isImage(fileSet) && ( +
+ + View Aux File + + + Download JPG + +
+ )} + + {isAltFormat(fileSet) && ( +
+ +
+ )} +
); }; diff --git a/app/assets/js/components/Work/Fileset/ListItem.jsx b/app/assets/js/components/Work/Fileset/ListItem.jsx index 0e1627adc..e4609c53f 100644 --- a/app/assets/js/components/Work/Fileset/ListItem.jsx +++ b/app/assets/js/components/Work/Fileset/ListItem.jsx @@ -22,7 +22,7 @@ function WorkFilesetListItem({ const iiifServerUrl = useContext(IIIFContext); const { id, coreMetadata } = fileSet; const dispatch = useWorkDispatch(); - const { isMedia } = useFileSet(); + const {isImage, isMedia, isPDF, isZip } = useFileSet(); const workContextState = useWorkState(); // Helper for media type file sets @@ -41,13 +41,31 @@ function WorkFilesetListItem({ if (!imgState.errored) { setImgState({ errored: true, - src: isMedia(fileSet) - ? "/images/video-placeholder2.png" - : "/images/placeholder.png", + src: placeholderImage(fileSet), }); } }; + const placeholderImage = (fileSet) => { + if (isMedia(fileSet)) { + return "/images/video-placeholder2.png"; + } else if (isPDF(fileSet)) { + return "/images/placeholder-pdf.png"; + } else if (isZip(fileSet)) { + return "/images/placeholder-zip.png"; + } else { + return "/images/placeholder.png"; + } + } + + const showWorkImageToggle = () => { + if (fileSet.role.id === "A" && workContextState.workTypeId === "AUDIO") { + return false; + } else { + return isImage(fileSet); + } + } + return (
@@ -102,9 +120,8 @@ function WorkFilesetListItem({
{!isEditing && ( <> - {!( - workContextState.workTypeId === "AUDIO" && - fileSet.role.id === "A" + {( + showWorkImageToggle() ) && (
diff --git a/app/assets/js/hooks/useAcceptedMimeTypes.js b/app/assets/js/hooks/useAcceptedMimeTypes.js index 25b8358e9..6d7c72ec5 100644 --- a/app/assets/js/hooks/useAcceptedMimeTypes.js +++ b/app/assets/js/hooks/useAcceptedMimeTypes.js @@ -12,19 +12,25 @@ export default function useAcceptedMimeTypes() { } const mimeParts = mimeType.split("/"); + const acceptedAltFormats = [ + "application/pdf", + "application/zip", + "application/zip-compressed", + ]; const isImage = mimeParts[0] === "image"; const isAudio = mimeParts[0] === "audio"; const isVideo = mimeParts[0] === "video"; + const isAltFormat = acceptedAltFormats.includes(mimeType); let code = ""; let message = ""; let isValid = true; switch (fileSetRole) { case "X": - if (!isImage) { + if (!isImage && !isAltFormat) { isValid = false; code = "invalid-image"; - message = "Auxiliary files can only be image mime types"; + message = "Auxiliary files can only be image, pdf, or zip mime types"; } break; diff --git a/app/assets/js/hooks/useFileSet.js b/app/assets/js/hooks/useFileSet.js index 98e0e98de..d19ef985b 100644 --- a/app/assets/js/hooks/useFileSet.js +++ b/app/assets/js/hooks/useFileSet.js @@ -23,6 +23,17 @@ export default function useFileSet() { return !fileSet || Object.keys(fileSet).length === 0; } + function isAltFormat(fileSet = {}) { + const mimeType = fileSet.coreMetadata?.mimeType?.toLowerCase(); + if (!mimeType) return; + const acceptedTypes = [ + "application/pdf", + "application/zip", + "application/zip-compressed", + ]; + return acceptedTypes.includes(mimeType); + } + function isImage(fileSet = {}) { const mimeType = fileSet.coreMetadata?.mimeType?.toLowerCase(); if (!mimeType) return; @@ -35,18 +46,44 @@ export default function useFileSet() { return mimeType.includes("video") || mimeType.includes("audio"); } + function isPDF(fileSet = {}) { + const mimeType = fileSet.coreMetadata?.mimeType?.toLowerCase(); + if (!mimeType) return; + return mimeType === "application/pdf"; + } + function isVideo(fileSet = {}) { const mimeType = fileSet.coreMetadata?.mimeType?.toLowerCase(); if (!mimeType) return; return mimeType.includes("video"); } + function isZip(fileSet = {}) { + const mimeType = fileSet.coreMetadata?.mimeType?.toLowerCase(); + if (!mimeType) return; + return mimeType.includes("zip"); + } + + function altFileFormat(fileSet = {}) { + const mimeType = fileSet.coreMetadata?.mimeType?.toLowerCase(); + if (!mimeType) return; + if (mimeType === "application/pdf") { + return "pdf"; + } else { + return "zip"; + } + } + return { + altFileFormat, filterFileSets, getWebVttString, + isAltFormat, isEmpty, isImage, isMedia, + isPDF, isVideo, + isZip, }; } diff --git a/app/assets/static/images/placeholder-pdf.png b/app/assets/static/images/placeholder-pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..bf70d077002b5bdf2b09ad6bc897627ca9352698 GIT binary patch literal 15422 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 URI.to_string() + end + + def derivative_key(file_set) do + Path.join([ + "derivatives", + Pairtree.derivative_path(file_set.id) + ]) + end + + def download_uri_for(%FileSet{id: id, role: %{id: "X"}}), do: download_uri(id) + def download_uri_for(%FileSet{id: id, role: %{id: "A"}}), do: download_uri(id) + def download_uri_for(_), do: nil + + defp download_uri(id) do + with uri <- URI.parse(Application.get_env(:meadow, :dc_api) |> get_in([:v2, "base_url"])) do + uri + |> URI.merge("file-sets/" <> id <> "/download") + |> URI.to_string() + end +end + defp multi_update(file_set_updates) do file_set_updates |> Enum.with_index(1) diff --git a/app/lib/meadow/data/works.ex b/app/lib/meadow/data/works.ex index 340f6b27e..685036201 100644 --- a/app/lib/meadow/data/works.ex +++ b/app/lib/meadow/data/works.ex @@ -406,6 +406,13 @@ defmodule Meadow.Data.Works do }), do: {:ok, work} + def set_representative_image(work, %FileSet{ + id: _id, + role: %{id: "X"}, + derivatives: %{"copy" => _copy} + }), + do: {:ok, work} + def set_representative_image(%Work{} = work, file_set_id) when is_binary(file_set_id) do set_representative_image(work, FileSets.get_file_set!(file_set_id)) end diff --git a/app/lib/meadow/indexing/v2/file_set.ex b/app/lib/meadow/indexing/v2/file_set.ex index 6831e915b..8d5e2d103 100644 --- a/app/lib/meadow/indexing/v2/file_set.ex +++ b/app/lib/meadow/indexing/v2/file_set.ex @@ -14,6 +14,7 @@ defmodule Meadow.Indexing.V2.FileSet do create_date: file_set.inserted_at, digests: file_set.core_metadata.digests, description: file_set.core_metadata.description, + download_url: FileSets.download_uri_for(file_set), extracted_metadata: extracted_metadata(file_set.extracted_metadata), id: file_set.id, indexed_at: NaiveDateTime.utc_now(), diff --git a/app/lib/meadow/indexing/v2/work.ex b/app/lib/meadow/indexing/v2/work.ex index 8d0640283..5192b87cd 100644 --- a/app/lib/meadow/indexing/v2/work.ex +++ b/app/lib/meadow/indexing/v2/work.ex @@ -204,6 +204,7 @@ defmodule Meadow.Indexing.V2.Work do description: file_set.core_metadata.description, accession_number: file_set.accession_number, duration: FileSets.duration_in_seconds(file_set), + download_url: FileSets.download_uri_for(file_set), height: FileSets.height(file_set), label: file_set.core_metadata.label, mime_type: file_set.core_metadata.mime_type, diff --git a/app/lib/meadow/ingest/validator.ex b/app/lib/meadow/ingest/validator.ex index 6e7605a39..3e3a009aa 100644 --- a/app/lib/meadow/ingest/validator.ex +++ b/app/lib/meadow/ingest/validator.ex @@ -391,6 +391,9 @@ defmodule Meadow.Ingest.Validator do end defp mime_type_accepted?(_, "X", "image/" <> _rest), do: true + defp mime_type_accepted?(_, "X", "application/pdf"), do: true + defp mime_type_accepted?(_, "X", "application/zip"), do: true + defp mime_type_accepted?(_, "X", "application/zip" <> _rest), do: true defp mime_type_accepted?(_, "P", _), do: true defp mime_type_accepted?(_, "S", _), do: true diff --git a/app/lib/meadow/pipeline/actions/create_derivative_copy.ex b/app/lib/meadow/pipeline/actions/create_derivative_copy.ex new file mode 100644 index 000000000..c062cea61 --- /dev/null +++ b/app/lib/meadow/pipeline/actions/create_derivative_copy.ex @@ -0,0 +1,97 @@ +defmodule Meadow.Pipeline.Actions.CreateDerivativeCopy do + @moduledoc """ + Action to copy the file referenced in a FileSet + to the pre-configured derivatives bucket. + + Subscribes to: + * + + """ + alias Meadow.Data.{ActionStates, FileSets} + alias Meadow.Repo + use Meadow.Pipeline.Actions.Common + alias Meadow.Utils.AWS + require Logger + import SweetXml, only: [sigil_x: 2] + + def actiondoc, do: "Create derivative copy of file set" + + def already_complete?(file_set, _) do + file_set + |> FileSets.derivative_location() + |> Meadow.Utils.Stream.exists?() + end + + def process(file_set, attributes) do + ActionStates.set_state!(file_set, __MODULE__, "started") + + case create_derivative_copy(file_set, attributes) do + {:ok, dest} -> + Repo.transaction(fn -> + derivatives = FileSets.add_derivative(file_set, :copy, dest) + FileSets.update_file_set(file_set, %{derivatives: derivatives}) + ActionStates.set_state!(file_set, __MODULE__, "ok") + end) + + :ok + + {:error, err} -> + ActionStates.set_state!(file_set, __MODULE__, "error", err) + {:error, err} + end + end + + defp create_derivative_copy(file_set, _attributes) do + with dest_location <- FileSets.derivative_location(file_set) do + copy_file(file_set, dest_location) + end + rescue + err in ArgumentError -> + Logger.error("Error creating derivative path: #{inspect(err)}") + {:error, "Error creating derivative path: #{inspect(err)}"} + end + + defp copy_file(file_set, dest_location) do + with src_location <- file_set.core_metadata.location, + %{host: src_bucket, path: "/" <> src_key} <- URI.parse(src_location), + %{host: dest_bucket, path: "/" <> dest_key} <- URI.parse(dest_location), + s3_metadata <- file_set.core_metadata.digests |> Enum.into([]) do + Logger.info( + "Making derivitive copy of source: #{src_location}, destination: #{dest_location}" + ) + + content_type = + case file_set.core_metadata.mime_type do + nil -> "application/octet-stream" + mime_type -> mime_type + end + + tagging = + file_set.core_metadata.digests + |> Enum.map_join("&", fn {tag, value} -> ["computed-#{tag}", value] |> Enum.join("=") end) + + case AWS.copy_object( + dest_bucket, + dest_key, + src_bucket, + src_key, + content_type: content_type, + metadata_directive: :REPLACE, + meta: s3_metadata, + tagging: tagging, + tagging_directive: :REPLACE + ) do + {:ok, _} -> {:ok, dest_location} + {:error, {:http_error, _status, %{body: body}}} -> {:error, extract_error(body)} + {:error, other} -> {:error, inspect(other)} + end + end + end + + defp extract_error(body) do + with error <- + SweetXml.xmap(body, code: ~x"/Error/Code/text()", message: ~x"/Error/Message/text()") do + "#{error[:code]}: #{error[:message]}" + end + end +end diff --git a/app/lib/meadow/pipeline/dispatcher.ex b/app/lib/meadow/pipeline/dispatcher.ex index a0d7c1be5..e9ba2413e 100644 --- a/app/lib/meadow/pipeline/dispatcher.ex +++ b/app/lib/meadow/pipeline/dispatcher.ex @@ -12,6 +12,7 @@ defmodule Meadow.Pipeline.Dispatcher do alias Meadow.Pipeline.Actions.{ CopyFileToPreservation, + CreateDerivativeCopy, CreatePyramidTiff, CreateTranscodeJob, ExtractExifMetadata, @@ -51,6 +52,14 @@ defmodule Meadow.Pipeline.Dispatcher do FileSetComplete ] + @auxiliary_derivative_actions [ + GenerateFileSetDigests, + ExtractExifMetadata, + CopyFileToPreservation, + CreateDerivativeCopy, + FileSetComplete + ] + @access_video_actions @access_audio_actions @skip_transcode_actions [ @@ -118,6 +127,24 @@ defmodule Meadow.Pipeline.Dispatcher do ), do: @access_image_actions + def dispatcher_actions( + %{role: %{id: "X"}, core_metadata: %{mime_type: "application/pdf"}}, + _attributes + ), + do: @auxiliary_derivative_actions + + def dispatcher_actions( + %{role: %{id: "X"}, core_metadata: %{mime_type: "application/zip"}}, + _attributes + ), + do: @auxiliary_derivative_actions + + def dispatcher_actions( + %{role: %{id: "X"}, core_metadata: %{mime_type: "application/zip" <> _}}, + _attributes + ), + do: @auxiliary_derivative_actions + def dispatcher_actions( %{role: %{id: "P"}, core_metadata: %{mime_type: "image/" <> _}}, _attributes diff --git a/app/lib/meadow/search/index.ex b/app/lib/meadow/search/index.ex index 0aedc9b6a..005a5accc 100644 --- a/app/lib/meadow/search/index.ex +++ b/app/lib/meadow/search/index.ex @@ -136,7 +136,7 @@ defmodule Meadow.Search.Index do end defp embedding_model_name(model_id) do - case Meadow.Search.HTTP.get(["_plugins", "_ml", "models", model_id]) do + case HTTP.get(["_plugins", "_ml", "models", model_id]) do {:ok, %{status_code: 200, body: %{"name" => name}}} -> name _ -> nil end diff --git a/app/lib/meadow/utils/pairtree.ex b/app/lib/meadow/utils/pairtree.ex index 9e23b0872..ec77d4ad4 100644 --- a/app/lib/meadow/utils/pairtree.ex +++ b/app/lib/meadow/utils/pairtree.ex @@ -3,6 +3,18 @@ defmodule Meadow.Utils.Pairtree do Functions for working with pairtrees """ + @doc """ + Generates a derivative path + + ## Examples + + iex> Pairtree.derivative_path("6bdd9d3a-6507-41f9-84b2-71d49713cf6f") + "6b/dd/9d/3a/6bdd9d3a-6507-41f9-84b2-71d49713cf6f" + """ + def derivative_path(uuid) do + generate!(uuid, 4) <> "/" <> uuid + end + @doc """ Generates a preservation path diff --git a/app/test/fixtures/placeholders/04-pyramid.tif b/app/test/fixtures/placeholders/04-pyramid.tif new file mode 100644 index 0000000000000000000000000000000000000000..0dc779aadc663e350736e142ced606c212e14d24 GIT binary patch literal 57794 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 literal 0 HcmV?d00001 diff --git a/app/test/fixtures/placeholders/05-pyramid.tif b/app/test/fixtures/placeholders/05-pyramid.tif new file mode 100644 index 0000000000000000000000000000000000000000..8709b03041ba0bafb522a70e65b6c6966ad8ca63 GIT binary patch literal 55330 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 QdW3kaTi%hhKLC{$4=%0A+}!t(ksD3y8X`#DCQj^gG4> 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 literal 0 HcmV?d00001 diff --git a/app/test/meadow/data/file_sets_test.exs b/app/test/meadow/data/file_sets_test.exs index e53e17712..2f1b72bb1 100644 --- a/app/test/meadow/data/file_sets_test.exs +++ b/app/test/meadow/data/file_sets_test.exs @@ -173,6 +173,44 @@ defmodule Meadow.Data.FileSetsTest do end describe "utilities" do + test "download_uri_for/1 for an Auxilary file" do + file_set = file_set_fixture(role: %{id: "X", scheme: "FILE_SET_ROLE"}) + + with url <- file_set |> FileSets.download_uri_for() do + assert url |> String.ends_with?("file-sets/#{file_set.id}/download") + end + end + + test "download_uri_for/1 for an Access file" do + file_set = file_set_fixture(role: %{id: "A", scheme: "FILE_SET_ROLE"}) + + with url <- file_set |> FileSets.download_uri_for() do + assert url |> String.ends_with?("file-sets/#{file_set.id}/download") + end + end + + test "download_uri_for/1 for other file (not image, pdf or zip) is null" do + file_set = file_set_fixture(role: %{id: "P", scheme: "FILE_SET_ROLE"}) + assert is_nil(FileSets.download_uri_for(file_set)) + end + + test "derivative_key/1 for a FileSet" do + file_set = file_set_fixture(role: %{id: "X", scheme: "FILE_SET_ROLE"}) + + with key <- FileSets.derivative_key(file_set) do + assert key == "derivatives/#{Pairtree.derivative_path(file_set.id)}" + end + end + + test "derivative_location/1 for a FileSet" do + file_set = file_set_fixture(role: %{id: "X", scheme: "FILE_SET_ROLE"}) + + with url <- FileSets.derivative_location(file_set) do + assert url |> String.starts_with?("s3://#{@pyramid_bucket}/") + assert url |> String.ends_with?(Pairtree.derivative_path(file_set.id)) + end + end + test "representative_image_url_for/1 for a video with a poster" do file_set = file_set_fixture(%{derivatives: %{"poster" => "poster.tiff"}}) diff --git a/app/test/pipeline/actions/create_derivative_copy_test.exs b/app/test/pipeline/actions/create_derivative_copy_test.exs new file mode 100644 index 000000000..bfa7fba42 --- /dev/null +++ b/app/test/pipeline/actions/create_derivative_copy_test.exs @@ -0,0 +1,96 @@ +defmodule Meadow.Pipeline.Actions.CreateDerivativeCopyTest do + use Meadow.S3Case + use Meadow.DataCase + use Meadow.PipelineCase + + alias Meadow.Data.{ActionStates, FileSets} + alias Meadow.Pipeline.Actions.CreateDerivativeCopy + alias Meadow.Utils.Pairtree + + import ExUnit.CaptureLog + + @md5 "85062e8c916f55ae0c514cb0732cfb1f" + @key "copy_file_to_preservation_test/test.tif" + @content "test/fixtures/test.pdf" + @fixture %{bucket: @ingest_bucket, key: @key, content: File.read!(@content)} + @id "7aab17f1-89b4-4716-8421-e2f3f4c161ec" + + setup do + file_set = + file_set_fixture(%{ + id: @id, + accession_number: "123", + role: %{id: "X", scheme: "FILE_SET_ROLE"}, + core_metadata: %{ + digests: %{ + "md5" => @md5 + }, + location: "s3://#{@ingest_bucket}/#{@key}", + mime_type: "application.pdf", + original_filename: "test.pdf" + } + }) + + {:ok, + file_set_id: file_set.id, + derivative_key: "derivatives/#{Pairtree.derivative_path(file_set.id)}"} + end + + describe "success" do + @describetag s3: [@fixture] + test "process/2", %{file_set_id: file_set_id} do + assert( + {:ok, %{id: ^file_set_id}, %{}} = + send_test_message(CreateDerivativeCopy, %{file_set_id: file_set_id}, %{}) + ) + + assert(ActionStates.ok?(file_set_id, CreateDerivativeCopy)) + + file_set = FileSets.get_file_set!(file_set_id) + dest_key = FileSets.derivative_key(file_set) + + assert FileSets.get_file_set(file_set_id) + |> Map.get(:derivatives) + |> Map.get("copy") == "s3://#{@pyramid_bucket}/#{dest_key}" + + assert(object_exists?(@pyramid_bucket, dest_key)) + + on_exit(fn -> + delete_object(@pyramid_bucket, dest_key) + end) + end + end + + describe "skip conditions" do + @describetag s3: [@fixture] + + setup tags do + ExAws.S3.put_object(@pyramid_bucket, tags.derivative_key, @content) + |> ExAws.request!() + + on_exit(fn -> + delete_object(@preservation_bucket, tags.derivative_key) + end) + end + + test "derivative file exists", %{ + file_set_id: file_set_id + } do + file_set = FileSets.get_file_set!(file_set_id) + dest_key = FileSets.derivative_key(file_set) + + log = + capture_log(fn -> + assert( + {:ok, %{id: ^file_set_id}, %{}} = + send_test_message(CreateDerivativeCopy, %{file_set_id: file_set_id}, %{}) + ) + + assert(ActionStates.ok?(file_set_id, CreateDerivativeCopy)) + assert(object_exists?(@pyramid_bucket, dest_key)) + end) + + refute log =~ ~r/foo/ + end + end +end diff --git a/infrastructure/deploy/pipeline.tf b/infrastructure/deploy/pipeline.tf index d0172a2b0..dabc89349 100644 --- a/infrastructure/deploy/pipeline.tf +++ b/infrastructure/deploy/pipeline.tf @@ -1,6 +1,6 @@ locals { actions = ["ingest-file-set", "extract-mime-type", "generate-file-set-digests", - "extract-exif-metadata", "copy-file-to-preservation", "create-pyramid-tiff", + "extract-exif-metadata", "copy-file-to-preservation", "create-derivative-copy", "create-pyramid-tiff", "create-transcode-job", "generate-poster-image", "transcode-complete", "file-set-complete"] } From 442a457636c64b081e110bdfc1bedbd5624666b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 May 2024 11:28:27 +0000 Subject: [PATCH 08/13] Bump @testing-library/react from 15.0.4 to 15.0.6 in /app/assets Bumps [@testing-library/react](https://github.com/testing-library/react-testing-library) from 15.0.4 to 15.0.6. - [Release notes](https://github.com/testing-library/react-testing-library/releases) - [Changelog](https://github.com/testing-library/react-testing-library/blob/main/CHANGELOG.md) - [Commits](https://github.com/testing-library/react-testing-library/compare/v15.0.4...v15.0.6) --- updated-dependencies: - dependency-name: "@testing-library/react" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- app/assets/package-lock.json | 16 +++++++++++----- app/assets/package.json | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/assets/package-lock.json b/app/assets/package-lock.json index 854087ac3..d2a6a03d2 100644 --- a/app/assets/package-lock.json +++ b/app/assets/package-lock.json @@ -7,7 +7,7 @@ "license": "MIT", "dependencies": { "@absinthe/socket-apollo-link": "^0.2.1", - "@apollo/client": "latest", + "@apollo/client": "*", "@apollo/react-hooks": "^4.0.0", "@apollo/react-testing": "^4.0.0", "@appbaseio/reactivesearch": "3.23.1", @@ -76,7 +76,7 @@ "@nulib/prettier-config": "^1.2.0", "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.4.2", - "@testing-library/react": "^15.0.4", + "@testing-library/react": "^15.0.6", "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.12", "@types/react-beautiful-dnd": "^13.1.8", @@ -7446,9 +7446,9 @@ } }, "node_modules/@testing-library/react": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-15.0.4.tgz", - "integrity": "sha512-Fw/LM1emOHKfCxv5R0tz+25TOtiMt0o5Np1zJmb4LbSacOagXQX4ooAaHiJfGUMe+OjUk504BX11W+9Z8CvyZA==", + "version": "15.0.6", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-15.0.6.tgz", + "integrity": "sha512-UlbazRtEpQClFOiYp+1BapMT+xyqWMnE+hh9tn5DQ6gmlE7AIZWcGpzZukmDZuFk3By01oiqOf8lRedLS4k6xQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.12.5", @@ -7459,8 +7459,14 @@ "node": ">=18" }, "peerDependencies": { + "@types/react": "^18.0.0", "react": "^18.0.0", "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/@testing-library/user-event": { diff --git a/app/assets/package.json b/app/assets/package.json index 4b3da1fcb..bf9d4c876 100644 --- a/app/assets/package.json +++ b/app/assets/package.json @@ -86,7 +86,7 @@ "@nulib/prettier-config": "^1.2.0", "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.4.2", - "@testing-library/react": "^15.0.4", + "@testing-library/react": "^15.0.6", "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.12", "@types/react-beautiful-dnd": "^13.1.8", From 3c9077eb067ac035b34701249525449a4234f529 Mon Sep 17 00:00:00 2001 From: "Michael B. Klein" Date: Thu, 2 May 2024 17:25:34 +0000 Subject: [PATCH 09/13] Update Authoritex to v1.1.0 --- app/mix.exs | 2 +- app/mix.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/mix.exs b/app/mix.exs index 42d2ef2f1..e1f18f16b 100644 --- a/app/mix.exs +++ b/app/mix.exs @@ -53,7 +53,7 @@ defmodule Meadow.MixProject do {:absinthe_phoenix, "~> 2.0.0"}, {:assertions, "~> 0.19.0", only: :test}, {:atomic_map, "~> 0.8"}, - {:authoritex, "~> 1.0.2"}, + {:authoritex, "~> 1.1.0"}, {:aws_signature, "~> 0.3.1"}, {:briefly, "~> 0.5.0"}, {:broadway_dashboard, "~> 0.3.0"}, diff --git a/app/mix.lock b/app/mix.lock index 0fd7da53e..74e0b4ad3 100644 --- a/app/mix.lock +++ b/app/mix.lock @@ -4,7 +4,7 @@ "absinthe_plug": {:hex, :absinthe_plug, "1.5.8", "38d230641ba9dca8f72f1fed2dfc8abd53b3907d1996363da32434ab6ee5d6ab", [:mix], [{:absinthe, "~> 1.5", [hex: :absinthe, repo: "hexpm", optional: false]}, {:plug, "~> 1.4", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "bbb04176647b735828861e7b2705465e53e2cf54ccf5a73ddd1ebd855f996e5a"}, "assertions": {:hex, :assertions, "0.19.0", "f177fcc22b55df6a41a58b151e430d189d0a1083dae3240522503dedaf8e1174", [:mix], [], "hexpm", "759bdbf977fe3e2d2b79f8a65d8674f29ac757781136a6cb4adf88f1574af1d8"}, "atomic_map": {:hex, :atomic_map, "0.9.3", "3c7f1302e0590164732d08ca999708efbb2cd768abf2911cf140280ce2dc499d", [:mix], [], "hexpm", "c237babf301bd2435bd85b96cffc973022b4cbb7721537059ee0dd3bb74938d2"}, - "authoritex": {:hex, :authoritex, "1.0.3", "0380267dea5b3394c9556da17ca1ae8ee2653a9a1fa5f5917f8090dc84679054", [:mix], [{:httpoison, "~> 1.8.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:httpoison_retry, "~> 1.1.0", [hex: :httpoison_retry, repo: "hexpm", optional: false]}, {:jason, "~> 1.4.0", [hex: :jason, repo: "hexpm", optional: false]}, {:sweet_xml, "~> 0.6", [hex: :sweet_xml, repo: "hexpm", optional: false]}], "hexpm", "16035bb15b3bc1827147f7d94568bbbd54e3fd84d75a6cfd57349f336e136ed3"}, + "authoritex": {:hex, :authoritex, "1.1.0", "8113b79ac3f5296c3c5f9ff5d0601c06a2d5ebcae19c61ec37029ace90b13117", [:mix], [{:httpoison, "~> 1.8.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:httpoison_retry, "~> 1.1.0", [hex: :httpoison_retry, repo: "hexpm", optional: false]}, {:jason, "~> 1.4.0", [hex: :jason, repo: "hexpm", optional: false]}, {:sweet_xml, "~> 0.6", [hex: :sweet_xml, repo: "hexpm", optional: false]}], "hexpm", "d209febb112dfa86ae0dc7e1c70c9efaa1bdafe4f537f78a97bdb8fd800ced54"}, "aws_signature": {:hex, :aws_signature, "0.3.2", "adf33bc4af00b2089b7708bf20e3246f09c639a905a619b3689f0a0a22c3ef8f", [:rebar3], [], "hexpm", "b0daf61feb4250a8ab0adea60db3e336af732ff71dd3fb22e45ae3dcbd071e44"}, "base64url": {:hex, :base64url, "0.0.1", "36a90125f5948e3afd7be97662a1504b934dd5dac78451ca6e9abf85a10286be", [:rebar], [], "hexpm", "fab09b20e3f5db886725544cbcf875b8e73ec93363954eb8a1a9ed834aa8c1f9"}, "briefly": {:hex, :briefly, "0.5.1", "ee10d48da7f79ed2aebdc3e536d5f9a0c3e36ff76c0ad0d4254653a152b13a8a", [:mix], [], "hexpm", "bd684aa92ad8b7b4e0d92c31200993c4bc1469fc68cd6d5f15144041bd15cb57"}, @@ -60,7 +60,7 @@ "logger_file_backend": {:hex, :logger_file_backend, "0.0.14", "774bb661f1c3fed51b624d2859180c01e386eb1273dc22de4f4a155ef749a602", [:mix], [], "hexpm", "071354a18196468f3904ef09413af20971d55164267427f6257b52cfba03f9e6"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, "mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"}, - "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, + "mimerl": {:hex, :mimerl, "1.3.0", "d0cd9fc04b9061f82490f6581e0128379830e78535e017f7780f37fea7545726", [:rebar3], [], "hexpm", "a1e15a50d1887217de95f0b9b0793e32853f7c258a5cd227650889b38839fe9d"}, "mox": {:hex, :mox, "1.1.0", "0f5e399649ce9ab7602f72e718305c0f9cdc351190f72844599545e4996af73c", [:mix], [], "hexpm", "d44474c50be02d5b72131070281a5d3895c0e7a95c780e90bc0cfe712f633a13"}, "nimble_csv": {:hex, :nimble_csv, "1.2.0", "4e26385d260c61eba9d4412c71cea34421f296d5353f914afe3f2e71cce97722", [:mix], [], "hexpm", "d0628117fcc2148178b034044c55359b26966c6eaa8e2ce15777be3bbc91b12a"}, "nimble_options": {:hex, :nimble_options, "1.0.2", "92098a74df0072ff37d0c12ace58574d26880e522c22801437151a159392270e", [:mix], [], "hexpm", "fd12a8db2021036ce12a309f26f564ec367373265b53e25403f0ee697380f1b8"}, From e07916111e82cfb77f03f6b6735fe1cb14ecd6b2 Mon Sep 17 00:00:00 2001 From: Karen Shaw Date: Thu, 2 May 2024 18:21:58 +0000 Subject: [PATCH 10/13] Remove email from aux file download call --- .../js/components/Work/Fileset/ActionButtons/Auxillary.jsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/assets/js/components/Work/Fileset/ActionButtons/Auxillary.jsx b/app/assets/js/components/Work/Fileset/ActionButtons/Auxillary.jsx index 4acbaeb58..5a8b7203a 100644 --- a/app/assets/js/components/Work/Fileset/ActionButtons/Auxillary.jsx +++ b/app/assets/js/components/Work/Fileset/ActionButtons/Auxillary.jsx @@ -8,7 +8,6 @@ import { Button } from "@nulib/design-system"; import { IconDownload } from "@js/components/Icon"; import { toastWrapper } from "@js/services/helpers"; import { useWorkState } from "@js/context/work-context"; -import { AuthContext } from "@js/components/Auth/Auth"; import { GET_DCAPI_ENDPOINT } from "@js/components/UI/ui.gql"; import { getApiResponse } from "@js/services/get-api-response"; import { useQuery } from "@apollo/client"; @@ -18,12 +17,11 @@ const WorkFilesetActionButtonsAuxiliary = ({ fileSet }) => { const url = `${iiifServerUrl}${fileSet.id}${IIIF_SIZES.IIIF_FULL}`; const { altFileFormat, isImage, isAltFormat } = useFileSet(); const { dcApiToken } = useWorkState(); - const currentUser = useContext(AuthContext); const { data: dataDcApiEndpoint } = useQuery(GET_DCAPI_ENDPOINT); const handleDownloadFile = async () => { const dcApiFileSet = `${dataDcApiEndpoint?.dcapiEndpoint?.url}/file-sets/${fileSet.id}`; - const uri = `${dcApiFileSet}/download?email=${currentUser?.email}`; + const uri = `${dcApiFileSet}/download`; try { const response = await getApiResponse(uri, dcApiToken); From d1ea75f1d1286ba33c9bfdac788acbaa4901a0ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Apr 2024 11:22:27 +0000 Subject: [PATCH 11/13] Bump react from 18.2.0 to 18.3.1 in /app/assets Bumps [react](https://github.com/facebook/react/tree/HEAD/packages/react) from 18.2.0 to 18.3.1. - [Release notes](https://github.com/facebook/react/releases) - [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md) - [Commits](https://github.com/facebook/react/commits/v18.3.1/packages/react) --- updated-dependencies: - dependency-name: react dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- app/assets/package-lock.json | 10 +++++----- app/assets/package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/assets/package-lock.json b/app/assets/package-lock.json index 898346789..5f629a9d2 100644 --- a/app/assets/package-lock.json +++ b/app/assets/package-lock.json @@ -7,7 +7,7 @@ "license": "MIT", "dependencies": { "@absinthe/socket-apollo-link": "^0.2.1", - "@apollo/client": "*", + "@apollo/client": "latest", "@apollo/react-hooks": "^4.0.0", "@apollo/react-testing": "^4.0.0", "@appbaseio/reactivesearch": "3.23.1", @@ -95,7 +95,7 @@ "lodash.isundefined": "3.0.1", "node-fetch": "^2.6.1", "prettier": "^3.2.5", - "react": "^18.2.0", + "react": "^18.3.1", "react-dom": "^18.3.1", "react-router-dom": "^5.3.0", "react-router-prop-types": "^1.0.5", @@ -18887,9 +18887,9 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dependencies": { "loose-envify": "^1.1.0" }, diff --git a/app/assets/package.json b/app/assets/package.json index c74767ca4..fa4526fe0 100644 --- a/app/assets/package.json +++ b/app/assets/package.json @@ -105,7 +105,7 @@ "lodash.isundefined": "3.0.1", "node-fetch": "^2.6.1", "prettier": "^3.2.5", - "react": "^18.2.0", + "react": "^18.3.1", "react-dom": "^18.3.1", "react-router-dom": "^5.3.0", "react-router-prop-types": "^1.0.5", From 36511ed4b7eb20410f161a9202af9526af386171 Mon Sep 17 00:00:00 2001 From: Karen Shaw Date: Fri, 3 May 2024 15:38:53 +0000 Subject: [PATCH 12/13] Bump version to 9.3.3 --- app/mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/mix.exs b/app/mix.exs index e1f18f16b..ebe1812fc 100644 --- a/app/mix.exs +++ b/app/mix.exs @@ -3,7 +3,7 @@ Code.require_file("lib/env.ex") defmodule Meadow.MixProject do use Mix.Project - @app_version "9.2.4" + @app_version "9.3.3" def project do [ From 984cfb3c9ec1a5d3c12c30268b03817679f3aec6 Mon Sep 17 00:00:00 2001 From: Karen Shaw Date: Fri, 3 May 2024 15:59:10 +0000 Subject: [PATCH 13/13] Update terraform rds version to 11.22 --- infrastructure/deploy/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infrastructure/deploy/main.tf b/infrastructure/deploy/main.tf index 9ccc3cec2..3ce580005 100644 --- a/infrastructure/deploy/main.tf +++ b/infrastructure/deploy/main.tf @@ -20,7 +20,7 @@ module "rds" { allocated_storage = var.db_size backup_window = "04:00-05:00" engine = "postgres" - engine_version = "11.19" + engine_version = "11.22" final_snapshot_identifier_prefix = "meadow-final" identifier = "${var.stack_name}-db" instance_class = "db.t3.medium"