diff --git a/.github/workflows/deploy-documentation.yml b/.github/workflows/deploy-documentation.yml index ef4f7d2b7..d1816bddd 100644 --- a/.github/workflows/deploy-documentation.yml +++ b/.github/workflows/deploy-documentation.yml @@ -38,7 +38,7 @@ jobs: run: npm install && npm run docs:build - name: Deploy Vuepress to Github Pages - uses: crazy-max/ghaction-github-pages@fbf0a4fa4e00f45accd6cf3232368436ec06ed59 # v4.0.0 + uses: crazy-max/ghaction-github-pages@df5cc2bfa78282ded844b354faee141f06b41865 # v4.0.0 with: target_branch: gh-pages build_dir: .vuepress/dist diff --git a/.github/workflows/docker-push.yml b/.github/workflows/docker-push.yml index 93dc45bd3..406d8304b 100644 --- a/.github/workflows/docker-push.yml +++ b/.github/workflows/docker-push.yml @@ -59,16 +59,16 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7 - name: Log in to the Container registry - uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 + uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@70b2cdc6480c1a8b86edf1777157f8f437de2166 + uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | @@ -81,7 +81,7 @@ jobs: type=sha - name: Build and push Docker images id: push - uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 + uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 with: context: ${{ matrix.app.context }} target: ${{ matrix.app.target }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 29d936d2d..b66413f22 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -64,7 +64,7 @@ jobs: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV #- name: Repository Dispatch - # uses: peter-evans/repository-dispatch@b0b38f73c8333be75d585a92b2c630a10d2a78f5 # v3.0.0 + # uses: peter-evans/repository-dispatch@7d980a9b9f8ecf8955ea90507b3ed89122f53215 # v3.0.0 # with: # token: ${{ github.token }} # event-type: trigger-ocelot-build-success @@ -72,7 +72,7 @@ jobs: # client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "VERSION": "${VERSION}", "BUILD_DATE": "${BUILD_DATE}", "BUILD_COMMIT": "${BUILD_COMMIT}", "BUILD_VERSION": "${BUILD_VERSION}"}' - name: Repository Dispatch stage.ocelot.social - uses: peter-evans/repository-dispatch@b0b38f73c8333be75d585a92b2c630a10d2a78f5 # v3.0.0 + uses: peter-evans/repository-dispatch@7d980a9b9f8ecf8955ea90507b3ed89122f53215 # v3.0.0 with: token: ${{ secrets.OCELOT_PUBLISH_EVENT_PAT }} # this token is required to access the other repository event-type: trigger-ocelot-build-success @@ -80,7 +80,7 @@ jobs: client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "GITHUB_RUN_NUMBER": "${{ env.GITHUB_RUN_NUMBER }}", "VERSION": "${VERSION}", "BUILD_DATE": "${BUILD_DATE}", "BUILD_COMMIT": "${BUILD_COMMIT}", "BUILD_VERSION": "${BUILD_VERSION}"}' - name: Repository Dispatch stage.yunite.me - uses: peter-evans/repository-dispatch@b0b38f73c8333be75d585a92b2c630a10d2a78f5 # v3.0.0 + uses: peter-evans/repository-dispatch@7d980a9b9f8ecf8955ea90507b3ed89122f53215 # v3.0.0 with: token: ${{ secrets.OCELOT_PUBLISH_EVENT_PAT }} # this token is required to access the other repository event-type: trigger-ocelot-build-success diff --git a/.github/workflows/test-backend.yml b/.github/workflows/test-backend.yml index ba0bb3c74..766717a97 100644 --- a/.github/workflows/test-backend.yml +++ b/.github/workflows/test-backend.yml @@ -37,7 +37,7 @@ jobs: - name: Cache docker images id: cache-neo4j - uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4.0.2 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2 with: path: /tmp/neo4j.tar key: ${{ github.run_id }}-backend-neo4j-cache @@ -58,7 +58,7 @@ jobs: - name: Cache docker images id: cache-backend - uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4.0.2 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2 with: path: /tmp/backend.tar key: ${{ github.run_id }}-backend-cache @@ -87,14 +87,14 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7 - name: Restore Neo4J cache - uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4.0.2 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2 with: path: /tmp/neo4j.tar key: ${{ github.run_id }}-backend-neo4j-cache fail-on-cache-miss: true - name: Restore Backend cache - uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4.0.2 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2 with: path: /tmp/backend.tar key: ${{ github.run_id }}-backend-cache diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 8088b9c19..8e3570d95 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -37,7 +37,7 @@ jobs: - name: Cache docker images id: cache - uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4.0.2 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2 with: path: | /opt/cucumber-json-formatter @@ -59,7 +59,7 @@ jobs: job: [1, 2, 3, 4, 5, 6, 7, 8] steps: - name: Restore cache - uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4.0.2 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2 id: cache with: path: | diff --git a/.github/workflows/test-webapp.yml b/.github/workflows/test-webapp.yml index 21473f3fe..937153060 100644 --- a/.github/workflows/test-webapp.yml +++ b/.github/workflows/test-webapp.yml @@ -50,7 +50,7 @@ jobs: docker save "ocelotsocialnetwork/webapp:test" > /tmp/webapp.tar - name: Cache docker image - uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4.0.2 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2 with: path: /tmp/webapp.tar key: ${{ github.run_id }}-webapp-cache @@ -79,7 +79,7 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7 - name: Restore webapp cache - uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4.0.2 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2 with: path: /tmp/webapp.tar key: ${{ github.run_id }}-webapp-cache diff --git a/.gitignore b/.gitignore index 25c7b3134..d9d081e31 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ node_modules/ cypress/videos cypress/screenshots/ cypress.env.json +deployment/configurations/ .vuepress/.cache/ .vuepress/.temp/ diff --git a/backend/package.json b/backend/package.json index 12ed9ce20..9c52815a1 100644 --- a/backend/package.json +++ b/backend/package.json @@ -23,8 +23,8 @@ "db:migrate:create": "yarn run __migrate --template-file ./src/db/migrate/template.ts --date-format 'yyyymmddHHmmss' create" }, "dependencies": { - "@babel/cli": "~7.26.4", - "@babel/core": "^7.26.9", + "@babel/cli": "~7.27.0", + "@babel/core": "^7.26.10", "@babel/node": "~7.26.0", "@babel/plugin-proposal-throw-expressions": "^7.25.9", "@babel/preset-env": "~7.26.9", @@ -53,7 +53,7 @@ "graphql-redis-subscriptions": "^2.7.0", "graphql-shield": "~7.2.2", "graphql-tag": "~2.10.3", - "helmet": "~8.0.0", + "helmet": "~8.1.0", "ioredis": "^4.16.1", "jsonwebtoken": "~8.5.1", "languagedetect": "^2.0.0", @@ -61,20 +61,20 @@ "linkifyjs": "^4.2.0", "lodash": "~4.17.21", "merge-graphql-schemas": "^1.7.8", - "metascraper": "^5.46.7", - "metascraper-author": "^5.46.5", - "metascraper-date": "^5.46.5", - "metascraper-description": "^5.46.5", - "metascraper-image": "^5.46.5", - "metascraper-lang": "^5.46.5", + "metascraper": "^5.46.11", + "metascraper-author": "^5.46.11", + "metascraper-date": "^5.46.11", + "metascraper-description": "^5.46.11", + "metascraper-image": "^5.46.11", + "metascraper-lang": "^5.46.11", "metascraper-lang-detector": "^4.10.2", - "metascraper-logo": "^5.46.5", - "metascraper-publisher": "^5.46.5", + "metascraper-logo": "^5.46.11", + "metascraper-publisher": "^5.46.11", "metascraper-soundcloud": "^5.34.4", - "metascraper-title": "^5.46.5", - "metascraper-url": "^5.46.5", - "metascraper-video": "^5.46.5", - "metascraper-youtube": "^5.46.5", + "metascraper-title": "^5.46.11", + "metascraper-url": "^5.46.11", + "metascraper-video": "^5.46.11", + "metascraper-youtube": "^5.46.11", "migrate": "^2.1.0", "mime-types": "^2.1.35", "minimatch": "^9.0.4", @@ -86,25 +86,25 @@ "nodemailer": "^6.10.0", "nodemailer-html-to-text": "^3.2.0", "request": "~2.88.2", - "sanitize-html": "~2.14.0", + "sanitize-html": "~2.15.0", "slug": "~9.1.0", "subscriptions-transport-ws": "^0.9.19", "trunc-html": "~1.1.2", "uuid": "~9.0.1", - "validator": "^13.12.0", + "validator": "^13.15.0", "xregexp": "^5.1.2" }, "devDependencies": { - "@faker-js/faker": "9.5.0", + "@faker-js/faker": "9.6.0", "@types/jest": "^29.5.14", - "@types/node": "^22.13.5", + "@types/node": "^22.14.0", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "apollo-server-testing": "~2.11.0", "eslint": "^8.57.1", "eslint-config-prettier": "^10.1.1", "eslint-config-standard": "^17.1.0", - "eslint-import-resolver-typescript": "^3.8.3", + "eslint-import-resolver-typescript": "^4.3.1", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^28.11.0", "eslint-plugin-n": "^16.6.2", @@ -113,11 +113,11 @@ "eslint-plugin-security": "^3.0.1", "jest": "^29.7.0", "nodemon": "~3.1.9", - "prettier": "^3.5.2", + "prettier": "^3.5.3", "rosie": "^2.1.1", - "ts-jest": "^29.2.5", + "ts-jest": "^29.3.1", "ts-node": "^10.9.2", - "typescript": "^5.7.3" + "typescript": "^5.8.3" }, "resolutions": { "**/**/fs-capacitor": "^6.2.0", diff --git a/backend/src/middleware/notifications/notificationsMiddleware.spec.ts b/backend/src/middleware/notifications/notificationsMiddleware.spec.ts index 8b3123458..50d655484 100644 --- a/backend/src/middleware/notifications/notificationsMiddleware.spec.ts +++ b/backend/src/middleware/notifications/notificationsMiddleware.spec.ts @@ -255,7 +255,6 @@ describe('notifications', () => { }) it('sends me no notification', async () => { - await notifiedUser.relateTo(commentAuthor, 'blocked') await createCommentOnPostAction() const expected = expect.objectContaining({ data: { notifications: [] }, diff --git a/backend/src/middleware/notifications/notificationsMiddleware.ts b/backend/src/middleware/notifications/notificationsMiddleware.ts index 29eff6cf3..7ecbf8181 100644 --- a/backend/src/middleware/notifications/notificationsMiddleware.ts +++ b/backend/src/middleware/notifications/notificationsMiddleware.ts @@ -109,13 +109,19 @@ const handleContentDataOfPost = async (resolve, root, args, context, resolveInfo const handleContentDataOfComment = async (resolve, root, args, context, resolveInfo) => { const { content } = args - let idsOfUsers = extractMentionedUsers(content) + let idsOfMentionedUsers = extractMentionedUsers(content) const comment = await resolve(root, args, context, resolveInfo) const [postAuthor] = await postAuthorOfComment(comment.id, { context }) - idsOfUsers = idsOfUsers.filter((id) => id !== postAuthor.id) + idsOfMentionedUsers = idsOfMentionedUsers.filter((id) => id !== postAuthor.id) await publishNotifications(context, [ - notifyUsersOfMention('Comment', comment.id, idsOfUsers, 'mentioned_in_comment', context), - notifyUsersOfComment('Comment', comment.id, postAuthor.id, 'commented_on_post', context), + notifyUsersOfMention( + 'Comment', + comment.id, + idsOfMentionedUsers, + 'mentioned_in_comment', + context, + ), + notifyUsersOfComment('Comment', comment.id, 'commented_on_post', context), ]) return comment } @@ -270,29 +276,34 @@ const notifyUsersOfMention = async (label, id, idsOfUsers, reason, context) => { } } -const notifyUsersOfComment = async (label, commentId, postAuthorId, reason, context) => { - if (context.user.id === postAuthorId) return [] +const notifyUsersOfComment = async (label, commentId, reason, context) => { await validateNotifyUsers(label, reason) const session = context.driver.session() const writeTxResultPromise = await session.writeTransaction(async (transaction) => { const notificationTransactionResponse = await transaction.run( ` - MATCH (postAuthor:User {id: $postAuthorId})-[:WROTE]->(post:Post)<-[:COMMENTS]-(comment:Comment { id: $commentId })<-[:WROTE]-(commenter:User) - WHERE NOT (postAuthor)-[:BLOCKED]-(commenter) - MERGE (comment)-[notification:NOTIFIED {reason: $reason}]->(postAuthor) + MATCH (observingUser:User)-[:OBSERVES { active: true }]->(post:Post)<-[:COMMENTS]-(comment:Comment { id: $commentId })<-[:WROTE]-(commenter:User) + WHERE NOT (observingUser)-[:BLOCKED]-(commenter) AND NOT observingUser.id = $userId + WITH observingUser, post, comment, commenter + MATCH (postAuthor:User)-[:WROTE]->(post) + MERGE (comment)-[notification:NOTIFIED {reason: $reason}]->(observingUser) SET notification.read = FALSE SET notification.createdAt = COALESCE(notification.createdAt, toString(datetime())) SET notification.updatedAt = toString(datetime()) - WITH notification, postAuthor, post, commenter, + WITH notification, observingUser, post, commenter, postAuthor, comment {.*, __typename: labels(comment)[0], author: properties(commenter), post: post {.*, author: properties(postAuthor) } } AS finalResource RETURN notification { .*, from: finalResource, - to: properties(postAuthor), + to: properties(observingUser), relatedUser: properties(commenter) } `, - { commentId, postAuthorId, reason }, + { + commentId, + reason, + userId: context.user.id, + }, ) return notificationTransactionResponse.records.map((record) => record.get('notification')) }) diff --git a/backend/src/middleware/notifications/observing-posts.spec.ts b/backend/src/middleware/notifications/observing-posts.spec.ts new file mode 100644 index 000000000..13b971ed8 --- /dev/null +++ b/backend/src/middleware/notifications/observing-posts.spec.ts @@ -0,0 +1,377 @@ +import gql from 'graphql-tag' +import { cleanDatabase } from '../../db/factories' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' +import { createTestClient } from 'apollo-server-testing' + +import CONFIG from '../../config' + +CONFIG.CATEGORIES_ACTIVE = false + +let server, query, mutate, authenticatedUser + +let postAuthor, firstCommenter, secondCommenter + +const driver = getDriver() +const neode = getNeode() + +const createPostMutation = gql` + mutation ($id: ID, $title: String!, $content: String!) { + CreatePost(id: $id, title: $title, content: $content) { + id + title + content + } + } +` + +const createCommentMutation = gql` + mutation ($id: ID, $postId: ID!, $content: String!) { + CreateComment(id: $id, postId: $postId, content: $content) { + id + content + } + } +` + +const notificationQuery = gql` + query ($read: Boolean) { + notifications(read: $read, orderBy: updatedAt_desc) { + read + reason + createdAt + relatedUser { + id + } + from { + __typename + ... on Post { + id + content + } + ... on Comment { + id + content + } + ... on Group { + id + } + } + } + } +` + +const toggleObservePostMutation = gql` + mutation ($id: ID!, $value: Boolean!) { + toggleObservePost(id: $id, value: $value) { + isObservedByMe + observingUsersCount + } + } +` + +beforeAll(async () => { + await cleanDatabase() + + const createServerResult = createServer({ + context: () => { + return { + user: authenticatedUser, + neode, + driver, + cypherParams: { + currentUserId: authenticatedUser ? authenticatedUser.id : null, + }, + } + }, + }) + server = createServerResult.server + const createTestClientResult = createTestClient(server) + query = createTestClientResult.query + mutate = createTestClientResult.mutate +}) + +afterAll(async () => { + await cleanDatabase() + driver.close() +}) + +describe('notifications for users that observe a post', () => { + beforeAll(async () => { + postAuthor = await neode.create( + 'User', + { + id: 'post-author', + name: 'Post Author', + slug: 'post-author', + }, + { + email: 'test@example.org', + password: '1234', + }, + ) + firstCommenter = await neode.create( + 'User', + { + id: 'first-commenter', + name: 'First Commenter', + slug: 'first-commenter', + }, + { + email: 'test2@example.org', + password: '1234', + }, + ) + secondCommenter = await neode.create( + 'User', + { + id: 'second-commenter', + name: 'Second Commenter', + slug: 'second-commenter', + }, + { + email: 'test3@example.org', + password: '1234', + }, + ) + authenticatedUser = await postAuthor.toJson() + await mutate({ + mutation: createPostMutation, + variables: { + id: 'post', + title: 'This is the post', + content: 'This is the content of the post', + }, + }) + }) + + describe('first comment on the post', () => { + beforeAll(async () => { + authenticatedUser = await firstCommenter.toJson() + await mutate({ + mutation: createCommentMutation, + variables: { + postId: 'post', + id: 'c-1', + content: 'first comment of first commenter', + }, + }) + }) + + it('sends NO notification to the commenter', async () => { + await expect( + query({ + query: notificationQuery, + }), + ).resolves.toMatchObject({ + data: { + notifications: [], + }, + errors: undefined, + }) + }) + + it('sends notification to the author', async () => { + authenticatedUser = await postAuthor.toJson() + await expect( + query({ + query: notificationQuery, + }), + ).resolves.toMatchObject({ + data: { + notifications: [ + { + from: { + __typename: 'Comment', + id: 'c-1', + }, + read: false, + reason: 'commented_on_post', + }, + ], + }, + errors: undefined, + }) + }) + + describe('second comment on post', () => { + beforeAll(async () => { + authenticatedUser = await secondCommenter.toJson() + await mutate({ + mutation: createCommentMutation, + variables: { + postId: 'post', + id: 'c-2', + content: 'first comment of second commenter', + }, + }) + }) + + it('sends NO notification to the commenter', async () => { + await expect( + query({ + query: notificationQuery, + }), + ).resolves.toMatchObject({ + data: { + notifications: [], + }, + errors: undefined, + }) + }) + + it('sends notification to the author', async () => { + authenticatedUser = await postAuthor.toJson() + await expect( + query({ + query: notificationQuery, + }), + ).resolves.toMatchObject({ + data: { + notifications: [ + { + from: { + __typename: 'Comment', + id: 'c-2', + }, + read: false, + reason: 'commented_on_post', + }, + { + from: { + __typename: 'Comment', + id: 'c-1', + }, + read: false, + reason: 'commented_on_post', + }, + ], + }, + errors: undefined, + }) + }) + + it('sends notification to first commenter', async () => { + authenticatedUser = await firstCommenter.toJson() + await expect( + query({ + query: notificationQuery, + }), + ).resolves.toMatchObject({ + data: { + notifications: [ + { + from: { + __typename: 'Comment', + id: 'c-2', + }, + read: false, + reason: 'commented_on_post', + }, + ], + }, + errors: undefined, + }) + }) + }) + + describe('first commenter unfollows the post and post author comments post', () => { + beforeAll(async () => { + authenticatedUser = await firstCommenter.toJson() + await mutate({ + mutation: toggleObservePostMutation, + variables: { + id: 'post', + value: false, + }, + }) + + authenticatedUser = await postAuthor.toJson() + await mutate({ + mutation: createCommentMutation, + variables: { + postId: 'post', + id: 'c-3', + content: 'first comment of post author', + }, + }) + }) + + it('sends no new notification to the post author', async () => { + await expect( + query({ + query: notificationQuery, + }), + ).resolves.toMatchObject({ + data: { + notifications: [ + { + from: { + __typename: 'Comment', + id: 'c-2', + }, + read: false, + reason: 'commented_on_post', + }, + { + from: { + __typename: 'Comment', + id: 'c-1', + }, + read: false, + reason: 'commented_on_post', + }, + ], + }, + errors: undefined, + }) + }) + + it('sends no new notification to first commenter', async () => { + authenticatedUser = await firstCommenter.toJson() + await expect( + query({ + query: notificationQuery, + }), + ).resolves.toMatchObject({ + data: { + notifications: [ + { + from: { + __typename: 'Comment', + id: 'c-2', + }, + read: false, + reason: 'commented_on_post', + }, + ], + }, + errors: undefined, + }) + }) + + it('sends notification to second commenter', async () => { + authenticatedUser = await secondCommenter.toJson() + await expect( + query({ + query: notificationQuery, + }), + ).resolves.toMatchObject({ + data: { + notifications: [ + { + from: { + __typename: 'Comment', + id: 'c-3', + }, + read: false, + reason: 'commented_on_post', + }, + ], + }, + errors: undefined, + }) + }) + }) + }) +}) diff --git a/backend/yarn.lock b/backend/yarn.lock index 45abd673e..ab611aea5 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -53,21 +53,21 @@ dependencies: xss "^1.0.6" -"@asamuzakjp/css-color@^2.8.2": - version "2.8.3" - resolved "https://registry.yarnpkg.com/@asamuzakjp/css-color/-/css-color-2.8.3.tgz#665f0f5e8edb95d8f543847529e30fe5cc437ef7" - integrity sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw== +"@asamuzakjp/css-color@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@asamuzakjp/css-color/-/css-color-3.1.1.tgz#41a612834dafd9353b89855b37baa8a03fb67bf2" + integrity sha512-hpRD68SV2OMcZCsrbdkccTw5FXjNDLo5OuqSHyHZfwweGsDWZwDJ2+gONyNAbazZclobMirACLw0lk8WVxIqxA== dependencies: - "@csstools/css-calc" "^2.1.1" - "@csstools/css-color-parser" "^3.0.7" + "@csstools/css-calc" "^2.1.2" + "@csstools/css-color-parser" "^3.0.8" "@csstools/css-parser-algorithms" "^3.0.4" "@csstools/css-tokenizer" "^3.0.3" lru-cache "^10.4.3" -"@babel/cli@~7.26.4": - version "7.26.4" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.26.4.tgz#4101ff8ee5de8447a6c395397a97921056411d20" - integrity sha512-+mORf3ezU3p3qr+82WvJSnQNE1GAYeoCfEv4fik6B5/2cvKZ75AX8oawWQdXtM9MmndooQj15Jr9kelRFWsuRw== +"@babel/cli@~7.27.0": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.27.0.tgz#076603b25fc7dd88298ea94ab249c8237c7e71cc" + integrity sha512-bZfxn8DRxwiVzDO5CEeV+7IqXeCkzI4yYnrQbpwjT76CUyossQc6RYE7n+xfm0/2k40lPaCpW0FhxYs7EBAetw== dependencies: "@jridgewell/trace-mapping" "^0.3.25" commander "^6.2.0" @@ -94,34 +94,34 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.8.tgz#821c1d35641c355284d4a870b8a4a7b0c141e367" integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9", "@babel/core@^7.26.9": - version "7.26.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.9.tgz#71838542a4b1e49dfed353d7acbc6eb89f4a76f2" - integrity sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw== +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9", "@babel/core@^7.26.10": + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.10.tgz#5c876f83c8c4dcb233ee4b670c0606f2ac3000f9" + integrity sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.9" + "@babel/generator" "^7.26.10" "@babel/helper-compilation-targets" "^7.26.5" "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.9" - "@babel/parser" "^7.26.9" + "@babel/helpers" "^7.26.10" + "@babel/parser" "^7.26.10" "@babel/template" "^7.26.9" - "@babel/traverse" "^7.26.9" - "@babel/types" "^7.26.9" + "@babel/traverse" "^7.26.10" + "@babel/types" "^7.26.10" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.26.9", "@babel/generator@^7.7.2": - version "7.26.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.9.tgz#75a9482ad3d0cc7188a537aa4910bc59db67cbca" - integrity sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg== +"@babel/generator@^7.26.10", "@babel/generator@^7.27.0", "@babel/generator@^7.7.2": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.0.tgz#764382b5392e5b9aff93cadb190d0745866cbc2c" + integrity sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw== dependencies: - "@babel/parser" "^7.26.9" - "@babel/types" "^7.26.9" + "@babel/parser" "^7.27.0" + "@babel/types" "^7.27.0" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -291,13 +291,13 @@ "@babel/traverse" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/helpers@^7.26.9": - version "7.26.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.9.tgz#28f3fb45252fc88ef2dc547c8a911c255fc9fef6" - integrity sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA== +"@babel/helpers@^7.26.10": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.0.tgz#53d156098defa8243eab0f32fa17589075a1b808" + integrity sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg== dependencies: - "@babel/template" "^7.26.9" - "@babel/types" "^7.26.9" + "@babel/template" "^7.27.0" + "@babel/types" "^7.27.0" "@babel/node@~7.26.0": version "7.26.0" @@ -311,12 +311,12 @@ regenerator-runtime "^0.14.0" v8flags "^3.1.1" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.26.9", "@babel/parser@^7.7.0": - version "7.26.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.9.tgz#d9e78bee6dc80f9efd8f2349dcfbbcdace280fd5" - integrity sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.26.10", "@babel/parser@^7.27.0", "@babel/parser@^7.7.0": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.0.tgz#3d7d6ee268e41d2600091cbd4e145ffee85a44ec" + integrity sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg== dependencies: - "@babel/types" "^7.26.9" + "@babel/types" "^7.27.0" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": version "7.25.9" @@ -999,32 +999,32 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.25.9", "@babel/template@^7.26.9", "@babel/template@^7.3.3": - version "7.26.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.26.9.tgz#4577ad3ddf43d194528cff4e1fa6b232fa609bb2" - integrity sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA== +"@babel/template@^7.25.9", "@babel/template@^7.26.9", "@babel/template@^7.27.0", "@babel/template@^7.3.3": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.0.tgz#b253e5406cc1df1c57dcd18f11760c2dbf40c0b4" + integrity sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA== dependencies: "@babel/code-frame" "^7.26.2" - "@babel/parser" "^7.26.9" - "@babel/types" "^7.26.9" + "@babel/parser" "^7.27.0" + "@babel/types" "^7.27.0" -"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.8", "@babel/traverse@^7.26.9", "@babel/traverse@^7.7.0": - version "7.26.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.9.tgz#4398f2394ba66d05d988b2ad13c219a2c857461a" - integrity sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg== +"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.10", "@babel/traverse@^7.26.8", "@babel/traverse@^7.7.0": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.0.tgz#11d7e644779e166c0442f9a07274d02cd91d4a70" + integrity sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA== dependencies: "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.9" - "@babel/parser" "^7.26.9" - "@babel/template" "^7.26.9" - "@babel/types" "^7.26.9" + "@babel/generator" "^7.27.0" + "@babel/parser" "^7.27.0" + "@babel/template" "^7.27.0" + "@babel/types" "^7.27.0" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.25.9", "@babel/types@^7.26.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.26.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.9.tgz#08b43dec79ee8e682c2ac631c010bdcac54a21ce" - integrity sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.25.9", "@babel/types@^7.26.10", "@babel/types@^7.27.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.0.tgz#ef9acb6b06c3173f6632d993ecb6d4ae470b4559" + integrity sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -1046,12 +1046,12 @@ resolved "https://registry.yarnpkg.com/@csstools/color-helpers/-/color-helpers-5.0.2.tgz#82592c9a7c2b83c293d9161894e2a6471feb97b8" integrity sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA== -"@csstools/css-calc@^2.1.1", "@csstools/css-calc@^2.1.2": +"@csstools/css-calc@^2.1.2": version "2.1.2" resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-2.1.2.tgz#bffd55f002dab119b76d4023f95cd943e6c8c11e" integrity sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw== -"@csstools/css-color-parser@^3.0.7": +"@csstools/css-color-parser@^3.0.8": version "3.0.8" resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-3.0.8.tgz#5fe9322920851450bf5e065c2b0e731b9e165394" integrity sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ== @@ -1069,6 +1069,28 @@ resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz#a5502c8539265fecbd873c1e395a890339f119c2" integrity sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw== +"@emnapi/core@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.4.0.tgz#8844b02d799198158ac1fea21ae2bc81b881da9a" + integrity sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg== + dependencies: + "@emnapi/wasi-threads" "1.0.1" + tslib "^2.4.0" + +"@emnapi/runtime@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.4.0.tgz#8f509bf1059a5551c8fe829a1c4e91db35fdfbee" + integrity sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw== + dependencies: + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz#d7ae71fd2166b1c916c6cd2d0df2ef565a2e1a5b" + integrity sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw== + dependencies: + tslib "^2.4.0" + "@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -1101,10 +1123,10 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== -"@faker-js/faker@9.5.0": - version "9.5.0" - resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-9.5.0.tgz#ce254c83706250ca8a5a0e05683608160610dd84" - integrity sha512-3qbjLv+fzuuCg3umxc9/7YjrEXNaKwHgmig949nfyaTx8eL4FAsvFbu+1JcFUj1YAXofhaDn6JdEUBTYuk0Ssw== +"@faker-js/faker@9.6.0": + version "9.6.0" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-9.6.0.tgz#64235d20330b142eef3d1d1638ba56c083b4bf1d" + integrity sha512-3vm4by+B5lvsFPSyep3ELWmZfE3kicDtmemVpuwl1yH7tqtnHdsA6hG8fbXedMVdkzgtvzWoRgjSB4Q+FHnZiw== "@graphql-toolkit/common@0.10.4": version "0.10.4" @@ -1484,13 +1506,13 @@ resolved "https://registry.yarnpkg.com/@kikobeats/time-span/-/time-span-1.0.5.tgz#9f7c5d48b08da02115dbf3d85ca11a6a6f8bfdeb" integrity sha512-txRAdmi35N1wnsLS1AO5mTlbY5Cv5/61WXqek2y3L9Q7u4mgdUVq819so5xe753hL5gYeLzlWoJ/VJfXg9nx8g== -"@metascraper/helpers@5.46.5", "@metascraper/helpers@^5.34.4": - version "5.46.5" - resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.46.5.tgz#db9db60835495d2865af1c99f758d32b8aac8f10" - integrity sha512-SuFJ7qu0MK1yaV9VnVDVY0eMsJ6hU3/4XYPhjrdZL9GejJUzzDhTTzNoi1V5NYF68YF+VlGEwQL101wDc/zo+A== +"@metascraper/helpers@5.46.11", "@metascraper/helpers@^5.34.4": + version "5.46.11" + resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.46.11.tgz#d55f77623227887a1ee52be3f4ea20174c36ec72" + integrity sha512-NmuJBy84CuXDeRT0PlKyM2To++jEHlqDTX8YajoL+S0FQpwvrB8kB3gsSaLzTgCzrZh0SABiicK1GVxtXFdrVA== dependencies: audio-extensions "0.0.0" - chrono-node "~2.7.7" + chrono-node "~2.7.9" condense-whitespace "~2.0.0" data-uri-utils "~1.0.8" debug-logfmt "~1.2.3" @@ -1499,10 +1521,10 @@ has-values "~2.0.1" image-extensions "~1.1.0" is-relative-url "~3.0.0" - is-uri "~1.2.6" + is-uri "~1.2.7" iso-639-3 "~2.2.0" isostring "0.0.1" - jsdom "~25.0.1" + jsdom "~26.0.0" lodash "~4.17.21" memoize-one "~6.0.0" microsoft-capitalize "~1.0.5" @@ -1510,7 +1532,7 @@ normalize-url "~6.1.0" re2 "~1.21.4" smartquotes "~2.3.2" - tldts "~6.1.70" + tldts "~6.1.85" url-regex-safe "~4.0.0" video-extensions "1" @@ -1537,6 +1559,15 @@ url-regex "~4.1.1" video-extensions "~1.1.0" +"@napi-rs/wasm-runtime@^0.2.7": + version "0.2.8" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.8.tgz#642e8390ee78ed21d6b79c467aa610e249224ed6" + integrity sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg== + dependencies: + "@emnapi/core" "^1.4.0" + "@emnapi/runtime" "^1.4.0" + "@tybys/wasm-util" "^0.9.0" + "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": version "2.1.8-no-fsevents.3" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b" @@ -1568,11 +1599,6 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nolyfill/is-core-module@1.0.39": - version "1.0.39" - resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e" - integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== - "@npmcli/agent@^2.0.0": version "2.2.2" resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-2.2.2.tgz#967604918e62f620a648c7975461c9c9e74fc5d5" @@ -1789,6 +1815,13 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@tybys/wasm-util@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.9.0.tgz#3e75eb00604c8d6db470bf18c37b7d984a0e3355" + integrity sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw== + dependencies: + tslib "^2.4.0" + "@types/accepts@*", "@types/accepts@^1.3.5": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" @@ -2026,12 +2059,12 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*", "@types/node@>=6", "@types/node@^22.13.5": - version "22.13.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.5.tgz#23add1d71acddab2c6a4d31db89c0f98d330b511" - integrity sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg== +"@types/node@*", "@types/node@>=6", "@types/node@^22.14.0": + version "22.14.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.14.0.tgz#d3bfa3936fef0dbacd79ea3eb17d521c628bb47e" + integrity sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA== dependencies: - undici-types "~6.20.0" + undici-types "~6.21.0" "@types/node@^10.1.0": version "10.17.26" @@ -2236,6 +2269,83 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@unrs/resolver-binding-darwin-arm64@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.3.3.tgz#394065916f98cdc1897cf7234adfdee395725fa8" + integrity sha512-EpRILdWr3/xDa/7MoyfO7JuBIJqpBMphtu4+80BK1bRfFcniVT74h3Z7q1+WOc92FuIAYatB1vn9TJR67sORGw== + +"@unrs/resolver-binding-darwin-x64@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.3.3.tgz#6a3c75ca984342261c7346db53293b0002e8cde1" + integrity sha512-ntj/g7lPyqwinMJWZ+DKHBse8HhVxswGTmNgFKJtdgGub3M3zp5BSZ3bvMP+kBT6dnYJLSVlDqdwOq1P8i0+/g== + +"@unrs/resolver-binding-freebsd-x64@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.3.3.tgz#6532b8d4fecaca6c4424791c82f7a27aac94fcd5" + integrity sha512-l6BT8f2CU821EW7U8hSUK8XPq4bmyTlt9Mn4ERrfjJNoCw0/JoHAh9amZZtV3cwC3bwwIat+GUnrcHTG9+qixw== + +"@unrs/resolver-binding-linux-arm-gnueabihf@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.3.3.tgz#69a8e430095fcf6a76f7350cc27b83464f8cbb91" + integrity sha512-8ScEc5a4y7oE2BonRvzJ+2GSkBaYWyh0/Ko4Q25e/ix6ANpJNhwEPZvCR6GVRmsQAYMIfQvYLdM6YEN+qRjnAQ== + +"@unrs/resolver-binding-linux-arm-musleabihf@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.3.3.tgz#e1fc8440e54929b1f0f6aff6f6e3e9e19ac4a73c" + integrity sha512-8qQ6l1VTzLNd3xb2IEXISOKwMGXDCzY/UNy/7SovFW2Sp0K3YbL7Ao7R18v6SQkLqQlhhqSBIFRk+u6+qu5R5A== + +"@unrs/resolver-binding-linux-arm64-gnu@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.3.3.tgz#1249e18b5fa1419addda637d62ef201ce9bcf5a4" + integrity sha512-v81R2wjqcWXJlQY23byqYHt9221h4anQ6wwN64oMD/WAE+FmxPHFZee5bhRkNVtzqO/q7wki33VFWlhiADwUeQ== + +"@unrs/resolver-binding-linux-arm64-musl@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.3.3.tgz#9af549ce9dde57b31c32a36cbe9eafa05f96befd" + integrity sha512-cAOx/j0u5coMg4oct/BwMzvWJdVciVauUvsd+GQB/1FZYKQZmqPy0EjJzJGbVzFc6gbnfEcSqvQE6gvbGf2N8Q== + +"@unrs/resolver-binding-linux-ppc64-gnu@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.3.3.tgz#45aab52319f3e3b2627038a80c0331b0793a4be3" + integrity sha512-mq2blqwErgDJD4gtFDlTX/HZ7lNP8YCHYFij2gkXPtMzrXxPW1hOtxL6xg4NWxvnj4bppppb0W3s/buvM55yfg== + +"@unrs/resolver-binding-linux-s390x-gnu@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.3.3.tgz#7d2fe5c43e291d42e66d74fce07d9cf0050b4241" + integrity sha512-u0VRzfFYysarYHnztj2k2xr+eu9rmgoTUUgCCIT37Nr+j0A05Xk2c3RY8Mh5+DhCl2aYibihnaAEJHeR0UOFIQ== + +"@unrs/resolver-binding-linux-x64-gnu@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.3.3.tgz#be54ff88c581610c42d8614475c0560f043d7ded" + integrity sha512-OrVo5ZsG29kBF0Ug95a2KidS16PqAMmQNozM6InbquOfW/udouk063e25JVLqIBhHLB2WyBnixOQ19tmeC/hIg== + +"@unrs/resolver-binding-linux-x64-musl@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.3.3.tgz#4efa7a1e4f7bf231098ed23df1e19174d360c24f" + integrity sha512-PYnmrwZ4HMp9SkrOhqPghY/aoL+Rtd4CQbr93GlrRTjK6kDzfMfgz3UH3jt6elrQAfupa1qyr1uXzeVmoEAxUA== + +"@unrs/resolver-binding-wasm32-wasi@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.3.3.tgz#6df454b4a9b28d47850bcb665d243f09101b782c" + integrity sha512-81AnQY6fShmktQw4hWDUIilsKSdvr/acdJ5azAreu2IWNlaJOKphJSsUVWE+yCk6kBMoQyG9ZHCb/krb5K0PEA== + dependencies: + "@napi-rs/wasm-runtime" "^0.2.7" + +"@unrs/resolver-binding-win32-arm64-msvc@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.3.3.tgz#fb19e118350e1392993a0a6565b427d38c1c1760" + integrity sha512-X/42BMNw7cW6xrB9syuP5RusRnWGoq+IqvJO8IDpp/BZg64J1uuIW6qA/1Cl13Y4LyLXbJVYbYNSKwR/FiHEng== + +"@unrs/resolver-binding-win32-ia32-msvc@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.3.3.tgz#23a9c4b5621bba2d472bc78fadde7273a8c4548d" + integrity sha512-EGNnNGQxMU5aTN7js3ETYvuw882zcO+dsVjs+DwO2j/fRVKth87C8e2GzxW1L3+iWAXMyJhvFBKRavk9Og1Z6A== + +"@unrs/resolver-binding-win32-x64-msvc@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.3.3.tgz#eee226e5b4c4d91c862248afd24452c8698ed542" + integrity sha512-GraLbYqOJcmW1qY3osB+2YIiD62nVf2/bVLHZmrb4t/YSUwE03l7TwcDJl08T/Tm3SVhepX8RQkpzWbag/Sb4w== + "@wry/context@^0.4.0": version "0.4.4" resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.4.4.tgz#e50f5fa1d6cfaabf2977d1fda5ae91717f8815f8" @@ -3197,6 +3307,14 @@ cacheable-request@^7.0.2: normalize-url "^6.0.1" responselike "^2.0.0" +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -3341,10 +3459,10 @@ chrono-node@~1.3.11: dependencies: moment "2.21.0" -chrono-node@~2.7.7: - version "2.7.8" - resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-2.7.8.tgz#629a96b955ea20b1fba9811328c69cbc932c8e39" - integrity sha512-pzxemrTKu6jFVyAfkNxUckp9nlrmRFtr5lGrEJcVKyeKV9WSeGT78Oysazlzd/H0BdMv7EzACtJrw0pi2KODBQ== +chrono-node@~2.7.9: + version "2.7.9" + resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-2.7.9.tgz#198c1360558b7a8913f3d3788ed5ee90b69c65b1" + integrity sha512-PW3tzuztH7OFbwdCCwv1k8F6ALFs5Yet1Neh5JJBL1GGj8zsLj3ZgZU6StUyM6gSsVRMv8EE6LqpTjM52Mshrw== dependencies: dayjs "^1.10.0" @@ -3617,12 +3735,12 @@ cssfilter@0.0.10: resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" integrity sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4= -cssstyle@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.2.1.tgz#5142782410fea95db66fb68147714a652a7c2381" - integrity sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw== +cssstyle@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.3.0.tgz#83db22d1aec8eb7e5ecd812b4d14a17fb3dd243d" + integrity sha512-6r0NiY0xizYqfBvWp1G7WXJ06/bZyrk7Dc6PHql82C/pKGUTKu4yAX4Y8JPamb1ob9nBKuxWzCGTRuGwU3yxJQ== dependencies: - "@asamuzakjp/css-color" "^2.8.2" + "@asamuzakjp/css-color" "^3.1.1" rrweb-cssom "^0.8.0" d@1, d@^1.0.1, d@^1.0.2: @@ -3722,7 +3840,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.7: +debug@4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== @@ -3968,6 +4086,15 @@ dotenv@^4.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d" integrity sha512-XcaMACOr3JMVcEv0Y/iUM2XaOsATRZ3U1In41/1jjK6vJZ2PZbQ1bzCG8uvaByfaBpl9gqc9QWJovpUGBXLLYQ== +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -4057,14 +4184,6 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^5.15.0: - version "5.17.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" - integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - entities@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" @@ -4235,6 +4354,11 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" @@ -4247,6 +4371,13 @@ es-object-atoms@^1.0.0: dependencies: es-errors "^1.3.0" +es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + es-set-tostringtag@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" @@ -4265,6 +4396,16 @@ es-set-tostringtag@^2.0.3: has-tostringtag "^1.0.2" hasown "^2.0.1" +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + es-shim-unscopables@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" @@ -4388,18 +4529,17 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-import-resolver-typescript@^3.8.3: - version "3.8.3" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.8.3.tgz#1721a1e4417e57a8fe6bf9463d0db8e220285eef" - integrity sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ== +eslint-import-resolver-typescript@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.3.1.tgz#6721c639716de3685363ddb284e2cec60cee60ee" + integrity sha512-/dR9YMomeBlvfuvX5q0C3Y/2PHC9OCRdT2ijFwdfq/4Bq+4m5/lqstEp9k3P6ocha1pCbhoY9fkwVYLmOqR0VQ== dependencies: - "@nolyfill/is-core-module" "1.0.39" - debug "^4.3.7" - enhanced-resolve "^5.15.0" + debug "^4.4.0" get-tsconfig "^4.10.0" - is-bun-module "^1.0.2" - stable-hash "^0.0.4" + is-bun-module "^2.0.0" + stable-hash "^0.0.5" tinyglobby "^0.2.12" + unrs-resolver "^1.3.3" eslint-module-utils@^2.12.0: version "2.12.0" @@ -4918,13 +5058,14 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== +form-data@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c" + integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" mime-types "^2.1.12" form-data@~2.3.2: @@ -5058,11 +5199,35 @@ get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: has-symbols "^1.0.3" hasown "^2.0.0" +get-intrinsic@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -5204,6 +5369,11 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + got@~11.8.0: version "11.8.6" resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" @@ -5221,7 +5391,7 @@ got@~11.8.0: p-cancelable "^2.0.0" responselike "^2.0.0" -graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== @@ -5399,6 +5569,11 @@ 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 sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + has-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" @@ -5444,10 +5619,10 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -helmet@~8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/helmet/-/helmet-8.0.0.tgz#05370fb1953aa7b81bd0ddfa459221247be6ea5c" - integrity sha512-VyusHLEIIO5mjQPUI1wpOAEu+wl6Q0998jzTxqUYGE45xCIcAxy3MsbEK/yyJUJ3ADeMoB6MornPH6GMWAf+Pw== +helmet@~8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/helmet/-/helmet-8.1.0.tgz#f96d23fedc89e9476ecb5198181009c804b8b38c" + integrity sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg== homedir-polyfill@^1.0.1: version "1.0.3" @@ -5573,7 +5748,7 @@ https-proxy-agent@^4.0.0: agent-base "5" debug "4" -https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.5: +https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== @@ -5827,12 +6002,12 @@ is-builtin-module@^3.2.1: dependencies: builtin-modules "^3.3.0" -is-bun-module@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-1.1.0.tgz#a66b9830869437f6cdad440ba49ab6e4dc837269" - integrity sha512-4mTAVPlrXpaN3jtF0lsnPCMGnq4+qZjVIKq0HCpfcqf8OC1SM5oATCIAPM5V5FN05qp2NNnFndphmdZS9CV3hA== +is-bun-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-2.0.0.tgz#4d7859a87c0fcac950c95e666730e745eae8bddd" + integrity sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ== dependencies: - semver "^7.6.3" + semver "^7.7.1" is-callable@^1.1.3, is-callable@^1.2.7: version "1.2.7" @@ -6065,10 +6240,10 @@ is-uri@~1.2.0: parse-uri "~1.0.0" punycode2 "~1.0.0" -is-uri@~1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/is-uri/-/is-uri-1.2.6.tgz#f8f5f55d9b997493f470bf10ca214a3838b1e818" - integrity sha512-kNciklu//Ki8BUmRseLTfG/WW55qDHavf3MKUic8wvXR3d7etbSMoQPTpjvDeLVekESSgJM4AG+BESIKU02u3A== +is-uri@~1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-uri/-/is-uri-1.2.7.tgz#cfb25d3123ff859a044ef54797551a911a450821" + integrity sha512-drze7nnbh2ZTHU0InyskqNcyCRH7G6SpC/2F3yFXTa38IL+aeUmYvz/9TRfR1Z4tuMzFGos1tolX8QJmgKEiqA== dependencies: parse-uri "~1.0.3" punycode2 "~1.0.0" @@ -6600,22 +6775,22 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -jsdom@~25.0.1: - version "25.0.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-25.0.1.tgz#536ec685c288fc8a5773a65f82d8b44badcc73ef" - integrity sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw== +jsdom@~26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-26.0.0.tgz#446dd1ad8cfc50df7e714e58f1f972c1763b354c" + integrity sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw== dependencies: - cssstyle "^4.1.0" + cssstyle "^4.2.1" data-urls "^5.0.0" decimal.js "^10.4.3" - form-data "^4.0.0" + form-data "^4.0.1" html-encoding-sniffer "^4.0.0" http-proxy-agent "^7.0.2" - https-proxy-agent "^7.0.5" + https-proxy-agent "^7.0.6" is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.12" - parse5 "^7.1.2" - rrweb-cssom "^0.7.1" + nwsapi "^2.2.16" + parse5 "^7.2.1" + rrweb-cssom "^0.8.0" saxes "^6.0.0" symbol-tree "^3.2.4" tough-cookie "^5.0.0" @@ -6623,7 +6798,7 @@ jsdom@~25.0.1: webidl-conversions "^7.0.0" whatwg-encoding "^3.1.1" whatwg-mimetype "^4.0.0" - whatwg-url "^14.0.0" + whatwg-url "^14.1.0" ws "^8.18.0" xml-name-validator "^5.0.0" @@ -6978,6 +7153,11 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -7031,33 +7211,33 @@ merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -metascraper-author@^5.46.5: - version "5.46.5" - resolved "https://registry.yarnpkg.com/metascraper-author/-/metascraper-author-5.46.5.tgz#64fa4e593ece8aa3d663b9fb0a101e2cd18f55d2" - integrity sha512-TKlqY7BVVzqphew842MwdtV5cNx3TG6l6rtswSzYOM2EhyuZuQPQUgrk6s20hRbZrCJM9XM+oc1PvzdmV7hXcg== +metascraper-author@^5.46.11: + version "5.46.11" + resolved "https://registry.yarnpkg.com/metascraper-author/-/metascraper-author-5.46.11.tgz#ddef50ae941ba3b46f0f24cc8f78ab819934344a" + integrity sha512-PyL0jzDfdBR5b4RjIRp64L4kolhyLuVG7XVHUMZ3+3epbxu8j1enUah6iErb9dQ0nlqAfdtAlNXZ63IU5COs+g== dependencies: - "@metascraper/helpers" "5.46.5" + "@metascraper/helpers" "5.46.11" -metascraper-date@^5.46.5: - version "5.46.5" - resolved "https://registry.yarnpkg.com/metascraper-date/-/metascraper-date-5.46.5.tgz#df63486c1db3d6bf360dff32b29446bb9e1b128b" - integrity sha512-PrgJioyTXm1ZqPpo0ybpKZ4u3QUDr3PQEWuKmQ5Xfe886haKF9N4b23KVDrME87nI975bwi3aH+3lo1msxL7ig== +metascraper-date@^5.46.11: + version "5.46.11" + resolved "https://registry.yarnpkg.com/metascraper-date/-/metascraper-date-5.46.11.tgz#bcecc35b23c329787f8486b72cf26a43c2aa923b" + integrity sha512-N3ToXyaZ3SMg3jtgExr6jLX7JCaVPZ2GD6o4ojE3v2zCa3IZBTsIhIw2mw8eiM6A4EqYMMdzGAXpkZXo4tbEuw== dependencies: - "@metascraper/helpers" "5.46.5" + "@metascraper/helpers" "5.46.11" -metascraper-description@^5.46.5: - version "5.46.5" - resolved "https://registry.yarnpkg.com/metascraper-description/-/metascraper-description-5.46.5.tgz#10c74065e8c6227a2e19bcbfb498fd117dd0b7a9" - integrity sha512-RJKfwVPXRy8+w7mSjJM+6oe1ws3AtPA5CspcJty1fdKD1S4jF0nFzgwtrTgOCtggMK8iHG01/qAunPobFEbs+w== +metascraper-description@^5.46.11: + version "5.46.11" + resolved "https://registry.yarnpkg.com/metascraper-description/-/metascraper-description-5.46.11.tgz#ab5df1ec24b9f662618f496ea19d5ade6669e35e" + integrity sha512-kJ9Er7XptGiZ502l3uCaMXVkaAKB//7FDylOHs+Dx4Irzp8SrWzKQgWX2XLg99oXdy7F/reNLdpPuV877Cw43Q== dependencies: - "@metascraper/helpers" "5.46.5" + "@metascraper/helpers" "5.46.11" -metascraper-image@^5.46.5: - version "5.46.5" - resolved "https://registry.yarnpkg.com/metascraper-image/-/metascraper-image-5.46.5.tgz#c011ddccbdbf380851a7a36cd9ebd12f9f7e9558" - integrity sha512-wgfilKtxeiwBjNYsMXr4AKVIu3jqScDZnWILl2MkILnn6BttLetgNRXsAvE5bT9LD8Upnf5ufJebLK+hoHAiwg== +metascraper-image@^5.46.11: + version "5.46.11" + resolved "https://registry.yarnpkg.com/metascraper-image/-/metascraper-image-5.46.11.tgz#ca9f8ebaf60c68cbccc022bbc474da4eb86dbc6c" + integrity sha512-R6u3jaYr7w4DEkpv3dhvdqoCEslbTrFDcV6CsAmqy62l33hGW1pfqxrCVMKoSj7NTVnmA5PqmSdzSqbvCinU4A== dependencies: - "@metascraper/helpers" "5.46.5" + "@metascraper/helpers" "5.46.11" metascraper-lang-detector@^4.10.2: version "4.10.2" @@ -7068,27 +7248,27 @@ metascraper-lang-detector@^4.10.2: franc "~4.0.0" iso-639-3 "~1.1.0" -metascraper-lang@^5.46.5: - version "5.46.5" - resolved "https://registry.yarnpkg.com/metascraper-lang/-/metascraper-lang-5.46.5.tgz#a47c9433341b4a31e5bde9e4f094c34ce5de3f42" - integrity sha512-CMa4D23kBVa+1DbCnpiiCgGvPQqx6b0TaSd9qLIeGaqhWQw7dUxGAB6x5KzjhoABGgKzTIpy+Xmc9cPforT+SQ== +metascraper-lang@^5.46.11: + version "5.46.11" + resolved "https://registry.yarnpkg.com/metascraper-lang/-/metascraper-lang-5.46.11.tgz#4956f2e18d3b52e1945ff2f329c9d76de1d13123" + integrity sha512-mS/6rmfIDiLhV8x/Io7WLtVLLUwJFo9jP8SU00GePbqWgOjxpeDlqcaC6WUBIV/rVdZzg0Sv86vcn09+qyvHhg== dependencies: - "@metascraper/helpers" "5.46.5" + "@metascraper/helpers" "5.46.11" -metascraper-logo@^5.46.5: - version "5.46.5" - resolved "https://registry.yarnpkg.com/metascraper-logo/-/metascraper-logo-5.46.5.tgz#5e57677ee6e9c21bcb7288257d751a3fb302141d" - integrity sha512-Wp7u7CEXjo7PA7kRKPG9EtD57xXWkv0E9klVgkQeSzBaVmXCTcEMYhHMfyBumpeZn02+Gmj/cuEuHjuMtbJ/uQ== +metascraper-logo@^5.46.11: + version "5.46.11" + resolved "https://registry.yarnpkg.com/metascraper-logo/-/metascraper-logo-5.46.11.tgz#6b601ab93e40b147ff873011f8066f03f2af10a7" + integrity sha512-NMilSVAtQccVm3iW1DLMiOPdQh0OSWGVjDzXmL7fXZLUCkvXYYeDX14eQWV1gvKoY3Iw00K/CSmgchAfK+8hVg== dependencies: - "@metascraper/helpers" "5.46.5" + "@metascraper/helpers" "5.46.11" lodash "~4.17.21" -metascraper-publisher@^5.46.5: - version "5.46.5" - resolved "https://registry.yarnpkg.com/metascraper-publisher/-/metascraper-publisher-5.46.5.tgz#f9ac000a358df7ff1f826ecaac58c0aada152687" - integrity sha512-vmc6tMshN/0n9DrMlOBt1jxktNIAqLJTP28Z2HStOadlNg4m6L+hdmp0mFAjfTxCuzR3bJYmWRfba4b51ugIiA== +metascraper-publisher@^5.46.11: + version "5.46.11" + resolved "https://registry.yarnpkg.com/metascraper-publisher/-/metascraper-publisher-5.46.11.tgz#6754dfa271ce89b44b055f134aea40953eba5869" + integrity sha512-1kdNc0aJDimP3Wc3kuRlKseASqm3nvrteBuCsraZgltnYTT8O82kehaxkY+OPijNV7mfrhnZFnE9X2Qh5VpfDg== dependencies: - "@metascraper/helpers" "5.46.5" + "@metascraper/helpers" "5.46.11" metascraper-soundcloud@^5.34.4: version "5.34.4" @@ -7097,45 +7277,45 @@ metascraper-soundcloud@^5.34.4: dependencies: "@metascraper/helpers" "^5.34.4" -metascraper-title@^5.46.5: - version "5.46.5" - resolved "https://registry.yarnpkg.com/metascraper-title/-/metascraper-title-5.46.5.tgz#b1a5027b3d051cba5a3cefcbb97a58bdfb0c00f5" - integrity sha512-AciK4SgOCdkRgXQ6isYcV/JzxomUd7hJ7BrikXqIfZME+UK6OHUtjQV3gtdB0SHBbIBE7Q+h1X5r8j5nWwBALg== +metascraper-title@^5.46.11: + version "5.46.11" + resolved "https://registry.yarnpkg.com/metascraper-title/-/metascraper-title-5.46.11.tgz#bedd7f891ed56697f1ddf48f5bd286997e430e95" + integrity sha512-xb/A5EvvSTh4Ux+VoLpF7Q4/7Yy6PpWq6RCH8QhuzxUXAFQIdCbAK0UUkgWtpmUarbxGK0UK6koX0fFKGu4CXQ== dependencies: - "@metascraper/helpers" "5.46.5" + "@metascraper/helpers" "5.46.11" -metascraper-url@^5.46.5: - version "5.46.5" - resolved "https://registry.yarnpkg.com/metascraper-url/-/metascraper-url-5.46.5.tgz#8673db754a613951b9a870c3533ee3a4fee04d22" - integrity sha512-DsF80xrH3qoyhxsZISbGQ6krs+BQO+3c19FA3oGfs88cjhpGSr0gMr662xL5NBveFatHSCCaaKYl2/OTb3N1VQ== +metascraper-url@^5.46.11: + version "5.46.11" + resolved "https://registry.yarnpkg.com/metascraper-url/-/metascraper-url-5.46.11.tgz#23fd921b7ea063e4cb52d14e36b3b8a3fd5fc62c" + integrity sha512-EHs+lKR1LYASN0dNq5dSfUXWGqI2kNRfKIe0XySdFFZfcODGkEjgm0+T8jUDuf+qQVGsrJrwG83Hs9w6p0G7+A== dependencies: - "@metascraper/helpers" "5.46.5" + "@metascraper/helpers" "5.46.11" -metascraper-video@^5.46.5: - version "5.46.5" - resolved "https://registry.yarnpkg.com/metascraper-video/-/metascraper-video-5.46.5.tgz#44a246622e92f499d9da9e567e4e65da7c002520" - integrity sha512-+tQNDglDBJU4jpIc9N8BwZ0w5OZBOO0jobigp8OHLJWPQTC9zfcZTsBRr7zTbrAfXF3Hu51ZO4VkapxTwTUQsw== +metascraper-video@^5.46.11: + version "5.46.11" + resolved "https://registry.yarnpkg.com/metascraper-video/-/metascraper-video-5.46.11.tgz#268b71a70cf917d176262f55df374e7001342964" + integrity sha512-yb8AOYsOTFidBiX4dyFYxBNhnbKnbw1NYJx/nrmYaHemuM3JSTGt4u1blYwK7ZGhobhb/I2CIhogI0b3meG/dA== dependencies: - "@metascraper/helpers" "5.46.5" + "@metascraper/helpers" "5.46.11" lodash "~4.17.21" p-reflect "~2.1.0" -metascraper-youtube@^5.46.5: - version "5.46.5" - resolved "https://registry.yarnpkg.com/metascraper-youtube/-/metascraper-youtube-5.46.5.tgz#20998d86ccc56b93dfd57b619bff3c936980c47d" - integrity sha512-cc3/BaqbcEpvBjOP0MWFxBlDHsdqCeksD0QQX/gwW/2LT8KfUL+qZl6rHqmYPk1RH4WDVtjAzFwq8Z6bQ+/yxQ== +metascraper-youtube@^5.46.11: + version "5.46.11" + resolved "https://registry.yarnpkg.com/metascraper-youtube/-/metascraper-youtube-5.46.11.tgz#5dd2d226cb446df4c2a357024024a41c90cbeade" + integrity sha512-Lr2AJ86apYNGw5MQ4nhP+NPV5BiePv/T4xHWLEtPkpXDooJPSXSVf/BAdLmQ7s6lGtSqwSUxlIY3Y3P3Rwt9FA== dependencies: - "@metascraper/helpers" "5.46.5" + "@metascraper/helpers" "5.46.11" get-video-id "3" p-locate "~5.0.0" reachable-url "~1.8.1" -metascraper@^5.46.7: - version "5.46.7" - resolved "https://registry.yarnpkg.com/metascraper/-/metascraper-5.46.7.tgz#cdc7d7fa3206cab5b69d6d69db6d473f61eec09b" - integrity sha512-fBWVQQH3blesqRRxO8lfOh5lxnp4gMBld7uz+hFElY5Kk9sJZIhzFW2TJW+rqqvnjbbmDiaYvGfBEzfZ5sC1Sw== +metascraper@^5.46.11: + version "5.46.11" + resolved "https://registry.yarnpkg.com/metascraper/-/metascraper-5.46.11.tgz#ee63bdbc94440c33d714b006e50a1712e2f2c25d" + integrity sha512-EdwpSK+P5l+oS5X7yRjnFhVq6s0m7f9mWfRykZKCHEeoLFmNVpUrA94S4q5PG6jAla5YMh2PAGGPS5EYyZ4YrQ== dependencies: - "@metascraper/helpers" "5.46.5" + "@metascraper/helpers" "5.46.11" cheerio "~1.0.0" debug-logfmt "~1.2.3" lodash "~4.17.21" @@ -7594,10 +7774,10 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" -nwsapi@^2.2.12: - version "2.2.16" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.16.tgz#177760bba02c351df1d2644e220c31dfec8cdb43" - integrity sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ== +nwsapi@^2.2.16: + version "2.2.20" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.20.tgz#22e53253c61e7b0e7e93cef42c891154bcca11ef" + integrity sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA== oauth-sign@~0.9.0: version "0.9.0" @@ -7891,6 +8071,13 @@ parse5@^7.0.0, parse5@^7.1.2: dependencies: entities "^4.4.0" +parse5@^7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.2.1.tgz#8928f55915e6125f430cc44309765bf17556a33a" + integrity sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ== + dependencies: + entities "^4.5.0" + parseurl@^1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -8037,10 +8224,10 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.2.tgz#d066c6053200da0234bf8fa1ef45168abed8b914" - integrity sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg== +prettier@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.3.tgz#4fc2ce0d657e7a02e602549f053b239cb7dfe1b5" + integrity sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw== pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" @@ -8437,11 +8624,6 @@ rosie@^2.1.1: resolved "https://registry.yarnpkg.com/rosie/-/rosie-2.1.1.tgz#f8c9b8145d581d19fb1c933cf6ac1c554ad68798" integrity sha512-2AXB7WrIZXtKMZ6Q/PlozqPF5nu/x7NEvRJZOblrJuprrPfm5gL8JVvJPj9aaib9F8IUALnLUFhzXrwEtnI5cQ== -rrweb-cssom@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz#c73451a484b86dd7cfb1e0b2898df4b703183e4b" - integrity sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg== - rrweb-cssom@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz#3021d1b4352fbf3b614aaeed0bc0d5739abe0bc2" @@ -8514,10 +8696,10 @@ safe-regex@^2.1.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sanitize-html@~2.14.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.14.0.tgz#bd2a7b97ee1d86a7f0e0babf3a4468f639c3a429" - integrity sha512-CafX+IUPxZshXqqRaG9ZClSlfPVjSxI0td7n07hk8QO2oO+9JDnlcL8iM8TWeOXOIBFgIOx6zioTzM53AOMn3g== +sanitize-html@~2.15.0: + version "2.15.0" + resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.15.0.tgz#8e7f97ee1fecdec1bb1fb2e37f6d2c6acfdbabe3" + integrity sha512-wIjst57vJGpLyBP8ioUbg6ThwJie5SuSIjHxJg53v5Fg+kUK+AXlb7bK3RNXpp315MvwM+0OBGCV6h5pPHsVhA== dependencies: deepmerge "^4.2.2" escape-string-regexp "^4.0.0" @@ -8553,10 +8735,10 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== +semver@^7.0.0, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.7.1: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== send@0.19.0: version "0.19.0" @@ -8828,10 +9010,10 @@ ssri@^10.0.0: dependencies: minipass "^7.0.3" -stable-hash@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/stable-hash/-/stable-hash-0.0.4.tgz#55ae7dadc13e4b3faed13601587cec41859b42f7" - integrity sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g== +stable-hash@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stable-hash/-/stable-hash-0.0.5.tgz#94e8837aaeac5b4d0f631d2972adef2924b40269" + integrity sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA== stack-utils@^2.0.3: version "2.0.6" @@ -9074,11 +9256,6 @@ synckit@^0.11.0: "@pkgr/core" "^0.2.0" tslib "^2.8.1" -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - tar@^6.1.11: version "6.1.13" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" @@ -9163,13 +9340,25 @@ tldts-core@^6.1.78: resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.78.tgz#47b477d9742870daa01dbd5ff9a598a48379728c" integrity sha512-jS0svNsB99jR6AJBmfmEWuKIgz91Haya91Z43PATaeHJ24BkMoNRb/jlaD37VYjb0mYf6gRL/HOnvS1zEnYBiw== -tldts@^6.1.32, tldts@~6.1.70: +tldts-core@^6.1.85: + version "6.1.85" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.85.tgz#6f6b795468c0b5f7660a11c7306ff2766ceaea7e" + integrity sha512-DTjUVvxckL1fIoPSb3KE7ISNtkWSawZdpfxGxwiIrZoO6EbHVDXXUIlIuWympPaeS+BLGyggozX/HTMsRAdsoA== + +tldts@^6.1.32: version "6.1.78" resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.78.tgz#ee94576653a60d421ff94162c4e9060f2e62467b" integrity sha512-fSgYrW0ITH0SR/CqKMXIruYIPpNu5aDgUp22UhYoSrnUQwc7SBqifEBFNce7AAcygUPBo6a/gbtcguWdmko4RQ== dependencies: tldts-core "^6.1.78" +tldts@~6.1.85: + version "6.1.85" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.85.tgz#c7636ad5ec2f02591264360da51c6b584ef6f7bb" + integrity sha512-gBdZ1RjCSevRPFix/hpaUWeak2/RNUZB4/8frF1r5uYMHjFptkiT0JXIebWvgI/0ZHXvxaUDDJshiA0j6GdL3w== + dependencies: + tldts-core "^6.1.85" + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -9226,6 +9415,13 @@ tr46@^5.0.0: dependencies: punycode "^2.3.1" +tr46@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-5.1.0.tgz#4a077922360ae807e172075ce5beb79b36e4a101" + integrity sha512-IUWnUK7ADYR5Sl1fZlO1INDUhVhatWl7BtJWsIhwJ0UAK7ilzzIa8uIqOO/aYVWHZPJkKbEL+362wrzoeRF7bw== + dependencies: + punycode "^2.3.1" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -9276,10 +9472,10 @@ ts-invariant@^0.4.0: dependencies: tslib "^1.9.3" -ts-jest@^29.2.5: - version "29.2.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" - integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== +ts-jest@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.3.1.tgz#2e459e1f94a833bd8216ba4b045fac948e265937" + integrity sha512-FT2PIRtZABwl6+ZCry8IY7JZ3xMuppsEV9qFVHOVe8jDzggwUZ9TsM4chyJxL9yi6LvkqcZYU3LmapEE454zBQ== dependencies: bs-logger "^0.2.6" ejs "^3.1.10" @@ -9288,7 +9484,8 @@ ts-jest@^29.2.5: json5 "^2.2.3" lodash.memoize "^4.1.2" make-error "^1.3.6" - semver "^7.6.3" + semver "^7.7.1" + type-fest "^4.38.0" yargs-parser "^21.1.1" ts-node@^10.9.2: @@ -9330,7 +9527,7 @@ tslib@^1.10.0, tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.8.1: +tslib@^2.4.0, tslib@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -9376,6 +9573,11 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-fest@^4.38.0: + version "4.39.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.39.1.tgz#7521f6944e279abaf79cf60cfbc4823f4858083e" + integrity sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w== + type-is@^1.6.16, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -9472,10 +9674,10 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@^5.7.3: - version "5.7.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" - integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== +typescript@^5.8.3: + version "5.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" + integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== unbox-primitive@^1.0.2: version "1.0.2" @@ -9492,10 +9694,10 @@ undefsafe@^2.0.5: resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== -undici-types@~6.20.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" - integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== undici@^6.19.5: version "6.19.8" @@ -9551,6 +9753,27 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +unrs-resolver@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/unrs-resolver/-/unrs-resolver-1.3.3.tgz#46bd5dd2ecc650365e050055fc208b5f4ae57803" + integrity sha512-PFLAGQzYlyjniXdbmQ3dnGMZJXX5yrl2YS4DLRfR3BhgUsE1zpRIrccp9XMOGRfIHpdFvCn/nr5N1KMVda4x3A== + optionalDependencies: + "@unrs/resolver-binding-darwin-arm64" "1.3.3" + "@unrs/resolver-binding-darwin-x64" "1.3.3" + "@unrs/resolver-binding-freebsd-x64" "1.3.3" + "@unrs/resolver-binding-linux-arm-gnueabihf" "1.3.3" + "@unrs/resolver-binding-linux-arm-musleabihf" "1.3.3" + "@unrs/resolver-binding-linux-arm64-gnu" "1.3.3" + "@unrs/resolver-binding-linux-arm64-musl" "1.3.3" + "@unrs/resolver-binding-linux-ppc64-gnu" "1.3.3" + "@unrs/resolver-binding-linux-s390x-gnu" "1.3.3" + "@unrs/resolver-binding-linux-x64-gnu" "1.3.3" + "@unrs/resolver-binding-linux-x64-musl" "1.3.3" + "@unrs/resolver-binding-wasm32-wasi" "1.3.3" + "@unrs/resolver-binding-win32-arm64-msvc" "1.3.3" + "@unrs/resolver-binding-win32-ia32-msvc" "1.3.3" + "@unrs/resolver-binding-win32-x64-msvc" "1.3.3" + update-browserslist-db@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" @@ -9677,10 +9900,10 @@ v8flags@^3.1.1: dependencies: homedir-polyfill "^1.0.1" -validator@^13.12.0: - version "13.12.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.12.0.tgz#7d78e76ba85504da3fee4fd1922b385914d4b35f" - integrity sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg== +validator@^13.15.0: + version "13.15.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.15.0.tgz#2dc7ce057e7513a55585109eec29b2c8e8c1aefd" + integrity sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA== vary@^1, vary@~1.1.2: version "1.1.2" @@ -9750,6 +9973,14 @@ whatwg-url@^14.0.0: tr46 "^5.0.0" webidl-conversions "^7.0.0" +whatwg-url@^14.1.0: + version "14.2.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.2.0.tgz#4ee02d5d725155dae004f6ae95c73e7ef5d95663" + integrity sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw== + dependencies: + tr46 "^5.1.0" + webidl-conversions "^7.0.0" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" diff --git a/deployment/deployment-values.md b/deployment/deployment-values.md new file mode 100644 index 000000000..96e5770fa --- /dev/null +++ b/deployment/deployment-values.md @@ -0,0 +1,73 @@ +# Deployment Values + +For each deployment, you need to set the environment variables and configurations. +Here is some specific information on how to set the values. + +## Webapp + +We have several configuration possibilities just in the frontend. + +### Date Time + +In file `branding/constants/dateTime.js`. + +- `RELATIVE_DATETIME` + - `true` (default) or `false` +- `ABSOLUT_DATETIME_FORMAT` + - definition see [date-fns, format](https://date-fns.org/v3.3.1/docs/format): + - `P`: just localized date + - `Pp`: just localized date and time + +## E-Mails + +You need to set environment variables to send registration and invitation information or notifications to users, for example. + +### SPF and DKIM + +More and more e-mail providers require settings for authorization and verification of e-mail senders. + +### SPF + +Sometimes it is enough to create an SPF record in your DNS. + +### DKIM + +However, if you need DKIM authorization and verification, you must set the appropriate environment variables in: `.env`, `docker-compose.yml` or Helm script `values.yaml`: + +```bash +SMTP_DKIM_DOMAINNAME= +SMTP_DKIM_KEYSELECTOR=ocelot # "free" name used in DNS as selector. we recommend this +SMTP_DKIM_PRIVATKEY="-----BEGIN RSA PRIVATE KEY-----\\n\\n-----END RSA PRIVATE KEY-----\\n" +``` + +You can find out how DKIM works here: + + + +To create the private and public DKIM key as DNS records with selector, see here: + + + +Information about the required PEM format can be found here: + + + +## Neo4j Database + +We have several configuration options for our Neo4j database. + +### DBMS_DEFAULT_DATABASE – Default Database Name to be Used + +If you need to set the default database name in Neo4j to be used for all operations and terminal commands like our backup scripts, you must set the appropriate environment variable in: `.env`, `docker-compose.yml` or Helm script `values.yaml`: + +```yaml +DBMS_DEFAULT_DATABASE: "graph.db" +``` + +The default value is `neo4j` if it is not set. + +As example see files: + +- `neo4j/.env.template` +- `deployment/docker-compose.yml` +- `deployment/configurations/stage.ocelot.social/kubernetes/values.yaml.template` diff --git a/docker-compose.override.yml b/docker-compose.override.yml index fed2ae70a..53f7e7b4e 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -43,3 +43,4 @@ services: container_name: mailserver ports: - 1080:80 + - 25:25 diff --git a/docker-compose.test.yml b/docker-compose.test.yml index 542a6c187..119cd20eb 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -40,3 +40,4 @@ services: image: djfarrelly/maildev ports: - 1080:80 + - 25:25 diff --git a/package-lock.json b/package-lock.json index 6e9ed925a..0b708bace 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,13 +9,13 @@ "version": "3.2.1", "license": "MIT", "devDependencies": { - "@babel/core": "^7.26.9", + "@babel/core": "^7.26.10", "@babel/preset-env": "^7.26.9", "@babel/register": "^7.25.9", "@badeball/cypress-cucumber-preprocessor": "^22.0.1", "@cucumber/cucumber": "11.2.0", "@cypress/browserify-preprocessor": "^3.0.2", - "@faker-js/faker": "9.5.0", + "@faker-js/faker": "9.6.0", "auto-changelog": "^2.5.0", "bcryptjs": "^2.4.3", "cross-env": "^7.0.3", @@ -127,22 +127,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", - "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", + "@babel/generator": "^7.26.10", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.9", - "@babel/parser": "^7.26.9", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -158,14 +158,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", - "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -411,27 +411,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", - "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", - "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.9" + "@babel/types": "^7.27.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -1714,32 +1714,32 @@ } }, "node_modules/@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", - "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/parser": "^7.26.9", - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1748,9 +1748,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", - "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -2786,9 +2786,9 @@ } }, "node_modules/@faker-js/faker": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.5.0.tgz", - "integrity": "sha512-3qbjLv+fzuuCg3umxc9/7YjrEXNaKwHgmig949nfyaTx8eL4FAsvFbu+1JcFUj1YAXofhaDn6JdEUBTYuk0Ssw==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.6.0.tgz", + "integrity": "sha512-3vm4by+B5lvsFPSyep3ELWmZfE3kicDtmemVpuwl1yH7tqtnHdsA6hG8fbXedMVdkzgtvzWoRgjSB4Q+FHnZiw==", "dev": true, "funding": [ { diff --git a/package.json b/package.json index a46e3fa85..dd27c53ca 100644 --- a/package.json +++ b/package.json @@ -33,13 +33,13 @@ "release": "./scripts/release.sh" }, "devDependencies": { - "@babel/core": "^7.26.9", + "@babel/core": "^7.26.10", "@babel/preset-env": "^7.26.9", "@babel/register": "^7.25.9", "@badeball/cypress-cucumber-preprocessor": "^22.0.1", "@cucumber/cucumber": "11.2.0", "@cypress/browserify-preprocessor": "^3.0.2", - "@faker-js/faker": "9.5.0", + "@faker-js/faker": "9.6.0", "auto-changelog": "^2.5.0", "bcryptjs": "^2.4.3", "cross-env": "^7.0.3", diff --git a/webapp/assets/_new/icons/svgs/bell-slashed.svg b/webapp/assets/_new/icons/svgs/bell-slashed.svg new file mode 100644 index 000000000..0aae3ff97 --- /dev/null +++ b/webapp/assets/_new/icons/svgs/bell-slashed.svg @@ -0,0 +1 @@ + diff --git a/webapp/components/ContentMenu/ContentMenu.spec.js b/webapp/components/ContentMenu/ContentMenu.spec.js index 0bd398e41..ce7a45a42 100644 --- a/webapp/components/ContentMenu/ContentMenu.spec.js +++ b/webapp/components/ContentMenu/ContentMenu.spec.js @@ -500,6 +500,44 @@ describe('ContentMenu.vue', () => { ], ]) }) + + it('can observe posts', async () => { + const wrapper = await openContentMenu({ + isOwner: false, + resourceType: 'contribution', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + isObservedByMe: false, + }, + }) + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'post.menu.observe') + .at(0) + .trigger('click') + expect(wrapper.emitted('toggleObservePost')).toEqual([ + ['d23a4265-f5f7-4e17-9f86-85f714b4b9f8', true], + ]) + }) + + it('can unobserve posts', async () => { + const wrapper = await openContentMenu({ + isOwner: false, + resourceType: 'contribution', + resource: { + id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', + isObservedByMe: true, + }, + }) + wrapper + .findAll('.ds-menu-item') + .filter((item) => item.text() === 'post.menu.unobserve') + .at(0) + .trigger('click') + expect(wrapper.emitted('toggleObservePost')).toEqual([ + ['d23a4265-f5f7-4e17-9f86-85f714b4b9f8', false], + ]) + }) }) }) }) diff --git a/webapp/components/ContentMenu/ContentMenu.vue b/webapp/components/ContentMenu/ContentMenu.vue index d723a9667..627e5d982 100644 --- a/webapp/components/ContentMenu/ContentMenu.vue +++ b/webapp/components/ContentMenu/ContentMenu.vue @@ -99,6 +99,24 @@ export default { }) } } + + if (this.resource.isObservedByMe) { + routes.push({ + label: this.$t(`post.menu.unobserve`), + callback: () => { + this.$emit('toggleObservePost', this.resource.id, false) + }, + icon: 'bell-slashed', + }) + } else { + routes.push({ + label: this.$t(`post.menu.observe`), + callback: () => { + this.$emit('toggleObservePost', this.resource.id, true) + }, + icon: 'bell', + }) + } } if (this.isOwner && this.resourceType === 'comment') { diff --git a/webapp/components/ObserveButton.spec.js b/webapp/components/ObserveButton.spec.js new file mode 100644 index 000000000..3ecfc40b6 --- /dev/null +++ b/webapp/components/ObserveButton.spec.js @@ -0,0 +1,60 @@ +import { mount } from '@vue/test-utils' +import ObserveButton from './ObserveButton.vue' + +const localVue = global.localVue + +describe('ObserveButton', () => { + let mocks + + const Wrapper = (count = 1, postId = '123', isObserved = true) => { + return mount(ObserveButton, { + mocks, + localVue, + propsData: { + count, + postId, + isObserved, + }, + }) + } + + let wrapper + + beforeEach(() => { + mocks = { + $t: jest.fn(), + } + }) + + describe('observed', () => { + beforeEach(() => { + wrapper = Wrapper(1, '123', true) + }) + + it('renders', () => { + expect(wrapper.element).toMatchSnapshot() + }) + + it('emits toggleObservePost with false when clicked', () => { + const button = wrapper.find('.base-button') + button.trigger('click') + expect(wrapper.emitted('toggleObservePost')).toEqual([['123', false]]) + }) + }) + + describe('unobserved', () => { + beforeEach(() => { + wrapper = Wrapper(1, '123', false) + }) + + it('renders', () => { + expect(wrapper.element).toMatchSnapshot() + }) + + it('emits toggleObservePost with true when clicked', () => { + const button = wrapper.find('.base-button') + button.trigger('click') + expect(wrapper.emitted('toggleObservePost')).toEqual([['123', true]]) + }) + }) +}) diff --git a/webapp/components/ObserveButton.vue b/webapp/components/ObserveButton.vue new file mode 100644 index 000000000..2c275709b --- /dev/null +++ b/webapp/components/ObserveButton.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/webapp/components/PostTeaser/PostTeaser.vue b/webapp/components/PostTeaser/PostTeaser.vue index 3c7d23c03..ad43a9d31 100644 --- a/webapp/components/PostTeaser/PostTeaser.vue +++ b/webapp/components/PostTeaser/PostTeaser.vue @@ -59,7 +59,7 @@ :key="category.id" v-tooltip="{ content: ` - ${$t(`contribution.category.name.${category.slug}`)}: + ${$t(`contribution.category.name.${category.slug}`)}: ${$t(`contribution.category.description.${category.slug}`)} `, placement: 'bottom-start', @@ -97,6 +97,7 @@ :is-owner="isAuthor" @pinPost="pinPost" @unpinPost="unpinPost" + @toggleObservePost="toggleObservePost" /> @@ -212,6 +213,9 @@ export default { unpinPost(post) { this.$emit('unpinPost', post) }, + toggleObservePost(postId, value) { + this.$emit('toggleObservePost', postId, value) + }, visibilityChanged(isVisible, entry, id) { if (!this.post.viewedTeaserByCurrentUser && isVisible) { this.$apollo diff --git a/webapp/components/__snapshots__/ObserveButton.spec.js.snap b/webapp/components/__snapshots__/ObserveButton.spec.js.snap new file mode 100644 index 000000000..c3ba629be --- /dev/null +++ b/webapp/components/__snapshots__/ObserveButton.spec.js.snap @@ -0,0 +1,81 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ObserveButton observed renders 1`] = ` +
+ + +
+ +

+

+ 1x +

+ + + +

+
+`; + +exports[`ObserveButton unobserved renders 1`] = ` +
+ + +
+ +

+

+ 1x +

+ + + +

+
+`; diff --git a/webapp/components/_new/features/SearchResults/SearchResults.vue b/webapp/components/_new/features/SearchResults/SearchResults.vue index 20385ce64..94d569e70 100644 --- a/webapp/components/_new/features/SearchResults/SearchResults.vue +++ b/webapp/components/_new/features/SearchResults/SearchResults.vue @@ -48,6 +48,9 @@ @removePostFromList="posts = removePostFromList(post, posts)" @pinPost="pinPost(post, refetchPostList)" @unpinPost="unpinPost(post, refetchPostList)" + @toggleObservePost=" + (postId, value) => toggleObservePost(postId, value, refetchPostList) + " /> diff --git a/webapp/graphql/CommentMutations.js b/webapp/graphql/CommentMutations.js index 191edf217..dd00527be 100644 --- a/webapp/graphql/CommentMutations.js +++ b/webapp/graphql/CommentMutations.js @@ -13,6 +13,8 @@ export default (i18n) => { updatedAt disabled deleted + isPostObservedByMe + postObservingUsersCount author { id slug diff --git a/webapp/jest.config.js b/webapp/jest.config.js index e9185f60e..947d6019d 100644 --- a/webapp/jest.config.js +++ b/webapp/jest.config.js @@ -38,4 +38,5 @@ module.exports = { }, moduleFileExtensions: ['js', 'json', 'vue'], testEnvironment: 'jest-environment-jsdom', + snapshotSerializers: ['jest-serializer-vue'], } diff --git a/webapp/locales/de.json b/webapp/locales/de.json index 4e5d42ac4..518ba99a9 100644 --- a/webapp/locales/de.json +++ b/webapp/locales/de.json @@ -747,6 +747,9 @@ "title": "Benachrichtigungen", "user": "Nutzer" }, + "observeButton": { + "observed": "beobachtet" + }, "post": { "comment": { "reply": "Antworten", @@ -778,8 +781,12 @@ "menu": { "delete": "Beitrag löschen", "edit": "Beitrag bearbeiten", + "observe": "Beitrag beobachten", + "observedSuccessfully": "Du beobachtest diesen Beitrag!", "pin": "Beitrag anheften", "pinnedSuccessfully": "Beitrag erfolgreich angeheftet!", + "unobserve": "Beitrag nicht mehr beobachten", + "unobservedSuccessfully": "Du beobachtest diesen Beitrag nicht mehr!", "unpin": "Beitrag loslösen", "unpinnedSuccessfully": "Angehefteten Beitrag erfolgreich losgelöst!" }, diff --git a/webapp/locales/en.json b/webapp/locales/en.json index 534a376cf..f78728c4f 100644 --- a/webapp/locales/en.json +++ b/webapp/locales/en.json @@ -747,6 +747,9 @@ "title": "Notifications", "user": "User" }, + "observeButton": { + "observed": "observed" + }, "post": { "comment": { "reply": "Reply", @@ -778,8 +781,12 @@ "menu": { "delete": "Delete post", "edit": "Edit post", + "observe": "Observe post", + "observedSuccessfully": "You are now observing this post!", "pin": "Pin post", "pinnedSuccessfully": "Post pinned successfully!", + "unobserve": "Stop to observe post", + "unobservedSuccessfully": "You are no longer observing this post!", "unpin": "Unpin post", "unpinnedSuccessfully": "Post unpinned successfully!" }, diff --git a/webapp/locales/es.json b/webapp/locales/es.json index c33169f66..a085a53e0 100644 --- a/webapp/locales/es.json +++ b/webapp/locales/es.json @@ -747,6 +747,9 @@ "title": "Notificaciones", "user": "Usuario" }, + "observeButton": { + "observed": null + }, "post": { "comment": { "reply": "Contestar", @@ -778,8 +781,12 @@ "menu": { "delete": "Borrar contribución", "edit": "Editar contribución", + "observe": "Observar contribución", + "observedSuccessfully": null, "pin": "Anclar contribución", "pinnedSuccessfully": "¡Contribución anclado con éxito!", + "unobserve": "Dejar de observar contribución", + "unobservedSuccessfully": null, "unpin": "Desanclar contribución", "unpinnedSuccessfully": "¡Contribución desanclado con éxito!" }, diff --git a/webapp/locales/fr.json b/webapp/locales/fr.json index 889093b8c..f1b5642de 100644 --- a/webapp/locales/fr.json +++ b/webapp/locales/fr.json @@ -747,6 +747,9 @@ "title": "Notifications", "user": "Utilisateur" }, + "observeButton": { + "observed": null + }, "post": { "comment": { "reply": null, @@ -778,8 +781,12 @@ "menu": { "delete": "Supprimer le Post", "edit": "Modifier le Post", + "observe": "Observer le Post", + "observedSuccessfully": null, "pin": "Épingler le Post", "pinnedSuccessfully": "Poste épinglé avec succès!", + "unobserve": "Ne plus observer le Post", + "unobservedSuccessfully": null, "unpin": "Retirer l'épingle du poste", "unpinnedSuccessfully": "Épingle retirer du Post avec succès!" }, diff --git a/webapp/locales/it.json b/webapp/locales/it.json index 222ac94b2..54248e6ee 100644 --- a/webapp/locales/it.json +++ b/webapp/locales/it.json @@ -747,6 +747,9 @@ "title": null, "user": null }, + "observeButton": { + "observed": null + }, "post": { "comment": { "reply": null, @@ -778,8 +781,12 @@ "menu": { "delete": null, "edit": null, + "observe": null, + "observedSuccessfully": null, "pin": null, "pinnedSuccessfully": null, + "unobserve": null, + "unobservedSuccessfully": null, "unpin": null, "unpinnedSuccessfully": null }, diff --git a/webapp/locales/nl.json b/webapp/locales/nl.json index 6ec9b4c2a..7907ce052 100644 --- a/webapp/locales/nl.json +++ b/webapp/locales/nl.json @@ -747,6 +747,9 @@ "title": null, "user": null }, + "observeButton": { + "observed": null + }, "post": { "comment": { "reply": null, @@ -778,8 +781,12 @@ "menu": { "delete": null, "edit": null, + "observe": null, + "observedSuccessfully": null, "pin": null, "pinnedSuccessfully": null, + "unobserve": null, + "unobservedSuccessfully": null, "unpin": null, "unpinnedSuccessfully": null }, diff --git a/webapp/locales/pl.json b/webapp/locales/pl.json index 1ed0fa050..7a800b3d0 100644 --- a/webapp/locales/pl.json +++ b/webapp/locales/pl.json @@ -747,6 +747,9 @@ "title": null, "user": null }, + "observeButton": { + "observed": null + }, "post": { "comment": { "reply": null, @@ -778,8 +781,12 @@ "menu": { "delete": "Usuń wpis", "edit": "Edytuj wpis", + "observe": null, + "observedSuccessfully": null, "pin": null, "pinnedSuccessfully": null, + "unobserve": null, + "unobservedSuccessfully": null, "unpin": null, "unpinnedSuccessfully": null }, diff --git a/webapp/locales/pt.json b/webapp/locales/pt.json index c2e38fbc6..c0bb8a500 100644 --- a/webapp/locales/pt.json +++ b/webapp/locales/pt.json @@ -747,6 +747,9 @@ "title": "Notificações", "user": "Usuário" }, + "observeButton": { + "observed": null + }, "post": { "comment": { "reply": null, @@ -778,8 +781,12 @@ "menu": { "delete": "Excluir publicação", "edit": "Editar publicação", + "observe": "Observar publicação", + "observedSuccessfully": null, "pin": "Fixar publicação", "pinnedSuccessfully": "Publicação fixada com sucesso!", + "unobserve": "Deixar de observar publicação", + "unobservedSuccessfully": null, "unpin": "Desafixar publicação", "unpinnedSuccessfully": "Publicação desafixada com sucesso!" }, diff --git a/webapp/locales/ru.json b/webapp/locales/ru.json index 91a8b30bc..bebae1012 100644 --- a/webapp/locales/ru.json +++ b/webapp/locales/ru.json @@ -747,6 +747,9 @@ "title": "Уведомления", "user": "Пользователь" }, + "observeButton": { + "observed": null + }, "post": { "comment": { "reply": "Ответ", @@ -778,8 +781,12 @@ "menu": { "delete": "Удалить пост", "edit": "Редактировать пост", + "observe": null, + "observedSuccessfully": null, "pin": "Закрепить пост", "pinnedSuccessfully": "Пост больше не закреплен!", + "unobserve": null, + "unobservedSuccessfully": null, "unpin": "Открепить пост", "unpinnedSuccessfully": "Пост успешно не закреплено!" }, diff --git a/webapp/mixins/postListActions.js b/webapp/mixins/postListActions.js index 57fd28bd1..808af3ff7 100644 --- a/webapp/mixins/postListActions.js +++ b/webapp/mixins/postListActions.js @@ -35,5 +35,23 @@ export default { }) .catch((error) => this.$toast.error(error.message)) }, + toggleObservePost(postId, value, refetchPostList = () => {}) { + this.$apollo + .mutate({ + mutation: PostMutations().toggleObservePost, + variables: { + value, + id: postId, + }, + }) + .then(() => { + const message = this.$t( + `post.menu.${value ? 'observedSuccessfully' : 'unobservedSuccessfully'}`, + ) + this.$toast.success(message) + refetchPostList() + }) + .catch((error) => this.$toast.error(error.message)) + }, }, } diff --git a/webapp/package.json b/webapp/package.json index d12672224..5c1d946fc 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -40,6 +40,7 @@ "express": "~4.21.2", "graphql": "~14.7.0", "intersection-observer": "^0.12.0", + "jest-serializer-vue": "^3.1.0", "jsonwebtoken": "~9.0.2", "linkify-it": "~5.0.0", "mapbox-gl": "1.13.2", @@ -47,7 +48,7 @@ "nuxt": "~2.12.1", "nuxt-dropzone": "^1.0.4", "nuxt-env": "~0.1.0", - "sass": "^1.85.0", + "sass": "^1.86.3", "stack-utils": "^2.0.3", "tippy.js": "^4.3.5", "tiptap": "~1.26.6", @@ -55,7 +56,7 @@ "trunc-html": "^1.1.2", "v-mapbox": "^1.11.2", "v-tooltip": "~2.1.3", - "validator": "^13.12.0", + "validator": "^13.15.0", "vue-advanced-chat": "^2.0.11", "vue-count-to": "~1.0.13", "vue-infinite-loading": "^2.4.5", @@ -72,7 +73,7 @@ "@babel/core": "^7.25.8", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/preset-env": "^7.25.8", - "@faker-js/faker": "9.5.0", + "@faker-js/faker": "9.6.0", "@storybook/addon-a11y": "^8.0.8", "@storybook/addon-actions": "^5.3.21", "@storybook/addon-notes": "^5.3.18", @@ -92,7 +93,7 @@ "core-js": "~2.6.10", "css-loader": "~3.5.2", "eslint": "^7.28.0", - "eslint-config-prettier": "~10.0.1", + "eslint-config-prettier": "~10.1.1", "eslint-config-standard": "~15.0.1", "eslint-loader": "~4.0.0", "eslint-plugin-import": "~2.31.0", @@ -101,13 +102,13 @@ "eslint-plugin-prettier": "^5.2.3", "eslint-plugin-promise": "~7.2.1", "eslint-plugin-standard": "~5.0.0", - "eslint-plugin-vue": "~9.32.0", + "eslint-plugin-vue": "~9.33.0", "flush-promises": "^1.0.2", "identity-obj-proxy": "^3.0.0", "jest": "29.7", "jest-environment-jsdom": "^29.7.0", "mutation-observer": "^1.0.3", - "prettier": "~3.5.2", + "prettier": "~3.5.3", "sass-loader": "~10.1.1", "storybook-design-token": "^0.8.1", "storybook-vue-router": "^1.0.7", diff --git a/webapp/pages/groups/_id/_slug.vue b/webapp/pages/groups/_id/_slug.vue index f261f2ef3..10d2ca8d2 100644 --- a/webapp/pages/groups/_id/_slug.vue +++ b/webapp/pages/groups/_id/_slug.vue @@ -283,6 +283,9 @@ @removePostFromList="posts = removePostFromList(post, posts)" @pinPost="pinPost(post, refetchPostList)" @unpinPost="unpinPost(post, refetchPostList)" + @toggleObservePost=" + (postId, value) => toggleObservePost(postId, value, refetchPostList) + " /> diff --git a/webapp/pages/index.vue b/webapp/pages/index.vue index 6067119e1..c780b0ae3 100644 --- a/webapp/pages/index.vue +++ b/webapp/pages/index.vue @@ -116,6 +116,9 @@ @removePostFromList="posts = removePostFromList(post, posts)" @pinPost="pinPost(post, refetchPostList)" @unpinPost="unpinPost(post, refetchPostList)" + @toggleObservePost=" + (postId, value) => toggleObservePost(postId, value, refetchPostList) + " /> diff --git a/webapp/pages/post/_id/_slug/index.vue b/webapp/pages/post/_id/_slug/index.vue index 1e9622c13..b84486eec 100644 --- a/webapp/pages/post/_id/_slug/index.vue +++ b/webapp/pages/post/_id/_slug/index.vue @@ -49,6 +49,7 @@ :is-owner="isAuthor" @pinPost="pinPost" @unpinPost="unpinPost" + @toggleObservePost="toggleObservePost" /> @@ -111,6 +112,18 @@ :post-id="post.id" /> + + + + @@ -156,6 +169,7 @@ import ContentMenu from '~/components/ContentMenu/ContentMenu' import DateTimeRange from '~/components/DateTimeRange/DateTimeRange' import UserTeaser from '~/components/UserTeaser/UserTeaser' import HcShoutButton from '~/components/ShoutButton.vue' +import ObserveButton from '~/components/ObserveButton.vue' import LocationTeaser from '~/components/LocationTeaser/LocationTeaser' import PageParamsLink from '~/components/_new/features/PageParamsLink/PageParamsLink.vue' import { @@ -184,6 +198,7 @@ export default { HcCategory, HcHashtag, HcShoutButton, + ObserveButton, LocationTeaser, PageParamsLink, UserTeaser, @@ -302,6 +317,8 @@ export default { }, async createComment(comment) { this.post.comments.push(comment) + this.post.isObservedByMe = comment.isPostObservedByMe + this.post.observingUsersCount = comment.postObservingUsersCount }, pinPost(post) { this.$apollo @@ -325,6 +342,24 @@ export default { }) .catch((error) => this.$toast.error(error.message)) }, + toggleObservePost(postId, value) { + this.$apollo + .mutate({ + mutation: PostMutations().toggleObservePost, + variables: { + value, + id: postId, + }, + }) + .then(() => { + const message = this.$t( + `post.menu.${value ? 'observedSuccessfully' : 'unobservedSuccessfully'}`, + ) + this.$toast.success(message) + this.$apollo.queries.Post.refetch() + }) + .catch((error) => this.$toast.error(error.message)) + }, toggleNewCommentForm(showNewCommentForm) { this.showNewCommentForm = showNewCommentForm }, @@ -379,7 +414,7 @@ export default { position: relative; /* The padding top makes sure the correct height is set (according to the hero image aspect ratio) before the hero image loads so - the autoscroll works correctly when following a comment link. + the autoscroll works correctly when following a comment link. */ padding-top: calc(var(--hero-image-aspect-ratio) * (100% + 48px)); diff --git a/webapp/pages/profile/_id/_slug.vue b/webapp/pages/profile/_id/_slug.vue index cef3a5d45..e60ba1098 100644 --- a/webapp/pages/profile/_id/_slug.vue +++ b/webapp/pages/profile/_id/_slug.vue @@ -156,6 +156,9 @@ @removePostFromList="posts = removePostFromList(post, posts)" @pinPost="pinPost(post, refetchPostList)" @unpinPost="unpinPost(post, refetchPostList)" + @toggleObservePost=" + (postId, value) => toggleObservePost(postId, value, refetchPostList) + " /> diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 55873eb69..87e849383 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -2447,10 +2447,10 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@faker-js/faker@9.5.0": - version "9.5.0" - resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-9.5.0.tgz#ce254c83706250ca8a5a0e05683608160610dd84" - integrity sha512-3qbjLv+fzuuCg3umxc9/7YjrEXNaKwHgmig949nfyaTx8eL4FAsvFbu+1JcFUj1YAXofhaDn6JdEUBTYuk0Ssw== +"@faker-js/faker@9.6.0": + version "9.6.0" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-9.6.0.tgz#64235d20330b142eef3d1d1638ba56c083b4bf1d" + integrity sha512-3vm4by+B5lvsFPSyep3ELWmZfE3kicDtmemVpuwl1yH7tqtnHdsA6hG8fbXedMVdkzgtvzWoRgjSB4Q+FHnZiw== "@hapi/address@2.x.x": version "2.0.0" @@ -9425,10 +9425,10 @@ eslint-config-prettier@^6.0.0: dependencies: get-stdin "^6.0.0" -eslint-config-prettier@~10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz#fbb03bfc8db0651df9ce4e8b7150d11c5fe3addf" - integrity sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw== +eslint-config-prettier@~10.1.1: + version "10.1.1" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.1.tgz#cf0ff6e5c4e7e15f129f1f1ce2a5ecba92dec132" + integrity sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw== eslint-config-standard@~15.0.1: version "15.0.1" @@ -9534,10 +9534,10 @@ eslint-plugin-standard@~5.0.0: resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-5.0.0.tgz#c43f6925d669f177db46f095ea30be95476b1ee4" integrity sha512-eSIXPc9wBM4BrniMzJRBm2uoVuXz2EPa+NXPk2+itrVt+r5SbKFERx/IgrK/HmfjddyKVz2f+j+7gBRvu19xLg== -eslint-plugin-vue@~9.32.0: - version "9.32.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.32.0.tgz#2b558e827886b567dfaa156cc1cad0f596461fab" - integrity sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug== +eslint-plugin-vue@~9.33.0: + version "9.33.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz#de33eba8f78e1d172c59c8ec7fbfd60c6ca35c39" + integrity sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw== dependencies: "@eslint-community/eslint-utils" "^4.4.0" globals "^13.24.0" @@ -12609,6 +12609,13 @@ jest-runtime@^29.7.0: slash "^3.0.0" strip-bom "^4.0.0" +jest-serializer-vue@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jest-serializer-vue/-/jest-serializer-vue-3.1.0.tgz#af65817aa416d019f837b6cc53f121a3222846f4" + integrity sha512-vXz9/3IgBbLhsaVANYLG4ROCQd+Wg3qbB6ICofzFL+fbhSFPlqb0/MMGXcueVsjaovdWlYiRaLQLpdi1PTcoRQ== + dependencies: + pretty "2.0.0" + jest-snapshot@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" @@ -16118,10 +16125,10 @@ prettier@^1.18.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== -prettier@~3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.2.tgz#d066c6053200da0234bf8fa1ef45168abed8b914" - integrity sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg== +prettier@~3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.3.tgz#4fc2ce0d657e7a02e602549f053b239cb7dfe1b5" + integrity sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw== pretty-bytes@^5.3.0: version "5.3.0" @@ -16155,7 +16162,7 @@ pretty-time@^1.1.0: resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== -pretty@^2.0.0: +pretty@2.0.0, pretty@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5" integrity sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w== @@ -17419,10 +17426,10 @@ sass-resources-loader@^2.2.1: glob "^7.1.6" loader-utils "^2.0.0" -sass@^1.85.0: - version "1.85.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.85.0.tgz#0127ef697d83144496401553f0a0e87be83df45d" - integrity sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww== +sass@^1.86.3: + version "1.86.3" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.86.3.tgz#0a0d9ea97cb6665e73f409639f8533ce057464c9" + integrity sha512-iGtg8kus4GrsGLRDLRBRHY9dNVA78ZaS7xr01cWnS7PEMQyFtTqBiyCrfpTYTZXRWM94akzckYjh8oADfFNTzw== dependencies: chokidar "^4.0.0" immutable "^5.0.2" @@ -17816,12 +17823,7 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== - -source-map-js@^1.0.2, source-map-js@^1.2.0: +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== @@ -19659,10 +19661,10 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -validator@^13.12.0: - version "13.12.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.12.0.tgz#7d78e76ba85504da3fee4fd1922b385914d4b35f" - integrity sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg== +validator@^13.15.0: + version "13.15.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.15.0.tgz#2dc7ce057e7513a55585109eec29b2c8e8c1aefd" + integrity sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA== vary@^1, vary@^1.1.2, vary@~1.1.2: version "1.1.2" diff --git a/yarn.lock b/yarn.lock index b3f340b5d..4e1450d9a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -52,34 +52,34 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.8.tgz#821c1d35641c355284d4a870b8a4a7b0c141e367" integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== -"@babel/core@^7.16.0", "@babel/core@^7.26.9": - version "7.26.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.9.tgz#71838542a4b1e49dfed353d7acbc6eb89f4a76f2" - integrity sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw== +"@babel/core@^7.16.0", "@babel/core@^7.26.10": + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.10.tgz#5c876f83c8c4dcb233ee4b670c0606f2ac3000f9" + integrity sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.9" + "@babel/generator" "^7.26.10" "@babel/helper-compilation-targets" "^7.26.5" "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.9" - "@babel/parser" "^7.26.9" + "@babel/helpers" "^7.26.10" + "@babel/parser" "^7.26.10" "@babel/template" "^7.26.9" - "@babel/traverse" "^7.26.9" - "@babel/types" "^7.26.9" + "@babel/traverse" "^7.26.10" + "@babel/types" "^7.26.10" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.26.9": - version "7.26.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.9.tgz#75a9482ad3d0cc7188a537aa4910bc59db67cbca" - integrity sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg== +"@babel/generator@^7.26.10", "@babel/generator@^7.27.0": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.0.tgz#764382b5392e5b9aff93cadb190d0745866cbc2c" + integrity sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw== dependencies: - "@babel/parser" "^7.26.9" - "@babel/types" "^7.26.9" + "@babel/parser" "^7.27.0" + "@babel/types" "^7.27.0" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -343,20 +343,20 @@ "@babel/traverse" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/helpers@^7.26.9": - version "7.26.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.9.tgz#28f3fb45252fc88ef2dc547c8a911c255fc9fef6" - integrity sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA== +"@babel/helpers@^7.26.10": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.0.tgz#53d156098defa8243eab0f32fa17589075a1b808" + integrity sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg== dependencies: - "@babel/template" "^7.26.9" - "@babel/types" "^7.26.9" + "@babel/template" "^7.27.0" + "@babel/types" "^7.27.0" -"@babel/parser@^7.24.4", "@babel/parser@^7.24.7", "@babel/parser@^7.25.3", "@babel/parser@^7.26.9": - version "7.26.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.9.tgz#d9e78bee6dc80f9efd8f2349dcfbbcdace280fd5" - integrity sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A== +"@babel/parser@^7.24.4", "@babel/parser@^7.24.7", "@babel/parser@^7.25.3", "@babel/parser@^7.26.10", "@babel/parser@^7.27.0": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.0.tgz#3d7d6ee268e41d2600091cbd4e145ffee85a44ec" + integrity sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg== dependencies: - "@babel/types" "^7.26.9" + "@babel/types" "^7.27.0" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": version "7.25.9" @@ -1015,32 +1015,32 @@ dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.25.9", "@babel/template@^7.26.9": - version "7.26.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.26.9.tgz#4577ad3ddf43d194528cff4e1fa6b232fa609bb2" - integrity sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA== +"@babel/template@^7.22.15", "@babel/template@^7.25.9", "@babel/template@^7.26.9", "@babel/template@^7.27.0": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.0.tgz#b253e5406cc1df1c57dcd18f11760c2dbf40c0b4" + integrity sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA== dependencies: "@babel/code-frame" "^7.26.2" - "@babel/parser" "^7.26.9" - "@babel/types" "^7.26.9" + "@babel/parser" "^7.27.0" + "@babel/types" "^7.27.0" -"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.8", "@babel/traverse@^7.26.9": - version "7.26.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.9.tgz#4398f2394ba66d05d988b2ad13c219a2c857461a" - integrity sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg== +"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.10", "@babel/traverse@^7.26.8": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.0.tgz#11d7e644779e166c0442f9a07274d02cd91d4a70" + integrity sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA== dependencies: "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.9" - "@babel/parser" "^7.26.9" - "@babel/template" "^7.26.9" - "@babel/types" "^7.26.9" + "@babel/generator" "^7.27.0" + "@babel/parser" "^7.27.0" + "@babel/template" "^7.27.0" + "@babel/types" "^7.27.0" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.25.9", "@babel/types@^7.26.9", "@babel/types@^7.4.4": - version "7.26.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.9.tgz#08b43dec79ee8e682c2ac631c010bdcac54a21ce" - integrity sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw== +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.25.9", "@babel/types@^7.26.10", "@babel/types@^7.27.0", "@babel/types@^7.4.4": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.0.tgz#ef9acb6b06c3173f6632d993ecb6d4ae470b4559" + integrity sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -1543,10 +1543,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699" integrity sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg== -"@faker-js/faker@9.5.0": - version "9.5.0" - resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-9.5.0.tgz#ce254c83706250ca8a5a0e05683608160610dd84" - integrity sha512-3qbjLv+fzuuCg3umxc9/7YjrEXNaKwHgmig949nfyaTx8eL4FAsvFbu+1JcFUj1YAXofhaDn6JdEUBTYuk0Ssw== +"@faker-js/faker@9.6.0": + version "9.6.0" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-9.6.0.tgz#64235d20330b142eef3d1d1638ba56c083b4bf1d" + integrity sha512-3vm4by+B5lvsFPSyep3ELWmZfE3kicDtmemVpuwl1yH7tqtnHdsA6hG8fbXedMVdkzgtvzWoRgjSB4Q+FHnZiw== "@fastify/busboy@^2.0.0": version "2.1.1"