diff --git a/.eslintrc.js b/.eslintrc.js index 07e3e54e0e1..3e00c9ebaae 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,85 +1,90 @@ module.exports = { plugins: ["matrix-org"], - extends: [ - "plugin:matrix-org/babel", - "plugin:matrix-org/react", - ], + extends: ["plugin:matrix-org/babel", "plugin:matrix-org/react"], env: { browser: true, node: true, }, rules: { // Things we do that break the ideal style - "quotes": "off", + quotes: "off", }, settings: { react: { - version: 'detect', + version: "detect", }, }, - overrides: [{ - files: [ - "src/**/*.{ts,tsx}", - "test/**/*.{ts,tsx}", - "module_system/**/*.{ts,tsx}", - ], - extends: [ - "plugin:matrix-org/typescript", - "plugin:matrix-org/react", - ], - // NOTE: These rules are frozen and new rules should not be added here. - // New changes belong in https://github.com/matrix-org/eslint-plugin-matrix-org/ - rules: { - // Things we do that break the ideal style - "prefer-promise-reject-errors": "off", - "quotes": "off", + overrides: [ + { + files: ["src/**/*.{ts,tsx}", "test/**/*.{ts,tsx}", "module_system/**/*.{ts,tsx}"], + extends: ["plugin:matrix-org/typescript", "plugin:matrix-org/react"], + // NOTE: These rules are frozen and new rules should not be added here. + // New changes belong in https://github.com/matrix-org/eslint-plugin-matrix-org/ + rules: { + // Things we do that break the ideal style + "prefer-promise-reject-errors": "off", + "quotes": "off", - // We disable this while we're transitioning - "@typescript-eslint/no-explicit-any": "off", - // We're okay with assertion errors when we ask for them - "@typescript-eslint/no-non-null-assertion": "off", + // We disable this while we're transitioning + "@typescript-eslint/no-explicit-any": "off", + // We're okay with assertion errors when we ask for them + "@typescript-eslint/no-non-null-assertion": "off", - // Ban matrix-js-sdk/src imports in favour of matrix-js-sdk/src/matrix imports to prevent unleashing hell. - "no-restricted-imports": ["error", { - "paths": [{ - "name": "matrix-js-sdk", - "message": "Please use matrix-js-sdk/src/matrix instead", - }, { - "name": "matrix-js-sdk/", - "message": "Please use matrix-js-sdk/src/matrix instead", - }, { - "name": "matrix-js-sdk/src", - "message": "Please use matrix-js-sdk/src/matrix instead", - }, { - "name": "matrix-js-sdk/src/", - "message": "Please use matrix-js-sdk/src/matrix instead", - }, { - "name": "matrix-js-sdk/src/index", - "message": "Please use matrix-js-sdk/src/matrix instead", - }, { - "name": "matrix-react-sdk", - "message": "Please use matrix-react-sdk/src/index instead", - }, { - "name": "matrix-react-sdk/", - "message": "Please use matrix-react-sdk/src/index instead", - }], - "patterns": [{ - "group": ["matrix-js-sdk/lib", "matrix-js-sdk/lib/", "matrix-js-sdk/lib/**"], - "message": "Please use matrix-js-sdk/src/* instead", - }, { - "group": ["matrix-react-sdk/lib", "matrix-react-sdk/lib/", "matrix-react-sdk/lib/**"], - "message": "Please use matrix-react-sdk/src/* instead", - }], - }], + // Ban matrix-js-sdk/src imports in favour of matrix-js-sdk/src/matrix imports to prevent unleashing hell. + "no-restricted-imports": [ + "error", + { + paths: [ + { + name: "matrix-js-sdk", + message: "Please use matrix-js-sdk/src/matrix instead", + }, + { + name: "matrix-js-sdk/", + message: "Please use matrix-js-sdk/src/matrix instead", + }, + { + name: "matrix-js-sdk/src", + message: "Please use matrix-js-sdk/src/matrix instead", + }, + { + name: "matrix-js-sdk/src/", + message: "Please use matrix-js-sdk/src/matrix instead", + }, + { + name: "matrix-js-sdk/src/index", + message: "Please use matrix-js-sdk/src/matrix instead", + }, + { + name: "matrix-react-sdk", + message: "Please use matrix-react-sdk/src/index instead", + }, + { + name: "matrix-react-sdk/", + message: "Please use matrix-react-sdk/src/index instead", + }, + ], + patterns: [ + { + group: ["matrix-js-sdk/lib", "matrix-js-sdk/lib/", "matrix-js-sdk/lib/**"], + message: "Please use matrix-js-sdk/src/* instead", + }, + { + group: ["matrix-react-sdk/lib", "matrix-react-sdk/lib/", "matrix-react-sdk/lib/**"], + message: "Please use matrix-react-sdk/src/* instead", + }, + ], + }, + ], + }, }, - }, { - files: [ - "test/**/*.{ts,tsx}", - ], - rules: { - // We don't need super strict typing in test utilities - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/explicit-member-accessibility": "off", + { + files: ["test/**/*.{ts,tsx}"], + rules: { + // We don't need super strict typing in test utilities + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/explicit-member-accessibility": "off", + }, }, - }], + ], }; diff --git a/.github/ISSUE_TEMPLATE/bug-desktop.yml b/.github/ISSUE_TEMPLATE/bug-desktop.yml index be3d623d88d..529c0a0ebcf 100644 --- a/.github/ISSUE_TEMPLATE/bug-desktop.yml +++ b/.github/ISSUE_TEMPLATE/bug-desktop.yml @@ -2,75 +2,75 @@ name: Bug report for the Element desktop app (not in a browser) description: File a bug report if you are using the desktop Element application. labels: [T-Defect] body: - - type: markdown - attributes: - value: | - Thanks for taking the time to fill out this bug report! + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! - Please report security issues by email to security@matrix.org - - type: textarea - id: reproduction-steps - attributes: - label: Steps to reproduce - description: Please attach screenshots, videos or logs if you can. - placeholder: Tell us what you see! - value: | - 1. Where are you starting? What can you see? - 2. What do you click? - 3. More steps… - validations: - required: true - - type: textarea - id: result - attributes: - label: Outcome - placeholder: Tell us what went wrong - value: | - #### What did you expect? + Please report security issues by email to security@matrix.org + - type: textarea + id: reproduction-steps + attributes: + label: Steps to reproduce + description: Please attach screenshots, videos or logs if you can. + placeholder: Tell us what you see! + value: | + 1. Where are you starting? What can you see? + 2. What do you click? + 3. More steps… + validations: + required: true + - type: textarea + id: result + attributes: + label: Outcome + placeholder: Tell us what went wrong + value: | + #### What did you expect? - #### What happened instead? - validations: - required: true - - type: input - id: os - attributes: - label: Operating system - placeholder: Windows, macOS, Ubuntu, Arch Linux… - validations: - required: false - - type: input - id: version - attributes: - label: Application version - description: You can find the version information in Settings -> Help & About. - placeholder: e.g. Element version 1.7.34, olm version 3.2.3 - validations: - required: false - - type: input - id: source - attributes: - label: How did you install the app? - description: Where did you install the app from? Please give a link or a description. - placeholder: e.g. From https://element.io/get-started - validations: - required: false - - type: input - id: homeserver - attributes: - label: Homeserver - description: | - Which server is your account registered on? If it is a local or non-public homeserver, please tell us what is the homeserver implementation (ex: Synapse/Dendrite/etc.) and the version. - placeholder: e.g. matrix.org or Synapse 1.50.0rc1 - validations: - required: false - - type: dropdown - id: rageshake - attributes: - label: Will you send logs? - description: | - Did you know that you can send a /rageshake command from your application to submit logs for this issue? Trigger the defect, then type `/rageshake` into the message input area followed by a description of the problem and send the command. You will be able to add a link to this defect report and submit anonymous logs to the developers. - options: - - 'Yes' - - 'No' - validations: - required: true + #### What happened instead? + validations: + required: true + - type: input + id: os + attributes: + label: Operating system + placeholder: Windows, macOS, Ubuntu, Arch Linux… + validations: + required: false + - type: input + id: version + attributes: + label: Application version + description: You can find the version information in Settings -> Help & About. + placeholder: e.g. Element version 1.7.34, olm version 3.2.3 + validations: + required: false + - type: input + id: source + attributes: + label: How did you install the app? + description: Where did you install the app from? Please give a link or a description. + placeholder: e.g. From https://element.io/get-started + validations: + required: false + - type: input + id: homeserver + attributes: + label: Homeserver + description: | + Which server is your account registered on? If it is a local or non-public homeserver, please tell us what is the homeserver implementation (ex: Synapse/Dendrite/etc.) and the version. + placeholder: e.g. matrix.org or Synapse 1.50.0rc1 + validations: + required: false + - type: dropdown + id: rageshake + attributes: + label: Will you send logs? + description: | + Did you know that you can send a /rageshake command from your application to submit logs for this issue? Trigger the defect, then type `/rageshake` into the message input area followed by a description of the problem and send the command. You will be able to add a link to this defect report and submit anonymous logs to the developers. + options: + - "Yes" + - "No" + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/bug-web.yml b/.github/ISSUE_TEMPLATE/bug-web.yml index 99691f8a7ae..24ab78a153d 100644 --- a/.github/ISSUE_TEMPLATE/bug-web.yml +++ b/.github/ISSUE_TEMPLATE/bug-web.yml @@ -2,83 +2,83 @@ name: Bug report for Element Web (in browser) description: File a bug report if you are using Element in a web browser like Firefox, Chrome, Edge, and so on. labels: [T-Defect] body: - - type: markdown - attributes: - value: | - Thanks for taking the time to fill out this bug report! + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! - Please report security issues by email to security@matrix.org - - type: textarea - id: reproduction-steps - attributes: - label: Steps to reproduce - description: Please attach screenshots, videos or logs if you can. - placeholder: Tell us what you see! - value: | - 1. Where are you starting? What can you see? - 2. What do you click? - 3. More steps… - validations: - required: true - - type: textarea - id: result - attributes: - label: Outcome - placeholder: Tell us what went wrong - value: | - #### What did you expect? + Please report security issues by email to security@matrix.org + - type: textarea + id: reproduction-steps + attributes: + label: Steps to reproduce + description: Please attach screenshots, videos or logs if you can. + placeholder: Tell us what you see! + value: | + 1. Where are you starting? What can you see? + 2. What do you click? + 3. More steps… + validations: + required: true + - type: textarea + id: result + attributes: + label: Outcome + placeholder: Tell us what went wrong + value: | + #### What did you expect? - #### What happened instead? - validations: - required: true - - type: input - id: os - attributes: - label: Operating system - placeholder: Windows, macOS, Ubuntu, Arch Linux… - validations: - required: false - - type: input - id: browser - attributes: - label: Browser information - description: Which browser are you using? Which version? - placeholder: e.g. Chromium Version 92.0.4515.131 - validations: - required: false - - type: input - id: webapp-url - attributes: - label: URL for webapp - description: Which URL are you using to access the webapp? If a private server, tell us what version of Element Web you are using. - placeholder: e.g. develop.element.io, app.element.io - validations: - required: false - - type: input - id: version - attributes: - label: Application version - description: You can find the version information in Settings -> Help & About. - placeholder: e.g. Element version 1.7.34, olm version 3.2.3 - validations: - required: false - - type: input - id: homeserver - attributes: - label: Homeserver - description: | - Which server is your account registered on? If it is a local or non-public homeserver, please tell us what is the homeserver implementation (ex: Synapse/Dendrite/etc.) and the version. - placeholder: e.g. matrix.org or Synapse 1.50.0rc1 - validations: - required: false - - type: dropdown - id: rageshake - attributes: - label: Will you send logs? - description: | - Did you know that you can send a /rageshake command from the web application to submit logs for this issue? Trigger the defect, then type `/rageshake` into the message input area followed by a description of the problem and send the command. You will be able to add a link to this defect report and submit anonymous logs to the developers. - options: - - 'Yes' - - 'No' - validations: - required: true + #### What happened instead? + validations: + required: true + - type: input + id: os + attributes: + label: Operating system + placeholder: Windows, macOS, Ubuntu, Arch Linux… + validations: + required: false + - type: input + id: browser + attributes: + label: Browser information + description: Which browser are you using? Which version? + placeholder: e.g. Chromium Version 92.0.4515.131 + validations: + required: false + - type: input + id: webapp-url + attributes: + label: URL for webapp + description: Which URL are you using to access the webapp? If a private server, tell us what version of Element Web you are using. + placeholder: e.g. develop.element.io, app.element.io + validations: + required: false + - type: input + id: version + attributes: + label: Application version + description: You can find the version information in Settings -> Help & About. + placeholder: e.g. Element version 1.7.34, olm version 3.2.3 + validations: + required: false + - type: input + id: homeserver + attributes: + label: Homeserver + description: | + Which server is your account registered on? If it is a local or non-public homeserver, please tell us what is the homeserver implementation (ex: Synapse/Dendrite/etc.) and the version. + placeholder: e.g. matrix.org or Synapse 1.50.0rc1 + validations: + required: false + - type: dropdown + id: rageshake + attributes: + label: Will you send logs? + description: | + Did you know that you can send a /rageshake command from the web application to submit logs for this issue? Trigger the defect, then type `/rageshake` into the message input area followed by a description of the problem and send the command. You will be able to add a link to this defect report and submit anonymous logs to the developers. + options: + - "Yes" + - "No" + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index cbda0e66350..b34e4493684 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,5 @@ blank_issues_enabled: false contact_links: - - name: Questions & support - url: https://matrix.to/#/#element-web:matrix.org - about: Please ask and answer questions here. + - name: Questions & support + url: https://matrix.to/#/#element-web:matrix.org + about: Please ask and answer questions here. diff --git a/.github/ISSUE_TEMPLATE/enhancement.yml b/.github/ISSUE_TEMPLATE/enhancement.yml index 02ed7ddbf28..e6784b1a90a 100644 --- a/.github/ISSUE_TEMPLATE/enhancement.yml +++ b/.github/ISSUE_TEMPLATE/enhancement.yml @@ -2,35 +2,35 @@ name: Enhancement request description: Do you have a suggestion or feature request? labels: [T-Enhancement] body: - - type: markdown - attributes: - value: | - Thank you for taking the time to propose an enhancement to an existing feature. If you would like to propose a new feature or a major cross-platform change, please [start a discussion here](https://github.com/vector-im/element-meta/discussions/new?category=ideas). - - type: textarea - id: usecase - attributes: - label: Your use case - description: What would you like to be able to do? Please feel welcome to include screenshots or mock ups. - placeholder: Tell us what you would like to do! - value: | - #### What would you like to do? + - type: markdown + attributes: + value: | + Thank you for taking the time to propose an enhancement to an existing feature. If you would like to propose a new feature or a major cross-platform change, please [start a discussion here](https://github.com/vector-im/element-meta/discussions/new?category=ideas). + - type: textarea + id: usecase + attributes: + label: Your use case + description: What would you like to be able to do? Please feel welcome to include screenshots or mock ups. + placeholder: Tell us what you would like to do! + value: | + #### What would you like to do? - #### Why would you like to do it? + #### Why would you like to do it? - #### How would you like to achieve it? - validations: - required: true - - type: textarea - id: alternative - attributes: - label: Have you considered any alternatives? - placeholder: A clear and concise description of any alternative solutions or features you've considered. - validations: - required: false - - type: textarea - id: additional-context - attributes: - label: Additional context - placeholder: Is there anything else you'd like to add? - validations: - required: false + #### How would you like to achieve it? + validations: + required: true + - type: textarea + id: alternative + attributes: + label: Have you considered any alternatives? + placeholder: A clear and concise description of any alternative solutions or features you've considered. + validations: + required: false + - type: textarea + id: additional-context + attributes: + label: Additional context + placeholder: Is there anything else you'd like to add? + validations: + required: false diff --git a/.github/renovate.json b/.github/renovate.json index 91ed4799766..76320426d9e 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,6 +1,4 @@ { - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": [ - "github>matrix-org/renovate-config-element-web" - ] + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["github>matrix-org/renovate-config-element-web"] } diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml index 10bda8e205f..32deb2f2b57 100644 --- a/.github/workflows/backport.yml +++ b/.github/workflows/backport.yml @@ -1,30 +1,30 @@ name: Backport on: - pull_request_target: - types: - - closed - - labeled - branches: - - develop + pull_request_target: + types: + - closed + - labeled + branches: + - develop jobs: - backport: - name: Backport - runs-on: ubuntu-latest - # Only react to merged PRs for security reasons. - # See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target. - if: > - github.event.pull_request.merged - && ( - github.event.action == 'closed' - || ( - github.event.action == 'labeled' - && contains(github.event.label.name, 'backport') - ) - ) - steps: - - uses: tibdex/backport@v2 - with: - labels_template: "<%= JSON.stringify([...labels, 'X-Release-Blocker']) %>" - # We can't use GITHUB_TOKEN here or CI won't run on the new PR - github_token: ${{ secrets.ELEMENT_BOT_TOKEN }} + backport: + name: Backport + runs-on: ubuntu-latest + # Only react to merged PRs for security reasons. + # See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target. + if: > + github.event.pull_request.merged + && ( + github.event.action == 'closed' + || ( + github.event.action == 'labeled' + && contains(github.event.label.name, 'backport') + ) + ) + steps: + - uses: tibdex/backport@v2 + with: + labels_template: "<%= JSON.stringify([...labels, 'X-Release-Blocker']) %>" + # We can't use GITHUB_TOKEN here or CI won't run on the new PR + github_token: ${{ secrets.ELEMENT_BOT_TOKEN }} diff --git a/.github/workflows/issue_closed.yml b/.github/workflows/issue_closed.yml index 935740f299a..751b2104bbf 100644 --- a/.github/workflows/issue_closed.yml +++ b/.github/workflows/issue_closed.yml @@ -2,155 +2,155 @@ # For all closed (completed) issues, cascade the closure onto any referenced rageshakes # For all closed (not planned) issues, comment on rageshakes to move them into the canonical issue if one exists on: - issues: - types: [ closed ] + issues: + types: [closed] jobs: - tidy: - name: Tidy closed issues - runs-on: ubuntu-latest - steps: - - uses: actions/github-script@v5 - id: main - with: - # PAT needed as the GITHUB_TOKEN won't be able to see cross-references from other orgs (matrix-org) - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - script: | - const variables = { - owner: context.repo.owner, - name: context.repo.repo, - number: context.issue.number, - }; + tidy: + name: Tidy closed issues + runs-on: ubuntu-latest + steps: + - uses: actions/github-script@v6 + id: main + with: + # PAT needed as the GITHUB_TOKEN won't be able to see cross-references from other orgs (matrix-org) + github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} + script: | + const variables = { + owner: context.repo.owner, + name: context.repo.repo, + number: context.issue.number, + }; - const query = `query($owner:String!, $name:String!, $number:Int!) { - repository(owner: $owner, name: $name) { - issue(number: $number) { - stateReason, - timelineItems(first: 100, itemTypes: [MARKED_AS_DUPLICATE_EVENT, UNMARKED_AS_DUPLICATE_EVENT, CROSS_REFERENCED_EVENT]) { - edges { - node { - __typename - ... on MarkedAsDuplicateEvent { - canonical { - ... on Issue { - repository { - nameWithOwner + const query = `query($owner:String!, $name:String!, $number:Int!) { + repository(owner: $owner, name: $name) { + issue(number: $number) { + stateReason, + timelineItems(first: 100, itemTypes: [MARKED_AS_DUPLICATE_EVENT, UNMARKED_AS_DUPLICATE_EVENT, CROSS_REFERENCED_EVENT]) { + edges { + node { + __typename + ... on MarkedAsDuplicateEvent { + canonical { + ... on Issue { + repository { + nameWithOwner + } + number + } + ... on PullRequest { + repository { + nameWithOwner + } + number + } + } + } + ... on UnmarkedAsDuplicateEvent { + canonical { + ... on Issue { + repository { + nameWithOwner + } + number + } + ... on PullRequest { + repository { + nameWithOwner + } + number + } + } + } + ... on CrossReferencedEvent { + source { + ... on Issue { + repository { + nameWithOwner + } + number + } + ... on PullRequest { + repository { + nameWithOwner + } + number + } + } + } + } } - number - } - ... on PullRequest { - repository { - nameWithOwner - } - number - } - } - } - ... on UnmarkedAsDuplicateEvent { - canonical { - ... on Issue { - repository { - nameWithOwner - } - number - } - ... on PullRequest { - repository { - nameWithOwner - } - number } } } - ... on CrossReferencedEvent { - source { - ... on Issue { - repository { - nameWithOwner - } - number - } - ... on PullRequest { - repository { - nameWithOwner - } - number - } - } - } - } - } - } - } - } - }`; + }`; - const result = await github.graphql(query, variables); - const { stateReason, timelineItems: { edges } } = result.repository.issue; + const result = await github.graphql(query, variables); + const { stateReason, timelineItems: { edges } } = result.repository.issue; - const RAGESHAKE_OWNER = "matrix-org"; - const RAGESHAKE_REPO = "element-web-rageshakes"; - const rageshakes = new Set(); - const duplicateOf = new Set(); + const RAGESHAKE_OWNER = "matrix-org"; + const RAGESHAKE_REPO = "element-web-rageshakes"; + const rageshakes = new Set(); + const duplicateOf = new Set(); - console.log("Edges: ", JSON.stringify(edges)); + console.log("Edges: ", JSON.stringify(edges)); - for (const { node } of edges) { - switch(node.__typename) { - case "MarkedAsDuplicateEvent": - duplicateOf.add(node.canonical.repository.nameWithOwner + "#" + node.canonical.number); - break; - case "UnmarkedAsDuplicateEvent": - duplicateOf.remove(node.canonical.repository.nameWithOwner + "#" + node.canonical.number); - break; - case "CrossReferencedEvent": - if (node.source.repository.nameWithOwner === (RAGESHAKE_OWNER + "/" + RAGESHAKE_REPO)) { - rageshakes.add(node.source.number); - } - break; - } - } + for (const { node } of edges) { + switch(node.__typename) { + case "MarkedAsDuplicateEvent": + duplicateOf.add(node.canonical.repository.nameWithOwner + "#" + node.canonical.number); + break; + case "UnmarkedAsDuplicateEvent": + duplicateOf.remove(node.canonical.repository.nameWithOwner + "#" + node.canonical.number); + break; + case "CrossReferencedEvent": + if (node.source.repository.nameWithOwner === (RAGESHAKE_OWNER + "/" + RAGESHAKE_REPO)) { + rageshakes.add(node.source.number); + } + break; + } + } - console.log("Duplicate of: ", duplicateOf); - console.log("Found rageshakes: ", rageshakes); + console.log("Duplicate of: ", duplicateOf); + console.log("Found rageshakes: ", rageshakes); - if (duplicateOf.size) { - const body = Array.from(duplicateOf).join("\n"); + if (duplicateOf.size) { + const body = Array.from(duplicateOf).join("\n"); - // Comment on all rageshakes to create relationship to the issue this was closed as duplicate of - for (const rageshake of rageshakes) { - github.rest.issues.createComment({ - owner: RAGESHAKE_OWNER, - repo: RAGESHAKE_REPO, - issue_number: rageshake, - body, - }); - } + // Comment on all rageshakes to create relationship to the issue this was closed as duplicate of + for (const rageshake of rageshakes) { + github.rest.issues.createComment({ + owner: RAGESHAKE_OWNER, + repo: RAGESHAKE_REPO, + issue_number: rageshake, + body, + }); + } - // Duplicate was closed with wrong reason, fix it - if (stateReason === "COMPLETED") { - core.setOutput("closeAsNotPlanned", "true"); - } - } else { - // This issue was closed, close all related rageshakes - for (const rageshake of rageshakes) { - github.rest.issues.update({ - owner: RAGESHAKE_OWNER, - repo: RAGESHAKE_REPO, - issue_number: rageshake, - state: "closed", - }); - } - } - - uses: actions/github-script@v5 - name: Close duplicate as Not Planned - if: steps.main.outputs.closeAsNotPlanned - with: - # We do this step separately, and with the default token so as to not re-trigger this workflow when re-closing - script: | - await github.graphql(`mutation($id:ID!) { - closeIssue(input: { issueId:$id, stateReason:NOT_PLANNED }) { - clientMutationId - } - }`, { - id: context.payload.issue.node_id, - }); + // Duplicate was closed with wrong reason, fix it + if (stateReason === "COMPLETED") { + core.setOutput("closeAsNotPlanned", "true"); + } + } else { + // This issue was closed, close all related rageshakes + for (const rageshake of rageshakes) { + github.rest.issues.update({ + owner: RAGESHAKE_OWNER, + repo: RAGESHAKE_REPO, + issue_number: rageshake, + state: "closed", + }); + } + } + - uses: actions/github-script@v6 + name: Close duplicate as Not Planned + if: steps.main.outputs.closeAsNotPlanned + with: + # We do this step separately, and with the default token so as to not re-trigger this workflow when re-closing + script: | + await github.graphql(`mutation($id:ID!) { + closeIssue(input: { issueId:$id, stateReason:NOT_PLANNED }) { + clientMutationId + } + }`, { + id: context.payload.issue.node_id, + }); diff --git a/.github/workflows/static_analysis.yaml b/.github/workflows/static_analysis.yaml index 711efc024dd..e06fb5d7c62 100644 --- a/.github/workflows/static_analysis.yaml +++ b/.github/workflows/static_analysis.yaml @@ -1,119 +1,119 @@ name: Static Analysis on: - pull_request: { } - push: - branches: [ develop, master ] - repository_dispatch: - types: [ element-web-notify ] + pull_request: {} + push: + branches: [develop, master] + repository_dispatch: + types: [element-web-notify] env: - # These must be set for fetchdep.sh to get the right branch - REPOSITORY: ${{ github.repository }} - PR_NUMBER: ${{ github.event.pull_request.number }} + # These must be set for fetchdep.sh to get the right branch + REPOSITORY: ${{ github.repository }} + PR_NUMBER: ${{ github.event.pull_request.number }} jobs: - ts_lint: - name: "Typescript Syntax Check" - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - uses: actions/setup-node@v3 - with: - cache: 'yarn' - - - name: Install Dependencies - run: "./scripts/layered.sh" - - - name: Typecheck - run: "yarn run lint:types" - - tsc-strict: - name: Typescript Strict Error Checker - if: github.event_name == 'pull_request' - runs-on: ubuntu-latest - permissions: - pull-requests: read - checks: write - steps: - - uses: actions/checkout@v3 - - - name: Install Deps - run: "scripts/layered.sh" - - - name: Get diff lines - id: diff - uses: Equip-Collaboration/diff-line-numbers@v1.0.0 - with: - include: '["\\.tsx?$"]' - - - name: Detecting files changed - id: files - uses: futuratrepadeira/changed-files@v4.0.0 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - pattern: '^.*\.tsx?$' - - - uses: t3chguy/typescript-check-action@main - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - use-check: false - check-fail-mode: added - output-behaviour: annotate - ts-extra-args: '--strict --noImplicitAny' - files-changed: ${{ steps.files.outputs.files_updated }} - files-added: ${{ steps.files.outputs.files_created }} - files-deleted: ${{ steps.files.outputs.files_deleted }} - line-numbers: ${{ steps.diff.outputs.lineNumbers }} - - i18n_lint: - name: "i18n Check" - uses: matrix-org/matrix-react-sdk/.github/workflows/i18n_check.yml@develop - - js_lint: - name: "ESLint" - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - uses: actions/setup-node@v3 - with: - cache: 'yarn' - - # Does not need branch matching as only analyses this layer - - name: Install Deps - run: "yarn install --pure-lockfile" - - - name: Run Linter - run: "yarn run lint:js" - - style_lint: - name: "Style Lint" - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - uses: actions/setup-node@v3 - with: - cache: 'yarn' - - # Needs branch matching as it inherits .stylelintrc.js from matrix-react-sdk - - name: Install Dependencies - run: "./scripts/layered.sh" - - - name: Run Linter - run: "yarn run lint:style" - - analyse_dead_code: - name: "Analyse Dead Code" - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - uses: actions/setup-node@v3 - with: - cache: 'yarn' - - - name: Install Deps - run: "scripts/layered.sh" - - - name: Dead Code Analysis - run: "yarn run analyse:unused-exports" + ts_lint: + name: "Typescript Syntax Check" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-node@v3 + with: + cache: "yarn" + + - name: Install Dependencies + run: "./scripts/layered.sh" + + - name: Typecheck + run: "yarn run lint:types" + + tsc-strict: + name: Typescript Strict Error Checker + if: github.event_name == 'pull_request' + runs-on: ubuntu-latest + permissions: + pull-requests: read + checks: write + steps: + - uses: actions/checkout@v3 + + - name: Install Deps + run: "scripts/layered.sh" + + - name: Get diff lines + id: diff + uses: Equip-Collaboration/diff-line-numbers@v1.0.0 + with: + include: '["\\.tsx?$"]' + + - name: Detecting files changed + id: files + uses: futuratrepadeira/changed-files@v4.0.0 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + pattern: '^.*\.tsx?$' + + - uses: t3chguy/typescript-check-action@main + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + use-check: false + check-fail-mode: added + output-behaviour: annotate + ts-extra-args: "--strict --noImplicitAny" + files-changed: ${{ steps.files.outputs.files_updated }} + files-added: ${{ steps.files.outputs.files_created }} + files-deleted: ${{ steps.files.outputs.files_deleted }} + line-numbers: ${{ steps.diff.outputs.lineNumbers }} + + i18n_lint: + name: "i18n Check" + uses: matrix-org/matrix-react-sdk/.github/workflows/i18n_check.yml@develop + + js_lint: + name: "ESLint" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-node@v3 + with: + cache: "yarn" + + # Does not need branch matching as only analyses this layer + - name: Install Deps + run: "yarn install --pure-lockfile" + + - name: Run Linter + run: "yarn run lint:js" + + style_lint: + name: "Style Lint" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-node@v3 + with: + cache: "yarn" + + # Needs branch matching as it inherits .stylelintrc.js from matrix-react-sdk + - name: Install Dependencies + run: "./scripts/layered.sh" + + - name: Run Linter + run: "yarn run lint:style" + + analyse_dead_code: + name: "Analyse Dead Code" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-node@v3 + with: + cache: "yarn" + + - name: Install Deps + run: "scripts/layered.sh" + + - name: Dead Code Analysis + run: "yarn run analyse:unused-exports" diff --git a/.github/workflows/triage-assigned.yml b/.github/workflows/triage-assigned.yml index acb23c469af..cc28b731039 100644 --- a/.github/workflows/triage-assigned.yml +++ b/.github/workflows/triage-assigned.yml @@ -1,18 +1,19 @@ name: Move issued assigned to specific team members to their boards on: - issues: - types: [ assigned ] + issues: + types: [assigned] jobs: - web-app-team: - runs-on: ubuntu-latest - if: | - contains(github.event.issue.assignees.*.login, 't3chguy') || - contains(github.event.issue.assignees.*.login, 'turt2live') - steps: - - uses: alex-page/github-project-automation-plus@be108970955040d35dd6d053c3aff3faaf678026 - with: - project: Web App Team - column: "In Progress" - repo-token: ${{ secrets.ELEMENT_BOT_TOKEN }} + web-app-team: + runs-on: ubuntu-latest + if: | + contains(github.event.issue.assignees.*.login, 't3chguy') || + contains(github.event.issue.assignees.*.login, 'andybalaam') || + contains(github.event.issue.assignees.*.login, 'turt2live') + steps: + - uses: alex-page/github-project-automation-plus@1f8873e97e3c8f58161a323b7c568c1f623a1c4d + with: + project: Web App Team + column: "In Progress" + repo-token: ${{ secrets.ELEMENT_BOT_TOKEN }} diff --git a/.github/workflows/triage-incoming.yml b/.github/workflows/triage-incoming.yml index 788e777fb5b..d9e4834fa8b 100644 --- a/.github/workflows/triage-incoming.yml +++ b/.github/workflows/triage-incoming.yml @@ -1,15 +1,15 @@ name: Move new issues into Issue triage board on: - issues: - types: [ opened ] + issues: + types: [opened] jobs: - automate-project-columns: - runs-on: ubuntu-latest - steps: - - uses: alex-page/github-project-automation-plus@be108970955040d35dd6d053c3aff3faaf678026 - with: - project: Issue triage - column: Incoming - repo-token: ${{ secrets.ELEMENT_BOT_TOKEN }} + automate-project-columns: + runs-on: ubuntu-latest + steps: + - uses: alex-page/github-project-automation-plus@1f8873e97e3c8f58161a323b7c568c1f623a1c4d + with: + project: Issue triage + column: Incoming + repo-token: ${{ secrets.ELEMENT_BOT_TOKEN }} diff --git a/.github/workflows/triage-labelled.yml b/.github/workflows/triage-labelled.yml index daf7fd0c88f..15d6ff5c914 100644 --- a/.github/workflows/triage-labelled.yml +++ b/.github/workflows/triage-labelled.yml @@ -1,359 +1,359 @@ name: Move labelled issues to correct projects on: - issues: - types: [labeled] + issues: + types: [labeled] jobs: - apply_Z-Labs_label: - name: Add Z-Labs label for features behind labs flags - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'A-Maths') || - contains(github.event.issue.labels.*.name, 'A-Message-Pinning') || - contains(github.event.issue.labels.*.name, 'A-Location-Sharing') || - contains(github.event.issue.labels.*.name, 'Z-IA') || - contains(github.event.issue.labels.*.name, 'A-Themes-Custom') || - contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') || - contains(github.event.issue.labels.*.name, 'A-Tags') || - contains(github.event.issue.labels.*.name, 'A-Video-Rooms') || - contains(github.event.issue.labels.*.name, 'A-Message-Starring') || - contains(github.event.issue.labels.*.name, 'A-Rich-Text-Editor') || - contains(github.event.issue.labels.*.name, 'A-Element-Call') - steps: - - uses: actions/github-script@v5 - with: - script: | - github.rest.issues.addLabels({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - labels: ['Z-Labs'] - }) + apply_Z-Labs_label: + name: Add Z-Labs label for features behind labs flags + runs-on: ubuntu-latest + if: > + contains(github.event.issue.labels.*.name, 'A-Maths') || + contains(github.event.issue.labels.*.name, 'A-Message-Pinning') || + contains(github.event.issue.labels.*.name, 'A-Location-Sharing') || + contains(github.event.issue.labels.*.name, 'Z-IA') || + contains(github.event.issue.labels.*.name, 'A-Themes-Custom') || + contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') || + contains(github.event.issue.labels.*.name, 'A-Tags') || + contains(github.event.issue.labels.*.name, 'A-Video-Rooms') || + contains(github.event.issue.labels.*.name, 'A-Message-Starring') || + contains(github.event.issue.labels.*.name, 'A-Rich-Text-Editor') || + contains(github.event.issue.labels.*.name, 'A-Element-Call') + steps: + - uses: actions/github-script@v6 + with: + script: | + github.rest.issues.addLabels({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ['Z-Labs'] + }) - apply_Help-Wanted_label: - name: Add "Help Wanted" label to all "good first issue" and Hacktoberfest - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'good first issue') || - contains(github.event.issue.labels.*.name, 'Hacktoberfest') - steps: - - uses: actions/github-script@v5 - with: - script: | - github.rest.issues.addLabels({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - labels: ['Help Wanted'] - }) + apply_Help-Wanted_label: + name: Add "Help Wanted" label to all "good first issue" and Hacktoberfest + runs-on: ubuntu-latest + if: > + contains(github.event.issue.labels.*.name, 'good first issue') || + contains(github.event.issue.labels.*.name, 'Hacktoberfest') + steps: + - uses: actions/github-script@v6 + with: + script: | + github.rest.issues.addLabels({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ['Help Wanted'] + }) - move_needs_info_issues: - name: X-Needs-Info issues to Need info column on triage board - runs-on: ubuntu-latest - steps: - - uses: konradpabjan/move-labeled-or-milestoned-issue@190352295fe309fcb113b49193bc81d9aaa9cb01 - with: - action-token: "${{ secrets.ELEMENT_BOT_TOKEN }}" - project-url: "https://github.com/vector-im/element-web/projects/27" - column-name: "Need info" - label-name: "X-Needs-Info" + move_needs_info_issues: + name: X-Needs-Info issues to Need info column on triage board + runs-on: ubuntu-latest + steps: + - uses: konradpabjan/move-labeled-or-milestoned-issue@190352295fe309fcb113b49193bc81d9aaa9cb01 + with: + action-token: "${{ secrets.ELEMENT_BOT_TOKEN }}" + project-url: "https://github.com/vector-im/element-web/projects/27" + column-name: "Need info" + label-name: "X-Needs-Info" - add_priority_design_issues_to_project: - name: P1 X-Needs-Design to Design project board - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'X-Needs-Design') && - (contains(github.event.issue.labels.*.name, 'S-Critical') && - (contains(github.event.issue.labels.*.name, 'O-Frequent') || - contains(github.event.issue.labels.*.name, 'O-Occasional')) || - contains(github.event.issue.labels.*.name, 'S-Major') && - contains(github.event.issue.labels.*.name, 'O-Frequent') || - contains(github.event.issue.labels.*.name, 'A11y')) - steps: - - uses: octokit/graphql-action@v2.x - id: add_to_project - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - mutation add_to_project($projectid:ID!,$contentid:ID!) { - addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { - item { - id - } - } - } - projectid: ${{ env.PROJECT_ID }} - contentid: ${{ github.event.issue.node_id }} - env: - PROJECT_ID: "PN_kwDOAM0swc0sUA" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} + add_priority_design_issues_to_project: + name: P1 X-Needs-Design to Design project board + runs-on: ubuntu-latest + if: > + contains(github.event.issue.labels.*.name, 'X-Needs-Design') && + (contains(github.event.issue.labels.*.name, 'S-Critical') && + (contains(github.event.issue.labels.*.name, 'O-Frequent') || + contains(github.event.issue.labels.*.name, 'O-Occasional')) || + contains(github.event.issue.labels.*.name, 'S-Major') && + contains(github.event.issue.labels.*.name, 'O-Frequent') || + contains(github.event.issue.labels.*.name, 'A11y')) + steps: + - uses: octokit/graphql-action@v2.x + id: add_to_project + with: + headers: '{"GraphQL-Features": "projects_next_graphql"}' + query: | + mutation add_to_project($projectid:ID!,$contentid:ID!) { + addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { + item { + id + } + } + } + projectid: ${{ env.PROJECT_ID }} + contentid: ${{ github.event.issue.node_id }} + env: + PROJECT_ID: "PVT_kwDOAM0swc0sUA" + GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - add_product_issues: - name: X-Needs-Product to Design project board - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'X-Needs-Product') - steps: - - uses: octokit/graphql-action@v2.x - id: add_to_project - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - mutation add_to_project($projectid:ID!,$contentid:ID!) { - addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { - item { - id - } - } - } - projectid: ${{ env.PROJECT_ID }} - contentid: ${{ github.event.issue.node_id }} - env: - PROJECT_ID: "PN_kwDOAM0swc4AAg6N" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} + add_product_issues: + name: X-Needs-Product to product project board + runs-on: ubuntu-latest + if: > + contains(github.event.issue.labels.*.name, 'X-Needs-Product') + steps: + - uses: octokit/graphql-action@v2.x + id: add_to_project + with: + headers: '{"GraphQL-Features": "projects_next_graphql"}' + query: | + mutation add_to_project($projectid:ID!,$contentid:ID!) { + addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { + item { + id + } + } + } + projectid: ${{ env.PROJECT_ID }} + contentid: ${{ github.event.issue.node_id }} + env: + PROJECT_ID: "PVT_kwDOAM0swc4AAg6N" + GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - Delight_issues_to_board: - name: Delight issues to project board - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'A-New-Search-Experience') || - (contains(github.event.issue.labels.*.name, 'A-Threads') && - (contains(github.event.issue.labels.*.name, 'S-Major') || - contains(github.event.issue.labels.*.name, 'S-Critical'))) || - contains(github.event.issue.labels.*.name, 'Team: Delight') || - contains(github.event.issue.labels.*.name, 'Z-NewUserJourney') - steps: - - uses: octokit/graphql-action@v2.x - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - mutation add_to_project($projectid:ID!,$contentid:ID!) { - addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { - item { - id - } - } - } - projectid: ${{ env.PROJECT_ID }} - contentid: ${{ github.event.issue.node_id }} - env: - PROJECT_ID: "PN_kwDOAM0swc1HvQ" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - - Search_issues_to_board: - name: Search issues to project board - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'A-New-Search-Experience') - steps: - - uses: octokit/graphql-action@v2.x - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - mutation add_to_project($projectid:ID!,$contentid:ID!) { - addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { - item { - id - } - } - } - projectid: ${{ env.PROJECT_ID }} - contentid: ${{ github.event.issue.node_id }} - env: - PROJECT_ID: "PN_kwDOAM0swc4ADtaO" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} + Delight_issues_to_board: + name: Delight issues to project board + runs-on: ubuntu-latest + if: > + contains(github.event.issue.labels.*.name, 'A-New-Search-Experience') || + (contains(github.event.issue.labels.*.name, 'A-Threads') && + (contains(github.event.issue.labels.*.name, 'S-Major') || + contains(github.event.issue.labels.*.name, 'S-Critical'))) || + contains(github.event.issue.labels.*.name, 'Team: Delight') || + contains(github.event.issue.labels.*.name, 'Z-NewUserJourney') + steps: + - uses: octokit/graphql-action@v2.x + with: + headers: '{"GraphQL-Features": "projects_next_graphql"}' + query: | + mutation add_to_project($projectid:ID!,$contentid:ID!) { + addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { + item { + id + } + } + } + projectid: ${{ env.PROJECT_ID }} + contentid: ${{ github.event.issue.node_id }} + env: + PROJECT_ID: "PVT_kwDOAM0swc1HvQ" + GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - move_voice-message_issues: - name: A-Voice Messages to voice message board - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'A-Voice Messages') - steps: - - uses: octokit/graphql-action@v2.x - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - mutation add_to_project($projectid:ID!,$contentid:ID!) { - addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { - item { - id - } - } - } - projectid: ${{ env.PROJECT_ID }} - contentid: ${{ github.event.issue.node_id }} - env: - PROJECT_ID: "PN_kwDOAM0swc2KCw" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} + Search_issues_to_board: + name: Search issues to project board + runs-on: ubuntu-latest + if: > + contains(github.event.issue.labels.*.name, 'A-New-Search-Experience') + steps: + - uses: octokit/graphql-action@v2.x + with: + headers: '{"GraphQL-Features": "projects_next_graphql"}' + query: | + mutation add_to_project($projectid:ID!,$contentid:ID!) { + addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { + item { + id + } + } + } + projectid: ${{ env.PROJECT_ID }} + contentid: ${{ github.event.issue.node_id }} + env: + PROJECT_ID: "PVT_kwDOAM0swc4ADtaO" + GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - move_message_bubbles_issues: - name: A-Message-Bubbles to Message bubbles board - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'A-Message-Bubbles') - steps: - - uses: octokit/graphql-action@v2.x - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - mutation add_to_project($projectid:ID!,$contentid:ID!) { - addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { - item { - id - } - } - } - projectid: ${{ env.PROJECT_ID }} - contentid: ${{ github.event.issue.node_id }} - env: - PROJECT_ID: "PN_kwDOAM0swc3m-g" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} + move_voice-message_issues: + name: A-Voice Messages to voice message board + runs-on: ubuntu-latest + if: > + contains(github.event.issue.labels.*.name, 'A-Voice Messages') + steps: + - uses: octokit/graphql-action@v2.x + with: + headers: '{"GraphQL-Features": "projects_next_graphql"}' + query: | + mutation add_to_project($projectid:ID!,$contentid:ID!) { + addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { + item { + id + } + } + } + projectid: ${{ env.PROJECT_ID }} + contentid: ${{ github.event.issue.node_id }} + env: + PROJECT_ID: "PVT_kwDOAM0swc2KCw" + GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - move_ftue_issues: - name: Z-FTUE issues to the FTUE project board - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'Z-FTUE') - steps: - - uses: octokit/graphql-action@v2.x - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - mutation add_to_project($projectid:ID!,$contentid:ID!) { - addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { - item { - id - } - } - } - projectid: ${{ env.PROJECT_ID }} - contentid: ${{ github.event.issue.node_id }} - env: - PROJECT_ID: "PN_kwDOAM0swc4AAqVx" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} + move_message_bubbles_issues: + name: A-Message-Bubbles to Message bubbles board + runs-on: ubuntu-latest + if: > + contains(github.event.issue.labels.*.name, 'A-Message-Bubbles') + steps: + - uses: octokit/graphql-action@v2.x + with: + headers: '{"GraphQL-Features": "projects_next_graphql"}' + query: | + mutation add_to_project($projectid:ID!,$contentid:ID!) { + addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { + item { + id + } + } + } + projectid: ${{ env.PROJECT_ID }} + contentid: ${{ github.event.issue.node_id }} + env: + PROJECT_ID: "PVT_kwDOAM0swc3m-g" + GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - move_WTF_issues: - name: Z-WTF issues to the WTF project board - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'Z-WTF') - steps: - - uses: octokit/graphql-action@v2.x - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - mutation add_to_project($projectid:ID!,$contentid:ID!) { - addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { - item { - id - } - } - } - projectid: ${{ env.PROJECT_ID }} - contentid: ${{ github.event.issue.node_id }} - env: - PROJECT_ID: "PN_kwDOAM0swc4AArk0" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} + move_ftue_issues: + name: Z-FTUE issues to the FTUE project board + runs-on: ubuntu-latest + if: > + contains(github.event.issue.labels.*.name, 'Z-FTUE') + steps: + - uses: octokit/graphql-action@v2.x + with: + headers: '{"GraphQL-Features": "projects_next_graphql"}' + query: | + mutation add_to_project($projectid:ID!,$contentid:ID!) { + addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { + item { + id + } + } + } + projectid: ${{ env.PROJECT_ID }} + contentid: ${{ github.event.issue.node_id }} + env: + PROJECT_ID: "PVT_kwDOAM0swc4AAqVx" + GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - ps_features1: - name: Add labelled issues to PS features team 1 - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'A-Polls') || - contains(github.event.issue.labels.*.name, 'A-Location-Sharing') || - (contains(github.event.issue.labels.*.name, 'A-Voice-Messages') && - !contains(github.event.issue.labels.*.name, 'A-Broadcast')) || - (contains(github.event.issue.labels.*.name, 'A-Session-Mgmt') && - contains(github.event.issue.labels.*.name, 'A-User-Settings')) - steps: - - uses: octokit/graphql-action@v2.x - id: add_to_project - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - mutation add_to_project($projectid:ID!,$contentid:ID!) { - addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { - item { - id - } - } - } - projectid: ${{ env.PROJECT_ID }} - contentid: ${{ github.event.issue.node_id }} - env: - PROJECT_ID: "PVT_kwDOAM0swc4AHJKF" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} + move_WTF_issues: + name: Z-WTF issues to the WTF project board + runs-on: ubuntu-latest + if: > + contains(github.event.issue.labels.*.name, 'Z-WTF') + steps: + - uses: octokit/graphql-action@v2.x + with: + headers: '{"GraphQL-Features": "projects_next_graphql"}' + query: | + mutation add_to_project($projectid:ID!,$contentid:ID!) { + addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { + item { + id + } + } + } + projectid: ${{ env.PROJECT_ID }} + contentid: ${{ github.event.issue.node_id }} + env: + PROJECT_ID: "PVT_kwDOAM0swc4AArk0" + GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - ps_features2: - name: Add labelled issues to PS features team 2 - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'A-DM-Start') || - contains(github.event.issue.labels.*.name, 'A-Broadcast') - steps: - - uses: octokit/graphql-action@v2.x - id: add_to_project - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - mutation add_to_project($projectid:ID!,$contentid:ID!) { - addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { - item { - id - } - } - } - projectid: ${{ env.PROJECT_ID }} - contentid: ${{ github.event.issue.node_id }} - env: - PROJECT_ID: "PVT_kwDOAM0swc4AHJKd" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} + ps_features1: + name: Add labelled issues to PS features team 1 + runs-on: ubuntu-latest + if: > + contains(github.event.issue.labels.*.name, 'A-Polls') || + contains(github.event.issue.labels.*.name, 'A-Location-Sharing') || + (contains(github.event.issue.labels.*.name, 'A-Voice-Messages') && + !contains(github.event.issue.labels.*.name, 'A-Broadcast')) || + (contains(github.event.issue.labels.*.name, 'A-Session-Mgmt') && + contains(github.event.issue.labels.*.name, 'A-User-Settings')) + steps: + - uses: octokit/graphql-action@v2.x + id: add_to_project + with: + headers: '{"GraphQL-Features": "projects_next_graphql"}' + query: | + mutation add_to_project($projectid:ID!,$contentid:ID!) { + addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { + item { + id + } + } + } + projectid: ${{ env.PROJECT_ID }} + contentid: ${{ github.event.issue.node_id }} + env: + PROJECT_ID: "PVT_kwDOAM0swc4AHJKF" + GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - ps_features3: - name: Add labelled issues to PS features team 3 - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'A-Rich-Text-Editor') - steps: - - uses: octokit/graphql-action@v2.x - id: add_to_project - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - mutation add_to_project($projectid:ID!,$contentid:ID!) { - addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { - item { - id - } - } - } - projectid: ${{ env.PROJECT_ID }} - contentid: ${{ github.event.issue.node_id }} - env: - PROJECT_ID: "PVT_kwDOAM0swc4AHJKW" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} + ps_features2: + name: Add labelled issues to PS features team 2 + runs-on: ubuntu-latest + if: > + contains(github.event.issue.labels.*.name, 'A-DM-Start') || + contains(github.event.issue.labels.*.name, 'A-Broadcast') + steps: + - uses: octokit/graphql-action@v2.x + id: add_to_project + with: + headers: '{"GraphQL-Features": "projects_next_graphql"}' + query: | + mutation add_to_project($projectid:ID!,$contentid:ID!) { + addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { + item { + id + } + } + } + projectid: ${{ env.PROJECT_ID }} + contentid: ${{ github.event.issue.node_id }} + env: + PROJECT_ID: "PVT_kwDOAM0swc4AHJKd" + GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - voip: - name: Add labelled issues to VoIP project board - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'Team: VoIP') - steps: - - uses: octokit/graphql-action@v2.x - id: add_to_project - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - mutation add_to_project($projectid:ID!,$contentid:ID!) { - addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { - item { - id - } - } - } - projectid: ${{ env.PROJECT_ID }} - contentid: ${{ github.event.issue.node_id }} - env: - PROJECT_ID: "PVT_kwDOAM0swc4ABMIk" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} + ps_features3: + name: Add labelled issues to PS features team 3 + runs-on: ubuntu-latest + if: > + contains(github.event.issue.labels.*.name, 'A-Rich-Text-Editor') + steps: + - uses: octokit/graphql-action@v2.x + id: add_to_project + with: + headers: '{"GraphQL-Features": "projects_next_graphql"}' + query: | + mutation add_to_project($projectid:ID!,$contentid:ID!) { + addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { + item { + id + } + } + } + projectid: ${{ env.PROJECT_ID }} + contentid: ${{ github.event.issue.node_id }} + env: + PROJECT_ID: "PVT_kwDOAM0swc4AHJKW" + GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} + + voip: + name: Add labelled issues to VoIP project board + runs-on: ubuntu-latest + if: > + contains(github.event.issue.labels.*.name, 'Team: VoIP') + steps: + - uses: octokit/graphql-action@v2.x + id: add_to_project + with: + headers: '{"GraphQL-Features": "projects_next_graphql"}' + query: | + mutation add_to_project($projectid:ID!,$contentid:ID!) { + addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { + item { + id + } + } + } + projectid: ${{ env.PROJECT_ID }} + contentid: ${{ github.event.issue.node_id }} + env: + PROJECT_ID: "PVT_kwDOAM0swc4ABMIk" + GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} diff --git a/.github/workflows/triage-move-review-requests.yml b/.github/workflows/triage-move-review-requests.yml index 00bef45f244..d47904a571e 100644 --- a/.github/workflows/triage-move-review-requests.yml +++ b/.github/workflows/triage-move-review-requests.yml @@ -1,139 +1,139 @@ name: Move pull requests asking for review to the relevant project on: - pull_request_target: - types: [ review_requested ] + pull_request_target: + types: [review_requested] jobs: - add_design_pr_to_project: - name: Move PRs asking for design review to the design board - runs-on: ubuntu-latest - steps: - - uses: octokit/graphql-action@v2.x - id: find_team_members - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - query find_team_members($team: String!) { - organization(login: "vector-im") { - team(slug: $team) { - members { - nodes { - login - } - } - } - } - } - team: ${{ env.TEAM }} - env: - TEAM: "design" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - - id: any_matching_reviewers - run: | - # Fetch requested reviewers, and people who are on the team - echo '${{ tojson(fromjson(steps.find_team_members.outputs.data).organization.team.members.nodes[*].login) }}' | tee /tmp/team_members.json - echo '${{ tojson(github.event.pull_request.requested_reviewers[*].login) }}' | tee /tmp/reviewers.json - jq --raw-output .[] < /tmp/team_members.json | sort | tee /tmp/team_members.txt - jq --raw-output .[] < /tmp/reviewers.json | sort | tee /tmp/reviewers.txt + add_design_pr_to_project: + name: Move PRs asking for design review to the design board + runs-on: ubuntu-latest + steps: + - uses: octokit/graphql-action@v2.x + id: find_team_members + with: + headers: '{"GraphQL-Features": "projects_next_graphql"}' + query: | + query find_team_members($team: String!) { + organization(login: "vector-im") { + team(slug: $team) { + members { + nodes { + login + } + } + } + } + } + team: ${{ env.TEAM }} + env: + TEAM: "design" + GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} + - id: any_matching_reviewers + run: | + # Fetch requested reviewers, and people who are on the team + echo '${{ tojson(fromjson(steps.find_team_members.outputs.data).organization.team.members.nodes[*].login) }}' | tee /tmp/team_members.json + echo '${{ tojson(github.event.pull_request.requested_reviewers[*].login) }}' | tee /tmp/reviewers.json + jq --raw-output .[] < /tmp/team_members.json | sort | tee /tmp/team_members.txt + jq --raw-output .[] < /tmp/reviewers.json | sort | tee /tmp/reviewers.txt - # Fetch requested team reviewers, and the name of the team - echo '${{ tojson(github.event.pull_request.requested_teams[*].slug) }}' | tee /tmp/team_reviewers.json - jq --raw-output .[] < /tmp/team_reviewers.json | sort | tee /tmp/team_reviewers.txt - echo '${{ env.TEAM }}' | tee /tmp/team.txt + # Fetch requested team reviewers, and the name of the team + echo '${{ tojson(github.event.pull_request.requested_teams[*].slug) }}' | tee /tmp/team_reviewers.json + jq --raw-output .[] < /tmp/team_reviewers.json | sort | tee /tmp/team_reviewers.txt + echo '${{ env.TEAM }}' | tee /tmp/team.txt - # If either a reviewer matches a team member, or a team matches our team, say "true" - if [ $(join /tmp/team_members.txt /tmp/reviewers.txt | wc -l) != 0 ]; then - echo "::set-output name=match::true" - elif [ $(join /tmp/team.txt /tmp/team_reviewers.txt | wc -l) != 0 ]; then - echo "::set-output name=match::true" - else - echo "::set-output name=match::false" - fi - env: - TEAM: "design" - - uses: octokit/graphql-action@v2.x - id: add_to_project - if: steps.any_matching_reviewers.outputs.match == 'true' - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - mutation add_to_project($projectid:ID!, $contentid:ID!) { - addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { - item { - id - } - } - } - projectid: ${{ env.PROJECT_ID }} - contentid: ${{ github.event.pull_request.node_id }} - env: - PROJECT_ID: "PN_kwDOAM0swc0sUA" - TEAM: "design" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} + # If either a reviewer matches a team member, or a team matches our team, say "true" + if [ $(join /tmp/team_members.txt /tmp/reviewers.txt | wc -l) != 0 ]; then + echo "::set-output name=match::true" + elif [ $(join /tmp/team.txt /tmp/team_reviewers.txt | wc -l) != 0 ]; then + echo "::set-output name=match::true" + else + echo "::set-output name=match::false" + fi + env: + TEAM: "design" + - uses: octokit/graphql-action@v2.x + id: add_to_project + if: steps.any_matching_reviewers.outputs.match == 'true' + with: + headers: '{"GraphQL-Features": "projects_next_graphql"}' + query: | + mutation add_to_project($projectid:ID!, $contentid:ID!) { + addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { + item { + id + } + } + } + projectid: ${{ env.PROJECT_ID }} + contentid: ${{ github.event.pull_request.node_id }} + env: + PROJECT_ID: "PVT_kwDOAM0swc0sUA" + TEAM: "design" + GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - add_product_pr_to_project: - name: Move PRs asking for design review to the design board - runs-on: ubuntu-latest - steps: - - uses: octokit/graphql-action@v2.x - id: find_team_members - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - query find_team_members($team: String!) { - organization(login: "vector-im") { - team(slug: $team) { - members { - nodes { - login - } - } - } - } - } - team: ${{ env.TEAM }} - env: - TEAM: "product" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - - id: any_matching_reviewers - run: | - # Fetch requested reviewers, and people who are on the team - echo '${{ tojson(fromjson(steps.find_team_members.outputs.data).organization.team.members.nodes[*].login) }}' | tee /tmp/team_members.json - echo '${{ tojson(github.event.pull_request.requested_reviewers[*].login) }}' | tee /tmp/reviewers.json - jq --raw-output .[] < /tmp/team_members.json | sort | tee /tmp/team_members.txt - jq --raw-output .[] < /tmp/reviewers.json | sort | tee /tmp/reviewers.txt + add_product_pr_to_project: + name: Move PRs asking for design review to the design board + runs-on: ubuntu-latest + steps: + - uses: octokit/graphql-action@v2.x + id: find_team_members + with: + headers: '{"GraphQL-Features": "projects_next_graphql"}' + query: | + query find_team_members($team: String!) { + organization(login: "vector-im") { + team(slug: $team) { + members { + nodes { + login + } + } + } + } + } + team: ${{ env.TEAM }} + env: + TEAM: "product" + GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} + - id: any_matching_reviewers + run: | + # Fetch requested reviewers, and people who are on the team + echo '${{ tojson(fromjson(steps.find_team_members.outputs.data).organization.team.members.nodes[*].login) }}' | tee /tmp/team_members.json + echo '${{ tojson(github.event.pull_request.requested_reviewers[*].login) }}' | tee /tmp/reviewers.json + jq --raw-output .[] < /tmp/team_members.json | sort | tee /tmp/team_members.txt + jq --raw-output .[] < /tmp/reviewers.json | sort | tee /tmp/reviewers.txt - # Fetch requested team reviewers, and the name of the team - echo '${{ tojson(github.event.pull_request.requested_teams[*].slug) }}' | tee /tmp/team_reviewers.json - jq --raw-output .[] < /tmp/team_reviewers.json | sort | tee /tmp/team_reviewers.txt - echo '${{ env.TEAM }}' | tee /tmp/team.txt + # Fetch requested team reviewers, and the name of the team + echo '${{ tojson(github.event.pull_request.requested_teams[*].slug) }}' | tee /tmp/team_reviewers.json + jq --raw-output .[] < /tmp/team_reviewers.json | sort | tee /tmp/team_reviewers.txt + echo '${{ env.TEAM }}' | tee /tmp/team.txt - # If either a reviewer matches a team member, or a team matches our team, say "true" - if [ $(join /tmp/team_members.txt /tmp/reviewers.txt | wc -l) != 0 ]; then - echo "::set-output name=match::true" - elif [ $(join /tmp/team.txt /tmp/team_reviewers.txt | wc -l) != 0 ]; then - echo "::set-output name=match::true" - else - echo "::set-output name=match::false" - fi - env: - TEAM: "product" - - uses: octokit/graphql-action@v2.x - id: add_to_project - if: steps.any_matching_reviewers.outputs.match == 'true' - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - mutation add_to_project($projectid:ID!, $contentid:ID!) { - addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { - item { - id - } - } - } - projectid: ${{ env.PROJECT_ID }} - contentid: ${{ github.event.pull_request.node_id }} - env: - PROJECT_ID: "PN_kwDOAM0swc4AAg6N" - TEAM: "product" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} + # If either a reviewer matches a team member, or a team matches our team, say "true" + if [ $(join /tmp/team_members.txt /tmp/reviewers.txt | wc -l) != 0 ]; then + echo "::set-output name=match::true" + elif [ $(join /tmp/team.txt /tmp/team_reviewers.txt | wc -l) != 0 ]; then + echo "::set-output name=match::true" + else + echo "::set-output name=match::false" + fi + env: + TEAM: "product" + - uses: octokit/graphql-action@v2.x + id: add_to_project + if: steps.any_matching_reviewers.outputs.match == 'true' + with: + headers: '{"GraphQL-Features": "projects_next_graphql"}' + query: | + mutation add_to_project($projectid:ID!, $contentid:ID!) { + addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { + item { + id + } + } + } + projectid: ${{ env.PROJECT_ID }} + contentid: ${{ github.event.pull_request.node_id }} + env: + PROJECT_ID: "PVT_kwDOAM0swc4AAg6N" + TEAM: "product" + GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} diff --git a/.github/workflows/triage-priority-bugs.yml b/.github/workflows/triage-priority-bugs.yml index 613ed202e8a..5b7d359fef3 100644 --- a/.github/workflows/triage-priority-bugs.yml +++ b/.github/workflows/triage-priority-bugs.yml @@ -1,30 +1,30 @@ name: Move P1 bugs to boards on: - issues: - types: [labeled, unlabeled] + issues: + types: [labeled, unlabeled] jobs: - P1_issues_to_crypto_team_workboard: - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'Z-UISI') || - (contains(github.event.issue.labels.*.name, 'A-E2EE') || - contains(github.event.issue.labels.*.name, 'A-E2EE-Cross-Signing') || - contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') || - contains(github.event.issue.labels.*.name, 'A-E2EE-Key-Backup') || - contains(github.event.issue.labels.*.name, 'A-E2EE-SAS-Verification')) && - (contains(github.event.issue.labels.*.name, 'T-Defect') && - contains(github.event.issue.labels.*.name, 'S-Critical') && - (contains(github.event.issue.labels.*.name, 'O-Frequent') || - contains(github.event.issue.labels.*.name, 'O-Occasional')) || - contains(github.event.issue.labels.*.name, 'S-Major') && - contains(github.event.issue.labels.*.name, 'O-Frequent') || - contains(github.event.issue.labels.*.name, 'A11y') && - contains(github.event.issue.labels.*.name, 'O-Frequent')) - steps: - - uses: alex-page/github-project-automation-plus@be108970955040d35dd6d053c3aff3faaf678026 - with: - project: Crypto Team - column: Ready - repo-token: ${{ secrets.ELEMENT_BOT_TOKEN }} + P1_issues_to_crypto_team_workboard: + runs-on: ubuntu-latest + if: > + contains(github.event.issue.labels.*.name, 'Z-UISI') || + (contains(github.event.issue.labels.*.name, 'A-E2EE') || + contains(github.event.issue.labels.*.name, 'A-E2EE-Cross-Signing') || + contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') || + contains(github.event.issue.labels.*.name, 'A-E2EE-Key-Backup') || + contains(github.event.issue.labels.*.name, 'A-E2EE-SAS-Verification')) && + (contains(github.event.issue.labels.*.name, 'T-Defect') && + contains(github.event.issue.labels.*.name, 'S-Critical') && + (contains(github.event.issue.labels.*.name, 'O-Frequent') || + contains(github.event.issue.labels.*.name, 'O-Occasional')) || + contains(github.event.issue.labels.*.name, 'S-Major') && + contains(github.event.issue.labels.*.name, 'O-Frequent') || + contains(github.event.issue.labels.*.name, 'A11y') && + contains(github.event.issue.labels.*.name, 'O-Frequent')) + steps: + - uses: alex-page/github-project-automation-plus@1f8873e97e3c8f58161a323b7c568c1f623a1c4d + with: + project: Crypto Team + column: Ready + repo-token: ${{ secrets.ELEMENT_BOT_TOKEN }} diff --git a/.github/workflows/triage-unlabelled.yml b/.github/workflows/triage-unlabelled.yml index c5c442010be..80ef18e0ec7 100644 --- a/.github/workflows/triage-unlabelled.yml +++ b/.github/workflows/triage-unlabelled.yml @@ -1,70 +1,70 @@ name: Move unlabelled from needs info columns to triaged on: - issues: - types: [ unlabeled ] + issues: + types: [unlabeled] jobs: - Move_Unabeled_Issue_On_Project_Board: - name: Move no longer X-Needs-Info issues to Triaged - runs-on: ubuntu-latest - if: > - ${{ - !contains(github.event.issue.labels.*.name, 'X-Needs-Info') }} - env: - BOARD_NAME: "Issue triage" - OWNER: ${{ github.repository_owner }} - REPO: ${{ github.event.repository.name }} - ISSUE: ${{ github.event.issue.number }} - steps: - - name: Check if issue is already in "${{ env.BOARD_NAME }}" - run: | - json=$(curl -s -H 'Content-Type: application/json' -H "Authorization: bearer ${{ secrets.GITHUB_TOKEN }}" -X POST -d '{"query": "query($issue: Int!, $owner: String!, $repo: String!) { repository(owner: $owner, name: $repo) { issue(number: $issue) { projectCards { nodes { project { name } isArchived } } } } } ", "variables" : "{ \"issue\": '${ISSUE}', \"owner\": \"'${OWNER}'\", \"repo\": \"'${REPO}'\" }" }' https://api.github.com/graphql) - if echo $json | jq '.data.repository.issue.projectCards.nodes | length'; then - if [[ $(echo $json | jq '.data.repository.issue.projectCards.nodes[0].project.name') =~ "${BOARD_NAME}" ]]; then - if [[ $(echo $json | jq '.data.repository.issue.projectCards.nodes[0].isArchived') == 'true' ]]; then - echo "Issue is already in Project '$BOARD_NAME', but is archived - skipping workflow"; - echo "SKIP_ACTION=true" >> $GITHUB_ENV - else - echo "Issue is already in Project '$BOARD_NAME', proceeding"; - echo "ALREADY_IN_BOARD=true" >> $GITHUB_ENV - fi - else - echo "Issue is not in project '$BOARD_NAME', cancelling this workflow" - echo "ALREADY_IN_BOARD=false" >> $GITHUB_ENV - fi - fi - - name: Move issue - uses: alex-page/github-project-automation-plus@be108970955040d35dd6d053c3aff3faaf678026 - if: ${{ env.ALREADY_IN_BOARD == 'true' && env.SKIP_ACTION != 'true' }} - with: - project: Issue triage - column: Triaged - repo-token: ${{ secrets.ELEMENT_BOT_TOKEN }} + Move_Unabeled_Issue_On_Project_Board: + name: Move no longer X-Needs-Info issues to Triaged + runs-on: ubuntu-latest + if: > + ${{ + !contains(github.event.issue.labels.*.name, 'X-Needs-Info') }} + env: + BOARD_NAME: "Issue triage" + OWNER: ${{ github.repository_owner }} + REPO: ${{ github.event.repository.name }} + ISSUE: ${{ github.event.issue.number }} + steps: + - name: Check if issue is already in "${{ env.BOARD_NAME }}" + run: | + json=$(curl -s -H 'Content-Type: application/json' -H "Authorization: bearer ${{ secrets.GITHUB_TOKEN }}" -X POST -d '{"query": "query($issue: Int!, $owner: String!, $repo: String!) { repository(owner: $owner, name: $repo) { issue(number: $issue) { projectCards { nodes { project { name } isArchived } } } } } ", "variables" : "{ \"issue\": '${ISSUE}', \"owner\": \"'${OWNER}'\", \"repo\": \"'${REPO}'\" }" }' https://api.github.com/graphql) + if echo $json | jq '.data.repository.issue.projectCards.nodes | length'; then + if [[ $(echo $json | jq '.data.repository.issue.projectCards.nodes[0].project.name') =~ "${BOARD_NAME}" ]]; then + if [[ $(echo $json | jq '.data.repository.issue.projectCards.nodes[0].isArchived') == 'true' ]]; then + echo "Issue is already in Project '$BOARD_NAME', but is archived - skipping workflow"; + echo "SKIP_ACTION=true" >> $GITHUB_ENV + else + echo "Issue is already in Project '$BOARD_NAME', proceeding"; + echo "ALREADY_IN_BOARD=true" >> $GITHUB_ENV + fi + else + echo "Issue is not in project '$BOARD_NAME', cancelling this workflow" + echo "ALREADY_IN_BOARD=false" >> $GITHUB_ENV + fi + fi + - name: Move issue + uses: alex-page/github-project-automation-plus@1f8873e97e3c8f58161a323b7c568c1f623a1c4d + if: ${{ env.ALREADY_IN_BOARD == 'true' && env.SKIP_ACTION != 'true' }} + with: + project: Issue triage + column: Triaged + repo-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - remove_Z-Labs_label: - name: Remove Z-Labs label when features behind labs flags are removed - runs-on: ubuntu-latest - if: > - !(contains(github.event.issue.labels.*.name, 'A-Maths') || - contains(github.event.issue.labels.*.name, 'A-Message-Pinning') || - contains(github.event.issue.labels.*.name, 'A-Location-Sharing') || - contains(github.event.issue.labels.*.name, 'Z-IA') || - contains(github.event.issue.labels.*.name, 'A-Themes-Custom') || - contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') || - contains(github.event.issue.labels.*.name, 'A-Tags') || - contains(github.event.issue.labels.*.name, 'A-Video-Rooms') || - contains(github.event.issue.labels.*.name, 'A-Message-Starring') || - contains(github.event.issue.labels.*.name, 'A-Rich-Text-Editor') || - contains(github.event.issue.labels.*.name, 'A-Element-Call')) && - contains(github.event.issue.labels.*.name, 'Z-Labs') - steps: - - uses: actions/github-script@v5 - with: - script: | - github.rest.issues.removeLabel({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - name: ['Z-Labs'] - }) + remove_Z-Labs_label: + name: Remove Z-Labs label when features behind labs flags are removed + runs-on: ubuntu-latest + if: > + !(contains(github.event.issue.labels.*.name, 'A-Maths') || + contains(github.event.issue.labels.*.name, 'A-Message-Pinning') || + contains(github.event.issue.labels.*.name, 'A-Location-Sharing') || + contains(github.event.issue.labels.*.name, 'Z-IA') || + contains(github.event.issue.labels.*.name, 'A-Themes-Custom') || + contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') || + contains(github.event.issue.labels.*.name, 'A-Tags') || + contains(github.event.issue.labels.*.name, 'A-Video-Rooms') || + contains(github.event.issue.labels.*.name, 'A-Message-Starring') || + contains(github.event.issue.labels.*.name, 'A-Rich-Text-Editor') || + contains(github.event.issue.labels.*.name, 'A-Element-Call')) && + contains(github.event.issue.labels.*.name, 'Z-Labs') + steps: + - uses: actions/github-script@v6 + with: + script: | + github.rest.issues.removeLabel({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + name: ['Z-Labs'] + }) diff --git a/.modernizr.json b/.modernizr.json index 2a8979a91ad..c5e97f90c56 100644 --- a/.modernizr.json +++ b/.modernizr.json @@ -1,36 +1,36 @@ { - "minify": true, - "enableClasses": false, - "feature-detects": [ - "test/css/animations", - "test/css/displaytable", - "test/css/filters", - "test/css/flexbox", - "test/css/objectfit", + "minify": true, + "enableClasses": false, + "feature-detects": [ + "test/css/animations", + "test/css/displaytable", + "test/css/filters", + "test/css/flexbox", + "test/css/objectfit", - "test/es5/date", - "test/es5/function", - "test/es5/object", - "test/es5/undefined", + "test/es5/date", + "test/es5/function", + "test/es5/object", + "test/es5/undefined", - "test/es6/array", - "test/es6/collections", - "test/es6/promises", - "test/es6/string", + "test/es6/array", + "test/es6/collections", + "test/es6/promises", + "test/es6/string", - "test/svg", - "test/svg/asimg", - "test/svg/filters", + "test/svg", + "test/svg/asimg", + "test/svg/filters", - "test/url/parser", - "test/url/urlsearchparams", + "test/url/parser", + "test/url/urlsearchparams", - "test/cors", - "test/crypto", - "test/iframe/sandbox", - "test/json", - "test/network/fetch", - "test/storage/localstorage", - "test/window/resizeobserver" - ] + "test/cors", + "test/crypto", + "test/iframe/sandbox", + "test/json", + "test/network/fetch", + "test/storage/localstorage", + "test/window/resizeobserver" + ] } diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000000..fb5ff4bc7a4 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,27 @@ +/build +/dist +/lib +/node_modules +/packages/ +/webapp +/*.log +yarn.lock +electron/dist +electron/pub +**/.idea +/.tmp +/webpack-stats.json +.vscode +.vscode/ +.env +/coverage +# Auto-generated file +/src/modules.ts +/src/i18n/strings +/build_config.yaml +# Raises an error because it contains a template var breaking the script tag +src/vector/index.html +src/vector/modernizr.js + +# This file is owned, parsed, and generated by allchange, which doesn't comply with prettier +/CHANGELOG.md diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 00000000000..6a17910f1a0 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1 @@ +module.exports = require("eslint-plugin-matrix-org/.prettierrc.js"); diff --git a/.stylelintrc.js b/.stylelintrc.js index 2c7693849cb..f3d7a268b82 100644 --- a/.stylelintrc.js +++ b/.stylelintrc.js @@ -1,3 +1,4 @@ module.exports = { ...require("matrix-react-sdk/.stylelintrc.js"), + extends: ["stylelint-config-standard", "stylelint-config-prettier"], }; diff --git a/CHANGELOG.md b/CHANGELOG.md index b6edfc16c68..1103abd8e64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,39 @@ +Changes in [1.11.17](https://github.com/vector-im/element-web/releases/tag/v1.11.17) (2022-12-21) +================================================================================================= + +## ✨ Features + * Add inline code formatting to rich text editor ([\#9720](https://github.com/matrix-org/matrix-react-sdk/pull/9720)). + * Add emoji handling for plain text mode of the new rich text editor ([\#9727](https://github.com/matrix-org/matrix-react-sdk/pull/9727)). + * Overlay virtual room call events into main timeline ([\#9626](https://github.com/matrix-org/matrix-react-sdk/pull/9626)). Fixes #22929. + * Adds a new section under "Room Settings" > "Roles & Permissions" which adds the possibility to multiselect users from this room and grant them more permissions. ([\#9596](https://github.com/matrix-org/matrix-react-sdk/pull/9596)). Contributed by @GoodGuyMarco. + * Add emoji handling for rich text mode ([\#9661](https://github.com/matrix-org/matrix-react-sdk/pull/9661)). + * Add setting to hide bold notifications ([\#9705](https://github.com/matrix-org/matrix-react-sdk/pull/9705)). + * Further password reset flow enhancements ([\#9662](https://github.com/matrix-org/matrix-react-sdk/pull/9662)). + * Snooze the bulk unverified sessions reminder on dismiss ([\#9706](https://github.com/matrix-org/matrix-react-sdk/pull/9706)). + * Honor advanced audio processing settings when recording voice messages ([\#9610](https://github.com/matrix-org/matrix-react-sdk/pull/9610)). Contributed by @MrAnno. + * Improve the visual balance of bubble layout ([\#9704](https://github.com/matrix-org/matrix-react-sdk/pull/9704)). + * Add config setting to disable bulk unverified sessions nag ([\#9657](https://github.com/matrix-org/matrix-react-sdk/pull/9657)). + * Only display bulk unverified sessions nag when current sessions is verified ([\#9656](https://github.com/matrix-org/matrix-react-sdk/pull/9656)). + * Separate labs and betas more clearly ([\#8969](https://github.com/matrix-org/matrix-react-sdk/pull/8969)). Fixes #22706. + * Show user an error if we fail to create a DM for verification. ([\#9624](https://github.com/matrix-org/matrix-react-sdk/pull/9624)). + +## 🐛 Bug Fixes + * Prevent unnecessary m.direct updates ([\#9805](https://github.com/matrix-org/matrix-react-sdk/pull/9805)). Fixes #24059. + * Fix checkForPreJoinUISI for thread roots ([\#9803](https://github.com/matrix-org/matrix-react-sdk/pull/9803)). Fixes #24054. + * Load RTE components only when RTE labs is enabled ([\#9804](https://github.com/matrix-org/matrix-react-sdk/pull/9804)). + * Fix issue where thread panel did not update correctly ([\#9746](https://github.com/matrix-org/matrix-react-sdk/pull/9746)). Fixes #23971. + * Remove async call to get virtual room from room load ([\#9743](https://github.com/matrix-org/matrix-react-sdk/pull/9743)). Fixes #23968. + * Check each thread for unread messages. ([\#9723](https://github.com/matrix-org/matrix-react-sdk/pull/9723)). + * Device manage - handle sessions that don't support encryption ([\#9717](https://github.com/matrix-org/matrix-react-sdk/pull/9717)). Fixes #23722. + * Fix hover state for formatting buttons (Rich text editor) (fix vector-im/element-web/issues/23832) ([\#9715](https://github.com/matrix-org/matrix-react-sdk/pull/9715)). + * Don't allow group calls to be unterminated ([\#9710](https://github.com/matrix-org/matrix-react-sdk/pull/9710)). + * Fix replies to emotes not showing as inline ([\#9707](https://github.com/matrix-org/matrix-react-sdk/pull/9707)). Fixes #23903. + * Update copy of 'Change layout' button to match Element Call ([\#9703](https://github.com/matrix-org/matrix-react-sdk/pull/9703)). + * Fix call splitbrains when switching between rooms ([\#9692](https://github.com/matrix-org/matrix-react-sdk/pull/9692)). + * bugfix: fix an issue where the Notifier would incorrectly fire for non-timeline events ([\#9664](https://github.com/matrix-org/matrix-react-sdk/pull/9664)). Fixes #17263. + * Fix power selector being wrongly disabled for admins themselves ([\#9681](https://github.com/matrix-org/matrix-react-sdk/pull/9681)). Fixes #23882. + * Show day counts in call durations ([\#9641](https://github.com/matrix-org/matrix-react-sdk/pull/9641)). + Changes in [1.11.16](https://github.com/vector-im/element-web/releases/tag/v1.11.16) (2022-12-06) ================================================================================================= diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 37391f54f5d..5ca195b9a65 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1,4 @@ -Contributing code to Element Web -================================ +# Contributing code to Element Web Everyone is welcome to contribute code to Element Web, provided that they are willing to license their contributions under the same license as the project @@ -9,8 +8,7 @@ license the code under the same terms as the project's overall 'outbound' license - in this case, Apache Software License v2 (see [LICENSE](LICENSE)). -How to contribute ------------------ +## How to contribute The preferred and easiest way to contribute changes to the project is to fork it on github, and then create a pull request to ask us to pull your changes @@ -20,29 +18,30 @@ We use GitHub's pull request workflow to review the contribution, and either ask you to make any refinements needed or merge it and make them ourselves. Things that should go into your PR description: - * A changelog entry in the `Notes` section (see below) - * References to any bugs fixed by the change (in GitHub's `Fixes` notation) - * Describe the why and what is changing in the PR description so it's easy for - onlookers and reviewers to onboard and context switch. This information is - also helpful when we come back to look at this in 6 months and ask "why did - we do it like that?" we have a chance of finding out. - * Why didn't it work before? Why does it work now? What use cases does it + +- A changelog entry in the `Notes` section (see below) +- References to any bugs fixed by the change (in GitHub's `Fixes` notation) +- Describe the why and what is changing in the PR description so it's easy for + onlookers and reviewers to onboard and context switch. This information is + also helpful when we come back to look at this in 6 months and ask "why did + we do it like that?" we have a chance of finding out. + - Why didn't it work before? Why does it work now? What use cases does it unlock? - * If you find yourself adding information on how the code works or why you + - If you find yourself adding information on how the code works or why you chose to do it the way you did, make sure this information is instead written as comments in the code itself. - * Sometimes a PR can change considerably as it is developed. In this case, + - Sometimes a PR can change considerably as it is developed. In this case, the description should be updated to reflect the most recent state of the PR. (It can be helpful to retain the old content under a suitable heading, for additional context.) - * Include both **before** and **after** screenshots to easily compare and discuss - what's changing. - * Include a step-by-step testing strategy so that a reviewer can check out the - code locally and easily get to the point of testing your change. - * Add comments to the diff for the reviewer that might help them to understand - why the change is necessary or how they might better understand and review it. - -We rely on information in pull request to populate the information that goes into +- Include both **before** and **after** screenshots to easily compare and discuss + what's changing. +- Include a step-by-step testing strategy so that a reviewer can check out the + code locally and easily get to the point of testing your change. +- Add comments to the diff for the reviewer that might help them to understand + why the change is necessary or how they might better understand and review it. + +We rely on information in pull request to populate the information that goes into the changelogs our users see, both for Element Web itself and other projects on which it is based. This is picked up from both labels on the pull request and the `Notes:` annotation in the description. By default, the PR title will be @@ -50,8 +49,7 @@ used for the changelog entry, but you can specify more options, as follows. To add a longer, more detailed description of the change for the changelog: - -*Fix llama herding bug* +_Fix llama herding bug_ ``` Notes: Fix a bug (https://github.com/matrix-org/notaproject/issues/123) where the 'Herd' button would not herd more than 8 Llamas if the moon was in the waxing gibbous phase @@ -60,7 +58,8 @@ Notes: Fix a bug (https://github.com/matrix-org/notaproject/issues/123) where th For some PRs, it's not useful to have an entry in the user-facing changelog (this is the default for PRs labelled with `T-Task`): -*Remove outdated comment from `Ungulates.ts`* +_Remove outdated comment from `Ungulates.ts`_ + ``` Notes: none ``` @@ -68,16 +67,18 @@ Notes: none Sometimes, you're fixing a bug in a downstream project, in which case you want an entry in that project's changelog. You can do that too: -*Fix another herding bug* +_Fix another herding bug_ + ``` Notes: Fix a bug where the `herd()` function would only work on Tuesdays element-web notes: Fix a bug where the 'Herd' button only worked on Tuesdays ``` This example is for Element Web. You can specify: - * matrix-react-sdk - * element-web - * element-desktop + +- matrix-react-sdk +- element-web +- element-desktop If your PR introduces a breaking change, use the `Notes` section in the same way, additionally adding the `X-Breaking-Change` label (see below). There's no need @@ -85,17 +86,18 @@ to specify in the notes that it's a breaking change - this will be added automatically based on the label - but remember to tell the developer how to migrate: -*Remove legacy class* +_Remove legacy class_ ``` Notes: Remove legacy `Camelopard` class. `Giraffe` should be used instead. ``` Other metadata can be added using labels. - * `X-Breaking-Change`: A breaking change - adding this label will mean the change causes a *major* version bump. - * `T-Enhancement`: A new feature - adding this label will mean the change causes a *minor* version bump. - * `T-Defect`: A bug fix (in either code or docs). - * `T-Task`: No user-facing changes, eg. code comments, CI fixes, refactors or tests. Won't have a changelog entry unless you specify one. + +- `X-Breaking-Change`: A breaking change - adding this label will mean the change causes a _major_ version bump. +- `T-Enhancement`: A new feature - adding this label will mean the change causes a _minor_ version bump. +- `T-Defect`: A bug fix (in either code or docs). +- `T-Task`: No user-facing changes, eg. code comments, CI fixes, refactors or tests. Won't have a changelog entry unless you specify one. If you don't have permission to add labels, your PR reviewer(s) can work with you to add them: ask in the PR description or comments. @@ -104,8 +106,8 @@ We use continuous integration, and all pull requests get automatically tested: if your change breaks the build, then the PR will show that there are failed checks, so please check back after a few minutes. -Tests ------ +## Tests + Your PR should include tests. For new user facing features in `matrix-js-sdk`, `matrix-react-sdk` or `element-web`, you @@ -129,7 +131,7 @@ end-to-end test; which is best depends on what sort of test most concisely exercises the area. Changes to must be accompanied by unit tests written in Jest. -These are located in `/spec/` in `matrix-js-sdk` or `/test/` in `element-web` +These are located in `/spec/` in `matrix-js-sdk` or `/test/` in `element-web` and `matrix-react-sdk`. When writing unit tests, please aim for a high level of test coverage @@ -139,6 +141,7 @@ why it's not possible in your PR. Some sections of code are not sensible to add coverage for, such as those which explicitly inhibit noisy logging for tests. Which can be hidden using an istanbul magic comment as [documented here][1]. See example: + ```javascript /* istanbul ignore if */ if (process.env.NODE_ENV !== "test") { @@ -160,8 +163,8 @@ tests later will become progressively more difficult. If you're not sure how to approach writing tests for your change, ask for help in [#element-dev](https://matrix.to/#/#element-dev:matrix.org). -Code style ----------- +## Code style + Element Web aims to target TypeScript/ES6. All new files should be written in TypeScript and existing files should use ES6 principles where possible. @@ -174,11 +177,11 @@ The remaining code style is documented in [code_style.md](./code_style.md). Contributors are encouraged to it and follow the principles set out there. Please ensure your changes match the cosmetic style of the existing project, -and ***never*** mix cosmetic and functional changes in the same commit, as it +and **_never_** mix cosmetic and functional changes in the same commit, as it makes it horribly hard to review otherwise. -Attribution ------------ +## Attribution + Everyone who contributes anything to Matrix is welcome to be listed in the AUTHORS.rst file for the project in question. Please feel free to include a change to AUTHORS.rst in your pull request to list yourself and a short @@ -187,8 +190,8 @@ give away to contributors - if you feel that Matrix-branded apparel is missing from your life, please mail us your shipping address to matrix at matrix.org and we'll try to fix it :) -Sign off --------- +## Sign off + In order to have a concrete record that your contribution is intentional and you agree to license it under the same terms as the project's license, we've adopted the same lightweight approach that the Linux Kernel @@ -259,19 +262,16 @@ on Git 2.17+ you can mass signoff using rebase: git rebase --signoff origin/develop ``` -Review expectations -=================== +# Review expectations See https://github.com/vector-im/element-meta/wiki/Review-process - -Merge Strategy -============== +# Merge Strategy The preferred method for merging pull requests is squash merging to keep the commit history trim, but it is up to the discretion of the team member merging the change. We do not support rebase merges due to `allchange` being unable to -handle them. When merging make sure to leave the default commit title, or +handle them. When merging make sure to leave the default commit title, or at least leave the PR number at the end in brackets like by default. When stacking pull requests, you may wish to do the following: @@ -279,5 +279,4 @@ When stacking pull requests, you may wish to do the following: 2. Branch from your base branch (branch1) to your work branch (branch2), push commits and open a pull request configuring the base to be branch1, saying in the description that it is based on your other PR. 3. Merge the first PR using a merge commit otherwise your stacked PR will need a rebase. Github will automatically adjust the base branch of your other PR to be develop. - [1]: https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md diff --git a/README.md b/README.md index 59e7b3184c6..943ef937df3 100644 --- a/README.md +++ b/README.md @@ -7,36 +7,33 @@ `-- matrix-js-sdk (Matrix client js sdk) -Element -======= +# Element Element (formerly known as Vector and Riot) is a Matrix web client built using the [Matrix React SDK](https://github.com/matrix-org/matrix-react-sdk). -Supported Environments -====================== +# Supported Environments Element has several tiers of support for different environments: -* Supported - * Definition: Issues **actively triaged**, regressions **block** the release - * Last 2 major versions of Chrome, Firefox, Safari, and Edge on desktop OSes - * Latest release of official Element Desktop app on desktop OSes - * Desktop OSes means macOS, Windows, and Linux versions for desktop devices - that are actively supported by the OS vendor and receive security updates -* Experimental - * Definition: Issues **accepted**, regressions **do not block** the release - * Element as an installed PWA via current stable version of Chrome, Firefox, and Safari - * Mobile web for current stable version of Chrome, Firefox, and Safari on Android, iOS, and iPadOS -* Not supported - * Definition: Issues only affecting unsupported environments are **closed** - * Everything else +- Supported + - Definition: Issues **actively triaged**, regressions **block** the release + - Last 2 major versions of Chrome, Firefox, Safari, and Edge on desktop OSes + - Latest release of official Element Desktop app on desktop OSes + - Desktop OSes means macOS, Windows, and Linux versions for desktop devices + that are actively supported by the OS vendor and receive security updates +- Experimental + - Definition: Issues **accepted**, regressions **do not block** the release + - Element as an installed PWA via current stable version of Chrome, Firefox, and Safari + - Mobile web for current stable version of Chrome, Firefox, and Safari on Android, iOS, and iPadOS +- Not supported + - Definition: Issues only affecting unsupported environments are **closed** + - Everything else For accessing Element on an Android or iOS device, we currently recommend the native apps [element-android](https://github.com/SchildiChat/schildichat-android). -Getting Started -=============== +# Getting Started The easiest way to test SchildiChat is to just use the hosted copy at https://app.schildi.chat. @@ -61,47 +58,39 @@ and thus allowed. To install SchildiChat as a desktop application, see [Running as a desktop app](#running-as-a-desktop-app) below. -Important Security Notes -======================== +# Important Security Notes -Separate domains ----------------- +## Separate domains We do not recommend running Element from the same domain name as your Matrix -homeserver. The reason is the risk of XSS (cross-site-scripting) +homeserver. The reason is the risk of XSS (cross-site-scripting) vulnerabilities that could occur if someone caused Element to load and render malicious user generated content from a Matrix API which then had trusted access to Element (or other apps) due to sharing the same domain. We have put some coarse mitigations into place to try to protect against this -situation, but it's still not good practice to do it in the first place. See +situation, but it's still not good practice to do it in the first place. See for more details. -Configuration best practices ----------------------------- +## Configuration best practices Unless you have special requirements, you will want to add the following to your web server configuration when hosting Element Web: -* The `X-Frame-Options: SAMEORIGIN` header, to prevent Element Web from being - framed and protect from [clickjacking][owasp-clickjacking]. -* The `frame-ancestors 'none'` directive to your `Content-Security-Policy` - header, as the modern replacement for `X-Frame-Options` (though both should be - included since not all browsers support it yet, see - [this][owasp-clickjacking-csp]). -* The `X-Content-Type-Options: nosniff` header, to [disable MIME - sniffing][mime-sniffing]. -* The `X-XSS-Protection: 1; mode=block;` header, for basic XSS protection in - legacy browsers. - -[mime-sniffing]: - - -[owasp-clickjacking-csp]: - - -[owasp-clickjacking]: - +- The `X-Frame-Options: SAMEORIGIN` header, to prevent Element Web from being + framed and protect from [clickjacking][owasp-clickjacking]. +- The `frame-ancestors 'none'` directive to your `Content-Security-Policy` + header, as the modern replacement for `X-Frame-Options` (though both should be + included since not all browsers support it yet, see + [this][owasp-clickjacking-csp]). +- The `X-Content-Type-Options: nosniff` header, to [disable MIME + sniffing][mime-sniffing]. +- The `X-XSS-Protection: 1; mode=block;` header, for basic XSS protection in + legacy browsers. + +[mime-sniffing]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#mime_sniffing +[owasp-clickjacking-csp]: https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html#content-security-policy-frame-ancestors-examples +[owasp-clickjacking]: https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html If you are using nginx, this would look something like the following: @@ -111,7 +100,9 @@ add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; add_header Content-Security-Policy "frame-ancestors 'none'"; ``` + For Apache, the configuration looks like: + ``` Header set X-Frame-Options SAMEORIGIN Header set X-Content-Type-Options nosniff @@ -123,8 +114,7 @@ Note: In case you are already setting a `Content-Security-Policy` header elsewhere, you should modify it to include the `frame-ancestors` directive instead of adding that last line. -Building From Source -==================== +# Building From Source Element is a modular webapp built with modern ES6 and uses a Node.js build system. Ensure you have the latest LTS version of Node.js installed. @@ -137,7 +127,7 @@ guide](https://classic.yarnpkg.com/en/docs/install) if you do not have it alread 1. Clone the repo: `git clone https://github.com/vector-im/element-web.git`. 1. Switch to the element-web directory: `cd element-web`. 1. Install the prerequisites: `yarn install`. - * If you're using the `develop` branch, then it is recommended to set up a + - If you're using the `develop` branch, then it is recommended to set up a proper development environment (see [Setting up a dev environment](#setting-up-a-dev-environment) below). Alternatively, you can use - the continuous integration release of @@ -154,8 +144,7 @@ will not appear in Settings without using the dist script. You can then mount th `webapp` directory on your web server to actually serve up the app, which is entirely static content. -Running as a Desktop app -======================== +# Running as a Desktop app SchildiChat can also be run as a desktop app, wrapped in Electron. You can download a pre-built version from or, if you prefer, @@ -167,7 +156,7 @@ Many thanks to @aviraldg for the initial work on the Electron integration. Other options for running as a desktop app: -* @asdf:matrix.org points out that you can use nativefier and it just works(tm) +- @asdf:matrix.org points out that you can use nativefier and it just works(tm) ```bash yarn global add nativefier @@ -177,8 +166,7 @@ nativefier https://app.schildi.chat/ The [configuration docs](docs/config.md#desktop-app-configuration) show how to override the desktop app's default settings if desired. -Running from Docker -=================== +# Running from Docker The Docker image can be used to serve element-web as a web server. The easiest way to use it is to use the prebuilt image: @@ -217,26 +205,22 @@ docker build -t \ . ``` -Running in Kubernetes -===================== +# Running in Kubernetes The provided element-web docker image can also be run from within a Kubernetes cluster. See the [Kubernetes example](docs/kubernetes.md) for more details. -config.json -=========== +# config.json Element supports a variety of settings to configure default servers, behaviour, themes, etc. See the [configuration docs](docs/config.md) for more details. -Labs Features -============= +# Labs Features Some features of Element may be enabled by flags in the `Labs` section of the settings. Some of these features are described in [labs.md](https://github.com/vector-im/element-web/blob/develop/docs/labs.md). -Caching requirements -==================== +# Caching requirements Element requires the following URLs not to be cached, when/if you are serving Element from your own webserver: @@ -253,8 +237,7 @@ webserver to return `Cache-Control: no-cache` for `/`. This ensures the browser the next page load after it's been deployed. Note that this is already configured for you in the nginx config of our Dockerfile. -Development -=========== +# Development Before attempting to develop on Element you **must** read the [developer guide for `matrix-react-sdk`](https://github.com/matrix-org/matrix-react-sdk#developer-guide), which @@ -276,7 +259,7 @@ higher and lower level React components useful for building Matrix communication apps using React. Please note that Element is intended to run correctly without access to the public -internet. So please don't depend on resources (JS libs, CSS, images, fonts) +internet. So please don't depend on resources (JS libs, CSS, images, fonts) hosted by external CDNs or servers but instead please package all dependencies into Element itself. @@ -284,8 +267,7 @@ CSS hot-reload is available as an opt-in development feature. You can enable it by defining a `CSS_HOT_RELOAD` environment variable, in a `.env` file in the root of the repository. See `.env.example` for documentation and an example. -Setting up a dev environment -============================ +# Setting up a dev environment Much of the functionality in Element is actually in the `matrix-react-sdk` and `matrix-js-sdk` modules. It is possible to set these up in a way that makes it @@ -294,7 +276,7 @@ having to manually rebuild each time. First clone and build `matrix-js-sdk`: -``` bash +```bash git clone https://github.com/matrix-org/matrix-js-sdk.git pushd matrix-js-sdk yarn link @@ -341,9 +323,9 @@ Wait a few seconds for the initial build to finish; you should see something lik [element-js] ℹ 「wdm」: Compiled successfully. ``` - Remember, the command will not terminate since it runs the web server - and rebuilds source files when they change. This development server also - disables caching, so do NOT use it in production. +Remember, the command will not terminate since it runs the web server +and rebuilds source files when they change. This development server also +disables caching, so do NOT use it in production. Open in your browser to see your newly built Element. @@ -371,7 +353,7 @@ echo fs.inotify.max_user_instances=512 | sudo tee -a /etc/sysctl.conf sudo sysctl -p ``` -___ +--- When you make changes to `matrix-react-sdk` or `matrix-js-sdk` they should be automatically picked up by webpack and built. @@ -380,8 +362,7 @@ If any of these steps error with, `file table overflow`, you are probably on a m which has a very low limit on max open files. Run `ulimit -Sn 1024` and try again. You'll need to do this in each new terminal you open before building Element. -Running the tests ------------------ +## Running the tests There are a number of application-level tests in the `tests` directory; these are designed to run with Jest and JSDOM. To run them @@ -394,8 +375,7 @@ yarn test See [matrix-react-sdk](https://github.com/matrix-org/matrix-react-sdk/#end-to-end-tests) for how to run the end-to-end tests. -Translations -============ +# Translations To add a new translation, head to the [translating doc](docs/translating.md). @@ -403,8 +383,7 @@ For a developer guide, see the [translating dev doc](docs/translating-dev.md). [translationsstatus](https://translate.element.io/engage/element-web/?utm_source=widget) -Triaging issues -=============== +# Triaging issues Issues are triaged by community members and the Web App Team, following the [triage process](https://github.com/vector-im/element-meta/wiki/Triage-process). diff --git a/babel.config.js b/babel.config.js index d2248cd0c97..0c8d5affcde 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,18 +1,21 @@ module.exports = { - "sourceMaps": true, - "presets": [ - ["@babel/preset-env", { - "targets": [ - "last 2 Chrome versions", - "last 2 Firefox versions", - "last 2 Safari versions", - "last 2 Edge versions", - ], - }], + sourceMaps: true, + presets: [ + [ + "@babel/preset-env", + { + targets: [ + "last 2 Chrome versions", + "last 2 Firefox versions", + "last 2 Safari versions", + "last 2 Edge versions", + ], + }, + ], "@babel/preset-typescript", "@babel/preset-react", ], - "plugins": [ + plugins: [ "@babel/plugin-proposal-export-default-from", "@babel/plugin-proposal-numeric-separator", "@babel/plugin-proposal-class-properties", diff --git a/code_style.md b/code_style.md index 79840d4eeb1..235ba3f1d81 100644 --- a/code_style.md +++ b/code_style.md @@ -3,10 +3,10 @@ This code style applies to projects which the element-web team directly maintains or is reasonably adjacent to. As of writing, these are: -* element-desktop -* element-web -* matrix-react-sdk -* matrix-js-sdk +- element-desktop +- element-web +- matrix-react-sdk +- matrix-js-sdk Other projects might extend this code style for increased strictness. For example, matrix-events-sdk has stricter code organization to reduce the maintenance burden. These projects will declare their code @@ -66,37 +66,24 @@ Unless otherwise specified, the following applies to all code: ```typescript // Function arguments - function doThing( - arg1: string, - arg2: string, - arg3: string, - ): boolean { - return !!arg1 - && !!arg2 - && !!arg3; + function doThing(arg1: string, arg2: string, arg3: string): boolean { + return !!arg1 && !!arg2 && !!arg3; } // Calling a function - doThing( - "String 1", - "String 2", - "String 3", - ); + doThing("String 1", "String 2", "String 3"); // Reduce line verbosity when possible/reasonable - doThing( - "String1", "String 2", - "A much longer string 3", - ); + doThing("String1", "String 2", "A much longer string 3"); // Chaining function calls - something.doThing() + something + .doThing() .doOtherThing() .doMore() - .somethingElse(it => - useIt(it) - ); + .somethingElse((it) => useIt(it)); ``` + 4. Use semicolons for block/line termination. 1. Except when defining interfaces, classes, and non-arrow functions specifically. 5. When a statement's body is a single line, it may be written without curly braces, so long as the body is placed on @@ -105,6 +92,7 @@ Unless otherwise specified, the following applies to all code: ```typescript if (x) doThing(); ``` + 6. Blocks for `if`, `for`, `switch` and so on must have a space surrounding the condition, but not within the condition. @@ -113,11 +101,13 @@ Unless otherwise specified, the following applies to all code: doThing(); } ``` + 7. Mixing of logical operands requires brackets to explicitly define boolean logic. ```typescript - if ((a > b && b > c) || (d < e)) return true; + if ((a > b && b > c) || d < e) return true; ``` + 8. Ternaries use the same rules as `if` statements, plus the following: ```typescript @@ -125,14 +115,13 @@ Unless otherwise specified, the following applies to all code: const val = a > b ? doThing() : doOtherThing(); // Multiline is also okay - const val = a > b - ? doThing() - : doOtherThing(); + const val = a > b ? doThing() : doOtherThing(); // Use brackets when using multiple conditions. // Maximum 3 conditions, prefer 2 or less. - const val = (a > b && b > c) ? doThing() : doOtherThing(); + const val = a > b && b > c ? doThing() : doOtherThing(); ``` + 9. lowerCamelCase is used for function and variable naming. 10. UpperCamelCase is used for general naming. 11. Interface names should not be marked with an uppercase `I`. @@ -142,6 +131,7 @@ Unless otherwise specified, the following applies to all code: ```typescript let errorMessage: Optional; ``` + 14. Objects, arrays, enums and so on must have each line terminated with a comma: ```typescript @@ -150,21 +140,16 @@ Unless otherwise specified, the following applies to all code: else: 2, }; - const arr = [ - "one", - "two", - ]; + const arr = ["one", "two"]; enum Thing { Foo, Bar, } - doThing( - "arg1", - "arg2", - ); + doThing("arg1", "arg2"); ``` + 15. Objects can use shorthand declarations, including mixing of types. ```typescript @@ -175,6 +160,7 @@ Unless otherwise specified, the following applies to all code: // ... or ... { room, prop: this.prop } ``` + 16. Object keys should always be non-strings when possible. ```typescript @@ -184,11 +170,13 @@ Unless otherwise specified, the following applies to all code: [EventType.RoomMessage]: true, } ``` + 17. Explicitly cast to a boolean. ```typescript - !!stringVar || Boolean(stringVar) + !!stringVar || Boolean(stringVar); ``` + 18. Use `switch` statements when checking against more than a few enum-like values. 19. Use `const` for constants, `let` for mutability. 20. Describe types exhaustively (ensure noImplictAny would pass). @@ -200,6 +188,7 @@ Unless otherwise specified, the following applies to all code: 2. "Conflicted" typically refers to a getter which wants the same name as the underlying variable. 23. Prefer readonly members over getters backed by a variable, unless an internal setter is required. 24. Prefer Interfaces for object definitions, and types for parameter-value-only declarations. + 1. Note that an explicit type is optional if not expected to be used outside of the function call, unlike in this example: @@ -214,6 +203,7 @@ Unless otherwise specified, the following applies to all code: // ... } ``` + 25. Variables/properties which are `public static` should also be `readonly` when possible. 26. Interface and type properties are terminated with semicolons, not commas. 27. Prefer arrow formatting when declaring functions for interfaces/types: @@ -223,6 +213,7 @@ Unless otherwise specified, the following applies to all code: myCallback: (arg: string) => Promise; } ``` + 28. Prefer a type definition over an inline type. For example, define an interface. 29. Always prefer to add types or declare a type over the use of `any`. Prefer inferred types when they are not `any`. @@ -231,6 +222,7 @@ Unless otherwise specified, the following applies to all code: 31. Export only what can be reused. 32. Prefer a type like `Optional` (`type Optional = T | null | undefined`) instead of truly optional parameters. + 1. A notable exception is when the likelihood of a bug is minimal, such as when a function takes an argument that is more often not required than required. An example where the `?` operator is inappropriate is when taking a room ID: typically the caller should @@ -245,6 +237,7 @@ Unless otherwise specified, the following applies to all code: // ... } ``` + 33. There should be approximately one interface, class, or enum per file unless the file is named "types.ts", "global.d.ts", or ends with "-types.ts". 1. The file name should match the interface, class, or enum name. @@ -273,6 +266,7 @@ Unless otherwise specified, the following applies to all code: const example1 = "simple string"; const example2 = 'string containing "double quotes"'; ``` + 39. Prefer async-await to promise-chaining ```typescript @@ -312,6 +306,7 @@ Inheriting all the rules of TypeScript, the following additionally apply: } } ``` + 8. Stores must support using an alternative MatrixClient and dispatcher instance. 9. Utilities which require JSX must be split out from utilities which do not. This is to prevent import cycles during runtime where components accidentally include more of the app than they intended. @@ -323,37 +318,28 @@ Inheriting all the rules of TypeScript, the following additionally apply: ```typescript function render() { - return ; + return ; // or - return ( - - ); + return ; // or if children are needed (infer parens usage) - return { _t("Short string here") }; - - + return ( + + {_t("Short string here")} + + ); - return - { _t("Longer string here") } - ; + return ( + + {_t("Longer string here")} + + ); } ``` + 13. Curly braces within JSX should be padded with a space, however properties on those components should not. See above code example. 14. Functions used as properties should either be defined on the class or stored in a variable. They should not @@ -371,7 +357,7 @@ Inheriting all the rules of TypeScript, the following additionally apply: Note: We use PostCSS + some plugins to process our styles. It looks like SCSS, but actually it is not. -1. Class names must be prefixed with "mx_". +1. Class names must be prefixed with "mx\_". 2. Class names should denote the component which defines them, followed by any context: 1. mx_MyFoo 2. mx_MyFoo_avatar @@ -382,11 +368,13 @@ Note: We use PostCSS + some plugins to process our styles. It looks like SCSS, b ```scss .mx_MyFoo { - & .mx_MyFoo_avatar { // instead of &_avatar + & .mx_MyFoo_avatar { + // instead of &_avatar // ... } } ``` + 6. Break multiple selectors over multiple lines this way: ```scss @@ -396,6 +384,7 @@ Note: We use PostCSS + some plugins to process our styles. It looks like SCSS, b // ... } ``` + 7. Non-shared variables should use $lowerCamelCase. Shared variables use $dashed-naming. 8. Overrides to Z indexes, adjustments of dimensions/padding with pixels, and so on should all be documented for what the values mean: @@ -407,6 +396,7 @@ Note: We use PostCSS + some plugins to process our styles. It looks like SCSS, b z-index: 10; // above user avatar, but below dialogs } ``` + 9. Avoid the use of `!important`. If necessary, add a comment. ## Tests @@ -431,9 +421,7 @@ Note: We use PostCSS + some plugins to process our styles. It looks like SCSS, b // Use "it should..." terminology it("should call the correct API", async () => { // test-specific variables go here - // function calls/state changes go here - // expectations go here }); }); diff --git a/config.sample.json b/config.sample.json index 97bda379cd7..a26b5c334f7 100644 --- a/config.sample.json +++ b/config.sample.json @@ -22,15 +22,13 @@ "https://scalar-staging.vector.im/api", "https://scalar-staging.riot.im/scalar/api" ], - "defaultCountryCode": "GB", - "showLabsSettings": true, - "features": { }, + "default_country_code": "GB", + "show_labs_settings": true, + "features": {}, "default_federate": true, "default_theme": "light", "room_directory": { - "servers": [ - "matrix.org" - ] + "servers": ["matrix.org"] }, "enable_presence_by_hs_url": { "https://matrix.org": false, diff --git a/contribute.json b/contribute.json index 37aaa264f51..b0cad62effd 100644 --- a/contribute.json +++ b/contribute.json @@ -1,5 +1,5 @@ { - "name": "SchildiChat", + "name": "SchildiChat", "description": "A Matrix Client based on Element with a more traditional instant messaging experience", "repository": { "url": "https://github.com/SchildiChat/schildichat-desktop", @@ -9,9 +9,5 @@ "list": "https://github.com/SchildiChat/schildichat-desktop/issues", "report": "https://github.com/SchildiChat/schildichat-desktop/issues/new/choose" }, - "keywords": [ - "chat", - "schildichat", - "matrix" - ] + "keywords": ["chat", "schildichat", "matrix"] } diff --git a/docs/app-load.md b/docs/app-load.md index a043d204635..6f137bc8884 100644 --- a/docs/app-load.md +++ b/docs/app-load.md @@ -15,10 +15,10 @@ Current more parallel flow: digraph G { node [shape=box]; - subgraph cluster_0 { - color=orange; - node [style=filled]; - label = "index.ts"; +subgraph cluster_0 { +color=orange; +node [style=filled]; +label = "index.ts"; entrypoint, s0, ready [shape=point]; rageshake, config, i18n, theme, skin, olm [shape=parallelogram]; @@ -52,33 +52,38 @@ digraph G { skin -> ready [color=red]; theme -> ready [color=red]; i18n -> ready [color=red]; - } - subgraph cluster_1 { - color = green; - node [style=filled]; - label = "init.tsx"; +} + +subgraph cluster_1 { +color = green; +node [style=filled]; +label = "init.tsx"; ready -> loadApp; loadApp -> matrixchat; - } + +} } +

Key: -+ Parallelogram: async/await task -+ Box: sync task -+ Diamond: conditional branch -+ Egg: user interaction -+ Blue arrow: async task is allowed to settle but allowed to fail -+ Red arrow: async task success is asserted + +- Parallelogram: async/await task +- Box: sync task +- Diamond: conditional branch +- Egg: user interaction +- Blue arrow: async task is allowed to settle but allowed to fail +- Red arrow: async task success is asserted Notes: -+ A task begins when all its dependencies (arrows going into it) are fulfilled. -+ The success of setting up rageshake is never asserted, element-web has a fallback path for running without IDB (and thus rageshake). -+ Everything is awaited to be settled before the Modernizr check, to allow it to make use of things like i18n if they are successful. + +- A task begins when all its dependencies (arrows going into it) are fulfilled. +- The success of setting up rageshake is never asserted, element-web has a fallback path for running without IDB (and thus rageshake). +- Everything is awaited to be settled before the Modernizr check, to allow it to make use of things like i18n if they are successful. Underlying dependencies: ![image](https://user-images.githubusercontent.com/2403652/73848977-08624500-4821-11ea-9830-bb0317c41086.png) diff --git a/docs/betas.md b/docs/betas.md new file mode 100644 index 00000000000..79df5aa3dbe --- /dev/null +++ b/docs/betas.md @@ -0,0 +1,29 @@ +# Beta features + +Beta features are features that are not ready for production yet but the team +wants more people to try the features and give feedback on them. + +Before a feature gets into its beta phase, it is often a labs feature (see +[Labs](https://github.com/vector-im/element-web/blob/develop/docs/labs.md)). + +**Be warned! Beta features may not be completely finalised or stable!** + +## Threaded Messaging (`feature_thread`) + +Threading allows users to branch out a new conversation from the main timeline +of a room. This is particularly useful in high traffic rooms where multiple +conversations can happen in parallel or when a single discussion might stretch +over a very long period of time. + +Threads can be access by clicking their summary below the root event on the room +timeline. Users can find a comprehensive list of threads by click the icon on +the room header button. + +This feature might work in degraded mode if the homeserver a user is connected +to does not advertise support for the unstable feature `org.matrix.msc3440` when +calling the `/versions` API endpoint. + +## Video rooms (`feature_video_rooms`) + +Enables support for creating and joining video rooms, which are persistent video +chats that users can jump in and out of. diff --git a/docs/choosing-an-issue.md b/docs/choosing-an-issue.md index dfed5e6af7a..c82cb568224 100644 --- a/docs/choosing-an-issue.md +++ b/docs/choosing-an-issue.md @@ -33,19 +33,19 @@ someone to add something. When you're looking through the list, here are some things that might make an issue a **GOOD** choice: -* It is a problem or feature you care about. -* It concerns a type of code you know a little about. -* You think you can understand what's needed. -* It already has approval from Element Web's designers (look for comments from - members of the - [Product](https://github.com/orgs/vector-im/teams/product/members) or - [Design](https://github.com/orgs/vector-im/teams/design/members) teams). +- It is a problem or feature you care about. +- It concerns a type of code you know a little about. +- You think you can understand what's needed. +- It already has approval from Element Web's designers (look for comments from + members of the + [Product](https://github.com/orgs/vector-im/teams/product/members) or + [Design](https://github.com/orgs/vector-im/teams/design/members) teams). Here are some things that might make it a **BAD** choice: -* You don't understand it (maybe add a comment asking a clarifying question). -* It sounds difficult, or is part of a larger change you don't know about. -* **It is tagged with `X-Needs-Design` or `X-Needs-Product`.** +- You don't understand it (maybe add a comment asking a clarifying question). +- It sounds difficult, or is part of a larger change you don't know about. +- **It is tagged with `X-Needs-Design` or `X-Needs-Product`.** **Element Web's Design and Product teams tend to be very busy**, so if you make changes that require approval from one of those teams, you will probably have diff --git a/docs/config.md b/docs/config.md index e03f2b18635..075e0b588b4 100644 --- a/docs/config.md +++ b/docs/config.md @@ -17,7 +17,7 @@ for the desktop app the application will need to be exited fully (including via ## Homeserver configuration -In order for Element to even start you will need to tell it what homeserver to connect to *by default*. Users will be +In order for Element to even start you will need to tell it what homeserver to connect to _by default_. Users will be able to use a different homeserver if they like, though this can be disabled with `"disable_custom_urls": true` in your config. @@ -26,18 +26,18 @@ One of the following options **must** be supplied: 1. `default_server_config`: The preferred method of setting the homeserver connection information. Simply copy/paste your [`/.well-known/matrix/client`](https://spec.matrix.org/latest/client-server-api/#getwell-knownmatrixclient) into this field. For example: - ```json - { - "default_server_config": { - "m.homeserver": { - "base_url": "https://matrix-client.matrix.org" - }, - "m.identity_server": { - "base_url": "https://vector.im" - } - } - } - ``` + ```json + { + "default_server_config": { + "m.homeserver": { + "base_url": "https://matrix-client.matrix.org" + }, + "m.identity_server": { + "base_url": "https://vector.im" + } + } + } + ``` 2. `default_server_name`: A different method of connecting to the homeserver by looking up the connection information using `.well-known`. When using this option, simply use your server's domain name (the part at the end of user IDs): `"default_server_name": "matrix.org"` @@ -58,10 +58,10 @@ To force a labs flag on or off, use the following: ```json { - "features": { - "feature_you_want_to_turn_on": true, - "feature_you_want_to_keep_off": false - } + "features": { + "feature_you_want_to_turn_on": true, + "feature_you_want_to_keep_off": false + } } ``` @@ -82,25 +82,25 @@ instance. As of writing those settings are not fully documented, however a few a inputs. 3. `room_directory`: Optionally defines how the room directory component behaves. Currently only a single property, `servers` is supported to add additional servers to the dropdown. For example: - ```json - { - "room_directory": { - "servers": ["matrix.org", "example.org"] - } - } - ``` + ```json + { + "room_directory": { + "servers": ["matrix.org", "example.org"] + } + } + ``` 4. `setting_defaults`: Optional configuration for settings which are not described by this document and support the `config` level. This list is incomplete. For example: - ```json - { - "setting_defaults": { - "MessageComposerInput.showStickersButton": false, - "MessageComposerInput.showPollsButton": false - } - } - ``` - These values will take priority over the hardcoded defaults for the settings. For a list of available settings, see - [Settings.tsx](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.tsx). + ```json + { + "setting_defaults": { + "MessageComposerInput.showStickersButton": false, + "MessageComposerInput.showPollsButton": false + } + } + ``` + These values will take priority over the hardcoded defaults for the settings. For a list of available settings, see + [Settings.tsx](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.tsx). ## Customisation & branding @@ -171,16 +171,16 @@ Together, these two options might look like the following in your config: ```json { - "desktop_builds": { - "available": true, - "logo": "https://example.org/assets/logo-small.svg", - "url": "https://example.org/not_element/download" - }, - "mobile_builds": { - "ios": null, - "android": "https://example.org/not_element/android", - "fdroid": "https://example.org/not_element/fdroid" - } + "desktop_builds": { + "available": true, + "logo": "https://example.org/assets/logo-small.svg", + "url": "https://example.org/not_element/download" + }, + "mobile_builds": { + "ios": null, + "android": "https://example.org/not_element/android", + "fdroid": "https://example.org/not_element/fdroid" + } } ``` @@ -211,18 +211,18 @@ Together, the options might look like this in your config: ```json { - "branding": { - "welcome_background_url": "https://example.org/assets/background.jpg", - "auth_header_logo_url": "https://example.org/assets/logo.svg", - "auth_footer_links": [ - {"text": "FAQ", "url": "https://example.org/faq"}, - {"text": "Donate", "url": "https://example.org/donate"} - ] - }, - "embedded_pages": { - "welcome_url": "https://example.org/assets/welcome.html", - "home_url": "https://example.org/assets/home.html" - } + "branding": { + "welcome_background_url": "https://example.org/assets/background.jpg", + "auth_header_logo_url": "https://example.org/assets/logo.svg", + "auth_footer_links": [ + { "text": "FAQ", "url": "https://example.org/faq" }, + { "text": "Donate", "url": "https://example.org/donate" } + ] + }, + "embedded_pages": { + "welcome_url": "https://example.org/assets/welcome.html", + "home_url": "https://example.org/assets/home.html" + } } ``` @@ -241,15 +241,15 @@ When Element is deployed alongside a homeserver with SSO-only login, some option 2. `sso_redirect_options`: Options to define how to handle unauthenticated users. If the object contains `"immediate": true`, then all unauthenticated users will be automatically redirected to the SSO system to start their login. If instead you'd only like to have users which land on the welcome page to be redirected, use `"on_welcome_page": true`. As an example: - ```json - { - "sso_redirect_options": { - "immediate": false, - "on_welcome_page": true - } - } - ``` - It is most common to use the `immediate` flag instead of `on_welcome_page`. + ```json + { + "sso_redirect_options": { + "immediate": false, + "on_welcome_page": true + } + } + ``` + It is most common to use the `immediate` flag instead of `on_welcome_page`. ## VoIP / Jitsi calls @@ -262,77 +262,77 @@ More information about the Jitsi setup can be found [here](./jitsi.md). The VoIP and Jitsi options are: 1. `jitsi`: Optional configuration for how to start Jitsi conferences. Currently can only contain a single `preferred_domain` - value which points at the domain of the Jitsi instance. Defaults to `meet.jit.si`. This is *not* used if the Jitsi widget + value which points at the domain of the Jitsi instance. Defaults to `meet.jit.si`. This is _not_ used if the Jitsi widget was created by an integration manager, or if the homeserver provides Jitsi information in `/.well-known/matrix/client`. For example: - ```json - { - "jitsi": { - "preferred_domain": "meet.jit.si" - } - } - ``` + ```json + { + "jitsi": { + "preferred_domain": "meet.jit.si" + } + } + ``` 2. `jitsi_widget`: Optional configuration for the built-in Jitsi widget. Currently can only contain a single `skip_built_in_welcome_screen` value, denoting whether the "Join Conference" button should be shown. When `true` (default `false`), Jitsi calls will skip to the call instead of having a screen with a single button on it. This is most useful if the Jitsi instance being used already has a landing page for users to test audio and video before joining the call, otherwise users will automatically join the call. For example: - ```json - { - "jitsi_widget": { - "skip_built_in_welcome_screen": true - } - } - ``` + ```json + { + "jitsi_widget": { + "skip_built_in_welcome_screen": true + } + } + ``` 3. `voip`: Optional configuration for various VoIP features. Currently can only contain a single `obey_asserted_identity` value to - send MSC3086-style asserted identity messages during VoIP calls in the room corresponding to the asserted identity. This *must* + send MSC3086-style asserted identity messages during VoIP calls in the room corresponding to the asserted identity. This _must_ only be set in trusted environments. The option defaults to `false`. For example: - ```json - { - "voip": { - "obey_asserted_identity": false - } - } - ``` + ```json + { + "voip": { + "obey_asserted_identity": false + } + } + ``` 4. `widget_build_url`: Optional URL to have Element make a request to when a user presses the voice/video call buttons in the app, if a call would normally be started by the action. The URL will be called with a `roomId` query parameter to identify the room being called in. The URL must respond with a JSON object similar to the following: - ```json - { - "widget_id": "$arbitrary_string", - "widget": { - "creatorUserId": "@user:example.org", - "id": "$the_same_widget_id", - "type": "m.custom", - "waitForIframeLoad": true, - "name": "My Widget Name Here", - "avatar_url": "mxc://example.org/abc123", - "url": "https://example.org/widget.html", - "data": { - "title": "Subtitle goes here" - } - }, - "layout": { - "container": "top", - "index": 0, - "width": 65, - "height": 50 - } - } - ``` - The `widget` is the `content` of a normal widget state event. The `layout` is the layout specifier for the widget being created, - as defined by the `io.element.widgets.layout` state event. + ```json + { + "widget_id": "$arbitrary_string", + "widget": { + "creatorUserId": "@user:example.org", + "id": "$the_same_widget_id", + "type": "m.custom", + "waitForIframeLoad": true, + "name": "My Widget Name Here", + "avatar_url": "mxc://example.org/abc123", + "url": "https://example.org/widget.html", + "data": { + "title": "Subtitle goes here" + } + }, + "layout": { + "container": "top", + "index": 0, + "width": 65, + "height": 50 + } + } + ``` + The `widget` is the `content` of a normal widget state event. The `layout` is the layout specifier for the widget being created, + as defined by the `io.element.widgets.layout` state event. 5. `audio_stream_url`: Optional URL to pass to Jitsi to enable live streaming. This option is considered experimental and may be removed at any time without notice. 6. `element_call`: Optional configuration for native group calls using Element Call, with the following subkeys: - - `url`: The URL of the Element Call instance to use for native group calls. This option is considered experimental + - `url`: The URL of the Element Call instance to use for native group calls. This option is considered experimental and may be removed at any time without notice. Defaults to `https://call.element.io`. - - `use_exclusively`: A boolean specifying whether Element Call should be used exclusively as the only VoIP stack in + - `use_exclusively`: A boolean specifying whether Element Call should be used exclusively as the only VoIP stack in the app, removing the ability to start legacy 1:1 calls or Jitsi calls. Defaults to `false`. - - `participant_limit`: The maximum number of users who can join a call; if - this number is exceeded, the user will not be able to join a given call. - - `brand`: Optional name for the app. Defaults to `Element Call`. This is - used throughout the application in various strings/locations. + - `participant_limit`: The maximum number of users who can join a call; if + this number is exceeded, the user will not be able to join a given call. + - `brand`: Optional name for the app. Defaults to `Element Call`. This is + used throughout the application in various strings/locations. ## Bug reporting @@ -345,7 +345,7 @@ If you run your own rageshake server to collect bug reports, the following optio alongside the rageshake so the rageshake server can filter them by app name. By default, this will be `element-web`, as with any other rageshake submitted by the app. - If you are using the element.io rageshake server, please set this to `element-auto-uisi` so we can better filter them. + If you are using the element.io rageshake server, please set this to `element-auto-uisi` so we can better filter them. If you would like to use [Sentry](https://sentry.io/) for rageshake data, add a `sentry` object to your config with the following values: @@ -356,10 +356,10 @@ For example: ```json { - "sentry": { - "dsn": "dsn-goes-here", - "environment": "production" - } + "sentry": { + "dsn": "dsn-goes-here", + "environment": "production" + } } ``` @@ -376,15 +376,15 @@ If you would like to use Scalar, the integration manager maintained by Element, ```json { - "integrations_ui_url": "https://scalar.vector.im/", - "integrations_rest_url": "https://scalar.vector.im/api", - "integrations_widgets_urls": [ - "https://scalar.vector.im/_matrix/integrations/v1", - "https://scalar.vector.im/api", - "https://scalar-staging.vector.im/_matrix/integrations/v1", - "https://scalar-staging.vector.im/api", - "https://scalar-staging.riot.im/scalar/api" - ] + "integrations_ui_url": "https://scalar.vector.im/", + "integrations_rest_url": "https://scalar.vector.im/api", + "integrations_widgets_urls": [ + "https://scalar.vector.im/_matrix/integrations/v1", + "https://scalar.vector.im/api", + "https://scalar-staging.vector.im/_matrix/integrations/v1", + "https://scalar-staging.vector.im/api", + "https://scalar-staging.riot.im/scalar/api" + ] } ``` @@ -394,9 +394,9 @@ If you would like to include a custom message when someone is reporting an event ```json { - "report_event": { - "admin_message_md": "Please be sure to review our [terms of service](https://example.org/terms) before reporting a message." - } + "report_event": { + "admin_message_md": "Please be sure to review our [terms of service](https://example.org/terms) before reporting a message." + } } ``` @@ -404,9 +404,7 @@ To add additional "terms and conditions" links throughout the app, use the follo ```json { - "terms_and_conditions_links": [ - { "text": "Code of conduct", "url": "https://example.org/code-of-conduct" } - ] + "terms_and_conditions_links": [{ "text": "Code of conduct", "url": "https://example.org/code-of-conduct" }] } ``` @@ -423,7 +421,7 @@ analytics are deemed impossible and the user won't be asked to opt in to the sys There are additional root-level options which can be specified: 1. `analytics_owner`: the company name used in dialogs talking about analytics - this defaults to `brand`, -and is useful when the provider of analytics is different from the provider of the Element instance. + and is useful when the provider of analytics is different from the provider of the Element instance. 2. `privacy_policy_url`: URL to the privacy policy including the analytics collection policy. ## Server hosting links @@ -436,26 +434,26 @@ will not be shown to the user. of `utm_campaign` to denote which link the user clicked on within the app. Only ever applies to matrix.org users specifically. 2. `host_signup`: Optional configuration for an account importer to your hosting platform. The API surface of this is not documented at the moment, but can be configured with the following subproperties: - 1. `brand`: The brand name to use. - 2. `url`: The iframe URL for the importer. - 3. `domains`: The homeserver domains to show the importer to. - 4. `cookie_policy_url`: The URL to the cookie policy for the importer. - 5. `privacy_policy_url`: The URL to the privacy policy for the importer. - 6. `terms_of_service_url`: The URL to the terms of service for the importer. + 1. `brand`: The brand name to use. + 2. `url`: The iframe URL for the importer. + 3. `domains`: The homeserver domains to show the importer to. + 4. `cookie_policy_url`: The URL to the cookie policy for the importer. + 5. `privacy_policy_url`: The URL to the privacy policy for the importer. + 6. `terms_of_service_url`: The URL to the terms of service for the importer. If you're looking to mirror a setup from our production/development environments, the following config should be used: ```json { - "hosting_signup_link": "https://element.io/matrix-services?utm_source=element-web&utm_medium=web", - "host_signup": { - "brand": "Element Home", - "domains": [ "matrix.org" ], - "url": "https://ems.element.io/element-home/in-app-loader", - "cookie_policy_url": "https://element.io/cookie-policy", - "privacy_policy_url": "https://element.io/privacy", - "terms_of_service_url": "https://element.io/terms-of-service" - } + "hosting_signup_link": "https://element.io/matrix-services?utm_source=element-web&utm_medium=web", + "host_signup": { + "brand": "Element Home", + "domains": ["matrix.org"], + "url": "https://ems.element.io/element-home/in-app-loader", + "cookie_policy_url": "https://element.io/cookie-policy", + "privacy_policy_url": "https://element.io/privacy", + "terms_of_service_url": "https://element.io/terms-of-service" + } } ``` @@ -468,10 +466,10 @@ set this value to the following at a minimum: ```json { - "enable_presence_by_hs_url": { - "https://matrix.org": false, - "https://matrix-client.matrix.org": false - } + "enable_presence_by_hs_url": { + "https://matrix.org": false, + "https://matrix-client.matrix.org": false + } } ``` @@ -488,8 +486,8 @@ Element will check multiple sources when looking for an identity server to use i the following order of preference: 1. The identity server set in the user's account data - * For a new user, no value is present in their account data. It is only set - if the user visits Settings and manually changes their identity server. + - For a new user, no value is present in their account data. It is only set + if the user visits Settings and manually changes their identity server. 2. The identity server provided by the `.well-known` lookup that occurred at login 3. The identity server provided by the Riot config file @@ -515,38 +513,40 @@ preferences. Currently, the following UI feature flags are supported: -* `UIFeature.urlPreviews` - Whether URL previews are enabled across the entire application. -* `UIFeature.feedback` - Whether prompts to supply feedback are shown. -* `UIFeature.voip` - Whether or not VoIP is shown readily to the user. When disabled, - Jitsi widgets will still work though they cannot easily be added. -* `UIFeature.widgets` - Whether or not widgets will be shown. -* `UIFeature.flair` - Whether or not community flair is shown in rooms. -* `UIFeature.communities` - Whether or not to show any UI related to communities. Implicitly - disables `UIFeature.flair` when disabled. -* `UIFeature.advancedSettings` - Whether or not sections titled "advanced" in room and - user settings are shown to the user. -* `UIFeature.shareQrCode` - Whether or not the QR code on the share room/event dialog - is shown. -* `UIFeature.shareSocial` - Whether or not the social icons on the share room/event dialog - are shown. -* `UIFeature.identityServer` - Whether or not functionality requiring an identity server - is shown. When disabled, the user will not be able to interact with the identity - server (sharing email addresses, 3PID invites, etc). -* `UIFeature.thirdPartyId` - Whether or not UI relating to third party identifiers (3PIDs) - is shown. Typically this is considered "contact information" on the homeserver, and is - not directly related to the identity server. -* `UIFeature.registration` - Whether or not the registration page is accessible. Typically - useful if accounts are managed externally. -* `UIFeature.passwordReset` - Whether or not the password reset page is accessible. Typically - useful if accounts are managed externally. -* `UIFeature.deactivate` - Whether or not the deactivate account button is accessible. Typically - useful if accounts are managed externally. -* `UIFeature.advancedEncryption` - Whether or not advanced encryption options are shown to the - user. -* `UIFeature.roomHistorySettings` - Whether or not the room history settings are shown to the user. - This should only be used if the room history visibility options are managed by the server. -* `UIFeature.TimelineEnableRelativeDates` - Display relative date separators (eg: 'Today', 'Yesterday') in the - timeline for recent messages. When false day dates will be used. +- `UIFeature.urlPreviews` - Whether URL previews are enabled across the entire application. +- `UIFeature.feedback` - Whether prompts to supply feedback are shown. +- `UIFeature.voip` - Whether or not VoIP is shown readily to the user. When disabled, + Jitsi widgets will still work though they cannot easily be added. +- `UIFeature.widgets` - Whether or not widgets will be shown. +- `UIFeature.flair` - Whether or not community flair is shown in rooms. +- `UIFeature.communities` - Whether or not to show any UI related to communities. Implicitly + disables `UIFeature.flair` when disabled. +- `UIFeature.advancedSettings` - Whether or not sections titled "advanced" in room and + user settings are shown to the user. +- `UIFeature.shareQrCode` - Whether or not the QR code on the share room/event dialog + is shown. +- `UIFeature.shareSocial` - Whether or not the social icons on the share room/event dialog + are shown. +- `UIFeature.identityServer` - Whether or not functionality requiring an identity server + is shown. When disabled, the user will not be able to interact with the identity + server (sharing email addresses, 3PID invites, etc). +- `UIFeature.thirdPartyId` - Whether or not UI relating to third party identifiers (3PIDs) + is shown. Typically this is considered "contact information" on the homeserver, and is + not directly related to the identity server. +- `UIFeature.registration` - Whether or not the registration page is accessible. Typically + useful if accounts are managed externally. +- `UIFeature.passwordReset` - Whether or not the password reset page is accessible. Typically + useful if accounts are managed externally. +- `UIFeature.deactivate` - Whether or not the deactivate account button is accessible. Typically + useful if accounts are managed externally. +- `UIFeature.advancedEncryption` - Whether or not advanced encryption options are shown to the + user. +- `UIFeature.roomHistorySettings` - Whether or not the room history settings are shown to the user. + This should only be used if the room history visibility options are managed by the server. +- `UIFeature.TimelineEnableRelativeDates` - Display relative date separators (eg: 'Today', 'Yesterday') in the + timeline for recent messages. When false day dates will be used. +- `UIFeature.BulkUnverifiedSessionsReminder` - Display popup reminders to verify or remove unverified sessions. Defaults + to true. ## Undocumented / developer options diff --git a/docs/custom-home.md b/docs/custom-home.md index a179c6c7d08..ef8d523f987 100644 --- a/docs/custom-home.md +++ b/docs/custom-home.md @@ -26,7 +26,6 @@ The home page can be overridden in `config.json` to provide all users of an elem } ``` - ## `home.html` Example The following is a simple example for a custom `home.html`: @@ -62,4 +61,3 @@ It may be needed to set CORS headers for the `home.html` to enable element-deskt ``` add_header Access-Control-Allow-Origin *; ``` - diff --git a/docs/customisations.md b/docs/customisations.md index fed7e616f6d..730e9da7941 100644 --- a/docs/customisations.md +++ b/docs/customisations.md @@ -30,7 +30,7 @@ maintenance. **Note**: The project deliberately does not exclude `customisations.json` from Git. This is to ensure that in shared projects it's possible to have a common config. By -default, Element Web does *not* ship with this file to prevent conflicts. +default, Element Web does _not_ ship with this file to prevent conflicts. ### Custom components @@ -41,9 +41,10 @@ that properties/state machines won't change. ### Component visibility customisation UI for some actions can be hidden via the ComponentVisibility customisation: -- inviting users to rooms and spaces, -- creating rooms, -- creating spaces, + +- inviting users to rooms and spaces, +- creating rooms, +- creating spaces, To customise visibility create a customisation module from [ComponentVisibility](https://github.com/matrix-org/matrix-react-sdk/blob/master/src/customisations/ComponentVisibility.ts) following the instructions above. @@ -55,6 +56,7 @@ might be shown to the user, but they won't have permission to invite users to the current room: the button will appear disabled. For example, to only allow users who meet a certain condition to create spaces: + ```typescript function shouldShowComponent(component: UIComponent): boolean { if (component === UIComponent.CreateSpaces) { @@ -65,4 +67,5 @@ function shouldShowComponent(component: UIComponent): boolean { return true; } ``` + In this example, all UI related to creating a space will be hidden unless the users meets the custom condition. diff --git a/docs/e2ee.md b/docs/e2ee.md index 5e7d505c624..534bc4d32e8 100644 --- a/docs/e2ee.md +++ b/docs/e2ee.md @@ -10,9 +10,9 @@ Set the following on your homeserver's ```json { - "io.element.e2ee": { - "default": false - } + "io.element.e2ee": { + "default": false + } } ``` @@ -29,9 +29,9 @@ following on your homeserver's `/.well-known/matrix/client` config: ```json { - "io.element.e2ee": { - "secure_backup_required": true - } + "io.element.e2ee": { + "secure_backup_required": true + } } ``` @@ -44,9 +44,9 @@ only offer one of these, you can signal this via the ```json { - "io.element.e2ee": { - "secure_backup_setup_methods": ["passphrase"] - } + "io.element.e2ee": { + "secure_backup_setup_methods": ["passphrase"] + } } ``` diff --git a/docs/feature-flags.md b/docs/feature-flags.md index ddca7d40bd7..6d43c9ce069 100644 --- a/docs/feature-flags.md +++ b/docs/feature-flags.md @@ -5,10 +5,10 @@ flexibility and control over when and where those features are enabled. For example, flags make the following things possible: -* Extended testing of a feature via labs on develop -* Enabling features when ready instead of the first moment the code is released -* Testing a feature with a specific set of users (by enabling only on a specific - Element instance) +- Extended testing of a feature via labs on develop +- Enabling features when ready instead of the first moment the code is released +- Testing a feature with a specific set of users (by enabling only on a specific + Element instance) The size of the feature controlled by a feature flag may vary widely: it could be a large project like reactions or a smaller change to an existing algorithm. @@ -37,6 +37,7 @@ When starting work on a feature, we should create a matching feature flag: 1. Add a new [setting](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.tsx) of the form: + ```js "feature_cats": { isFeature: true, @@ -45,10 +46,13 @@ When starting work on a feature, we should create a matching feature flag: default: false, }, ``` + 2. Check whether the feature is enabled as appropriate: + ```js - SettingsStore.getValue("feature_cats") +SettingsStore.getValue("feature_cats"); ``` + 3. Document the feature in the [labs documentation](https://github.com/vector-im/element-web/blob/develop/docs/labs.md) With these steps completed, the feature is disabled by default, but can be @@ -88,12 +92,14 @@ cover these cases, change the setting's `default` in `Settings.tsx` to `true`. Once we're confident that a feature is working well, we should remove or convert the flag. If the feature is meant to be turned off/on by the user: + 1. Remove `isFeature` from the [setting](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.ts) 2. Change the `default` to `true` (if desired). 3. Remove the feature from the [labs documentation](https://github.com/vector-im/element-web/blob/develop/docs/labs.md) 4. Celebrate! 🥳 If the feature is meant to be forced on (non-configurable): + 1. Remove the [setting](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.ts) 2. Remove all `getValue` lines that test for the feature. 3. Remove the feature from the [labs documentation](https://github.com/vector-im/element-web/blob/develop/docs/labs.md) diff --git a/docs/jitsi-dev.md b/docs/jitsi-dev.md index d685a221542..59dc9a1ad8c 100644 --- a/docs/jitsi-dev.md +++ b/docs/jitsi-dev.md @@ -1,7 +1,7 @@ # Jitsi wrapper developer docs -*If you're looking for information on how to set up Jitsi in your Element, see -[jitsi.md](./jitsi.md) instead.* +_If you're looking for information on how to set up Jitsi in your Element, see +[jitsi.md](./jitsi.md) instead._ These docs are for developers wondering how the different conference buttons work within Element. If you're not a developer, you're probably looking for [jitsi.md](./jitsi.md). @@ -46,24 +46,24 @@ end up creating a widget with a URL like `https://integrations.example.org?widge The integration manager's wrapper will typically have another iframe to isolate the widget from the client by yet another layer. The wrapper often provides other functionality which might not be available on the embedded site, such as a fullscreen button or the -communication layer with the client (all widgets *should* be talking to the client +communication layer with the client (all widgets _should_ be talking to the client over `postMessage`, even if they aren't going to be using the widget APIs). -Widgets added with the `/addwidget` command will *not* be wrapped as they are not going -through an integration manager. The widgets themselves *should* also work outside of +Widgets added with the `/addwidget` command will _not_ be wrapped as they are not going +through an integration manager. The widgets themselves _should_ also work outside of Element. Widgets currently have a "pop out" button which opens them in a new tab and therefore have no connection back to Riot. ## Jitsi widgets from integration managers Integration managers will create an entire widget event and send it over `postMessage` -for the client to add to the room. This means that the integration manager gets to +for the client to add to the room. This means that the integration manager gets to decide the conference domain, conference name, and other aspects of the widget. As a result, users can end up with a Jitsi widget that does not use the same conference server they specified in their config.json - this is expected. Some integration managers allow the user to change the conference name while others -will generate one for the user. +will generate one for the user. ## Jitsi widgets generated by Element itself @@ -79,7 +79,7 @@ The Jitsi widget created by Element uses a local `jitsi.html` wrapper (or one ho required `postMessage` calls are fulfilled. **Note**: Per [jitsi.md](./jitsi.md) the `preferredDomain` can also come from the server's -client .well-known data. +client .well-known data. ## The Jitsi wrapper in Element @@ -92,9 +92,9 @@ and less risky to load. The local wrapper URL is populated with the conference i from the original widget (which could be a v1 or v2 widget) so the user joins the right call. -Critically, when the widget URL is reconstructed it does *not* take into account the +Critically, when the widget URL is reconstructed it does _not_ take into account the config.json's `preferredDomain` for Jitsi. If it did this, users would end up on different -conference servers and therefore different calls entirely. +conference servers and therefore different calls entirely. **Note**: Per [jitsi.md](./jitsi.md) the `preferredDomain` can also come from the server's client .well-known data. diff --git a/docs/jitsi.md b/docs/jitsi.md index c1f59a2103d..33156b31f89 100644 --- a/docs/jitsi.md +++ b/docs/jitsi.md @@ -24,13 +24,14 @@ Element will use the Jitsi server that is embedded in the widget, even if it is one you configured. This is because conference calls must be held on a single Jitsi server and cannot be split over multiple servers. -However, you can configure Element to *start* a conference with your Jitsi server by adding +However, you can configure Element to _start_ a conference with your Jitsi server by adding to your [config](./config.md) the following: + ```json { - "jitsi": { - "preferredDomain": "your.jitsi.example.org" - } + "jitsi": { + "preferredDomain": "your.jitsi.example.org" + } } ``` @@ -46,11 +47,12 @@ domain will appear later in the URL as a configuration parameter. **Hint**: If you want everyone on your homeserver to use the same Jitsi server by default, and you are using element-web 1.6 or newer, set the following on your homeserver's `/.well-known/matrix/client` config: + ```json { - "im.vector.riot.jitsi": { - "preferredDomain": "your.jitsi.example.org" - } + "im.vector.riot.jitsi": { + "preferredDomain": "your.jitsi.example.org" + } } ``` diff --git a/docs/kubernetes.md b/docs/kubernetes.md index a49888ef93f..ee38713cfbe 100644 --- a/docs/kubernetes.md +++ b/docs/kubernetes.md @@ -1,5 +1,4 @@ -Running in Kubernetes -===================== +# Running in Kubernetes In case you would like to deploy element-web in a kubernetes cluster you can use the provided Kubernetes example below as a starting point. Note that this example assumes the @@ -178,4 +177,3 @@ Then you can deploy it to your cluster with something like `kubectl apply -f my- number: 80 --- - diff --git a/docs/labs.md b/docs/labs.md index e0465c007b8..24cb2574578 100644 --- a/docs/labs.md +++ b/docs/labs.md @@ -4,6 +4,9 @@ If Labs is enabled in the [Element config](config.md), you can enable some of th to `Settings->Labs`. This list is non-exhaustive and subject to change, chat in [#element-web:matrix.org](https://matrix.to/#/#element-web:matrix.org) for more information. +If a labs features gets more stable, it _may_ be promoted to a beta feature +(see [Betas](https://github.com/vector-im/element-web/blob/develop/docs/betas.md)). + **Be warned! Labs features are not finalised, they may be fragile, they may change, they may be dropped. Ask in the room if you are unclear about any details here.** @@ -123,7 +126,7 @@ Switches to a new room search experience. ## Extensible events rendering (`feature_extensible_events`) [In Development] -*Intended for developer use only at the moment.* +_Intended for developer use only at the moment._ Extensible Events are a [new event format](https://github.com/matrix-org/matrix-doc/pull/1767) which supports graceful fallback in unknown event types. Instead of rendering nothing or a blank space, events @@ -160,7 +163,7 @@ Threading allows users to branch out a new conversation from the main timeline o Threads can be access by clicking their summary below the root event on the room timeline. Users can find a comprehensive list of threads by click the icon on the room header button. -This feature might work in degraded mode if the homeserver a user is connected to does not advertise support for the unstable feature `org.matrix.msc3440` when calling the `/versions` API endpoint. +This feature might work in degraded mode if the homeserver a user is connected to does not advertise support for the unstable feature `org.matrix.msc3440` when calling the `/versions` API endpoint. ## Video rooms (`feature_video_rooms`) diff --git a/docs/memory-profiles-and-leaks.md b/docs/memory-profiles-and-leaks.md index 49acd0fdba1..795e89965b8 100644 --- a/docs/memory-profiles-and-leaks.md +++ b/docs/memory-profiles-and-leaks.md @@ -1,11 +1,11 @@ ## Memory leaks -Element usually emits slow behaviour just before it is about to crash. Getting a +Element usually emits slow behaviour just before it is about to crash. Getting a memory snapshot (below) just before that happens is ideal in figuring out what is going wrong. Common symptoms are clicking on a room and it feels like the tab froze and scrolling -becoming jumpy/staggered. +becoming jumpy/staggered. If you receive a white screen (electron) or the chrome crash page, it is likely run out of memory and it is too late for a memory profile. Please do report when @@ -22,8 +22,8 @@ and anything newer is still in the warmup stages of the app. **Memory profiles can contain sensitive information.** If you are submitting a memory profile to us for debugging purposes, please pick the appropriate Element developer and -send them over an encrypted private message. *Do not share your memory profile in -public channels or with people you do not trust.* +send them over an encrypted private message. _Do not share your memory profile in +public channels or with people you do not trust._ ### Taking a memory profile (Firefox) diff --git a/docs/modules.md b/docs/modules.md index d5c101d16f3..86dae10e5ab 100644 --- a/docs/modules.md +++ b/docs/modules.md @@ -34,6 +34,7 @@ our [ILAG module](https://github.com/vector-im/element-web-ilag-module) which wi structure of a module is and how it works. The following requirements are key for any module: + 1. The module must depend on `@matrix-org/react-sdk-module-api` (usually as a dev dependency). 2. The module's `main` entrypoint must have a `default` export for the `RuntimeModule` instance, supporting a constructor which takes a single parameter: a `ModuleApi` instance. This instance is passed to `super()`. diff --git a/docs/review.md b/docs/review.md index b84f422dca2..8f8dc5f09bb 100644 --- a/docs/review.md +++ b/docs/review.md @@ -10,53 +10,53 @@ When reviewing code, here are some things we look for and also things we avoid: ### We review for -* Correctness -* Performance -* Accessibility -* Security -* Quality via automated and manual testing -* Comments and documentation where needed -* Sharing knowledge of different areas among the team -* Ensuring it's something we're comfortable maintaining for the long term -* Progress indicators and local echo where appropriate with network activity +- Correctness +- Performance +- Accessibility +- Security +- Quality via automated and manual testing +- Comments and documentation where needed +- Sharing knowledge of different areas among the team +- Ensuring it's something we're comfortable maintaining for the long term +- Progress indicators and local echo where appropriate with network activity ### We should avoid -* Style nits that are already handled by the linter -* Dramatically increasing scope +- Style nits that are already handled by the linter +- Dramatically increasing scope ### Good practices -* Use empathetic language - * See also [Mindful Communication in Code - Reviews](https://kickstarter.engineering/a-guide-to-mindful-communication-in-code-reviews-48aab5282e5e) - and [How to Do Code Reviews Like a Human](https://mtlynch.io/human-code-reviews-1/) -* Authors should prefer smaller commits for easier reviewing and bisection -* Reviewers should be explicit about required versus optional changes - * Reviews are conversations and the PR author should feel comfortable - discussing and pushing back on changes before making them -* Reviewers are encouraged to ask for tests where they believe it is reasonable -* Core team should lead by example through their tone and language -* Take the time to thank and point out good code changes -* Using softer language like "please" and "what do you think?" goes a long way - towards making others feel like colleagues working towards a common goal +- Use empathetic language + - See also [Mindful Communication in Code + Reviews](https://kickstarter.engineering/a-guide-to-mindful-communication-in-code-reviews-48aab5282e5e) + and [How to Do Code Reviews Like a Human](https://mtlynch.io/human-code-reviews-1/) +- Authors should prefer smaller commits for easier reviewing and bisection +- Reviewers should be explicit about required versus optional changes + - Reviews are conversations and the PR author should feel comfortable + discussing and pushing back on changes before making them +- Reviewers are encouraged to ask for tests where they believe it is reasonable +- Core team should lead by example through their tone and language +- Take the time to thank and point out good code changes +- Using softer language like "please" and "what do you think?" goes a long way + towards making others feel like colleagues working towards a common goal ### Workflow -* Authors should request review from the element-web team by default (if someone on - the team is clearly the expert in an area, a direct review request to them may - be more appropriate) -* Reviewers should remove the team review request and request review from - themselves when starting a review to avoid double review -* If there are multiple related PRs authors should reference each of the PRs in - the others before requesting review. Reviewers might start reviewing from - different places and could miss other required PRs. -* Avoid force pushing to a PR after the first round of review -* Use the GitHub default of merge commits when landing (avoid alternate options - like squash or rebase) -* PR author merges after review (assuming they have write access) -* Assign issues only when in progress to indicate to others what can be picked - up +- Authors should request review from the element-web team by default (if someone on + the team is clearly the expert in an area, a direct review request to them may + be more appropriate) +- Reviewers should remove the team review request and request review from + themselves when starting a review to avoid double review +- If there are multiple related PRs authors should reference each of the PRs in + the others before requesting review. Reviewers might start reviewing from + different places and could miss other required PRs. +- Avoid force pushing to a PR after the first round of review +- Use the GitHub default of merge commits when landing (avoid alternate options + like squash or rebase) +- PR author merges after review (assuming they have write access) +- Assign issues only when in progress to indicate to others what can be picked + up ## Code Quality @@ -64,10 +64,10 @@ In the past, we have occasionally written different kinds of tests for Element and the SDKs, but it hasn't been a consistent focus. Going forward, we'd like to change that. -* For new features, code reviewers will expect some form of automated testing to - be included by default -* For bug fixes, regression tests are of course great to have, but we don't want - to block fixes on this, so we won't require them at this time +- For new features, code reviewers will expect some form of automated testing to + be included by default +- For bug fixes, regression tests are of course great to have, but we don't want + to block fixes on this, so we won't require them at this time The above policy is not a strict rule, but instead it's meant to be a conversation between the author and reviewer. As an author, try to think about @@ -104,10 +104,10 @@ perspective. In more detail, our usual process for changes that affect the UI or alter user functionality is: -* For changes that will go live when merged, always flag Design and Product - teams as appropriate -* For changes guarded by a feature flag, Design and Product review is not - required (though may still be useful) since we can continue tweaking +- For changes that will go live when merged, always flag Design and Product + teams as appropriate +- For changes guarded by a feature flag, Design and Product review is not + required (though may still be useful) since we can continue tweaking As it can be difficult to review design work from looking at just the changed files in a PR, a [preview site](./pr-previews.md) that includes your changes diff --git a/docs/theming.md b/docs/theming.md index b0353ea3c11..3a733a72e2e 100644 --- a/docs/theming.md +++ b/docs/theming.md @@ -1,31 +1,29 @@ -Theming Element -============ +# Theming Element Themes are a very basic way of providing simple alternative look & feels to the Element app via CSS & custom imagery. -They are *NOT* co be confused with 'skins', which describe apps which sit on top +They are _NOT_ co be confused with 'skins', which describe apps which sit on top of matrix-react-sdk - e.g. in theory Element itself is a react-sdk skin. As of March 2022, skins are not fully supported; Element is the only available skin. To define a theme for Element: - 1. Pick a name, e.g. `teal`. at time of writing we have `light` and `dark`. - 2. Fork `src/skins/vector/css/themes/dark.pcss` to be `teal.pcss` - 3. Fork `src/skins/vector/css/themes/_base.pcss` to be `_teal.pcss` - 4. Override variables in `_teal.pcss` as desired. You may wish to delete ones +1. Pick a name, e.g. `teal`. at time of writing we have `light` and `dark`. +2. Fork `src/skins/vector/css/themes/dark.pcss` to be `teal.pcss` +3. Fork `src/skins/vector/css/themes/_base.pcss` to be `_teal.pcss` +4. Override variables in `_teal.pcss` as desired. You may wish to delete ones which don't differ from `_base.pcss`, to make it clear which are being overridden. If every single colour is being changed (as per `_dark.pcss`) then you might as well keep them all. - 5. Add the theme to the list of entrypoints in webpack.config.js - 6. Add the theme to the list of themes in matrix-react-sdk's UserSettings.js - 7. Sit back and admire your handywork. +5. Add the theme to the list of entrypoints in webpack.config.js +6. Add the theme to the list of themes in matrix-react-sdk's UserSettings.js +7. Sit back and admire your handywork. In future, the assets for a theme will probably be gathered together into a single directory tree. -Custom Themes -============= +# Custom Themes Themes derived from the built in themes may also be defined in settings. diff --git a/docs/translating-dev.md b/docs/translating-dev.md index 505558bc3d1..28c74e96695 100644 --- a/docs/translating-dev.md +++ b/docs/translating-dev.md @@ -2,11 +2,11 @@ ## Requirements -- A working [Development Setup](../README.md#setting-up-a-dev-environment) - - Including up-to-date versions of matrix-react-sdk and matrix-js-sdk -- Latest LTS version of Node.js installed -- Be able to understand English -- Be able to understand the language you want to translate Element into +- A working [Development Setup](../README.md#setting-up-a-dev-environment) + - Including up-to-date versions of matrix-react-sdk and matrix-js-sdk +- Latest LTS version of Node.js installed +- Be able to understand English +- Be able to understand the language you want to translate Element into ## Translating strings vs. marking strings for translation @@ -15,6 +15,7 @@ Translating strings are done with the `_t()` function found in matrix-react-sdk/ Basically, whenever a translatable string is introduced, you should call either `_t()` immediately OR `_td()` and later `_t()`. Example: + ``` // Module-level constant const COLORS = { @@ -30,10 +31,10 @@ function getColorName(hex) { ## Adding new strings - 1. Check if the import ``import { _t } from 'matrix-react-sdk/src/languageHandler';`` is present. If not add it to the other import statements. Also import `_td` if needed. - 1. Add ``_t()`` to your string. (Don't forget curly braces when you assign an expression to JSX attributes in the render method). If the string is introduced at a point before the translation system has not yet been initialized, use `_td()` instead, and call `_t()` at the appropriate time. - 1. Run `yarn i18n` to update ``src/i18n/strings/en_EN.json`` - 1. If you added a string with a plural, you can add other English plural variants to ``src/i18n/strings/en_EN.json`` (remeber to edit the one in the same project as the source file containing your new translation). +1. Check if the import `import { _t } from 'matrix-react-sdk/src/languageHandler';` is present. If not add it to the other import statements. Also import `_td` if needed. +1. Add `_t()` to your string. (Don't forget curly braces when you assign an expression to JSX attributes in the render method). If the string is introduced at a point before the translation system has not yet been initialized, use `_td()` instead, and call `_t()` at the appropriate time. +1. Run `yarn i18n` to update `src/i18n/strings/en_EN.json` +1. If you added a string with a plural, you can add other English plural variants to `src/i18n/strings/en_EN.json` (remeber to edit the one in the same project as the source file containing your new translation). ## Editing existing strings @@ -43,21 +44,21 @@ function getColorName(hex) { ## Adding variables inside a string. -1. Extend your ``_t()`` call. Instead of ``_t(STRING)`` use ``_t(STRING, {})`` +1. Extend your `_t()` call. Instead of `_t(STRING)` use `_t(STRING, {})` 1. Decide how to name it. Please think about if the person who has to translate it can understand what it does. E.g. using the name 'recipient' is bad, because a translator does not know if it is the name of a person, an email address, a user ID, etc. Rather use e.g. recipientEmailAddress. -1. Add it to the array in ``_t`` for example ``_t(STRING, {variable: this.variable})`` -1. Add the variable inside the string. The syntax for variables is ``%(variable)s``. Please note the _s_ at the end. The name of the variable has to match the previous used name. +1. Add it to the array in `_t` for example `_t(STRING, {variable: this.variable})` +1. Add the variable inside the string. The syntax for variables is `%(variable)s`. Please note the _s_ at the end. The name of the variable has to match the previous used name. -- You can use the special ``count`` variable to choose between multiple versions of the same string, in order to get the correct pluralization. E.g. ``_t('You have %(count)s new messages', { count: 2 })`` would show 'You have 2 new messages', while ``_t('You have %(count)s new messages', { count: 1 })`` would show 'You have one new message' (assuming a singular version of the string has been added to the translation file. See above). Passing in ``count`` is much prefered over having an if-statement choose the correct string to use, because some languages have much more complicated plural rules than english (e.g. they might need a completely different form if there are three things rather than two). -- If you want to translate text that includes e.g. hyperlinks or other HTML you have to also use tag substitution, e.g. ``_t('Click here!', {}, { 'a': (sub) => {sub} })``. If you don't do the tag substitution you will end up showing literally '' rather than making a hyperlink. -- You can also use React components with normal variable substitution if you want to insert HTML markup, e.g. ``_t('Your email address is %(emailAddress)s', { emailAddress: {userEmailAddress} })``. +- You can use the special `count` variable to choose between multiple versions of the same string, in order to get the correct pluralization. E.g. `_t('You have %(count)s new messages', { count: 2 })` would show 'You have 2 new messages', while `_t('You have %(count)s new messages', { count: 1 })` would show 'You have one new message' (assuming a singular version of the string has been added to the translation file. See above). Passing in `count` is much prefered over having an if-statement choose the correct string to use, because some languages have much more complicated plural rules than english (e.g. they might need a completely different form if there are three things rather than two). +- If you want to translate text that includes e.g. hyperlinks or other HTML you have to also use tag substitution, e.g. `_t('Click here!', {}, { 'a': (sub) => {sub} })`. If you don't do the tag substitution you will end up showing literally '' rather than making a hyperlink. +- You can also use React components with normal variable substitution if you want to insert HTML markup, e.g. `_t('Your email address is %(emailAddress)s', { emailAddress: {userEmailAddress} })`. ## Things to know/Style Guides -- Do not use `_t()` inside ``getDefaultProps``: the translations aren't loaded when `getDefaultProps` is called, leading to missing translations. Use `_td()` to indicate that `_t()` will be called on the string later. -- If using translated strings as constants, translated strings can't be in constants loaded at class-load time since the translations won't be loaded. Mark the strings using `_td()` instead and perform the actual translation later. -- If a string is presented in the UI with punctuation like a full stop, include this in the translation strings, since punctuation varies between languages too. -- Avoid "translation in parts", i.e. concatenating translated strings or using translated strings in variable substitutions. Context is important for translations, and translating partial strings this way is simply not always possible. -- Concatenating strings often also introduces an implicit assumption about word order (e.g. that the subject of the sentence comes first), which is incorrect for many languages. -- Translation 'smell test': If you have a string that does not begin with a capital letter (is not the start of a sentence) or it ends with e.g. ':' or a preposition (e.g. 'to') you should recheck that you are not trying to translate a partial sentence. -- If you have multiple strings, that are almost identical, except some part (e.g. a word or two) it is still better to translate the full sentence multiple times. It may seem like inefficient repetion, but unlike programming where you try to minimize repetition, translation is much faster if you have many, full, clear, sentences to work with, rather than fewer, but incomplete sentence fragments. +- Do not use `_t()` inside `getDefaultProps`: the translations aren't loaded when `getDefaultProps` is called, leading to missing translations. Use `_td()` to indicate that `_t()` will be called on the string later. +- If using translated strings as constants, translated strings can't be in constants loaded at class-load time since the translations won't be loaded. Mark the strings using `_td()` instead and perform the actual translation later. +- If a string is presented in the UI with punctuation like a full stop, include this in the translation strings, since punctuation varies between languages too. +- Avoid "translation in parts", i.e. concatenating translated strings or using translated strings in variable substitutions. Context is important for translations, and translating partial strings this way is simply not always possible. +- Concatenating strings often also introduces an implicit assumption about word order (e.g. that the subject of the sentence comes first), which is incorrect for many languages. +- Translation 'smell test': If you have a string that does not begin with a capital letter (is not the start of a sentence) or it ends with e.g. ':' or a preposition (e.g. 'to') you should recheck that you are not trying to translate a partial sentence. +- If you have multiple strings, that are almost identical, except some part (e.g. a word or two) it is still better to translate the full sentence multiple times. It may seem like inefficient repetion, but unlike programming where you try to minimize repetition, translation is much faster if you have many, full, clear, sentences to work with, rather than fewer, but incomplete sentence fragments. diff --git a/docs/translating.md b/docs/translating.md index 221b06dc928..897680f16e3 100644 --- a/docs/translating.md +++ b/docs/translating.md @@ -2,15 +2,15 @@ ## Requirements -- Web Browser -- Be able to understand English -- Be able to understand the language you want to translate Element into +- Web Browser +- Be able to understand English +- Be able to understand the language you want to translate Element into ## Step 0: Join #element-translations:matrix.org -1. Come and join https://matrix.to/#/#element-translations:matrix.org for general discussion +1. Come and join https://matrix.to/#/#element-translations:matrix.org for general discussion 2. Join https://matrix.to/#/#element-translators:matrix.org for language-specific rooms -3. Read scrollback and/or ask if anyone else is working on your language, and co-ordinate if needed. In general little-or-no coordination is needed though :) +3. Read scrollback and/or ask if anyone else is working on your language, and co-ordinate if needed. In general little-or-no coordination is needed though :) ## Step 1: Preparing your Weblate Profile @@ -27,7 +27,7 @@ If your language is listed go to Step 2a and if not go to Step 2b ## Step 2a: Helping on existing languages. 1. Head to one of the projects listed https://translate.element.io/projects/element-web/ -2. Click on the ``translate`` button on the right side of your language +2. Click on the `translate` button on the right side of your language 3. Fill in the translations in the writeable field. You will see the original English string and the string of your second language above. Head to the explanations under Steb 2b @@ -35,7 +35,7 @@ Head to the explanations under Steb 2b ## Step 2b: Adding a new language 1. Go to one of the projects listed https://translate.element.io/projects/element-web/ -2. Click the ``Start new translation`` button at the bottom +2. Click the `Start new translation` button at the bottom 3. Select a language 4. Start translating like in 2a.3 5. Repeat these steps for the other projects which are listed at the link of step 2b.1 @@ -52,13 +52,12 @@ The yellow button has to be used if you are unsure about the translation but you These things are variables that are expanded when displayed by Element. They can be room names, usernames or similar. If you find one, you can move to the right place for your language, but not delete it as the variable will be missing if you do. -A special case is `%(urlStart)s` and `%(urlEnd)s` which are used to mark the beginning of a hyperlink (i.e. `` and ``. You must keep these markers surrounding the equivalent string in your language that needs to be hyperlinked. +A special case is `%(urlStart)s` and `%(urlEnd)s` which are used to mark the beginning of a hyperlink (i.e. `` and ``. You must keep these markers surrounding the equivalent string in your language that needs to be hyperlinked. ### "I want to come back to this string. How?" You can use inside the translation field "Review needed" checkbox. It will be shown as Strings that need to be reviewed. - ### Further reading -The official Weblate doc provides some more in-depth explanation on how to do translations and talks about do and don'ts. You can find it at: https://docs.weblate.org/en/latest/user/translating.html \ No newline at end of file +The official Weblate doc provides some more in-depth explanation on how to do translations and talks about do and don'ts. You can find it at: https://docs.weblate.org/en/latest/user/translating.html diff --git a/element.io/app/config.json b/element.io/app/config.json index d7e7dc275fb..4c712f874e9 100644 --- a/element.io/app/config.json +++ b/element.io/app/config.json @@ -15,11 +15,7 @@ "uisi_autorageshake_app": "element-auto-uisi", "showLabsSettings": false, "roomDirectory": { - "servers": [ - "matrix.org", - "gitter.im", - "libera.chat" - ] + "servers": ["matrix.org", "gitter.im", "libera.chat"] }, "enable_presence_by_hs_url": { "https://matrix.org": false, @@ -32,14 +28,12 @@ } ], "hostSignup": { - "brand": "Element Home", - "cookiePolicyUrl": "https://element.io/cookie-policy", - "domains": [ - "matrix.org" - ], - "privacyPolicyUrl": "https://element.io/privacy", - "termsOfServiceUrl": "https://element.io/terms-of-service", - "url": "https://ems.element.io/element-home/in-app-loader" + "brand": "Element Home", + "cookiePolicyUrl": "https://element.io/cookie-policy", + "domains": ["matrix.org"], + "privacyPolicyUrl": "https://element.io/privacy", + "termsOfServiceUrl": "https://element.io/terms-of-service", + "url": "https://ems.element.io/element-home/in-app-loader" }, "posthog": { "projectApiKey": "phc_Jzsm6DTm6V2705zeU5dcNvQDlonOR68XvX2sh1sEOHO", diff --git a/element.io/develop/config.json b/element.io/develop/config.json index feec8a1be02..d2f787393e4 100644 --- a/element.io/develop/config.json +++ b/element.io/develop/config.json @@ -15,11 +15,7 @@ "uisi_autorageshake_app": "element-auto-uisi", "showLabsSettings": true, "roomDirectory": { - "servers": [ - "matrix.org", - "gitter.im", - "libera.chat" - ] + "servers": ["matrix.org", "gitter.im", "libera.chat"] }, "enable_presence_by_hs_url": { "https://matrix.org": false, @@ -36,14 +32,12 @@ } ], "hostSignup": { - "brand": "Element Home", - "cookiePolicyUrl": "https://element.io/cookie-policy", - "domains": [ - "matrix.org" - ], - "privacyPolicyUrl": "https://element.io/privacy", - "termsOfServiceUrl": "https://element.io/terms-of-service", - "url": "https://ems.element.io/element-home/in-app-loader" + "brand": "Element Home", + "cookiePolicyUrl": "https://element.io/cookie-policy", + "domains": ["matrix.org"], + "privacyPolicyUrl": "https://element.io/privacy", + "termsOfServiceUrl": "https://element.io/terms-of-service", + "url": "https://ems.element.io/element-home/in-app-loader" }, "sentry": { "dsn": "https://029a0eb289f942508ae0fb17935bd8c5@sentry.matrix.org/6", diff --git a/module_system/installer.ts b/module_system/installer.ts index 705a2f98ae7..9bc3721ae1a 100644 --- a/module_system/installer.ts +++ b/module_system/installer.ts @@ -65,7 +65,7 @@ export function installer(config: BuildConfig): void { // else must be a module, we assume. const pkgJsonStr = fs.readFileSync("./package.json", "utf-8"); const optionalDepNames = getOptionalDepNames(pkgJsonStr); - const installedModules = optionalDepNames.filter(d => !currentOptDeps.includes(d)); + const installedModules = optionalDepNames.filter((d) => !currentOptDeps.includes(d)); // Ensure all the modules are compatible. We check them all and report at the end to // try and save the user some time debugging this sort of failure. @@ -80,7 +80,7 @@ export function installer(config: BuildConfig): void { if (incompatibleNames.length > 0) { console.error( "The following modules are not compatible with this version of element-web. Please update the module " + - "references and try again.", + "references and try again.", JSON.stringify(incompatibleNames, null, 4), // stringify to get prettier/complete output ); exitCode = 1; @@ -133,29 +133,33 @@ function callYarnAdd(dep: string): void { // goes wrong in restoring the original package details. childProcess.execSync(`yarn add -O ${dep}`, { env: process.env, - stdio: ['inherit', 'inherit', 'inherit'], + stdio: ["inherit", "inherit", "inherit"], }); } function getOptionalDepNames(pkgJsonStr: string): string[] { - return Object.keys(JSON.parse(pkgJsonStr)?.['optionalDependencies'] ?? {}); + return Object.keys(JSON.parse(pkgJsonStr)?.["optionalDependencies"] ?? {}); } function findDepVersionInPackageJson(dep: string, pkgJsonStr: string): string { const pkgJson = JSON.parse(pkgJsonStr); const packages = { - ...(pkgJson['optionalDependencies'] ?? {}), - ...(pkgJson['devDependencies'] ?? {}), - ...(pkgJson['dependencies'] ?? {}), + ...(pkgJson["optionalDependencies"] ?? {}), + ...(pkgJson["devDependencies"] ?? {}), + ...(pkgJson["dependencies"] ?? {}), }; return packages[dep]; } function getTopLevelDependencyVersion(dep: string): string { - const dependencyTree = JSON.parse(childProcess.execSync(`npm list ${dep} --depth=0 --json`, { - env: process.env, - stdio: ['inherit', 'pipe', 'pipe'], - }).toString('utf-8')); + const dependencyTree = JSON.parse( + childProcess + .execSync(`npm list ${dep} --depth=0 --json`, { + env: process.env, + stdio: ["inherit", "pipe", "pipe"], + }) + .toString("utf-8"), + ); /* What a dependency tree looks like: diff --git a/package.json b/package.json index f043879e82c..0e67a054345 100644 --- a/package.json +++ b/package.json @@ -1,220 +1,220 @@ { - "name": "element-web", - "version": "1.11.16", - "description": "A feature-rich client for Matrix.org", - "author": "New Vector Ltd.", - "repository": { - "type": "git", - "url": "https://github.com/vector-im/element-web" - }, - "license": "Apache-2.0", - "files": [ - "lib", - "res", - "src", - "webpack.config.js", - "scripts", - "docs", - "release.sh", - "deploy", - "CHANGELOG.md", - "CONTRIBUTING.rst", - "LICENSE", - "README.md", - "AUTHORS.rst", - "package.json", - "contribute.json" - ], - "style": "bundle.css", - "scripts": { - "i18n": "matrix-gen-i18n", - "prunei18n": "matrix-prune-i18n", - "diff-i18n": "cp src/i18n/strings/en_EN.json src/i18n/strings/en_EN_orig.json && matrix-gen-i18n && matrix-compare-i18n-files src/i18n/strings/en_EN_orig.json src/i18n/strings/en_EN.json", - "clean": "rimraf lib webapp", - "build": "yarn clean && yarn build:genfiles && yarn build:bundle", - "build-stats": "yarn clean && yarn build:genfiles && yarn build:bundle-stats", - "build:jitsi": "node scripts/build-jitsi.js", - "build:res": "node scripts/copy-res.js", - "build:genfiles": "yarn build:res && yarn build:jitsi && yarn build:module_system", - "build:modernizr": "modernizr -c .modernizr.json -d src/vector/modernizr.js", - "build:bundle": "webpack --progress --bail --mode production", - "build:bundle-stats": "webpack --progress --bail --mode production --json > webpack-stats.json", - "build:module_system": "tsc --project ./tsconfig.module_system.json && node ./lib/module_system/scripts/install.js", - "dist": "scripts/package.sh", - "start": "yarn build:module_system && concurrently --kill-others-on-fail --prefix \"{time} [{name}]\" -n res,element-js \"yarn start:res\" \"yarn start:js\"", - "start:https": "concurrently --kill-others-on-fail --prefix \"{time} [{name}]\" -n res,element-js \"yarn start:res\" \"yarn start:js --https\"", - "start:res": "yarn build:jitsi && node scripts/copy-res.js -w", - "start:js": "webpack-dev-server --host=0.0.0.0 --output-filename=bundles/_dev_/[name].js --output-chunk-filename=bundles/_dev_/[name].js -w --mode development --disable-host-check --hot", - "lint": "yarn lint:types && yarn lint:js && yarn lint:style", - "lint:js": "eslint --max-warnings 0 src module_system test", - "lint:js-fix": "eslint --fix src module_system test", - "lint:types": "tsc --noEmit --jsx react && tsc --noEmit --project ./tsconfig.module_system.json", - "lint:style": "stylelint \"res/css/**/*.pcss\"", - "test": "jest", - "coverage": "yarn test --coverage", - "analyse:unused-exports": "node ./scripts/analyse_unused_exports.js" - }, - "dependencies": { - "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", - "@matrix-org/react-sdk-module-api": "^0.0.3", - "gfm.css": "^1.1.2", - "jsrsasign": "^10.5.25", - "katex": "^0.16.0", - "matrix-js-sdk": "22.0.0", - "matrix-react-sdk": "3.62.0", - "matrix-widget-api": "^1.1.1", - "prop-types": "^15.7.2", - "react": "17.0.2", - "react-dom": "17.0.2", - "sanitize-html": "^2.3.2", - "ua-parser-js": "^0.8.0" - }, - "devDependencies": { - "@babel/core": "^7.12.10", - "@babel/eslint-parser": "^7.12.10", - "@babel/eslint-plugin": "^7.12.10", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-export-default-from": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.7", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.12.10", - "@babel/preset-env": "^7.12.11", - "@babel/preset-react": "^7.12.10", - "@babel/preset-typescript": "^7.12.7", - "@babel/register": "^7.12.10", - "@babel/runtime": "^7.12.5", - "@casualbot/jest-sonar-reporter": "^2.2.5", - "@principalstudio/html-webpack-inject-preload": "^1.2.7", - "@sentry/webpack-plugin": "^1.18.1", - "@svgr/webpack": "^5.5.0", - "@testing-library/react": "^12.1.5", - "@types/flux": "^3.1.9", - "@types/jest": "^29.0.0", - "@types/jsrsasign": "^10.5.4", - "@types/modernizr": "^3.5.3", - "@types/node": "^14.18.28", - "@types/react": "^17.0.49", - "@types/react-dom": "^17.0.17", - "@types/sanitize-html": "^2.3.1", - "@types/ua-parser-js": "^0.7.36", - "@typescript-eslint/eslint-plugin": "^5.6.0", - "@typescript-eslint/parser": "^5.6.0", - "allchange": "^1.0.6", - "autoprefixer": "^10.4.8", - "babel-jest": "^29.0.0", - "babel-loader": "^8.2.2", - "chokidar": "^3.5.1", - "concurrently": "^5.3.0", - "cpx": "^1.5.0", - "css-loader": "^3.6.0", - "dotenv": "^16.0.2", - "eslint": "8.23.1", - "eslint-config-google": "^0.14.0", - "eslint-plugin-deprecate": "^0.7.0", - "eslint-plugin-import": "^2.25.4", - "eslint-plugin-matrix-org": "^0.8.0", - "eslint-plugin-react": "^7.28.0", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-unicorn": "^44.0.2", - "extract-text-webpack-plugin": "^4.0.0-beta.0", - "fake-indexeddb": "^3.1.2", - "fetch-mock-jest": "^1.5.1", - "file-loader": "^5.1.0", - "fs-extra": "^0.30.0", - "html-webpack-plugin": "^4.5.2", - "jest": "^29.0.0", - "jest-canvas-mock": "^2.3.0", - "jest-environment-jsdom": "^29.0.0", - "jest-mock": "^29.0.0", - "jest-raw-loader": "^1.0.1", - "json-loader": "^0.5.7", - "loader-utils": "^2.0.3", - "matrix-mock-request": "^2.5.0", - "matrix-web-i18n": "^1.3.0", - "mini-css-extract-plugin": "^1", - "minimist": "^1.2.6", - "mkdirp": "^1.0.4", - "modernizr": "^3.12.0", - "node-fetch": "^2.6.7", - "optimize-css-assets-webpack-plugin": "^5.0.4", - "postcss": "^8.4.16", - "postcss-easings": "^2.0.0", - "postcss-hexrgba": "2.0.1", - "postcss-import": "^12.0.1", - "postcss-loader": "^3.0.0", - "postcss-mixins": "^6.2.3", - "postcss-nested": "^4.2.3", - "postcss-preset-env": "^6.7.0", - "postcss-scss": "^4.0.4", - "postcss-simple-vars": "^5.0.2", - "raw-loader": "^4.0.2", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "shell-escape": "^0.2.0", - "simple-proxy-agent": "^1.1.0", - "string-replace-loader": "2", - "style-loader": "2", - "stylelint": "^14.9.1", - "stylelint-config-standard": "^26.0.0", - "stylelint-scss": "^4.2.0", - "terser-webpack-plugin": "^2.3.8", - "ts-prune": "^0.10.3", - "typescript": "4.7.4", - "webpack": "^4.46.0", - "webpack-cli": "^3.3.12", - "webpack-dev-server": "^3.11.2", - "worker-loader": "^2.0.0", - "worklet-loader": "^2.0.0", - "yaml": "^2.0.1" - }, - "jest": { - "testEnvironment": "jsdom", - "testEnvironmentOptions": { - "url": "http://localhost/" + "name": "element-web", + "version": "1.11.17", + "description": "A feature-rich client for Matrix.org", + "author": "New Vector Ltd.", + "repository": { + "type": "git", + "url": "https://github.com/vector-im/element-web" }, - "testMatch": [ - "/test/**/*-test.[tj]s?(x)" + "license": "Apache-2.0", + "files": [ + "lib", + "res", + "src", + "webpack.config.js", + "scripts", + "docs", + "release.sh", + "deploy", + "CHANGELOG.md", + "CONTRIBUTING.rst", + "LICENSE", + "README.md", + "AUTHORS.rst", + "package.json", + "contribute.json" ], - "setupFiles": [ - "jest-canvas-mock" - ], - "setupFilesAfterEnv": [ - "/node_modules/matrix-react-sdk/test/setupTests.js" - ], - "moduleNameMapper": { - "\\.(css|scss|pcss)$": "/__mocks__/cssMock.js", - "\\.(gif|png|ttf|woff2)$": "/node_modules/matrix-react-sdk/__mocks__/imageMock.js", - "\\.svg$": "/node_modules/matrix-react-sdk/__mocks__/svg.js", - "\\$webapp/i18n/languages.json": "/node_modules/matrix-react-sdk/__mocks__/languages.json", - "^react$": "/node_modules/react", - "^react-dom$": "/node_modules/react-dom", - "^matrix-js-sdk$": "/node_modules/matrix-js-sdk/src", - "^matrix-react-sdk$": "/node_modules/matrix-react-sdk/src", - "decoderWorker\\.min\\.js": "/node_modules/matrix-react-sdk/__mocks__/empty.js", - "decoderWorker\\.min\\.wasm": "/node_modules/matrix-react-sdk/__mocks__/empty.js", - "waveWorker\\.min\\.js": "/node_modules/matrix-react-sdk/__mocks__/empty.js", - "context-filter-polyfill": "/node_modules/matrix-react-sdk/__mocks__/empty.js", - "FontManager.ts": "/node_modules/matrix-react-sdk/__mocks__/FontManager.js", - "workers/(.+)\\.worker\\.ts": "/node_modules/matrix-react-sdk/__mocks__/workerMock.js", - "^!!raw-loader!.*": "jest-raw-loader", - "RecorderWorklet": "/node_modules/matrix-react-sdk/__mocks__/empty.js" + "style": "bundle.css", + "scripts": { + "i18n": "matrix-gen-i18n", + "prunei18n": "matrix-prune-i18n", + "diff-i18n": "cp src/i18n/strings/en_EN.json src/i18n/strings/en_EN_orig.json && matrix-gen-i18n && matrix-compare-i18n-files src/i18n/strings/en_EN_orig.json src/i18n/strings/en_EN.json", + "clean": "rimraf lib webapp", + "build": "yarn clean && yarn build:genfiles && yarn build:bundle", + "build-stats": "yarn clean && yarn build:genfiles && yarn build:bundle-stats", + "build:jitsi": "node scripts/build-jitsi.js", + "build:res": "node scripts/copy-res.js", + "build:genfiles": "yarn build:res && yarn build:jitsi && yarn build:module_system", + "build:modernizr": "modernizr -c .modernizr.json -d src/vector/modernizr.js", + "build:bundle": "webpack --progress --bail --mode production", + "build:bundle-stats": "webpack --progress --bail --mode production --json > webpack-stats.json", + "build:module_system": "tsc --project ./tsconfig.module_system.json && node ./lib/module_system/scripts/install.js", + "dist": "scripts/package.sh", + "start": "yarn build:module_system && concurrently --kill-others-on-fail --prefix \"{time} [{name}]\" -n res,element-js \"yarn start:res\" \"yarn start:js\"", + "start:https": "concurrently --kill-others-on-fail --prefix \"{time} [{name}]\" -n res,element-js \"yarn start:res\" \"yarn start:js --https\"", + "start:res": "yarn build:jitsi && node scripts/copy-res.js -w", + "start:js": "webpack-dev-server --host=0.0.0.0 --output-filename=bundles/_dev_/[name].js --output-chunk-filename=bundles/_dev_/[name].js -w --mode development --disable-host-check --hot", + "lint": "yarn lint:types && yarn lint:js && yarn lint:style", + "lint:js": "eslint --max-warnings 0 src module_system test && prettier --check .", + "lint:js-fix": "prettier --write . && eslint --fix src module_system test", + "lint:types": "tsc --noEmit --jsx react && tsc --noEmit --project ./tsconfig.module_system.json", + "lint:style": "stylelint \"res/css/**/*.pcss\"", + "test": "jest", + "coverage": "yarn test --coverage", + "analyse:unused-exports": "node ./scripts/analyse_unused_exports.js" }, - "transformIgnorePatterns": [ - "/node_modules/(?!matrix-js-sdk).+$", - "/node_modules/(?!matrix-react-sdk).+$" - ], - "coverageReporters": [ - "text-summary", - "lcov" - ], - "testResultsProcessor": "@casualbot/jest-sonar-reporter" - }, - "@casualbot/jest-sonar-reporter": { - "outputDirectory": "coverage", - "outputName": "jest-sonar-report.xml", - "relativePaths": true - } + "dependencies": { + "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", + "@matrix-org/react-sdk-module-api": "^0.0.3", + "gfm.css": "^1.1.2", + "jsrsasign": "^10.5.25", + "katex": "^0.16.0", + "matrix-js-sdk": "23.0.0", + "matrix-react-sdk": "3.63.0", + "matrix-widget-api": "^1.1.1", + "react": "17.0.2", + "react-dom": "17.0.2", + "sanitize-html": "^2.3.2", + "ua-parser-js": "^1.0.0" + }, + "devDependencies": { + "@babel/core": "^7.12.10", + "@babel/eslint-parser": "^7.12.10", + "@babel/eslint-plugin": "^7.12.10", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-export-default-from": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.7", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.12.10", + "@babel/preset-env": "^7.12.11", + "@babel/preset-react": "^7.12.10", + "@babel/preset-typescript": "^7.12.7", + "@babel/register": "^7.12.10", + "@babel/runtime": "^7.12.5", + "@casualbot/jest-sonar-reporter": "^2.2.5", + "@principalstudio/html-webpack-inject-preload": "^1.2.7", + "@sentry/webpack-plugin": "^1.18.1", + "@svgr/webpack": "^5.5.0", + "@testing-library/react": "^12.1.5", + "@types/flux": "^3.1.9", + "@types/jest": "^29.0.0", + "@types/jsrsasign": "^10.5.4", + "@types/modernizr": "^3.5.3", + "@types/node": "^16", + "@types/react": "17.0.49", + "@types/react-dom": "17.0.17", + "@types/sanitize-html": "^2.3.1", + "@types/ua-parser-js": "^0.7.36", + "@typescript-eslint/eslint-plugin": "^5.6.0", + "@typescript-eslint/parser": "^5.6.0", + "allchange": "^1.0.6", + "babel-jest": "^29.0.0", + "babel-loader": "^8.2.2", + "chokidar": "^3.5.1", + "concurrently": "^7.0.0", + "cpx": "^1.5.0", + "css-loader": "^4", + "dotenv": "^16.0.2", + "eslint": "8.28.0", + "eslint-config-google": "^0.14.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-deprecate": "^0.7.0", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-matrix-org": "^0.9.0", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-unicorn": "^45.0.0", + "extract-text-webpack-plugin": "^4.0.0-beta.0", + "fake-indexeddb": "^4.0.0", + "fetch-mock-jest": "^1.5.1", + "file-loader": "^6.0.0", + "fs-extra": "^11.0.0", + "html-webpack-plugin": "^4.5.2", + "jest": "^29.0.0", + "jest-canvas-mock": "^2.3.0", + "jest-environment-jsdom": "^29.0.0", + "jest-mock": "^29.0.0", + "jest-raw-loader": "^1.0.1", + "json-loader": "^0.5.7", + "loader-utils": "^3.0.0", + "matrix-mock-request": "^2.5.0", + "matrix-web-i18n": "^1.3.0", + "mini-css-extract-plugin": "^1", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "modernizr": "^3.12.0", + "node-fetch": "^2.6.7", + "optimize-css-assets-webpack-plugin": "^5.0.4", + "postcss": "^8.4.16", + "postcss-easings": "^2.0.0", + "postcss-hexrgba": "2.0.1", + "postcss-import": "^12.0.1", + "postcss-loader": "^3.0.0", + "postcss-mixins": "^6.2.3", + "postcss-nested": "^4.2.3", + "postcss-preset-env": "^6.7.0", + "postcss-scss": "^4.0.4", + "postcss-simple-vars": "^5.0.2", + "prettier": "2.8.0", + "raw-loader": "^4.0.2", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "simple-proxy-agent": "^1.1.0", + "string-replace-loader": "3", + "style-loader": "2", + "stylelint": "^14.9.1", + "stylelint-config-prettier": "^9.0.4", + "stylelint-config-standard": "^29.0.0", + "stylelint-scss": "^4.2.0", + "terser-webpack-plugin": "^4.0.0", + "ts-prune": "^0.10.3", + "typescript": "4.9.3", + "webpack": "^4.46.0", + "webpack-cli": "^3.3.12", + "webpack-dev-server": "^3.11.2", + "worker-loader": "^2.0.0", + "worklet-loader": "^2.0.0", + "yaml": "^2.0.1" + }, + "jest": { + "testEnvironment": "jsdom", + "testEnvironmentOptions": { + "url": "http://localhost/" + }, + "testMatch": [ + "/test/**/*-test.[tj]s?(x)" + ], + "setupFiles": [ + "jest-canvas-mock" + ], + "setupFilesAfterEnv": [ + "/node_modules/matrix-react-sdk/test/setupTests.js" + ], + "moduleNameMapper": { + "\\.(css|scss|pcss)$": "/__mocks__/cssMock.js", + "\\.(gif|png|ttf|woff2)$": "/node_modules/matrix-react-sdk/__mocks__/imageMock.js", + "\\.svg$": "/node_modules/matrix-react-sdk/__mocks__/svg.js", + "\\$webapp/i18n/languages.json": "/node_modules/matrix-react-sdk/__mocks__/languages.json", + "^react$": "/node_modules/react", + "^react-dom$": "/node_modules/react-dom", + "^matrix-js-sdk$": "/node_modules/matrix-js-sdk/src", + "^matrix-react-sdk$": "/node_modules/matrix-react-sdk/src", + "decoderWorker\\.min\\.js": "/node_modules/matrix-react-sdk/__mocks__/empty.js", + "decoderWorker\\.min\\.wasm": "/node_modules/matrix-react-sdk/__mocks__/empty.js", + "waveWorker\\.min\\.js": "/node_modules/matrix-react-sdk/__mocks__/empty.js", + "context-filter-polyfill": "/node_modules/matrix-react-sdk/__mocks__/empty.js", + "FontManager.ts": "/node_modules/matrix-react-sdk/__mocks__/FontManager.js", + "workers/(.+)\\.worker\\.ts": "/node_modules/matrix-react-sdk/__mocks__/workerMock.js", + "^!!raw-loader!.*": "jest-raw-loader", + "RecorderWorklet": "/node_modules/matrix-react-sdk/__mocks__/empty.js" + }, + "transformIgnorePatterns": [ + "/node_modules/(?!matrix-js-sdk).+$", + "/node_modules/(?!matrix-react-sdk).+$" + ], + "coverageReporters": [ + "text-summary", + "lcov" + ], + "testResultsProcessor": "@casualbot/jest-sonar-reporter" + }, + "@casualbot/jest-sonar-reporter": { + "outputDirectory": "coverage", + "outputName": "jest-sonar-report.xml", + "relativePaths": true + } } diff --git a/res/css/structures/ErrorView.pcss b/res/css/structures/ErrorView.pcss index 09160127ff2..cfe380c9c16 100644 --- a/res/css/structures/ErrorView.pcss +++ b/res/css/structures/ErrorView.pcss @@ -26,17 +26,8 @@ limitations under the License. background: linear-gradient(to bottom, #c5e0f7 0%, #ffffff 100%); /* stylelint-disable-next-line function-no-unknown */ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#c5e0f7', endColorstr='#ffffff', GradientType=0); - font-family: - -apple-system, - BlinkMacSystemFont, - "Segoe UI", - Roboto, - Helvetica, - Arial, - sans-serif, - "Apple Color Emoji", - "Segoe UI Emoji", - "Segoe UI Symbol"; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, + "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; color: #000; width: 100%; height: 100%; @@ -100,7 +91,8 @@ limitations under the License. margin: auto 20px auto 0; } - h1, h2 { + h1, + h2 { font-weight: 600; margin-bottom: 32px; } diff --git a/res/decoder-ring/datatypes.js b/res/decoder-ring/datatypes.js index 73ab2173ca3..35d251a8dea 100644 --- a/res/decoder-ring/datatypes.js +++ b/res/decoder-ring/datatypes.js @@ -20,7 +20,7 @@ class Optional { static from(value) { - return value && Some.of(value) || None; + return (value && Some.of(value)) || None; } map(f) { return this; diff --git a/res/decoder-ring/decoder.js b/res/decoder-ring/decoder.js index e6779422777..8a62ed2c8b0 100644 --- a/res/decoder-ring/decoder.js +++ b/res/decoder-ring/decoder.js @@ -10,11 +10,11 @@ async function getBundleName(baseUrl) { throw new StartupError(`Couldn't fetch index.html to prefill bundle; ${res.status} ${res.statusText}`); } const index = await res.text(); - return index.split("\n").map((line) => - line.match(/ @@ -18,12 +18,16 @@
- +

_t("Welcome to Element")

diff --git a/scripts/analyse_unused_exports.js b/scripts/analyse_unused_exports.js index 36014b1dc86..bf21a7ea61a 100755 --- a/scripts/analyse_unused_exports.js +++ b/scripts/analyse_unused_exports.js @@ -1,5 +1,5 @@ #!/usr/bin/env node -'use strict'; +"use strict"; const fs = require("fs"); const { exec } = require("node:child_process"); diff --git a/scripts/build-jitsi.js b/scripts/build-jitsi.js index e5ce21468dd..f7ea841b012 100644 --- a/scripts/build-jitsi.js +++ b/scripts/build-jitsi.js @@ -21,11 +21,13 @@ if (process.env.HTTPS_PROXY) { options.agent = new ProxyAgent(process.env.HTTPS_PROXY, { tunnel: true }); } -fetch("https://meet.element.io/libs/external_api.min.js", options).then(res => { - const stream = fs.createWriteStream(fname); - return new Promise((resolve, reject) => { - res.body.pipe(stream); - res.body.on('error', err => reject(err)); - res.body.on('finish', () => resolve()); - }); -}).then(() => console.log('Done with Jitsi download')); +fetch("https://meet.element.io/libs/external_api.min.js", options) + .then((res) => { + const stream = fs.createWriteStream(fname); + return new Promise((resolve, reject) => { + res.body.pipe(stream); + res.body.on("error", (err) => reject(err)); + res.body.on("finish", () => resolve()); + }); + }) + .then(() => console.log("Done with Jitsi download")); diff --git a/scripts/copy-res.js b/scripts/copy-res.js index 07826b3e838..5969048e6d4 100755 --- a/scripts/copy-res.js +++ b/scripts/copy-res.js @@ -11,52 +11,52 @@ const loaderUtils = require("loader-utils"); // This could readily be automated, but it's nice to explicitly // control when new languages are available. const INCLUDE_LANGS = [ - {'value': 'bg', 'label': 'Български'}, - {'value': 'ca', 'label': 'Català'}, - {'value': 'cs', 'label': 'čeština'}, - {'value': 'da', 'label': 'Dansk'}, - {'value': 'de_DE', 'label': 'Deutsch'}, - {'value': 'el', 'label': 'Ελληνικά'}, - {'value': 'en_EN', 'label': 'English'}, - {'value': 'en_US', 'label': 'English (US)'}, - {'value': 'eo', 'label': 'Esperanto'}, - {'value': 'es', 'label': 'Español'}, - {'value': 'et', 'label': 'Eesti'}, - {'value': 'eu', 'label': 'Euskara'}, - {'value': 'fi', 'label': 'Suomi'}, - {'value': 'fr', 'label': 'Français'}, - {'value': 'gl', 'label': 'Galego'}, - {'value': 'he', 'label': 'עברית'}, - {'value': 'hi', 'label': 'हिन्दी'}, - {'value': 'hu', 'label': 'Magyar'}, - {'value': 'id', 'label': 'Bahasa Indonesia'}, - {'value': 'is', 'label': 'íslenska'}, - {'value': 'it', 'label': 'Italiano'}, - {'value': 'ja', 'label': '日本語'}, - {'value': 'kab', 'label': 'Taqbaylit'}, - {'value': 'ko', 'label': '한국어'}, - {'value': 'lo', 'label': 'ລາວ'}, - {'value': 'lt', 'label': 'Lietuvių'}, - {'value': 'lv', 'label': 'Latviešu'}, - {'value': 'nb_NO', 'label': 'Norwegian Bokmål'}, - {'value': 'nl', 'label': 'Nederlands'}, - {'value': 'nn', 'label': 'Norsk Nynorsk'}, - {'value': 'pl', 'label': 'Polski'}, - {'value': 'pt', 'label': 'Português'}, - {'value': 'pt_BR', 'label': 'Português do Brasil'}, - {'value': 'ru', 'label': 'Русский'}, - {'value': 'sk', 'label': 'Slovenčina'}, - {'value': 'sq', 'label': 'Shqip'}, - {'value': 'sr', 'label': 'српски'}, - {'value': 'sv', 'label': 'Svenska'}, - {'value': 'te', 'label': 'తెలుగు'}, - {'value': 'th', 'label': 'ไทย'}, - {'value': 'tr', 'label': 'Türkçe'}, - {'value': 'uk', 'label': 'українська мова'}, - {'value': 'vi', 'label': 'Tiếng Việt'}, - {'value': 'vls', 'label': 'West-Vlaams'}, - {'value': 'zh_Hans', 'label': '简体中文'}, // simplified chinese - {'value': 'zh_Hant', 'label': '繁體中文'}, // traditional chinese + { value: "bg", label: "Български" }, + { value: "ca", label: "Català" }, + { value: "cs", label: "čeština" }, + { value: "da", label: "Dansk" }, + { value: "de_DE", label: "Deutsch" }, + { value: "el", label: "Ελληνικά" }, + { value: "en_EN", label: "English" }, + { value: "en_US", label: "English (US)" }, + { value: "eo", label: "Esperanto" }, + { value: "es", label: "Español" }, + { value: "et", label: "Eesti" }, + { value: "eu", label: "Euskara" }, + { value: "fi", label: "Suomi" }, + { value: "fr", label: "Français" }, + { value: "gl", label: "Galego" }, + { value: "he", label: "עברית" }, + { value: "hi", label: "हिन्दी" }, + { value: "hu", label: "Magyar" }, + { value: "id", label: "Bahasa Indonesia" }, + { value: "is", label: "íslenska" }, + { value: "it", label: "Italiano" }, + { value: "ja", label: "日本語" }, + { value: "kab", label: "Taqbaylit" }, + { value: "ko", label: "한국어" }, + { value: "lo", label: "ລາວ" }, + { value: "lt", label: "Lietuvių" }, + { value: "lv", label: "Latviešu" }, + { value: "nb_NO", label: "Norwegian Bokmål" }, + { value: "nl", label: "Nederlands" }, + { value: "nn", label: "Norsk Nynorsk" }, + { value: "pl", label: "Polski" }, + { value: "pt", label: "Português" }, + { value: "pt_BR", label: "Português do Brasil" }, + { value: "ru", label: "Русский" }, + { value: "sk", label: "Slovenčina" }, + { value: "sq", label: "Shqip" }, + { value: "sr", label: "српски" }, + { value: "sv", label: "Svenska" }, + { value: "te", label: "తెలుగు" }, + { value: "th", label: "ไทย" }, + { value: "tr", label: "Türkçe" }, + { value: "uk", label: "українська мова" }, + { value: "vi", label: "Tiếng Việt" }, + { value: "vls", label: "West-Vlaams" }, + { value: "zh_Hans", label: "简体中文" }, // simplified chinese + { value: "zh_Hant", label: "繁體中文" }, // traditional chinese ]; // cpx includes globbed parts of the filename in the destination, but excludes @@ -77,15 +77,13 @@ const COPY_LIST = [ ["contribute.json", "webapp"], ]; -const parseArgs = require('minimist'); -const Cpx = require('cpx'); -const chokidar = require('chokidar'); -const fs = require('fs'); -const rimraf = require('rimraf'); +const parseArgs = require("minimist"); +const Cpx = require("cpx"); +const chokidar = require("chokidar"); +const fs = require("fs"); +const rimraf = require("rimraf"); -const argv = parseArgs( - process.argv.slice(2), {} -); +const argv = parseArgs(process.argv.slice(2), {}); const watch = argv.w; const verbose = argv.v; @@ -98,12 +96,12 @@ function errCheck(err) { } // Check if webapp exists -if (!fs.existsSync('webapp')) { - fs.mkdirSync('webapp'); +if (!fs.existsSync("webapp")) { + fs.mkdirSync("webapp"); } // Check if i18n exists -if (!fs.existsSync('webapp/i18n/')) { - fs.mkdirSync('webapp/i18n/'); +if (!fs.existsSync("webapp/i18n/")) { + fs.mkdirSync("webapp/i18n/"); } function next(i, err) { @@ -132,7 +130,9 @@ function next(i, err) { }); } - const cb = (err) => { next(i + 1, err) }; + const cb = (err) => { + next(i + 1, err); + }; if (watch) { if (opts.directwatch) { @@ -140,14 +140,12 @@ function next(i, err) { // which in the case of config.json is '.', which inevitably takes // ages to crawl. So we create our own watcher on the files // instead. - const copy = () => { cpx.copy(errCheck) }; - chokidar.watch(source) - .on('add', copy) - .on('change', copy) - .on('ready', cb) - .on('error', errCheck); + const copy = () => { + cpx.copy(errCheck); + }; + chokidar.watch(source).on("add", copy).on("change", copy).on("ready", cb).on("error", errCheck); } else { - cpx.on('watch-ready', cb); + cpx.on("watch-ready", cb); cpx.on("watch-error", cb); cpx.watch(); } @@ -157,17 +155,14 @@ function next(i, err) { } function genLangFile(lang, dest) { - const reactSdkFile = 'node_modules/matrix-react-sdk/src/i18n/strings/' + lang + '.json'; - const riotWebFile = 'src/i18n/strings/' + lang + '.json'; + const reactSdkFile = "node_modules/matrix-react-sdk/src/i18n/strings/" + lang + ".json"; + const riotWebFile = "src/i18n/strings/" + lang + ".json"; let translations = {}; - [reactSdkFile, riotWebFile].forEach(function(f) { + [reactSdkFile, riotWebFile].forEach(function (f) { if (fs.existsSync(f)) { try { - Object.assign( - translations, - JSON.parse(fs.readFileSync(f).toString()) - ); + Object.assign(translations, JSON.parse(fs.readFileSync(f).toString())); } catch (e) { console.error("Failed: " + f, e); throw e; @@ -192,16 +187,16 @@ function genLangFile(lang, dest) { function genLangList(langFileMap) { const languages = {}; - INCLUDE_LANGS.forEach(function(lang) { + INCLUDE_LANGS.forEach(function (lang) { const normalizedLanguage = lang.value.toLowerCase().replace("_", "-"); - const languageParts = normalizedLanguage.split('-'); + const languageParts = normalizedLanguage.split("-"); if (languageParts.length == 2 && languageParts[0] == languageParts[1]) { - languages[languageParts[0]] = {'fileName': langFileMap[lang.value], 'label': lang.label}; + languages[languageParts[0]] = { fileName: langFileMap[lang.value], label: lang.label }; } else { - languages[normalizedLanguage] = {'fileName': langFileMap[lang.value], 'label': lang.label}; + languages[normalizedLanguage] = { fileName: langFileMap[lang.value], label: lang.label }; } }); - fs.writeFile('webapp/i18n/languages.json', JSON.stringify(languages, null, 4), function(err) { + fs.writeFile("webapp/i18n/languages.json", JSON.stringify(languages, null, 4), function (err) { if (err) { console.error("Copy Error occured: " + err); throw new Error("Failed to generate languages.json"); @@ -230,7 +225,7 @@ function weblateToCounterpart(inTrs) { const outTrs = {}; for (const key of Object.keys(inTrs)) { - const keyParts = key.split('|', 2); + const keyParts = key.split("|", 2); if (keyParts.length === 2) { let obj = outTrs[keyParts[0]]; if (obj === undefined) { @@ -239,7 +234,7 @@ function weblateToCounterpart(inTrs) { // This is a transitional edge case if a string went from singular to pluralised and both still remain // in the translation json file. Use the singular translation as `other` and merge pluralisation atop. obj = outTrs[keyParts[0]] = { - "other": inTrs[key], + other: inTrs[key], }; console.warn("Found entry in i18n file in both singular and pluralised form", keyParts[0]); } @@ -258,8 +253,8 @@ regenerate the file, adding its content-hashed filename to langFileMap and regenerating languages.json with the new filename */ function watchLanguage(lang, dest, langFileMap) { - const reactSdkFile = 'node_modules/matrix-react-sdk/src/i18n/strings/' + lang + '.json'; - const riotWebFile = 'src/i18n/strings/' + lang + '.json'; + const reactSdkFile = "node_modules/matrix-react-sdk/src/i18n/strings/" + lang + ".json"; + const riotWebFile = "src/i18n/strings/" + lang + ".json"; // XXX: Use a debounce because for some reason if we read the language // file immediately after the FS event is received, the file contents @@ -271,16 +266,13 @@ function watchLanguage(lang, dest, langFileMap) { } makeLangDebouncer = setTimeout(() => { const filename = genLangFile(lang, dest); - langFileMap[lang]=filename; + langFileMap[lang] = filename; genLangList(langFileMap); }, 500); }; - [reactSdkFile, riotWebFile].forEach(function(f) { - chokidar.watch(f) - .on('add', makeLang) - .on('change', makeLang) - .on('error', errCheck); + [reactSdkFile, riotWebFile].forEach(function (f) { + chokidar.watch(f).on("add", makeLang).on("change", makeLang).on("error", errCheck); }); } @@ -294,7 +286,7 @@ const I18N_FILENAME_MAP = INCLUDE_LANGS.reduce((m, l) => { genLangList(I18N_FILENAME_MAP); if (watch) { - INCLUDE_LANGS.forEach(l => watchLanguage(l.value, I18N_DEST, I18N_FILENAME_MAP)); + INCLUDE_LANGS.forEach((l) => watchLanguage(l.value, I18N_DEST, I18N_FILENAME_MAP)); } // non-language resources diff --git a/scripts/deploy.py b/scripts/deploy.py index a56bb332d2e..fa805a587ea 100755 --- a/scripts/deploy.py +++ b/scripts/deploy.py @@ -98,7 +98,24 @@ def fetch(self, tarball, extract_path): try: with tarfile.open(tarball) as tar: - tar.extractall(extract_path) + def is_within_directory(directory, target): + abs_directory = os.path.abspath(directory) + abs_target = os.path.abspath(target) + + prefix = os.path.commonprefix([abs_directory, abs_target]) + + return prefix == abs_directory + + def safe_extract(tar, path=".", members=None, *, numeric_owner=False): + for member in tar.getmembers(): + member_path = os.path.join(path, member.name) + if not is_within_directory(path, member_path): + raise Exception("Attempted Path Traversal in Tar File") + + tar.extractall(path, members, numeric_owner=numeric_owner) + + + safe_extract(tar, extract_path) finally: if self.should_clean and downloaded: os.remove(tarball) diff --git a/src/@types/global.d.ts b/src/@types/global.d.ts index 74a65af14fa..5047aeeed5e 100644 --- a/src/@types/global.d.ts +++ b/src/@types/global.d.ts @@ -19,20 +19,20 @@ import type { Renderer } from "react-dom"; import type { logger } from "matrix-js-sdk/src/logger"; type ElectronChannel = - "app_onAction" | - "before-quit" | - "check_updates" | - "install_update" | - "ipcCall" | - "ipcReply" | - "loudNotification" | - "preferences" | - "seshat" | - "seshatReply" | - "setBadgeCount" | - "update-downloaded" | - "userDownloadCompleted" | - "userDownloadAction"; + | "app_onAction" + | "before-quit" + | "check_updates" + | "install_update" + | "ipcCall" + | "ipcReply" + | "loudNotification" + | "preferences" + | "seshat" + | "seshatReply" + | "setBadgeCount" + | "update-downloaded" + | "userDownloadCompleted" + | "userDownloadAction"; declare global { interface Window { diff --git a/src/@types/raw-loader.d.ts b/src/@types/raw-loader.d.ts index ea3df880f67..c35dd356a8f 100644 --- a/src/@types/raw-loader.d.ts +++ b/src/@types/raw-loader.d.ts @@ -1,4 +1,4 @@ -declare module '!!raw-loader!*' { +declare module "!!raw-loader!*" { const contents: string; export default contents; } diff --git a/src/async-components/structures/CompatibilityView.tsx b/src/async-components/structures/CompatibilityView.tsx index e9fc39db7b7..1f6de1d7a82 100644 --- a/src/async-components/structures/CompatibilityView.tsx +++ b/src/async-components/structures/CompatibilityView.tsx @@ -16,7 +16,7 @@ limitations under the License. import * as React from "react"; import { _t } from "matrix-react-sdk/src/languageHandler"; -import SdkConfig from 'matrix-react-sdk/src/SdkConfig'; +import SdkConfig from "matrix-react-sdk/src/SdkConfig"; // directly import the style here as this layer does not support rethemedex at this time so no matrix-react-sdk // PostCSS variables will be accessible. @@ -32,123 +32,139 @@ const CompatibilityView: React.FC = ({ onAccept }) => { let ios = null; const iosCustomUrl = mobileBuilds?.ios; - if (iosCustomUrl !== null) { // could be undefined or a string - ios = <> -

iOS (iPhone or iPad)

- - Apple App Store - - ; + if (iosCustomUrl !== null) { + // could be undefined or a string + ios = ( + <> +

+ iOS (iPhone or iPad) +

+ + Apple App Store + + + ); } - let android = [

Android

]; + let android = [ +

+ Android +

, + ]; const andCustomUrl = mobileBuilds?.android; const fdroidCustomUrl = mobileBuilds?.fdroid; - if (andCustomUrl !== null) { // undefined or string - android.push( - Google Play Store - ); + if (andCustomUrl !== null) { + // undefined or string + android.push( + + Google Play Store + , + ); } - if (fdroidCustomUrl !== null) { // undefined or string - android.push( - F-Droid - ); + if (fdroidCustomUrl !== null) { + // undefined or string + android.push( + + F-Droid + , + ); } - if (android.length === 1) { // just a header, meaning no links + if (android.length === 1) { + // just a header, meaning no links android = []; } - let mobileHeader =

{ _t("Use %(brand)s on mobile", { brand }) }

; + let mobileHeader =

{_t("Use %(brand)s on mobile", { brand })}

; if (!android.length && !ios) { mobileHeader = null; } - return
-
-
- - SchildiChat - -

{ _t("Unsupported browser") }

-
+ return ( +
+
+
+ + SchildiChat + +

{_t("Unsupported browser")}

+
-
-
-
-

{ _t("Your browser can't run %(brand)s", { brand }) }

-

- { _t( - "%(brand)s uses advanced browser features which aren't " + - "supported by your current browser.", - { brand }, - ) } -

-

- { _t( - 'Please install Chrome, Firefox, ' + - 'or Safari for the best experience.', - {}, - { - 'chromeLink': (sub) => { sub }, - 'firefoxLink': (sub) => { sub }, - 'safariLink': (sub) => { sub }, - }, - ) } -

-

- { _t( - "You can continue using your current browser, but some or all features may not work " + - "and the look and feel of the application may be incorrect.", - ) } -

- +
+
+
+

{_t("Your browser can't run %(brand)s", { brand })}

+

+ {_t( + "%(brand)s uses advanced browser features which aren't " + + "supported by your current browser.", + { brand }, + )} +

+

+ {_t( + "Please install Chrome, Firefox, " + + "or Safari for the best experience.", + {}, + { + chromeLink: (sub) => {sub}, + firefoxLink: (sub) => {sub}, + safariLink: (sub) => {sub}, + }, + )} +

+

+ {_t( + "You can continue using your current browser, but some or all features may not work " + + "and the look and feel of the application may be incorrect.", + )} +

+ +
-
-
-
-
- {/* { mobileHeader } - { ios } - { android } */} -

Use SchildiChat on mobile

-

Android

- All the instructions and download links can be found on - https://schildi.chat/android. -

iOS (iPhone or iPad)

- SchildiChat is not available for iOS, but you can download - Element - or another Matrix-Client on the App Store. +
+
+
+ {/* {mobileHeader} + {ios} + {android} */} +

Use SchildiChat on mobile

+

Android

+ All the instructions and download links can be found on + https://schildi.chat/android. +

iOS (iPhone or iPad)

+ SchildiChat is not available for iOS, but you can download + Element + or another Matrix-Client on the App Store. +
-
-
-
; + ); }; export default CompatibilityView; diff --git a/src/async-components/structures/ErrorView.tsx b/src/async-components/structures/ErrorView.tsx index 5e82252ca1d..5702cab2479 100644 --- a/src/async-components/structures/ErrorView.tsx +++ b/src/async-components/structures/ErrorView.tsx @@ -28,34 +28,33 @@ interface IProps { } const ErrorView: React.FC = ({ title, messages }) => { - return
-
-
- - SchildiChat - -

{ _t("Failed to start") }

-
-
-
-
-

{ title }

- { messages && messages.map(msg =>

- { msg } -

) } + return ( +
+
+
+ + SchildiChat + +

{_t("Failed to start")}

+
+
+
+
+

{title}

+ {messages && messages.map((msg) =>

{msg}

)} +
-
-
-
; + ); }; export default ErrorView; - diff --git a/src/components/views/auth/VectorAuthFooter.tsx b/src/components/views/auth/VectorAuthFooter.tsx index 9be707a861d..2b02d2822e6 100644 --- a/src/components/views/auth/VectorAuthFooter.tsx +++ b/src/components/views/auth/VectorAuthFooter.tsx @@ -15,32 +15,34 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, { ReactElement } from 'react'; -import SdkConfig from 'matrix-react-sdk/src/SdkConfig'; -import { _t } from 'matrix-react-sdk/src/languageHandler'; +import React, { ReactElement } from "react"; +import SdkConfig from "matrix-react-sdk/src/SdkConfig"; +import { _t } from "matrix-react-sdk/src/languageHandler"; const VectorAuthFooter = (): ReactElement => { const brandingConfig = SdkConfig.getObject("branding"); const links = brandingConfig?.get("auth_footer_links") ?? [ - // { "text": "Blog", "url": "https://element.io/blog" }, - // { "text": "Twitter", "url": "https://twitter.com/element_hq" }, - { "text": "About", "url": "https://schildi.chat" }, - { "text": "GitHub", "url": "https://github.com/SchildiChat/schildichat-desktop" }, + // { text: "Blog", url: "https://element.io/blog" }, + // { text: "Twitter", url: "https://twitter.com/element_hq" }, + { text: "About", url: "https://schildi.chat" }, + { text: "GitHub", url: "https://github.com/SchildiChat/schildichat-desktop" }, ]; const authFooterLinks = []; for (const linkEntry of links) { authFooterLinks.push( - { linkEntry.text } + {linkEntry.text} , ); } return ( ); }; diff --git a/src/components/views/auth/VectorAuthHeaderLogo.tsx b/src/components/views/auth/VectorAuthHeaderLogo.tsx index 3cca83b5ad2..984e01274ec 100644 --- a/src/components/views/auth/VectorAuthHeaderLogo.tsx +++ b/src/components/views/auth/VectorAuthHeaderLogo.tsx @@ -15,8 +15,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -import * as React from 'react'; -import SdkConfig from 'matrix-react-sdk/src/SdkConfig'; +import * as React from "react"; +import SdkConfig from "matrix-react-sdk/src/SdkConfig"; export default class VectorAuthHeaderLogo extends React.PureComponent { public render(): React.ReactElement { diff --git a/src/components/views/auth/VectorAuthPage.tsx b/src/components/views/auth/VectorAuthPage.tsx index d698926c58c..a81aaa3279b 100644 --- a/src/components/views/auth/VectorAuthPage.tsx +++ b/src/components/views/auth/VectorAuthPage.tsx @@ -14,8 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -import * as React from 'react'; -import SdkConfig from 'matrix-react-sdk/src/SdkConfig'; +import * as React from "react"; +import SdkConfig from "matrix-react-sdk/src/SdkConfig"; import VectorAuthFooter from "./VectorAuthFooter"; @@ -48,25 +48,25 @@ export default class VectorAuthPage extends React.PureComponent { }; const modalStyle: React.CSSProperties = { - position: 'relative', - background: 'initial', + position: "relative", + background: "initial", }; const blurStyle: React.CSSProperties = { - position: 'absolute', + position: "absolute", top: 0, right: 0, bottom: 0, left: 0, - filter: 'blur(40px)', + filter: "blur(40px)", background: pageStyle.background, }; const modalContentStyle: React.CSSProperties = { - display: 'flex', + display: "flex", zIndex: 1, - background: 'rgba(255, 255, 255, 0.59)', - borderRadius: '3px', + background: "rgba(255, 255, 255, 0.59)", + borderRadius: "3px", }; return ( @@ -74,7 +74,7 @@ export default class VectorAuthPage extends React.PureComponent {
- { this.props.children } + {this.props.children}
diff --git a/src/favicon.ts b/src/favicon.ts index 6899bbebb4e..1ae1e5bd9ee 100644 --- a/src/favicon.ts +++ b/src/favicon.ts @@ -70,8 +70,8 @@ export default class Favicon { this.baseImage.setAttribute("crossOrigin", "anonymous"); this.baseImage.onload = (): void => { // get height and width of the favicon - this.canvas.height = (this.baseImage.height > 0) ? this.baseImage.height : 32; - this.canvas.width = (this.baseImage.width > 0) ? this.baseImage.width : 32; + this.canvas.height = this.baseImage.height > 0 ? this.baseImage.height : 32; + this.canvas.width = this.baseImage.width > 0 ? this.baseImage.width : 32; this.context = this.canvas.getContext("2d"); this.ready(); }; @@ -89,7 +89,10 @@ export default class Favicon { this.context.drawImage(this.baseImage, 0, 0, this.canvas.width, this.canvas.height); } - private options(n: number | string, params: IParams): { + private options( + n: number | string, + params: IParams, + ): { n: string | number; len: number; x: number; @@ -98,7 +101,7 @@ export default class Favicon { h: number; } { const opt = { - n: ((typeof n) === "number") ? Math.abs(n as number | 0) : n, + n: typeof n === "number" ? Math.abs(n as number | 0) : n, len: ("" + n).length, // badge positioning constants as percentages x: 0.4, @@ -174,8 +177,8 @@ export default class Favicon { this.context.stroke(); this.context.fillStyle = params.textColor; - if ((typeof opt.n) === "number" && opt.n > 999) { - const count = ((opt.n > 9999) ? 9 : Math.floor(opt.n as number / 1000)) + "k+"; + if (typeof opt.n === "number" && opt.n > 999) { + const count = (opt.n > 9999 ? 9 : Math.floor((opt.n as number) / 1000)) + "k+"; this.context.fillText(count, Math.floor(opt.x + opt.w / 2), Math.floor(opt.y + opt.h - opt.h * 0.2)); } else { this.context.fillText("" + opt.n, Math.floor(opt.x + opt.w / 2), Math.floor(opt.y + opt.h - opt.h * 0.15)); @@ -209,7 +212,7 @@ export default class Favicon { newIcon.setAttribute("href", url); old.parentNode?.removeChild(old); } else { - this.icons.forEach(icon => { + this.icons.forEach((icon) => { icon.setAttribute("href", url); }); } @@ -236,7 +239,7 @@ export default class Favicon { const icons: HTMLLinkElement[] = []; const links = window.document.getElementsByTagName("head")[0].getElementsByTagName("link"); for (const link of links) { - if ((/(^|\s)icon(\s|$)/i).test(link.getAttribute("rel"))) { + if (/(^|\s)icon(\s|$)/i.test(link.getAttribute("rel"))) { icons.push(link); } } @@ -252,7 +255,7 @@ export default class Favicon { window.document.getElementsByTagName("head")[0].appendChild(elms[0]); } - elms.forEach(item => { + elms.forEach((item) => { item.setAttribute("type", "image/png"); }); return elms; diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 8154d845b40..c492b68f5d3 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -26,5 +26,7 @@ "%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s utiliza características avanzadas do navegador que non están dispoñibles no teu navegador.", "Powered by Matrix": "Funciona grazas a Matrix", "Use %(brand)s on mobile": "Utiliza %(brand)s no móbil", - "Decentralised, encrypted chat & collaboration powered by $matrixLogo": "Conversas & colaboración descentralizadas e cifradas grazas a $matrixLogo" + "Decentralised, encrypted chat & collaboration powered by $matrixLogo": "Conversas & colaboración descentralizadas e cifradas grazas a $matrixLogo", + "%(appName)s: %(browserName)s on %(osName)s": "%(appName)s: %(browserName)s en %(osName)s", + "%(brand)s Desktop: %(platformName)s": "%(brand)s para Escritorio: %(platformName)s" } diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index ffbddb5c2ac..3cd191ea105 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -26,5 +26,7 @@ "%(brand)s uses advanced browser features which aren't supported by your current browser.": "当前浏览器不支持 %(brand)s 所需的高级浏览器特性。", "Powered by Matrix": "由 Matrix 驱动", "Use %(brand)s on mobile": "在移动设备上使用 %(brand)s", - "Decentralised, encrypted chat & collaboration powered by $matrixLogo": "去中心化、加密的聊天与协作,由 $matrixLogo 驱动" + "Decentralised, encrypted chat & collaboration powered by $matrixLogo": "去中心化、加密的聊天与协作,由 $matrixLogo 驱动", + "%(appName)s: %(browserName)s on %(osName)s": "%(appName)s:%(browserName)s在%(osName)s", + "%(brand)s Desktop: %(platformName)s": "%(brand)s桌面版:%(platformName)s" } diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 2ea41284647..fafcc895a45 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -26,7 +26,7 @@ "%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s 使用了您目前的瀏覽器不支援的進階瀏覽器功能。", "Powered by Matrix": "由 Matrix 提供", "Use %(brand)s on mobile": "在行動裝置上使用 %(brand)s", - "Decentralised, encrypted chat & collaboration powered by $matrixLogo": "去中心化、加密的聊天與協作,威力本源 $matrixLogo", + "Decentralised, encrypted chat & collaboration powered by $matrixLogo": "去中心化、加密的聊天與協作,由 $matrixLogo 驅動", "%(appName)s: %(browserName)s on %(osName)s": "%(appName)s:%(browserName)s 在 %(osName)s 上", "%(brand)s Desktop: %(platformName)s": "%(brand)s 桌面版:%(platformName)s" } diff --git a/src/vector/app.tsx b/src/vector/app.tsx index 0ae5bd30404..5e0cec7f90f 100644 --- a/src/vector/app.tsx +++ b/src/vector/app.tsx @@ -21,10 +21,10 @@ limitations under the License. // To ensure we load the browser-matrix version first import "matrix-js-sdk/src/browser-index"; -import React, { ReactElement } from 'react'; -import PlatformPeg from 'matrix-react-sdk/src/PlatformPeg'; -import { _td, newTranslatableError } from 'matrix-react-sdk/src/languageHandler'; -import AutoDiscoveryUtils from 'matrix-react-sdk/src/utils/AutoDiscoveryUtils'; +import React, { ReactElement } from "react"; +import PlatformPeg from "matrix-react-sdk/src/PlatformPeg"; +import { _td, newTranslatableError } from "matrix-react-sdk/src/languageHandler"; +import AutoDiscoveryUtils from "matrix-react-sdk/src/utils/AutoDiscoveryUtils"; import { AutoDiscovery } from "matrix-js-sdk/src/autodiscovery"; import * as Lifecycle from "matrix-react-sdk/src/Lifecycle"; import SdkConfig, { parseSsoRedirectOptions } from "matrix-react-sdk/src/SdkConfig"; @@ -34,7 +34,7 @@ import { createClient } from "matrix-js-sdk/src/matrix"; import { SnakedObject } from "matrix-react-sdk/src/utils/SnakedObject"; import MatrixChat from "matrix-react-sdk/src/components/structures/MatrixChat"; -import { parseQs } from './url_utils'; +import { parseQs } from "./url_utils"; import VectorBasePlatform from "./platform/VectorBasePlatform"; import { getScreenFromLocation, init as initRouting, onNewScreen } from "./routing"; @@ -58,25 +58,20 @@ window.matrixLogger = logger; function makeRegistrationUrl(params: object): string { let url; if (window.location.protocol === "vector:") { - url = 'https://app.element.io/#/register'; + url = "https://app.element.io/#/register"; } else { - url = ( - window.location.protocol + '//' + - window.location.host + - window.location.pathname + - '#/register' - ); + url = window.location.protocol + "//" + window.location.host + window.location.pathname + "#/register"; } const keys = Object.keys(params); for (let i = 0; i < keys.length; ++i) { if (i === 0) { - url += '?'; + url += "?"; } else { - url += '&'; + url += "&"; } const k = keys[i]; - url += k + '=' + encodeURIComponent(params[k]); + url += k + "=" + encodeURIComponent(params[k]); } return url; } @@ -99,7 +94,7 @@ export async function loadApp(fragParams: {}): Promise { const params = parseQs(window.location); - const urlWithoutQuery = window.location.protocol + '//' + window.location.host + window.location.pathname; + const urlWithoutQuery = window.location.protocol + "//" + window.location.host + window.location.pathname; logger.log("Vector starting at " + urlWithoutQuery); (platform as VectorBasePlatform).startUpdater(); @@ -115,7 +110,7 @@ export async function loadApp(fragParams: {}): Promise { const ssoRedirects = parseSsoRedirectOptions(config); let autoRedirect = ssoRedirects.immediate === true; // XXX: This path matching is a bit brittle, but better to do it early instead of in the app code. - const isWelcomeOrLanding = window.location.hash === '#/welcome' || window.location.hash === '#'; + const isWelcomeOrLanding = window.location.hash === "#/welcome" || window.location.hash === "#"; if (!autoRedirect && ssoRedirects.on_welcome_page && isWelcomeOrLanding) { autoRedirect = true; } @@ -133,20 +128,21 @@ export async function loadApp(fragParams: {}): Promise { return; } - const defaultDeviceName = snakedConfig.get("default_device_display_name") - ?? platform.getDefaultDeviceDisplayName(); - - return ; + const defaultDeviceName = snakedConfig.get("default_device_display_name") ?? platform.getDefaultDeviceDisplayName(); + + return ( + + ); } async function verifyServerConfig(): Promise { @@ -164,18 +160,20 @@ async function verifyServerConfig(): Promise { // validators for that purpose. const config = SdkConfig.get(); - let wkConfig = config['default_server_config']; // overwritten later under some conditions - const serverName = config['default_server_name']; - const hsUrl = config['default_hs_url']; - const isUrl = config['default_is_url']; + let wkConfig = config["default_server_config"]; // overwritten later under some conditions + const serverName = config["default_server_name"]; + const hsUrl = config["default_hs_url"]; + const isUrl = config["default_is_url"]; - const incompatibleOptions = [wkConfig, serverName, hsUrl].filter(i => !!i); + const incompatibleOptions = [wkConfig, serverName, hsUrl].filter((i) => !!i); if (incompatibleOptions.length > 1) { // noinspection ExceptionCaughtLocallyJS - throw newTranslatableError(_td( - "Invalid configuration: can only specify one of default_server_config, default_server_name, " + - "or default_hs_url.", - )); + throw newTranslatableError( + _td( + "Invalid configuration: can only specify one of default_server_config, default_server_name, " + + "or default_hs_url.", + ), + ); } if (incompatibleOptions.length < 1) { // noinspection ExceptionCaughtLocallyJS @@ -186,17 +184,17 @@ async function verifyServerConfig(): Promise { logger.log("Config uses a default_hs_url - constructing a default_server_config using this information"); logger.warn( "DEPRECATED CONFIG OPTION: In the future, default_hs_url will not be accepted. Please use " + - "default_server_config instead.", + "default_server_config instead.", ); wkConfig = { "m.homeserver": { - "base_url": hsUrl, + base_url: hsUrl, }, }; if (isUrl) { wkConfig["m.identity_server"] = { - "base_url": isUrl, + base_url: isUrl, }; } } @@ -211,7 +209,7 @@ async function verifyServerConfig(): Promise { logger.log("Config uses a default_server_name - doing .well-known lookup"); logger.warn( "DEPRECATED CONFIG OPTION: In the future, default_server_name will not be accepted. Please " + - "use default_server_config instead.", + "use default_server_config instead.", ); discoveryResult = await AutoDiscovery.findClientConfig(serverName); } @@ -238,7 +236,7 @@ async function verifyServerConfig(): Promise { // Add the newly built config to the actual config for use by the app logger.log("Updating SdkConfig with validated discovery information"); - SdkConfig.add({ "validated_server_config": validatedConfig }); + SdkConfig.add({ validated_server_config: validatedConfig }); return SdkConfig.get(); } diff --git a/src/vector/devcss.ts b/src/vector/devcss.ts index 2f678033851..be4016b61f5 100644 --- a/src/vector/devcss.ts +++ b/src/vector/devcss.ts @@ -28,7 +28,7 @@ limitations under the License. * * For more details, see webpack.config.js:184 (string-replace-loader) */ -if (process.env.NODE_ENV === 'development') { +if (process.env.NODE_ENV === "development") { ("use theming"); /** * Clean up old hot-module script injections as they hog up memory @@ -40,8 +40,7 @@ if (process.env.NODE_ENV === 'development') { const elements = Array.from(document.querySelectorAll("script[src*=hot-update]")); if (elements.length > 1) { const oldInjects = elements.slice(0, elements.length - 1); - oldInjects.forEach(e => e.remove()); + oldInjects.forEach((e) => e.remove()); } }, 1000); } - diff --git a/src/vector/getconfig.ts b/src/vector/getconfig.ts index 3d4bbd7bd40..4633b57d8d9 100644 --- a/src/vector/getconfig.ts +++ b/src/vector/getconfig.ts @@ -18,8 +18,8 @@ import type { IConfigOptions } from "matrix-react-sdk/src/IConfigOptions"; // Load the config file. First try to load up a domain-specific config of the // form "config.$domain.json" and if that fails, fall back to config.json. -export async function getVectorConfig(relativeLocation=''): Promise { - if (relativeLocation !== '' && !relativeLocation.endsWith('/')) relativeLocation += '/'; +export async function getVectorConfig(relativeLocation = ""): Promise { + if (relativeLocation !== "" && !relativeLocation.endsWith("/")) relativeLocation += "/"; const specificConfigPromise = getConfig(`${relativeLocation}config.${document.domain}.json`); const generalConfigPromise = getConfig(relativeLocation + "config.json"); diff --git a/src/vector/index.ts b/src/vector/index.ts index 067121e939d..dcffa5e2cc8 100644 --- a/src/vector/index.ts +++ b/src/vector/index.ts @@ -22,13 +22,13 @@ import { logger } from "matrix-js-sdk/src/logger"; // These are things that can run before the skin loads - be careful not to reference the react-sdk though. import { parseQsFromFragment } from "./url_utils"; -import './modernizr'; +import "./modernizr"; // Require common CSS here; this will make webpack process it into bundle.css. // Our own CSS (which is themed) is imported via separate webpack entry points // in webpack.config.js -require('gfm.css/gfm.css'); -require('katex/dist/katex.css'); +require("gfm.css/gfm.css"); +require("katex/dist/katex.css"); /** * This require is necessary only for purposes of CSS hot-reload, as otherwise @@ -37,8 +37,8 @@ require('katex/dist/katex.css'); * * On production build it's going to be an empty module, so don't worry about that. */ -require('./devcss'); -require('./localstorage-fix'); +require("./devcss"); +require("./localstorage-fix"); async function settled(...promises: Array>): Promise { for (const prom of promises) { @@ -60,19 +60,16 @@ function checkBrowserFeatures(): boolean { // in it for some features we depend on. // Modernizr requires rules to be lowercase with no punctuation. // ES2018: http://262.ecma-international.org/9.0/#sec-promise.prototype.finally - window.Modernizr.addTest("promiseprototypefinally", () => - typeof window.Promise?.prototype?.finally === "function"); + window.Modernizr.addTest("promiseprototypefinally", () => typeof window.Promise?.prototype?.finally === "function"); // ES2020: http://262.ecma-international.org/#sec-promise.allsettled - window.Modernizr.addTest("promiseallsettled", () => - typeof window.Promise?.allSettled === "function"); + window.Modernizr.addTest("promiseallsettled", () => typeof window.Promise?.allSettled === "function"); // ES2018: https://262.ecma-international.org/9.0/#sec-get-regexp.prototype.dotAll - window.Modernizr.addTest("regexpdotall", () => ( - window.RegExp?.prototype && - !!Object.getOwnPropertyDescriptor(window.RegExp.prototype, "dotAll")?.get - )); + window.Modernizr.addTest( + "regexpdotall", + () => window.RegExp?.prototype && !!Object.getOwnPropertyDescriptor(window.RegExp.prototype, "dotAll")?.get, + ); // ES2019: http://262.ecma-international.org/10.0/#sec-object.fromentries - window.Modernizr.addTest("objectfromentries", () => - typeof window.Object?.fromEntries === "function"); + window.Modernizr.addTest("objectfromentries", () => typeof window.Object?.fromEntries === "function"); const featureList = Object.keys(window.Modernizr); @@ -80,8 +77,8 @@ function checkBrowserFeatures(): boolean { for (const feature of featureList) { if (window.Modernizr[feature] === undefined) { logger.error( - "Looked for feature '%s' but Modernizr has no results for this. " + - "Has it been configured correctly?", feature, + "Looked for feature '%s' but Modernizr has no results for this. " + "Has it been configured correctly?", + feature, ); return false; } @@ -120,7 +117,8 @@ async function start(): Promise { } = await import( /* webpackChunkName: "init" */ /* webpackPreload: true */ - "./init"); + "./init" + ); try { // give rageshake a chance to load/fail, we don't actually assert rageshake loads, we allow it to fail if no IDB @@ -178,12 +176,12 @@ async function start(): Promise { // error handling begins here // ########################## if (!acceptBrowser) { - await new Promise(resolve => { + await new Promise((resolve) => { logger.error("Browser is missing required features."); // take to a different landing page to AWOOOOOGA at the user showIncompatibleBrowser(() => { if (window.localStorage) { - window.localStorage.setItem('mx_accepts_unsupported_browser', String(true)); + window.localStorage.setItem("mx_accepts_unsupported_browser", String(true)); } logger.log("User accepts the compatibility risks."); resolve(); @@ -199,12 +197,13 @@ async function start(): Promise { if (error.err && error.err instanceof SyntaxError) { // This uses the default brand since the app config is unavailable. return showError(_t("Your Element is misconfigured"), [ - _t("Your Element configuration contains invalid JSON. " + - "Please correct the problem and reload the page."), _t( - "The message from the parser is: %(message)s", - { message: error.err.message || _t("Invalid JSON") }, + "Your Element configuration contains invalid JSON. " + + "Please correct the problem and reload the page.", ), + _t("The message from the parser is: %(message)s", { + message: error.err.message || _t("Invalid JSON"), + }), ]); } return showError(_t("Unable to load config file: please refresh the page to try again.")); @@ -237,7 +236,7 @@ async function start(): Promise { } } -start().catch(err => { +start().catch((err) => { logger.error(err); // show the static error in an iframe to not lose any context / console data // with some basic styling to make the iframe full page diff --git a/src/vector/indexeddb-worker.ts b/src/vector/indexeddb-worker.ts index e196cdfb350..113bc87d6c1 100644 --- a/src/vector/indexeddb-worker.ts +++ b/src/vector/indexeddb-worker.ts @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { IndexedDBStoreWorker } from 'matrix-js-sdk/src/indexeddb-worker'; +import { IndexedDBStoreWorker } from "matrix-js-sdk/src/indexeddb-worker"; const remoteWorker = new IndexedDBStoreWorker(postMessage as InstanceType["postMessage"]); diff --git a/src/vector/init.tsx b/src/vector/init.tsx index 133ebefdf62..6ab4e4cacf4 100644 --- a/src/vector/init.tsx +++ b/src/vector/init.tsx @@ -20,7 +20,7 @@ limitations under the License. // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import olmWasmPath from "@matrix-org/olm/olm.wasm"; -import Olm from '@matrix-org/olm'; +import Olm from "@matrix-org/olm"; import * as ReactDOM from "react-dom"; import * as React from "react"; import * as languageHandler from "matrix-react-sdk/src/languageHandler"; @@ -45,7 +45,7 @@ export function preparePlatform(): void { if (window.electron) { logger.log("Using Electron platform"); PlatformPeg.set(new ElectronPlatform()); - } else if (window.matchMedia('(display-mode: standalone)').matches) { + } else if (window.matchMedia("(display-mode: standalone)").matches) { logger.log("Using PWA platform"); PlatformPeg.set(new PWAPlatform()); } else { @@ -90,30 +90,35 @@ export function loadOlm(): Promise { */ return Olm.init({ locateFile: () => olmWasmPath, - }).then(() => { - logger.log("Using WebAssembly Olm"); - }).catch((wasmLoadError) => { - logger.log("Failed to load Olm: trying legacy version", wasmLoadError); - return new Promise((resolve, reject) => { - const s = document.createElement('script'); - s.src = 'olm_legacy.js'; // XXX: This should be cache-busted too - s.onload = resolve; - s.onerror = reject; - document.body.appendChild(s); - }).then(() => { - // Init window.Olm, ie. the one just loaded by the script tag, - // not 'Olm' which is still the failed wasm version. - return window.Olm.init(); - }).then(() => { - logger.log("Using legacy Olm"); - }).catch((legacyLoadError) => { - logger.log("Both WebAssembly and asm.js Olm failed!", legacyLoadError); + }) + .then(() => { + logger.log("Using WebAssembly Olm"); + }) + .catch((wasmLoadError) => { + logger.log("Failed to load Olm: trying legacy version", wasmLoadError); + return new Promise((resolve, reject) => { + const s = document.createElement("script"); + s.src = "olm_legacy.js"; // XXX: This should be cache-busted too + s.onload = resolve; + s.onerror = reject; + document.body.appendChild(s); + }) + .then(() => { + // Init window.Olm, ie. the one just loaded by the script tag, + // not 'Olm' which is still the failed wasm version. + return window.Olm.init(); + }) + .then(() => { + logger.log("Using legacy Olm"); + }) + .catch((legacyLoadError) => { + logger.log("Both WebAssembly and asm.js Olm failed!", legacyLoadError); + }); }); - }); } export async function loadLanguage(): Promise { - const prefLang = SettingsStore.getValue("language", null, /*excludeDefault=*/true); + const prefLang = SettingsStore.getValue("language", null, /*excludeDefault=*/ true); let langs = []; if (!prefLang) { @@ -140,25 +145,35 @@ export async function loadApp(fragParams: {}): Promise { const module = await import( /* webpackChunkName: "element-web-app" */ /* webpackPreload: true */ - "./app"); - window.matrixChat = ReactDOM.render(await module.loadApp(fragParams), - document.getElementById('matrixchat')); + "./app" + ); + window.matrixChat = ReactDOM.render(await module.loadApp(fragParams), document.getElementById("matrixchat")); } export async function showError(title: string, messages?: string[]): Promise { - const ErrorView = (await import( - /* webpackChunkName: "error-view" */ - "../async-components/structures/ErrorView")).default; - window.matrixChat = ReactDOM.render(, - document.getElementById('matrixchat')); + const ErrorView = ( + await import( + /* webpackChunkName: "error-view" */ + "../async-components/structures/ErrorView" + ) + ).default; + window.matrixChat = ReactDOM.render( + , + document.getElementById("matrixchat"), + ); } export async function showIncompatibleBrowser(onAccept): Promise { - const CompatibilityView = (await import( - /* webpackChunkName: "compatibility-view" */ - "../async-components/structures/CompatibilityView")).default; - window.matrixChat = ReactDOM.render(, - document.getElementById('matrixchat')); + const CompatibilityView = ( + await import( + /* webpackChunkName: "compatibility-view" */ + "../async-components/structures/CompatibilityView" + ) + ).default; + window.matrixChat = ReactDOM.render( + , + document.getElementById("matrixchat"), + ); } export async function loadModules(): Promise { diff --git a/src/vector/jitsi/index.html b/src/vector/jitsi/index.html index 1a05c602777..be84a62c2bf 100644 --- a/src/vector/jitsi/index.html +++ b/src/vector/jitsi/index.html @@ -1,24 +1,24 @@ - - - Jitsi Widget - - -
-
-
-
- - -

Jitsi Video Conference

-
- + + + Jitsi Widget + + +
+
+
+
+ + +

Jitsi Video Conference

+
+ +
+
-
-
- - - + + + diff --git a/src/vector/jitsi/index.pcss b/src/vector/jitsi/index.pcss index 5756e441f50..eae7baaac03 100644 --- a/src/vector/jitsi/index.pcss +++ b/src/vector/jitsi/index.pcss @@ -19,10 +19,10 @@ limitations under the License. @import "../../../node_modules/matrix-react-sdk/res/css/_border-radii.pcss"; @font-face { - font-family: 'Nunito'; + font-family: "Nunito"; font-style: normal; font-weight: 400; - src: url('~matrix-react-sdk/res/fonts/Nunito/Nunito-Regular.ttf') format('truetype'); + src: url("~matrix-react-sdk/res/fonts/Nunito/Nunito-Regular.ttf") format("truetype"); } $dark-fg: #edf3ff; @@ -40,7 +40,8 @@ body.theme-light { color: $light-fg; } -body, html { +body, +html { padding: 0; margin: 0; } @@ -94,7 +95,7 @@ body, html { margin-top: -$icon-size; /* to visually center the form */ &::before { - content: ''; + content: ""; background-size: contain; background-color: $dark-fg; mask-repeat: no-repeat; diff --git a/src/vector/jitsi/index.ts b/src/vector/jitsi/index.ts index 81a97351876..95d3301113c 100644 --- a/src/vector/jitsi/index.ts +++ b/src/vector/jitsi/index.ts @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { KJUR } from 'jsrsasign'; +import { KJUR } from "jsrsasign"; import { IOpenIDCredentials, IWidgetApiRequest, @@ -34,7 +34,7 @@ import { getVectorConfig } from "../getconfig"; // We have to trick webpack into loading our CSS for us. require("./index.pcss"); -const JITSI_OPENIDTOKEN_JWT_AUTH = 'openidtoken-jwt'; +const JITSI_OPENIDTOKEN_JWT_AUTH = "openidtoken-jwt"; // Dev note: we use raw JS without many dependencies to reduce bundle size. // We do not need all of React to render a Jitsi conference. @@ -82,9 +82,9 @@ const setupCompleted = (async (): Promise => { // If we have these params, expect a widget API to be available (ie. to be in an iframe // inside a matrix client). Otherwise, assume we're on our own, eg. have been popped // out into a browser. - const parentUrl = qsParam('parentUrl', true); - const widgetId = qsParam('widgetId', true); - const theme = qsParam('theme', true); + const parentUrl = qsParam("parentUrl", true); + const widgetId = qsParam("widgetId", true); + const theme = qsParam("theme", true); if (theme) { document.body.classList.add(`theme-${theme.replace(" ", "_")}`); @@ -93,10 +93,10 @@ const setupCompleted = (async (): Promise => { // Set this up as early as possible because Element will be hitting it almost immediately. let widgetApiReady: Promise; if (parentUrl && widgetId) { - const parentOrigin = new URL(qsParam('parentUrl')).origin; + const parentOrigin = new URL(qsParam("parentUrl")).origin; widgetApi = new WidgetApi(qsParam("widgetId"), parentOrigin); - widgetApiReady = new Promise(resolve => widgetApi.once("ready", resolve)); + widgetApiReady = new Promise((resolve) => widgetApi.once("ready", resolve)); widgetApi.requestCapabilities(VideoConferenceCapabilities); widgetApi.start(); @@ -134,39 +134,39 @@ const setupCompleted = (async (): Promise => { meetApi = null; closeConference(); } else { - meetApi?.executeCommand('hangup'); + meetApi?.executeCommand("hangup"); } }); handleAction(ElementWidgetActions.MuteAudio, async () => { - if (meetApi && !await meetApi.isAudioMuted()) { - meetApi.executeCommand('toggleAudio'); + if (meetApi && !(await meetApi.isAudioMuted())) { + meetApi.executeCommand("toggleAudio"); } }); handleAction(ElementWidgetActions.UnmuteAudio, async () => { - if (meetApi && await meetApi.isAudioMuted()) { - meetApi.executeCommand('toggleAudio'); + if (meetApi && (await meetApi.isAudioMuted())) { + meetApi.executeCommand("toggleAudio"); } }); handleAction(ElementWidgetActions.MuteVideo, async () => { - if (meetApi && !await meetApi.isVideoMuted()) { - meetApi.executeCommand('toggleVideo'); + if (meetApi && !(await meetApi.isVideoMuted())) { + meetApi.executeCommand("toggleVideo"); } }); handleAction(ElementWidgetActions.UnmuteVideo, async () => { - if (meetApi && await meetApi.isVideoMuted()) { - meetApi.executeCommand('toggleVideo'); + if (meetApi && (await meetApi.isVideoMuted())) { + meetApi.executeCommand("toggleVideo"); } }); handleAction(ElementWidgetActions.TileLayout, async () => { - meetApi?.executeCommand('setTileView', true); + meetApi?.executeCommand("setTileView", true); }); handleAction(ElementWidgetActions.SpotlightLayout, async () => { - meetApi?.executeCommand('setTileView', false); + meetApi?.executeCommand("setTileView", false); }); handleAction(ElementWidgetActions.StartLiveStream, async ({ rtmpStreamKey }) => { if (!meetApi) throw new Error("Conference not joined"); - meetApi.executeCommand('startRecording', { - mode: 'stream', + meetApi.executeCommand("startRecording", { + mode: "stream", // this looks like it should be rtmpStreamKey but we may be on too old // a version of jitsi meet //rtmpStreamKey, @@ -178,23 +178,23 @@ const setupCompleted = (async (): Promise => { } // Populate the Jitsi params now - jitsiDomain = qsParam('conferenceDomain'); - conferenceId = qsParam('conferenceId'); - displayName = qsParam('displayName', true); - avatarUrl = qsParam('avatarUrl', true); // http not mxc - userId = qsParam('userId'); - jitsiAuth = qsParam('auth', true); - roomId = qsParam('roomId', true); - roomName = qsParam('roomName', true); - startAudioOnly = qsParam('isAudioOnly', true) === "true"; - isVideoChannel = qsParam('isVideoChannel', true) === "true"; - supportsScreensharing = qsParam('supportsScreensharing', true) === "true"; + jitsiDomain = qsParam("conferenceDomain"); + conferenceId = qsParam("conferenceId"); + displayName = qsParam("displayName", true); + avatarUrl = qsParam("avatarUrl", true); // http not mxc + userId = qsParam("userId"); + jitsiAuth = qsParam("auth", true); + roomId = qsParam("roomId", true); + roomName = qsParam("roomName", true); + startAudioOnly = qsParam("isAudioOnly", true) === "true"; + isVideoChannel = qsParam("isVideoChannel", true) === "true"; + supportsScreensharing = qsParam("supportsScreensharing", true) === "true"; // We've reached the point where we have to wait for the config, so do that then parse it. const instanceConfig = new SnakedObject((await configPromise) ?? {}); const jitsiConfig = instanceConfig.get("jitsi_widget") ?? {}; - skipOurWelcomeScreen = (new SnakedObject(jitsiConfig)) - .get("skip_built_in_welcome_screen") ?? false; + skipOurWelcomeScreen = + new SnakedObject(jitsiConfig).get("skip_built_in_welcome_screen") ?? false; // Either reveal the prejoin screen, or skip straight to Jitsi depending on the config. // We don't set up the call yet though as this might lead to failure without the widget API. @@ -238,10 +238,10 @@ function switchVisibleContainers(): void { } function toggleConferenceVisibility(inConference: boolean): void { - document.getElementById("jitsiContainer").style.visibility = inConference ? 'unset' : 'hidden'; + document.getElementById("jitsiContainer").style.visibility = inConference ? "unset" : "hidden"; // Video rooms have a separate UI for joining, so they should never show our join button document.getElementById("joinButtonContainer").style.visibility = - (inConference || isVideoChannel) ? 'hidden' : 'unset'; + inConference || isVideoChannel ? "hidden" : "unset"; } function skipToJitsiSplashScreen(): void { @@ -256,7 +256,7 @@ function skipToJitsiSplashScreen(): void { */ function createJWTToken(): string { // Header - const header = { alg: 'HS256', typ: 'JWT' }; + const header = { alg: "HS256", typ: "JWT" }; // Payload const payload = { // As per Jitsi token auth, `iss` needs to be set to something agreed between @@ -281,12 +281,7 @@ function createJWTToken(): string { // Sign JWT // The secret string here is irrelevant, we're only using the JWT // to transport data to Prosody in the Jitsi stack. - return KJUR.jws.JWS.sign( - 'HS256', - JSON.stringify(header), - JSON.stringify(payload), - 'notused', - ); + return KJUR.jws.JWS.sign("HS256", JSON.stringify(header), JSON.stringify(payload), "notused"); } async function notifyHangup(errorMessage?: string): Promise { @@ -318,9 +313,10 @@ function closeConference(): void { function joinConference(audioInput?: string | null, videoInput?: string | null): void { let jwt; if (jitsiAuth === JITSI_OPENIDTOKEN_JWT_AUTH) { - if (!openIdToken?.access_token) { // eslint-disable-line camelcase + if (!openIdToken?.access_token) { + // eslint-disable-line camelcase // We've failing to get a token, don't try to init conference - logger.warn('Expected to have an OpenID credential, cannot initialize widget.'); + logger.warn("Expected to have an OpenID credential, cannot initialize widget."); document.getElementById("widgetActionContainer").innerText = "Failed to load Jitsi widget"; return; } @@ -331,8 +327,8 @@ function joinConference(audioInput?: string | null, videoInput?: string | null): logger.warn( "[Jitsi Widget] The next few errors about failing to parse URL parameters are fine if " + - "they mention 'external_api' or 'jitsi' in the stack. They're just Jitsi Meet trying to parse " + - "our fragment values and not recognizing the options.", + "they mention 'external_api' or 'jitsi' in the stack. They're just Jitsi Meet trying to parse " + + "our fragment values and not recognizing the options.", ); const options = { @@ -400,7 +396,7 @@ function joinConference(audioInput?: string | null, videoInput?: string | null): meetApi.on("audioMuteStatusChanged", onAudioMuteStatusChanged); meetApi.on("videoMuteStatusChanged", onVideoMuteStatusChanged); - ["videoConferenceJoined", "participantJoined", "participantLeft"].forEach(event => { + ["videoConferenceJoined", "participantJoined", "participantLeft"].forEach((event) => { meetApi.on(event, updateParticipants); }); @@ -472,5 +468,4 @@ const updateParticipants = (): void => { }); }; -const onLog = ({ logLevel, args }): void => - (parent as unknown as typeof global).mx_rage_logger?.log(logLevel, ...args); +const onLog = ({ logLevel, args }): void => (parent as unknown as typeof global).mx_rage_logger?.log(logLevel, ...args); diff --git a/src/vector/localstorage-fix.ts b/src/vector/localstorage-fix.ts index d0ca05174ff..3c3d46b8ac6 100644 --- a/src/vector/localstorage-fix.ts +++ b/src/vector/localstorage-fix.ts @@ -4,8 +4,8 @@ * */ if (window.localStorage) { - Object.keys(window.localStorage).forEach(key => { - if (key.indexOf('loglevel:') === 0) { + Object.keys(window.localStorage).forEach((key) => { + if (key.indexOf("loglevel:") === 0) { window.localStorage.removeItem(key); } }); diff --git a/src/vector/mobile_guide/index.html b/src/vector/mobile_guide/index.html index c36b4745659..643e5e0c8e5 100644 --- a/src/vector/mobile_guide/index.html +++ b/src/vector/mobile_guide/index.html @@ -1,23 +1,17 @@ - + SchildiChat Mobile Guide - - + + - + @@ -162,14 +162,10 @@

Use SchildiChat on mobile

or another Matrix-Client on the App Store.
+
- -
- diff --git a/src/vector/static/unable-to-load.html b/src/vector/static/unable-to-load.html index f5187167f6a..82bad33e898 100644 --- a/src/vector/static/unable-to-load.html +++ b/src/vector/static/unable-to-load.html @@ -1,11 +1,10 @@ - - + - - + @@ -161,14 +160,10 @@

SchildiChat can't load

Something went wrong and SchildiChat was unable to load.

+
- -
- diff --git a/src/vector/url_utils.ts b/src/vector/url_utils.ts index 718fc152730..f4b09eed41a 100644 --- a/src/vector/url_utils.ts +++ b/src/vector/url_utils.ts @@ -19,7 +19,7 @@ import { QueryDict, decodeParams } from "matrix-js-sdk/src/utils"; // We want to support some name / value pairs in the fragment // so we're re-using query string like format // -export function parseQsFromFragment(location: Location): { location: string, params: QueryDict } { +export function parseQsFromFragment(location: Location): { location: string; params: QueryDict } { // if we have a fragment, it will start with '#', which we need to drop. // (if we don't, this will return ''). const fragment = location.hash.substring(1); @@ -27,7 +27,7 @@ export function parseQsFromFragment(location: Location): { location: string, par // our fragment may contain a query-param-like section. we need to fish // this out *before* URI-decoding because the params may contain ? and & // characters which are only URI-encoded once. - const hashparts = fragment.split('?'); + const hashparts = fragment.split("?"); const result = { location: decodeURIComponent(hashparts[0]), diff --git a/test/app-tests/loading-test.tsx b/test/app-tests/loading-test.tsx index 59a5a84cb4c..be705f79ad4 100644 --- a/test/app-tests/loading-test.tsx +++ b/test/app-tests/loading-test.tsx @@ -18,27 +18,27 @@ limitations under the License. /* loading.js: test the myriad paths we have for loading the application */ import "fake-indexeddb/auto"; -import React from 'react'; +import React from "react"; import { render, screen, fireEvent, waitFor, RenderResult, waitForElementToBeRemoved } from "@testing-library/react"; -import PlatformPeg from 'matrix-react-sdk/src/PlatformPeg'; -import { MatrixClientPeg } from 'matrix-react-sdk/src/MatrixClientPeg'; -import MatrixChat from 'matrix-react-sdk/src/components/structures/MatrixChat'; -import dis from 'matrix-react-sdk/src/dispatcher/dispatcher'; -import MockHttpBackend from 'matrix-mock-request'; +import PlatformPeg from "matrix-react-sdk/src/PlatformPeg"; +import { MatrixClientPeg } from "matrix-react-sdk/src/MatrixClientPeg"; +import MatrixChat from "matrix-react-sdk/src/components/structures/MatrixChat"; +import dis from "matrix-react-sdk/src/dispatcher/dispatcher"; +import MockHttpBackend from "matrix-mock-request"; import { makeType } from "matrix-react-sdk/src/utils/TypeUtils"; -import { ValidatedServerConfig } from 'matrix-react-sdk/src/utils/ValidatedServerConfig'; +import { ValidatedServerConfig } from "matrix-react-sdk/src/utils/ValidatedServerConfig"; import { IndexedDBCryptoStore } from "matrix-js-sdk/src/crypto/store/indexeddb-crypto-store"; import { QueryDict, sleep } from "matrix-js-sdk/src/utils"; import "../jest-mocks"; -import WebPlatform from '../../src/vector/platform/WebPlatform'; -import { parseQs, parseQsFromFragment } from '../../src/vector/url_utils'; +import WebPlatform from "../../src/vector/platform/WebPlatform"; +import { parseQs, parseQsFromFragment } from "../../src/vector/url_utils"; import { cleanLocalstorage, deleteIndexedDB } from "../test-utils"; -const DEFAULT_HS_URL = 'http://my_server'; -const DEFAULT_IS_URL = 'http://my_is'; +const DEFAULT_HS_URL = "http://my_server"; +const DEFAULT_IS_URL = "http://my_is"; -describe('loading:', function() { +describe("loading:", function () { let parentDiv; let httpBackend; @@ -51,10 +51,10 @@ describe('loading:', function() { // a promise which resolves when the MatrixChat calls onTokenLoginCompleted let tokenLoginCompletePromise; - beforeEach(function() { + beforeEach(function () { httpBackend = new MockHttpBackend(); window.fetch = httpBackend.fetchFn; - parentDiv = document.createElement('div'); + parentDiv = document.createElement("div"); // uncomment this to actually add the div to the UI, to help with // debugging (but slow things down) @@ -64,17 +64,14 @@ describe('loading:', function() { matrixChat = null; }); - afterEach(async function() { + afterEach(async function () { console.log(`${Date.now()}: loading: afterEach`); matrixChat?.unmount(); // unmounting should have cleared the MatrixClientPeg expect(MatrixClientPeg.get()).toBe(null); // clear the indexeddbs so we can start from a clean slate next time. - await Promise.all([ - deleteIndexedDB('matrix-js-sdk:crypto'), - deleteIndexedDB('matrix-js-sdk:riot-web-sync'), - ]); + await Promise.all([deleteIndexedDB("matrix-js-sdk:crypto"), deleteIndexedDB("matrix-js-sdk:riot-web-sync")]); cleanLocalstorage(); console.log(`${Date.now()}: loading: afterEach complete`); }); @@ -92,19 +89,21 @@ describe('loading:', function() { windowLocation = { search: queryString, hash: uriFragment, - toString: function(): string { return this.search + this.hash; }, + toString: function (): string { + return this.search + this.hash; + }, }; function onNewScreen(screen): void { - console.log(Date.now() + " newscreen "+screen); - const hash = '#/' + screen; + console.log(Date.now() + " newscreen " + screen); + const hash = "#/" + screen; windowLocation.hash = hash; - console.log(Date.now() + " browser URI now "+ windowLocation); + console.log(Date.now() + " browser URI now " + windowLocation); } // Parse the given window.location and return parameters that can be used when calling // MatrixChat.showScreen(screen, params) - function getScreenFromLocation(location): { screen: string, params: QueryDict } { + function getScreenFromLocation(location): { screen: string; params: QueryDict } { const fragparts = parseQsFromFragment(location); return { screen: fragparts.location.substring(1), @@ -114,25 +113,28 @@ describe('loading:', function() { const fragParts = parseQsFromFragment(windowLocation); - const config = Object.assign({ - default_hs_url: DEFAULT_HS_URL, - default_is_url: DEFAULT_IS_URL, - validated_server_config: makeType(ValidatedServerConfig, { - hsUrl: DEFAULT_HS_URL, - hsName: "TEST_ENVIRONMENT", - hsNameIsDifferent: false, // yes, we lie - isUrl: DEFAULT_IS_URL, - }), - embeddedPages: { - homeUrl: 'data:text/html;charset=utf-8;base64,PGh0bWw+PC9odG1sPg==', + const config = Object.assign( + { + default_hs_url: DEFAULT_HS_URL, + default_is_url: DEFAULT_IS_URL, + validated_server_config: makeType(ValidatedServerConfig, { + hsUrl: DEFAULT_HS_URL, + hsName: "TEST_ENVIRONMENT", + hsNameIsDifferent: false, // yes, we lie + isUrl: DEFAULT_IS_URL, + }), + embeddedPages: { + homeUrl: "data:text/html;charset=utf-8;base64,PGh0bWw+PC9odG1sPg==", + }, }, - }, opts.config || {}); + opts.config || {}, + ); PlatformPeg.set(new WebPlatform()); const params = parseQs(windowLocation); - tokenLoginCompletePromise = new Promise(resolve => { + tokenLoginCompletePromise = new Promise((resolve) => { matrixChat = render( {throw new Error('Not implemented');}} - />, parentDiv, + makeRegistrationUrl={(): string => { + throw new Error("Not implemented"); + }} + />, + parentDiv, ); }); } @@ -155,21 +160,23 @@ describe('loading:', function() { // returns a promise resolving to the received request async function expectAndAwaitSync(opts?): Promise { let syncRequest = null; - httpBackend.when('GET', '/_matrix/client/versions') - .respond(200, { - "versions": ["r0.3.0"], - "unstable_features": { - "m.lazy_load_members": true, - }, - }); + httpBackend.when("GET", "/_matrix/client/versions").respond(200, { + versions: ["r0.3.0"], + unstable_features: { + "m.lazy_load_members": true, + }, + }); const isGuest = opts && opts.isGuest; if (!isGuest) { // the call to create the LL filter - httpBackend.when('POST', '/filter').respond(200, { filter_id: 'llfid' }); - httpBackend.when('GET', '/pushrules').respond(200, {}); + httpBackend.when("POST", "/filter").respond(200, { filter_id: "llfid" }); + httpBackend.when("GET", "/pushrules").respond(200, {}); } - httpBackend.when('GET', '/sync') - .check((r) => {syncRequest = r;}) + httpBackend + .when("GET", "/sync") + .check((r) => { + syncRequest = r; + }) .respond(200, {}); for (let attempts = 10; attempts > 0; attempts--) { @@ -182,29 +189,35 @@ describe('loading:', function() { throw new Error("Gave up waiting for /sync"); } - describe("Clean load with no stored credentials:", function() { - it('gives a welcome page by default', function() { + describe("Clean load with no stored credentials:", function () { + it("gives a welcome page by default", function () { loadApp(); - return sleep(1).then(async () => { - // at this point, we're trying to do a guest registration; - // we expect a spinner - await assertAtLoadingSpinner(); - - httpBackend.when('POST', '/register').check(function(req) { - expect(req.queryParams.kind).toEqual('guest'); - }).respond(403, "Guest access is disabled"); - - return httpBackend.flush(); - }).then(() => { - // Wait for another trip around the event loop for the UI to update - return awaitWelcomeComponent(matrixChat); - }).then(() => { - return waitFor(() => expect(windowLocation.hash).toEqual("#/welcome")); - }); + return sleep(1) + .then(async () => { + // at this point, we're trying to do a guest registration; + // we expect a spinner + await assertAtLoadingSpinner(); + + httpBackend + .when("POST", "/register") + .check(function (req) { + expect(req.queryParams.kind).toEqual("guest"); + }) + .respond(403, "Guest access is disabled"); + + return httpBackend.flush(); + }) + .then(() => { + // Wait for another trip around the event loop for the UI to update + return awaitWelcomeComponent(matrixChat); + }) + .then(() => { + return waitFor(() => expect(windowLocation.hash).toEqual("#/welcome")); + }); }); - it('should follow the original link after successful login', function() { + it("should follow the original link after successful login", function () { loadApp({ uriFragment: "#/room/!room:id", }); @@ -213,39 +226,48 @@ describe('loading:', function() { httpBackend.when("GET", "/versions").respond(200, { versions: ["r0.4.0"] }); httpBackend.when("GET", "/api/v1").respond(200, {}); - return sleep(1).then(async () => { - // at this point, we're trying to do a guest registration; - // we expect a spinner - await assertAtLoadingSpinner(); - - httpBackend.when('POST', '/register').check(function(req) { - expect(req.queryParams.kind).toEqual('guest'); - }).respond(403, "Guest access is disabled"); - - return httpBackend.flush(); - }).then(() => { - // Wait for another trip around the event loop for the UI to update - return sleep(10); - }).then(() => { - return moveFromWelcomeToLogin(matrixChat); - }).then(() => { - return completeLogin(matrixChat); - }).then(() => { - // once the sync completes, we should have a room view - return awaitRoomView(matrixChat); - }).then(() => { - httpBackend.verifyNoOutstandingExpectation(); - expect(windowLocation.hash).toEqual("#/room/!room:id"); - - // and the localstorage should have been updated - expect(localStorage.getItem('mx_user_id')).toEqual('@user:id'); - expect(localStorage.getItem('mx_access_token')).toEqual('access_token'); - expect(localStorage.getItem('mx_hs_url')).toEqual(DEFAULT_HS_URL); - expect(localStorage.getItem('mx_is_url')).toEqual(DEFAULT_IS_URL); - }); + return sleep(1) + .then(async () => { + // at this point, we're trying to do a guest registration; + // we expect a spinner + await assertAtLoadingSpinner(); + + httpBackend + .when("POST", "/register") + .check(function (req) { + expect(req.queryParams.kind).toEqual("guest"); + }) + .respond(403, "Guest access is disabled"); + + return httpBackend.flush(); + }) + .then(() => { + // Wait for another trip around the event loop for the UI to update + return sleep(10); + }) + .then(() => { + return moveFromWelcomeToLogin(matrixChat); + }) + .then(() => { + return completeLogin(matrixChat); + }) + .then(() => { + // once the sync completes, we should have a room view + return awaitRoomView(matrixChat); + }) + .then(() => { + httpBackend.verifyNoOutstandingExpectation(); + expect(windowLocation.hash).toEqual("#/room/!room:id"); + + // and the localstorage should have been updated + expect(localStorage.getItem("mx_user_id")).toEqual("@user:id"); + expect(localStorage.getItem("mx_access_token")).toEqual("access_token"); + expect(localStorage.getItem("mx_hs_url")).toEqual(DEFAULT_HS_URL); + expect(localStorage.getItem("mx_is_url")).toEqual(DEFAULT_IS_URL); + }); }); - it.skip('should not register as a guest when using a #/login link', function() { + it.skip("should not register as a guest when using a #/login link", function () { loadApp({ uriFragment: "#/login", }); @@ -254,37 +276,35 @@ describe('loading:', function() { httpBackend.when("GET", "/versions").respond(200, { versions: ["r0.4.0"] }); httpBackend.when("GET", "/api/v1").respond(200, {}); - return awaitLoginComponent(matrixChat).then(async () => { - await waitForElementToBeRemoved(() => screen.queryAllByLabelText("Loading...")); - // we expect a single component - await screen.findByRole("main"); - screen.getAllByText("Sign in"); - - // the only outstanding request should be a GET /login - // (in particular there should be no /register request for - // guest registration). - const allowedRequests = [ - "/_matrix/client/r0/login", - "/versions", - "/api/v1", - ]; - for (const req of httpBackend.requests) { - if (req.method === 'GET' && allowedRequests.find(p => req.path.endsWith(p))) { - continue; + return awaitLoginComponent(matrixChat) + .then(async () => { + await waitForElementToBeRemoved(() => screen.queryAllByLabelText("Loading...")); + // we expect a single component + await screen.findByRole("main"); + screen.getAllByText("Sign in"); + + // the only outstanding request should be a GET /login + // (in particular there should be no /register request for + // guest registration). + const allowedRequests = ["/_matrix/client/r0/login", "/versions", "/api/v1"]; + for (const req of httpBackend.requests) { + if (req.method === "GET" && allowedRequests.find((p) => req.path.endsWith(p))) { + continue; + } + + throw new Error(`Unexpected HTTP request to ${req}`); } - - throw new Error(`Unexpected HTTP request to ${req}`); - } - return completeLogin(matrixChat); - }).then(() => { - expect(matrixChat.container.querySelector(".mx_HomePage")).toBeTruthy(); - expect(windowLocation.hash).toEqual("#/home"); - }); + return completeLogin(matrixChat); + }) + .then(() => { + expect(matrixChat.container.querySelector(".mx_HomePage")).toBeTruthy(); + expect(windowLocation.hash).toEqual("#/home"); + }); }); }); - describe("MatrixClient rehydrated from stored credentials:", function() { - beforeEach(async function() { + describe("MatrixClient rehydrated from stored credentials:", function () { + beforeEach(async function () { localStorage.setItem("mx_hs_url", "http://localhost"); localStorage.setItem("mx_is_url", "http://localhost"); localStorage.setItem("mx_access_token", "access_token"); @@ -292,63 +312,68 @@ describe('loading:', function() { localStorage.setItem("mx_last_room_id", "!last_room:id"); // Create a crypto store as well to satisfy storage consistency checks - const cryptoStore = new IndexedDBCryptoStore( - indexedDB, - "matrix-js-sdk:crypto", - ); + const cryptoStore = new IndexedDBCryptoStore(indexedDB, "matrix-js-sdk:crypto"); await cryptoStore.startup(); }); - it('shows the last known room by default', function() { + it("shows the last known room by default", function () { loadApp(); - return awaitLoggedIn(matrixChat).then(() => { - // we are logged in - let the sync complete - return expectAndAwaitSync(); - }).then(() => { - // once the sync completes, we should have a room view - return awaitRoomView(matrixChat); - }).then(() => { - httpBackend.verifyNoOutstandingExpectation(); - expect(windowLocation.hash).toEqual("#/room/!last_room:id"); - }); + return awaitLoggedIn(matrixChat) + .then(() => { + // we are logged in - let the sync complete + return expectAndAwaitSync(); + }) + .then(() => { + // once the sync completes, we should have a room view + return awaitRoomView(matrixChat); + }) + .then(() => { + httpBackend.verifyNoOutstandingExpectation(); + expect(windowLocation.hash).toEqual("#/room/!last_room:id"); + }); }); - it('shows a home page by default if we have no joined rooms', function() { + it("shows a home page by default if we have no joined rooms", function () { localStorage.removeItem("mx_last_room_id"); loadApp(); - return awaitLoggedIn(matrixChat).then(() => { - // we are logged in - let the sync complete - return expectAndAwaitSync(); - }).then(() => { - // once the sync completes, we should have a home page - httpBackend.verifyNoOutstandingExpectation(); - expect(matrixChat.container.querySelector(".mx_HomePage")).toBeTruthy(); - expect(windowLocation.hash).toEqual("#/home"); - }); + return awaitLoggedIn(matrixChat) + .then(() => { + // we are logged in - let the sync complete + return expectAndAwaitSync(); + }) + .then(() => { + // once the sync completes, we should have a home page + httpBackend.verifyNoOutstandingExpectation(); + expect(matrixChat.container.querySelector(".mx_HomePage")).toBeTruthy(); + expect(windowLocation.hash).toEqual("#/home"); + }); }); - it('shows a room view if we followed a room link', function() { + it("shows a room view if we followed a room link", function () { loadApp({ uriFragment: "#/room/!room:id", }); - return awaitLoggedIn(matrixChat).then(() => { - // we are logged in - let the sync complete - return expectAndAwaitSync(); - }).then(() => { - // once the sync completes, we should have a room view - return awaitRoomView(matrixChat); - }).then(() => { - httpBackend.verifyNoOutstandingExpectation(); - expect(windowLocation.hash).toEqual("#/room/!room:id"); - }); + return awaitLoggedIn(matrixChat) + .then(() => { + // we are logged in - let the sync complete + return expectAndAwaitSync(); + }) + .then(() => { + // once the sync completes, we should have a room view + return awaitRoomView(matrixChat); + }) + .then(() => { + httpBackend.verifyNoOutstandingExpectation(); + expect(windowLocation.hash).toEqual("#/room/!room:id"); + }); }); - describe('/#/login link:', function() { - beforeEach(function() { + describe("/#/login link:", function () { + beforeEach(function () { loadApp({ uriFragment: "#/login", }); @@ -357,7 +382,7 @@ describe('loading:', function() { return expectAndAwaitSync(); }); - it('does not show a login view', async function() { + it("does not show a login view", async function () { await awaitRoomView(matrixChat); await screen.findByLabelText("Spaces"); @@ -366,136 +391,165 @@ describe('loading:', function() { }); }); - describe('Guest auto-registration:', function() { - it('shows a welcome page by default', function() { + describe("Guest auto-registration:", function () { + it("shows a welcome page by default", function () { loadApp(); - return sleep(1).then(async () => { - // at this point, we're trying to do a guest registration; - // we expect a spinner - await assertAtLoadingSpinner(); - - httpBackend.when('POST', '/register').check(function(req) { - expect(req.queryParams.kind).toEqual('guest'); - }).respond(200, { - user_id: "@guest:localhost", - access_token: "secret_token", + return sleep(1) + .then(async () => { + // at this point, we're trying to do a guest registration; + // we expect a spinner + await assertAtLoadingSpinner(); + + httpBackend + .when("POST", "/register") + .check(function (req) { + expect(req.queryParams.kind).toEqual("guest"); + }) + .respond(200, { + user_id: "@guest:localhost", + access_token: "secret_token", + }); + + return httpBackend.flush(); + }) + .then(() => { + return awaitLoggedIn(matrixChat); + }) + .then(() => { + // we are logged in - let the sync complete + return expectAndAwaitSync({ isGuest: true }); + }) + .then(() => { + // once the sync completes, we should have a welcome page + httpBackend.verifyNoOutstandingExpectation(); + expect(matrixChat.container.querySelector(".mx_Welcome")).toBeTruthy(); + expect(windowLocation.hash).toEqual("#/welcome"); }); - - return httpBackend.flush(); - }).then(() => { - return awaitLoggedIn(matrixChat); - }).then(() => { - // we are logged in - let the sync complete - return expectAndAwaitSync({ isGuest: true }); - }).then(() => { - // once the sync completes, we should have a welcome page - httpBackend.verifyNoOutstandingExpectation(); - expect(matrixChat.container.querySelector(".mx_Welcome")).toBeTruthy(); - expect(windowLocation.hash).toEqual("#/welcome"); - }); }); - it('uses the default homeserver to register with', function() { + it("uses the default homeserver to register with", function () { loadApp(); - return sleep(1).then(async () => { - // at this point, we're trying to do a guest registration; - // we expect a spinner - await assertAtLoadingSpinner(); - - httpBackend.when('POST', '/register').check(function(req) { + return sleep(1) + .then(async () => { + // at this point, we're trying to do a guest registration; + // we expect a spinner + await assertAtLoadingSpinner(); + + httpBackend + .when("POST", "/register") + .check(function (req) { + expect(req.path.startsWith(DEFAULT_HS_URL)).toBe(true); + expect(req.queryParams.kind).toEqual("guest"); + }) + .respond(200, { + user_id: "@guest:localhost", + access_token: "secret_token", + }); + + return httpBackend.flush(); + }) + .then(() => { + return awaitLoggedIn(matrixChat); + }) + .then(() => { + return expectAndAwaitSync({ isGuest: true }); + }) + .then((req) => { expect(req.path.startsWith(DEFAULT_HS_URL)).toBe(true); - expect(req.queryParams.kind).toEqual('guest'); - }).respond(200, { - user_id: "@guest:localhost", - access_token: "secret_token", - }); - - return httpBackend.flush(); - }).then(() => { - return awaitLoggedIn(matrixChat); - }).then(() => { - return expectAndAwaitSync({ isGuest: true }); - }).then((req) => { - expect(req.path.startsWith(DEFAULT_HS_URL)).toBe(true); - // once the sync completes, we should have a welcome page - httpBackend.verifyNoOutstandingExpectation(); - expect(matrixChat.container.querySelector(".mx_Welcome")).toBeTruthy(); - expect(windowLocation.hash).toEqual("#/welcome"); - expect(MatrixClientPeg.get().baseUrl).toEqual(DEFAULT_HS_URL); - expect(MatrixClientPeg.get().idBaseUrl).toEqual(DEFAULT_IS_URL); - }); + // once the sync completes, we should have a welcome page + httpBackend.verifyNoOutstandingExpectation(); + expect(matrixChat.container.querySelector(".mx_Welcome")).toBeTruthy(); + expect(windowLocation.hash).toEqual("#/welcome"); + expect(MatrixClientPeg.get().baseUrl).toEqual(DEFAULT_HS_URL); + expect(MatrixClientPeg.get().idBaseUrl).toEqual(DEFAULT_IS_URL); + }); }); - it('shows a room view if we followed a room link', function() { + it("shows a room view if we followed a room link", function () { loadApp({ uriFragment: "#/room/!room:id", }); - return sleep(1).then(async () => { - // at this point, we're trying to do a guest registration; - // we expect a spinner - await assertAtLoadingSpinner(); - - httpBackend.when('POST', '/register').check(function(req) { - expect(req.queryParams.kind).toEqual('guest'); - }).respond(200, { - user_id: "@guest:localhost", - access_token: "secret_token", + return sleep(1) + .then(async () => { + // at this point, we're trying to do a guest registration; + // we expect a spinner + await assertAtLoadingSpinner(); + + httpBackend + .when("POST", "/register") + .check(function (req) { + expect(req.queryParams.kind).toEqual("guest"); + }) + .respond(200, { + user_id: "@guest:localhost", + access_token: "secret_token", + }); + + return httpBackend.flush(); + }) + .then(() => { + return awaitLoggedIn(matrixChat); + }) + .then(() => { + return expectAndAwaitSync({ isGuest: true }); + }) + .then(() => { + // once the sync completes, we should have a room view + return awaitRoomView(matrixChat); + }) + .then(() => { + httpBackend.verifyNoOutstandingExpectation(); + expect(windowLocation.hash).toEqual("#/room/!room:id"); }); - - return httpBackend.flush(); - }).then(() => { - return awaitLoggedIn(matrixChat); - }).then(() => { - return expectAndAwaitSync({ isGuest: true }); - }).then(() => { - // once the sync completes, we should have a room view - return awaitRoomView(matrixChat); - }).then(() => { - httpBackend.verifyNoOutstandingExpectation(); - expect(windowLocation.hash).toEqual("#/room/!room:id"); - }); }); - describe('Login as user', function() { - beforeEach(function() { + describe("Login as user", function () { + beforeEach(function () { // first we have to load the homepage loadApp(); - httpBackend.when('POST', '/register').check(function(req) { - expect(req.queryParams.kind).toEqual('guest'); - }).respond(200, { - user_id: "@guest:localhost", - access_token: "secret_token", - }); - - return httpBackend.flush().then(() => { - return awaitLoggedIn(matrixChat); - }).then(() => { - // we got a sync spinner - let the sync complete - return expectAndAwaitSync(); - }).then(async () => { - // once the sync completes, we should have a home page - await waitFor(() => matrixChat.container.querySelector(".mx_HomePage")); - - // we simulate a click on the 'login' button by firing off - // the relevant dispatch. - // - // XXX: is it an anti-pattern to access the react-sdk's - // dispatcher in this way? Is it better to find the login - // button and simulate a click? (we might have to arrange - // for it to be shown - it's not always, due to the - // collapsing left panel - - dis.dispatch({ action: 'start_login' }); - - return awaitLoginComponent(matrixChat); - }); + httpBackend + .when("POST", "/register") + .check(function (req) { + expect(req.queryParams.kind).toEqual("guest"); + }) + .respond(200, { + user_id: "@guest:localhost", + access_token: "secret_token", + }); + + return httpBackend + .flush() + .then(() => { + return awaitLoggedIn(matrixChat); + }) + .then(() => { + // we got a sync spinner - let the sync complete + return expectAndAwaitSync(); + }) + .then(async () => { + // once the sync completes, we should have a home page + await waitFor(() => matrixChat.container.querySelector(".mx_HomePage")); + + // we simulate a click on the 'login' button by firing off + // the relevant dispatch. + // + // XXX: is it an anti-pattern to access the react-sdk's + // dispatcher in this way? Is it better to find the login + // button and simulate a click? (we might have to arrange + // for it to be shown - it's not always, due to the + // collapsing left panel + + dis.dispatch({ action: "start_login" }); + + return awaitLoginComponent(matrixChat); + }); }); - it('should give us a login page', async function() { + it("should give us a login page", async function () { // we expect a single component await screen.findByRole("main"); screen.getAllByText("Sign in"); @@ -505,44 +559,50 @@ describe('loading:', function() { }); }); - describe('Token login:', function() { - it('logs in successfully', function() { + describe("Token login:", function () { + it("logs in successfully", function () { localStorage.setItem("mx_sso_hs_url", "https://homeserver"); localStorage.setItem("mx_sso_is_url", "https://idserver"); loadApp({ queryString: "?loginToken=secretToken", }); - return sleep(1).then(async () => { - // we expect a spinner while we're logging in - await assertAtLoadingSpinner(); - - httpBackend.when('POST', '/login').check(function(req) { - expect(req.path).toMatch(new RegExp("^https://homeserver/")); - expect(req.data.type).toEqual("m.login.token"); - expect(req.data.token).toEqual("secretToken"); - }).respond(200, { - user_id: "@user:localhost", - device_id: 'DEVICE_ID', - access_token: "access_token", + return sleep(1) + .then(async () => { + // we expect a spinner while we're logging in + await assertAtLoadingSpinner(); + + httpBackend + .when("POST", "/login") + .check(function (req) { + expect(req.path).toMatch(new RegExp("^https://homeserver/")); + expect(req.data.type).toEqual("m.login.token"); + expect(req.data.token).toEqual("secretToken"); + }) + .respond(200, { + user_id: "@user:localhost", + device_id: "DEVICE_ID", + access_token: "access_token", + }); + + return httpBackend.flush(); + }) + .then(() => { + // at this point, MatrixChat should fire onTokenLoginCompleted, which + // makes index.js reload the app. We're not going to attempt to + // simulate the reload - just check that things are left in the + // right state for the reloaded app. + + return tokenLoginCompletePromise; + }) + .then(() => { + // check that the localstorage has been set up in such a way that + // the reloaded app can pick up where we leave off. + expect(localStorage.getItem("mx_user_id")).toEqual("@user:localhost"); + expect(localStorage.getItem("mx_access_token")).toEqual("access_token"); + expect(localStorage.getItem("mx_hs_url")).toEqual("https://homeserver"); + expect(localStorage.getItem("mx_is_url")).toEqual("https://idserver"); }); - - return httpBackend.flush(); - }).then(() => { - // at this point, MatrixChat should fire onTokenLoginCompleted, which - // makes index.js reload the app. We're not going to attempt to - // simulate the reload - just check that things are left in the - // right state for the reloaded app. - - return tokenLoginCompletePromise; - }).then(() => { - // check that the localstorage has been set up in such a way that - // the reloaded app can pick up where we leave off. - expect(localStorage.getItem('mx_user_id')).toEqual('@user:localhost'); - expect(localStorage.getItem('mx_access_token')).toEqual('access_token'); - expect(localStorage.getItem('mx_hs_url')).toEqual('https://homeserver'); - expect(localStorage.getItem('mx_is_url')).toEqual('https://idserver'); - }); }); }); @@ -551,38 +611,44 @@ describe('loading:', function() { async function completeLogin(matrixChat: RenderResult): Promise { // When we switch to the login component, it'll hit the login endpoint // for proof of life and to get flows. We'll only give it one option. - httpBackend.when('GET', '/login') - .respond(200, { flows: [{ type: "m.login.password" }] }); + httpBackend.when("GET", "/login").respond(200, { flows: [{ type: "m.login.password" }] }); httpBackend.flush(); // We already would have tried the GET /login request // Give the component some time to finish processing the login flows before // continuing. await sleep(100); - httpBackend.when('POST', '/login').check(function(req) { - expect(req.data.type).toEqual('m.login.password'); - expect(req.data.identifier.type).toEqual('m.id.user'); - expect(req.data.identifier.user).toEqual('user'); - expect(req.data.password).toEqual('pass'); - }).respond(200, { - user_id: '@user:id', - device_id: 'DEVICE_ID', - access_token: 'access_token', - }); + httpBackend + .when("POST", "/login") + .check(function (req) { + expect(req.data.type).toEqual("m.login.password"); + expect(req.data.identifier.type).toEqual("m.id.user"); + expect(req.data.identifier.user).toEqual("user"); + expect(req.data.password).toEqual("pass"); + }) + .respond(200, { + user_id: "@user:id", + device_id: "DEVICE_ID", + access_token: "access_token", + }); fireEvent.change(matrixChat.container.querySelector("#mx_LoginForm_username"), { target: { value: "user" } }); fireEvent.change(matrixChat.container.querySelector("#mx_LoginForm_password"), { target: { value: "pass" } }); fireEvent.click(screen.getByText("Sign in", { selector: ".mx_Login_submit" })); - return httpBackend.flush().then(() => { - // Wait for another trip around the event loop for the UI to update - return sleep(1); - }).then(() => { - return expectAndAwaitSync().catch((e) => { - throw new Error("Never got /sync after login: did the client start?"); + return httpBackend + .flush() + .then(() => { + // Wait for another trip around the event loop for the UI to update + return sleep(1); + }) + .then(() => { + return expectAndAwaitSync().catch((e) => { + throw new Error("Never got /sync after login: did the client start?"); + }); + }) + .then(() => { + httpBackend.verifyNoOutstandingExpectation(); }); - }).then(() => { - httpBackend.verifyNoOutstandingExpectation(); - }); } }); @@ -594,7 +660,7 @@ async function assertAtLoadingSpinner(): Promise { async function awaitLoggedIn(matrixChat: RenderResult): Promise { if (matrixChat.container.querySelector(".mx_MatrixChat_wrapper")) return; // already logged in - return new Promise(resolve => { + return new Promise((resolve) => { const onAction = ({ action }): void => { if (action !== "on_logged_in") { return; @@ -621,6 +687,6 @@ async function awaitWelcomeComponent(matrixChat: RenderResult): Promise { } function moveFromWelcomeToLogin(matrixChat: RenderResult): Promise { - dis.dispatch({ action: 'start_login' }); + dis.dispatch({ action: "start_login" }); return awaitLoginComponent(matrixChat); } diff --git a/test/jest-mocks.ts b/test/jest-mocks.ts index 7a5503667aa..3302ea9ff91 100644 --- a/test/jest-mocks.ts +++ b/test/jest-mocks.ts @@ -15,9 +15,9 @@ limitations under the License. */ // https://jestjs.io/docs/en/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom -Object.defineProperty(window, 'matchMedia', { +Object.defineProperty(window, "matchMedia", { writable: true, - value: jest.fn().mockImplementation(query => ({ + value: jest.fn().mockImplementation((query) => ({ matches: false, media: query, onchange: null, diff --git a/test/test-utils.ts b/test/test-utils.ts index db10cd5a2ba..84234ef34e5 100644 --- a/test/test-utils.ts +++ b/test/test-utils.ts @@ -34,14 +34,12 @@ export function deleteIndexedDB(dbName: string): Promise { }; req.onerror = (ev): void => { - reject(new Error( - `${Date.now()}: unable to delete indexeddb ${dbName}: ${req.error}`, - )); + reject(new Error(`${Date.now()}: unable to delete indexeddb ${dbName}: ${req.error}`)); }; req.onsuccess = (): void => { const now = Date.now(); - console.log(`${now}: Removed indexeddb instance: ${dbName} in ${now-startTime} ms`); + console.log(`${now}: Removed indexeddb instance: ${dbName} in ${now - startTime} ms`); resolve(); }; }).catch((e) => { diff --git a/test/unit-tests/vector/getconfig-test.ts b/test/unit-tests/vector/getconfig-test.ts index 3e205fe83e8..aac830457e7 100644 --- a/test/unit-tests/vector/getconfig-test.ts +++ b/test/unit-tests/vector/getconfig-test.ts @@ -20,88 +20,88 @@ import { getVectorConfig } from "../../../src/vector/getconfig"; fetchMock.config.overwriteRoutes = true; -describe('getVectorConfig()', () => { +describe("getVectorConfig()", () => { const prevDocumentDomain = document.domain; - const elementDomain = 'app.element.io'; + const elementDomain = "app.element.io"; const now = 1234567890; const specificConfig = { - brand: 'specific', + brand: "specific", }; const generalConfig = { - brand: 'general', + brand: "general", }; beforeEach(() => { document.domain = elementDomain; // stable value for cachebuster - jest.spyOn(Date, 'now').mockReturnValue(now); + jest.spyOn(Date, "now").mockReturnValue(now); jest.clearAllMocks(); fetchMock.mockClear(); }); afterAll(() => { document.domain = prevDocumentDomain; - jest.spyOn(Date, 'now').mockRestore(); + jest.spyOn(Date, "now").mockRestore(); }); - it('requests specific config for document domain', async () => { + it("requests specific config for document domain", async () => { fetchMock.getOnce("express:/config.app.element.io.json", specificConfig); fetchMock.getOnce("express:/config.json", generalConfig); await expect(getVectorConfig()).resolves.toEqual(specificConfig); }); - it('adds trailing slash to relativeLocation when not an empty string', async () => { + it("adds trailing slash to relativeLocation when not an empty string", async () => { fetchMock.getOnce("express:../config.app.element.io.json", specificConfig); fetchMock.getOnce("express:../config.json", generalConfig); await expect(getVectorConfig("..")).resolves.toEqual(specificConfig); }); - it('returns general config when specific config succeeds but is empty', async () => { + it("returns general config when specific config succeeds but is empty", async () => { fetchMock.getOnce("express:/config.app.element.io.json", {}); fetchMock.getOnce("express:/config.json", generalConfig); await expect(getVectorConfig()).resolves.toEqual(generalConfig); }); - it('returns general config when specific config 404s', async () => { + it("returns general config when specific config 404s", async () => { fetchMock.getOnce("express:/config.app.element.io.json", { status: 404 }); fetchMock.getOnce("express:/config.json", generalConfig); await expect(getVectorConfig()).resolves.toEqual(generalConfig); }); - it('returns general config when specific config is fetched from a file and is empty', async () => { + it("returns general config when specific config is fetched from a file and is empty", async () => { fetchMock.getOnce("express:/config.app.element.io.json", 0); fetchMock.getOnce("express:/config.json", generalConfig); await expect(getVectorConfig()).resolves.toEqual(generalConfig); }); - it('returns general config when specific config returns a non-200 status', async () => { + it("returns general config when specific config returns a non-200 status", async () => { fetchMock.getOnce("express:/config.app.element.io.json", { status: 401 }); fetchMock.getOnce("express:/config.json", generalConfig); await expect(getVectorConfig()).resolves.toEqual(generalConfig); }); - it('returns general config when specific config returns an error', async () => { + it("returns general config when specific config returns an error", async () => { fetchMock.getOnce("express:/config.app.element.io.json", { throws: "err1" }); fetchMock.getOnce("express:/config.json", generalConfig); await expect(getVectorConfig()).resolves.toEqual(generalConfig); }); - it('rejects with an error when general config rejects', async () => { + it("rejects with an error when general config rejects", async () => { fetchMock.getOnce("express:/config.app.element.io.json", { throws: "err-specific" }); fetchMock.getOnce("express:/config.json", { throws: "err-general" }); await expect(getVectorConfig()).rejects.toBe("err-general"); }); - it('rejects with an error when config is invalid JSON', async () => { + it("rejects with an error when config is invalid JSON", async () => { fetchMock.getOnce("express:/config.app.element.io.json", { throws: "err-specific" }); fetchMock.getOnce("express:/config.json", '{"invalid": "json",}'); diff --git a/test/unit-tests/vector/platform/ElectronPlatform-test.ts b/test/unit-tests/vector/platform/ElectronPlatform-test.ts index f96506d0a88..c1a4e4ce5c1 100644 --- a/test/unit-tests/vector/platform/ElectronPlatform-test.ts +++ b/test/unit-tests/vector/platform/ElectronPlatform-test.ts @@ -14,33 +14,34 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { logger } from 'matrix-js-sdk/src/logger'; -import { MatrixEvent, Room } from 'matrix-js-sdk/src/matrix'; -import { UpdateCheckStatus } from 'matrix-react-sdk/src/BasePlatform'; -import { Action } from 'matrix-react-sdk/src/dispatcher/actions'; -import dispatcher from 'matrix-react-sdk/src/dispatcher/dispatcher'; -import * as rageshake from 'matrix-react-sdk/src/rageshake/rageshake'; +import { logger } from "matrix-js-sdk/src/logger"; +import { MatrixEvent, Room } from "matrix-js-sdk/src/matrix"; +import { UpdateCheckStatus } from "matrix-react-sdk/src/BasePlatform"; +import { Action } from "matrix-react-sdk/src/dispatcher/actions"; +import dispatcher from "matrix-react-sdk/src/dispatcher/dispatcher"; +import * as rageshake from "matrix-react-sdk/src/rageshake/rageshake"; -import ElectronPlatform from '../../../../src/vector/platform/ElectronPlatform'; +import ElectronPlatform from "../../../../src/vector/platform/ElectronPlatform"; -jest.mock('matrix-react-sdk/src/rageshake/rageshake', () => ({ +jest.mock("matrix-react-sdk/src/rageshake/rageshake", () => ({ flush: jest.fn(), })); -describe('ElectronPlatform', () => { - const defaultUserAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 ' + - '(KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'; +describe("ElectronPlatform", () => { + const defaultUserAgent = + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 " + + "(KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"; const mockElectron = { on: jest.fn(), send: jest.fn(), }; - const dispatchSpy = jest.spyOn(dispatcher, 'dispatch'); - const dispatchFireSpy = jest.spyOn(dispatcher, 'fire'); - const logSpy = jest.spyOn(logger, 'log').mockImplementation(() => {}); + const dispatchSpy = jest.spyOn(dispatcher, "dispatch"); + const dispatchFireSpy = jest.spyOn(dispatcher, "fire"); + const logSpy = jest.spyOn(logger, "log").mockImplementation(() => {}); - const userId = '@alice:server.org'; - const deviceId = 'device-id'; + const userId = "@alice:server.org"; + const deviceId = "device-id"; window.electron = mockElectron; beforeEach(() => { @@ -53,9 +54,9 @@ describe('ElectronPlatform', () => { const getElectronEventHandlerCall = (eventType: string): [type: string, handler: Function] | undefined => mockElectron.on.mock.calls.find(([type]) => type === eventType); - it('flushes rageshake before quitting', () => { + it("flushes rageshake before quitting", () => { new ElectronPlatform(); - const [event, handler] = getElectronEventHandlerCall('before-quit'); + const [event, handler] = getElectronEventHandlerCall("before-quit"); // correct event bound expect(event).toBeTruthy(); @@ -65,9 +66,9 @@ describe('ElectronPlatform', () => { expect(rageshake.flush).toHaveBeenCalled(); }); - it('dispatches view settings action on preferences event', () => { + it("dispatches view settings action on preferences event", () => { new ElectronPlatform(); - const [event, handler] = getElectronEventHandlerCall('preferences'); + const [event, handler] = getElectronEventHandlerCall("preferences"); // correct event bound expect(event).toBeTruthy(); @@ -76,10 +77,10 @@ describe('ElectronPlatform', () => { expect(dispatchFireSpy).toHaveBeenCalledWith(Action.ViewUserSettings); }); - describe('updates', () => { - it('dispatches on check updates action', () => { + describe("updates", () => { + it("dispatches on check updates action", () => { new ElectronPlatform(); - const [event, handler] = getElectronEventHandlerCall('check_updates'); + const [event, handler] = getElectronEventHandlerCall("check_updates"); // correct event bound expect(event).toBeTruthy(); @@ -90,9 +91,9 @@ describe('ElectronPlatform', () => { }); }); - it('dispatches on check updates action when update not available', () => { + it("dispatches on check updates action when update not available", () => { new ElectronPlatform(); - const [, handler] = getElectronEventHandlerCall('check_updates'); + const [, handler] = getElectronEventHandlerCall("check_updates"); handler({}, false); expect(dispatchSpy).toHaveBeenCalledWith({ @@ -101,55 +102,42 @@ describe('ElectronPlatform', () => { }); }); - it('starts update check', () => { + it("starts update check", () => { const platform = new ElectronPlatform(); platform.startUpdateCheck(); - expect(mockElectron.send).toHaveBeenCalledWith('check_updates'); + expect(mockElectron.send).toHaveBeenCalledWith("check_updates"); }); - it('installs update', () => { + it("installs update", () => { const platform = new ElectronPlatform(); platform.installUpdate(); - expect(mockElectron.send).toHaveBeenCalledWith('install_update'); + expect(mockElectron.send).toHaveBeenCalledWith("install_update"); }); }); - it('returns human readable name', () => { + it("returns human readable name", () => { const platform = new ElectronPlatform(); - expect(platform.getHumanReadableName()).toEqual('Electron Platform'); + expect(platform.getHumanReadableName()).toEqual("Electron Platform"); }); describe("getDefaultDeviceDisplayName", () => { - it.each([[ - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 " + - "(KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36", - "Element Desktop: macOS", - ], - [ - "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) " + - "electron/1.0.0 Chrome/53.0.2785.113 Electron/1.4.3 Safari/537.36", - "Element Desktop: Windows", - ], - [ - "Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0", - "Element Desktop: Linux", - ], - [ - "Mozilla/5.0 (X11; FreeBSD i686; rv:21.0) Gecko/20100101 Firefox/21.0", - "Element Desktop: FreeBSD", - ], - [ - "Mozilla/5.0 (X11; OpenBSD i686; rv:21.0) Gecko/20100101 Firefox/21.0", - "Element Desktop: OpenBSD", - ], - [ - "Mozilla/5.0 (X11; SunOS i686; rv:21.0) Gecko/20100101 Firefox/21.0", - "Element Desktop: SunOS", - ], - [ - "custom user agent", - "Element Desktop: Unknown", - ]])("%s = %s", (userAgent, result) => { + it.each([ + [ + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 " + + "(KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36", + "Element Desktop: macOS", + ], + [ + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) " + + "electron/1.0.0 Chrome/53.0.2785.113 Electron/1.4.3 Safari/537.36", + "Element Desktop: Windows", + ], + ["Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0", "Element Desktop: Linux"], + ["Mozilla/5.0 (X11; FreeBSD i686; rv:21.0) Gecko/20100101 Firefox/21.0", "Element Desktop: FreeBSD"], + ["Mozilla/5.0 (X11; OpenBSD i686; rv:21.0) Gecko/20100101 Firefox/21.0", "Element Desktop: OpenBSD"], + ["Mozilla/5.0 (X11; SunOS i686; rv:21.0) Gecko/20100101 Firefox/21.0", "Element Desktop: SunOS"], + ["custom user agent", "Element Desktop: Unknown"], + ])("%s = %s", (userAgent, result) => { delete window.navigator; window.navigator = { userAgent } as unknown as Navigator; const platform = new ElectronPlatform(); @@ -157,119 +145,119 @@ describe('ElectronPlatform', () => { }); }); - it('returns true for needsUrlTooltips', () => { + it("returns true for needsUrlTooltips", () => { const platform = new ElectronPlatform(); expect(platform.needsUrlTooltips()).toBe(true); }); - it('should override browser shortcuts', () => { + it("should override browser shortcuts", () => { const platform = new ElectronPlatform(); expect(platform.overrideBrowserShortcuts()).toBe(true); }); - it('allows overriding native context menus', () => { + it("allows overriding native context menus", () => { const platform = new ElectronPlatform(); expect(platform.allowOverridingNativeContextMenus()).toBe(true); }); - it('indicates support for desktop capturer', () => { + it("indicates support for desktop capturer", () => { const platform = new ElectronPlatform(); expect(platform.supportsDesktopCapturer()).toBe(true); }); - it('indicates no support for jitsi screensharing', () => { + it("indicates no support for jitsi screensharing", () => { const platform = new ElectronPlatform(); expect(platform.supportsJitsiScreensharing()).toBe(false); }); - describe('notifications', () => { - it('indicates support for notifications', () => { + describe("notifications", () => { + it("indicates support for notifications", () => { const platform = new ElectronPlatform(); expect(platform.supportsNotifications()).toBe(true); }); - it('may send notifications', () => { + it("may send notifications", () => { const platform = new ElectronPlatform(); expect(platform.maySendNotifications()).toBe(true); }); - it('pretends to request notification permission', async () => { + it("pretends to request notification permission", async () => { const platform = new ElectronPlatform(); const result = await platform.requestNotificationPermission(); - expect(result).toEqual('granted'); + expect(result).toEqual("granted"); }); - it('creates a loud notification', async () => { + it("creates a loud notification", async () => { const platform = new ElectronPlatform(); - platform.loudNotification(new MatrixEvent(), new Room('!room:server', {} as any, userId)); - expect(mockElectron.send).toHaveBeenCalledWith('loudNotification'); + platform.loudNotification(new MatrixEvent(), new Room("!room:server", {} as any, userId)); + expect(mockElectron.send).toHaveBeenCalledWith("loudNotification"); }); - it('sets notification count when count is changing', async () => { + it("sets notification count when count is changing", async () => { const platform = new ElectronPlatform(); platform.setNotificationCount(0); // not called because matches internal notificaiton count - expect(mockElectron.send).not.toHaveBeenCalledWith('setBadgeCount', 0); + expect(mockElectron.send).not.toHaveBeenCalledWith("setBadgeCount", 0); platform.setNotificationCount(1); - expect(mockElectron.send).toHaveBeenCalledWith('setBadgeCount', 1); + expect(mockElectron.send).toHaveBeenCalledWith("setBadgeCount", 1); }); }); - describe('spellcheck', () => { - it('indicates support for spellcheck settings', () => { + describe("spellcheck", () => { + it("indicates support for spellcheck settings", () => { const platform = new ElectronPlatform(); expect(platform.supportsSpellCheckSettings()).toBe(true); }); - it('gets available spellcheck languages', () => { + it("gets available spellcheck languages", () => { const platform = new ElectronPlatform(); mockElectron.send.mockClear(); platform.getAvailableSpellCheckLanguages(); const [channel, { name }] = mockElectron.send.mock.calls[0]; expect(channel).toEqual("ipcCall"); - expect(name).toEqual('getAvailableSpellCheckLanguages'); + expect(name).toEqual("getAvailableSpellCheckLanguages"); }); }); - describe('pickle key', () => { - it('makes correct ipc call to get pickle key', () => { + describe("pickle key", () => { + it("makes correct ipc call to get pickle key", () => { const platform = new ElectronPlatform(); mockElectron.send.mockClear(); platform.getPickleKey(userId, deviceId); const [, { name, args }] = mockElectron.send.mock.calls[0]; - expect(name).toEqual('getPickleKey'); + expect(name).toEqual("getPickleKey"); expect(args).toEqual([userId, deviceId]); }); - it('makes correct ipc call to create pickle key', () => { + it("makes correct ipc call to create pickle key", () => { const platform = new ElectronPlatform(); mockElectron.send.mockClear(); platform.createPickleKey(userId, deviceId); const [, { name, args }] = mockElectron.send.mock.calls[0]; - expect(name).toEqual('createPickleKey'); + expect(name).toEqual("createPickleKey"); expect(args).toEqual([userId, deviceId]); }); - it('makes correct ipc call to destroy pickle key', () => { + it("makes correct ipc call to destroy pickle key", () => { const platform = new ElectronPlatform(); mockElectron.send.mockClear(); platform.destroyPickleKey(userId, deviceId); const [, { name, args }] = mockElectron.send.mock.calls[0]; - expect(name).toEqual('destroyPickleKey'); + expect(name).toEqual("destroyPickleKey"); expect(args).toEqual([userId, deviceId]); }); }); - describe('versions', () => { - it('calls install update', () => { + describe("versions", () => { + it("calls install update", () => { const platform = new ElectronPlatform(); platform.installUpdate(); - expect(mockElectron.send).toHaveBeenCalledWith('install_update'); + expect(mockElectron.send).toHaveBeenCalledWith("install_update"); }); }); }); diff --git a/test/unit-tests/vector/platform/PWAPlatform-test.ts b/test/unit-tests/vector/platform/PWAPlatform-test.ts index 4829fc04d3b..59632d0bb6c 100644 --- a/test/unit-tests/vector/platform/PWAPlatform-test.ts +++ b/test/unit-tests/vector/platform/PWAPlatform-test.ts @@ -21,7 +21,7 @@ import WebPlatform from "../../../../src/vector/platform/WebPlatform"; jest.mock("../../../../src/vector/platform/WebPlatform"); -describe('PWAPlatform', () => { +describe("PWAPlatform", () => { beforeEach(() => { jest.clearAllMocks(); }); @@ -54,7 +54,7 @@ describe('PWAPlatform', () => { }); it("should handle Navigator::setAppBadge rejecting gracefully", () => { - navigator.setAppBadge = jest.fn().mockRejectedValue(new Error); + navigator.setAppBadge = jest.fn().mockRejectedValue(new Error()); const platform = new PWAPlatform(); expect(() => platform.setNotificationCount(123)).not.toThrow(); }); diff --git a/test/unit-tests/vector/platform/WebPlatform-test.ts b/test/unit-tests/vector/platform/WebPlatform-test.ts index ad84cb0c06d..6f7c332c2d5 100644 --- a/test/unit-tests/vector/platform/WebPlatform-test.ts +++ b/test/unit-tests/vector/platform/WebPlatform-test.ts @@ -15,24 +15,24 @@ limitations under the License. */ import fetchMock from "fetch-mock-jest"; -import { UpdateCheckStatus } from 'matrix-react-sdk/src/BasePlatform'; -import { MatrixClientPeg } from 'matrix-react-sdk/src/MatrixClientPeg'; +import { UpdateCheckStatus } from "matrix-react-sdk/src/BasePlatform"; +import { MatrixClientPeg } from "matrix-react-sdk/src/MatrixClientPeg"; -import WebPlatform from '../../../../src/vector/platform/WebPlatform'; +import WebPlatform from "../../../../src/vector/platform/WebPlatform"; fetchMock.config.overwriteRoutes = true; -describe('WebPlatform', () => { +describe("WebPlatform", () => { beforeEach(() => { jest.clearAllMocks(); }); - it('returns human readable name', () => { + it("returns human readable name", () => { const platform = new WebPlatform(); - expect(platform.getHumanReadableName()).toEqual('Web Platform'); + expect(platform.getHumanReadableName()).toEqual("Web Platform"); }); - it('registers service worker', () => { + it("registers service worker", () => { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - mocking readonly object navigator.serviceWorker = { register: jest.fn() }; @@ -65,12 +65,14 @@ describe('WebPlatform', () => { }); describe("getDefaultDeviceDisplayName", () => { - it.each([[ - "https://develop.element.io/#/room/!foo:bar", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) " + - "Chrome/105.0.0.0 Safari/537.36", - "develop.element.io: Chrome on macOS", - ]])("%s & %s = %s", (url, userAgent, result) => { + it.each([ + [ + "https://develop.element.io/#/room/!foo:bar", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) " + + "Chrome/105.0.0.0 Safari/537.36", + "develop.element.io: Chrome on macOS", + ], + ])("%s & %s = %s", (url, userAgent, result) => { delete window.navigator; window.navigator = { userAgent } as unknown as Navigator; delete window.location; @@ -80,66 +82,66 @@ describe('WebPlatform', () => { }); }); - describe('notification support', () => { + describe("notification support", () => { const mockNotification = { requestPermission: jest.fn(), - permission: 'notGranted', + permission: "notGranted", }; beforeEach(() => { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore window.Notification = mockNotification; - mockNotification.permission = 'notGranted'; + mockNotification.permission = "notGranted"; }); - it('supportsNotifications returns false when platform does not support notifications', () => { + it("supportsNotifications returns false when platform does not support notifications", () => { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore window.Notification = undefined; expect(new WebPlatform().supportsNotifications()).toBe(false); }); - it('supportsNotifications returns true when platform supports notifications', () => { + it("supportsNotifications returns true when platform supports notifications", () => { expect(new WebPlatform().supportsNotifications()).toBe(true); }); - it('maySendNotifications returns true when notification permissions are not granted', () => { + it("maySendNotifications returns true when notification permissions are not granted", () => { expect(new WebPlatform().maySendNotifications()).toBe(false); }); - it('maySendNotifications returns true when notification permissions are granted', () => { - mockNotification.permission = 'granted'; + it("maySendNotifications returns true when notification permissions are granted", () => { + mockNotification.permission = "granted"; expect(new WebPlatform().maySendNotifications()).toBe(true); }); - it('requests notification permissions and returns result ', async () => { - mockNotification.requestPermission.mockImplementation(callback => callback('test')); + it("requests notification permissions and returns result ", async () => { + mockNotification.requestPermission.mockImplementation((callback) => callback("test")); const platform = new WebPlatform(); const result = await platform.requestNotificationPermission(); - expect(result).toEqual('test'); + expect(result).toEqual("test"); }); }); - describe('app version', () => { + describe("app version", () => { const envVersion = process.env.VERSION; - const prodVersion = '1.10.13'; + const prodVersion = "1.10.13"; beforeEach(() => { - jest.spyOn(MatrixClientPeg, 'userRegisteredWithinLastHours').mockReturnValue(false); + jest.spyOn(MatrixClientPeg, "userRegisteredWithinLastHours").mockReturnValue(false); }); afterAll(() => { process.env.VERSION = envVersion; }); - it('should return true from canSelfUpdate()', async () => { + it("should return true from canSelfUpdate()", async () => { const platform = new WebPlatform(); const result = await platform.canSelfUpdate(); expect(result).toBe(true); }); - it('getAppVersion returns normalized app version', async () => { + it("getAppVersion returns normalized app version", async () => { process.env.VERSION = prodVersion; const platform = new WebPlatform(); @@ -156,23 +158,26 @@ describe('WebPlatform', () => { expect(notSemverVersion).toEqual(`version not like semver`); }); - describe('pollForUpdate()', () => { - it('should return not available and call showNoUpdate when current version ' + - 'matches most recent version', async () => { - process.env.VERSION = prodVersion; - fetchMock.getOnce("/version", prodVersion); - const platform = new WebPlatform(); - - const showUpdate = jest.fn(); - const showNoUpdate = jest.fn(); - const result = await platform.pollForUpdate(showUpdate, showNoUpdate); - - expect(result).toEqual({ status: UpdateCheckStatus.NotAvailable }); - expect(showUpdate).not.toHaveBeenCalled(); - expect(showNoUpdate).toHaveBeenCalled(); - }); - - it('should strip v prefix from versions before comparing', async () => { + describe("pollForUpdate()", () => { + it( + "should return not available and call showNoUpdate when current version " + + "matches most recent version", + async () => { + process.env.VERSION = prodVersion; + fetchMock.getOnce("/version", prodVersion); + const platform = new WebPlatform(); + + const showUpdate = jest.fn(); + const showNoUpdate = jest.fn(); + const result = await platform.pollForUpdate(showUpdate, showNoUpdate); + + expect(result).toEqual({ status: UpdateCheckStatus.NotAvailable }); + expect(showUpdate).not.toHaveBeenCalled(); + expect(showNoUpdate).toHaveBeenCalled(); + }, + ); + + it("should strip v prefix from versions before comparing", async () => { process.env.VERSION = prodVersion; fetchMock.getOnce("/version", `v${prodVersion}`); const platform = new WebPlatform(); @@ -187,24 +192,26 @@ describe('WebPlatform', () => { expect(showNoUpdate).toHaveBeenCalled(); }); - it('should return ready and call showUpdate when current version ' + - 'differs from most recent version', async () => { - process.env.VERSION = '0.0.0'; // old version - fetchMock.getOnce("/version", prodVersion); - const platform = new WebPlatform(); - - const showUpdate = jest.fn(); - const showNoUpdate = jest.fn(); - const result = await platform.pollForUpdate(showUpdate, showNoUpdate); - - expect(result).toEqual({ status: UpdateCheckStatus.Ready }); - expect(showUpdate).toHaveBeenCalledWith('0.0.0', prodVersion); - expect(showNoUpdate).not.toHaveBeenCalled(); - }); - - it('should return ready without showing update when user registered in last 24', async () => { - process.env.VERSION = '0.0.0'; // old version - jest.spyOn(MatrixClientPeg, 'userRegisteredWithinLastHours').mockReturnValue(true); + it( + "should return ready and call showUpdate when current version " + "differs from most recent version", + async () => { + process.env.VERSION = "0.0.0"; // old version + fetchMock.getOnce("/version", prodVersion); + const platform = new WebPlatform(); + + const showUpdate = jest.fn(); + const showNoUpdate = jest.fn(); + const result = await platform.pollForUpdate(showUpdate, showNoUpdate); + + expect(result).toEqual({ status: UpdateCheckStatus.Ready }); + expect(showUpdate).toHaveBeenCalledWith("0.0.0", prodVersion); + expect(showNoUpdate).not.toHaveBeenCalled(); + }, + ); + + it("should return ready without showing update when user registered in last 24", async () => { + process.env.VERSION = "0.0.0"; // old version + jest.spyOn(MatrixClientPeg, "userRegisteredWithinLastHours").mockReturnValue(true); fetchMock.getOnce("/version", prodVersion); const platform = new WebPlatform(); @@ -217,7 +224,7 @@ describe('WebPlatform', () => { expect(showNoUpdate).not.toHaveBeenCalled(); }); - it('should return error when version check fails', async () => { + it("should return error when version check fails", async () => { fetchMock.getOnce("/version", { throws: "oups" }); const platform = new WebPlatform(); @@ -225,7 +232,7 @@ describe('WebPlatform', () => { const showNoUpdate = jest.fn(); const result = await platform.pollForUpdate(showUpdate, showNoUpdate); - expect(result).toEqual({ status: UpdateCheckStatus.Error, detail: 'Unknown Error' }); + expect(result).toEqual({ status: UpdateCheckStatus.Error, detail: "Unknown Error" }); expect(showUpdate).not.toHaveBeenCalled(); expect(showNoUpdate).not.toHaveBeenCalled(); }); diff --git a/test/unit-tests/vector/url_utils-test.ts b/test/unit-tests/vector/url_utils-test.ts index 663798a1aea..374b6c6d294 100644 --- a/test/unit-tests/vector/url_utils-test.ts +++ b/test/unit-tests/vector/url_utils-test.ts @@ -16,7 +16,7 @@ limitations under the License. import { parseQsFromFragment, parseQs } from "../../../src/vector/url_utils"; -describe("url_utils.ts", function() { +describe("url_utils.ts", function () { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore const location: Location = { @@ -24,28 +24,28 @@ describe("url_utils.ts", function() { search: "", }; - it("parseQsFromFragment", function() { + it("parseQsFromFragment", function () { location.hash = "/home?foo=bar"; expect(parseQsFromFragment(location)).toEqual({ location: "home", params: { - "foo": "bar", + foo: "bar", }, }); }); - describe("parseQs", function() { + describe("parseQs", function () { location.search = "?foo=bar"; expect(parseQs(location)).toEqual({ - "foo": "bar", + foo: "bar", }); }); - describe("parseQs with arrays", function() { + describe("parseQs with arrays", function () { location.search = "?via=s1&via=s2&via=s2&foo=bar"; expect(parseQs(location)).toEqual({ - "via": ["s1", "s2", "s2"], - "foo": "bar", + via: ["s1", "s2", "s2"], + foo: "bar", }); }); }); diff --git a/tsconfig.json b/tsconfig.json index 691d3c34872..ddceda407c1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,28 +1,19 @@ { - "compilerOptions": { - "experimentalDecorators": false, - "emitDecoratorMetadata": false, - "resolveJsonModule": true, - "esModuleInterop": true, - "module": "commonjs", - "moduleResolution": "node", - "target": "es2016", - "noImplicitAny": false, - "noUnusedLocals": true, - "sourceMap": false, - "outDir": "./lib", - "declaration": true, - "jsx": "react", - "lib": [ - "es2019", - "dom", - "dom.iterable" - ] - }, - "include": [ - "./src/**/*.ts", - "./src/**/*.tsx", - "./test/**/*.ts", - "./test/**/*.tsx" - ] + "compilerOptions": { + "experimentalDecorators": false, + "emitDecoratorMetadata": false, + "resolveJsonModule": true, + "esModuleInterop": true, + "module": "commonjs", + "moduleResolution": "node", + "target": "es2016", + "noImplicitAny": false, + "noUnusedLocals": true, + "sourceMap": false, + "outDir": "./lib", + "declaration": true, + "jsx": "react", + "lib": ["es2019", "dom", "dom.iterable"] + }, + "include": ["./src/**/*.ts", "./src/**/*.tsx", "./test/**/*.ts", "./test/**/*.tsx"] } diff --git a/tsconfig.module_system.json b/tsconfig.module_system.json index e5e8d22b522..e1776404f5a 100644 --- a/tsconfig.module_system.json +++ b/tsconfig.module_system.json @@ -1,17 +1,11 @@ { - "extends": "./tsconfig.json", - "compilerOptions": { - "jsx": "preserve", - "declaration": false, - "outDir": "./lib/module_system", - "lib": [ - "es2019" - ], - "types": [ - "node" - ] - }, - "include": [ - "./module_system/**/*.ts" - ] + "extends": "./tsconfig.json", + "compilerOptions": { + "jsx": "preserve", + "declaration": false, + "outDir": "./lib/module_system", + "lib": ["es2019"], + "types": ["node"] + }, + "include": ["./module_system/**/*.ts"] } diff --git a/webpack.config.js b/webpack.config.js index e2303d946a6..6ac920582e3 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,13 +1,13 @@ /* eslint-disable quote-props */ -const dotenv = require('dotenv'); -const path = require('path'); -const webpack = require('webpack'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const TerserPlugin = require('terser-webpack-plugin'); -const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); -const HtmlWebpackInjectPreload = require('@principalstudio/html-webpack-inject-preload'); +const dotenv = require("dotenv"); +const path = require("path"); +const webpack = require("webpack"); +const HtmlWebpackPlugin = require("html-webpack-plugin"); +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); +const TerserPlugin = require("terser-webpack-plugin"); +const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin"); +const HtmlWebpackInjectPreload = require("@principalstudio/html-webpack-inject-preload"); const SentryCliPlugin = require("@sentry/webpack-plugin"); // Environment variables @@ -17,7 +17,7 @@ const SentryCliPlugin = require("@sentry/webpack-plugin"); dotenv.config(); let ogImageUrl = process.env.RIOT_OG_IMAGE_URL; -if (!ogImageUrl) ogImageUrl = 'https://app.schildi.chat/themes/element/img/logos/opengraph.png'; +if (!ogImageUrl) ogImageUrl = "https://app.schildi.chat/themes/element/img/logos/opengraph.png"; if (!process.env.VERSION) { console.warn("Unset VERSION variable - this may affect build output"); @@ -38,14 +38,19 @@ const cssThemes = { function getActiveThemes() { // Default to `light` theme when the MATRIX_THEMES environment variable is not defined. - const theme = process.env.MATRIX_THEMES ?? 'light'; - return theme.split(',').map(x => x.trim()).filter(Boolean); + const theme = process.env.MATRIX_THEMES ?? "light"; + return theme + .split(",") + .map((x) => x.trim()) + .filter(Boolean); } // See docs/customisations.md -let fileOverrides = {/* {[file: string]: string} */}; +let fileOverrides = { + /* {[file: string]: string} */ +}; try { - fileOverrides = require('./customisations.json'); + fileOverrides = require("./customisations.json"); // stringify the output so it appears in logs correctly, as large files can sometimes get // represented as `` which is less than helpful. @@ -59,14 +64,14 @@ function parseOverridesToReplacements(overrides) { return new webpack.NormalModuleReplacementPlugin( // because the input is effectively defined by the person running the build, we don't // need to do anything special to protect against regex overrunning, etc. - new RegExp(oldPath.replace(/\//g, '[\\/\\\\]').replace(/\./g, '\\.')), + new RegExp(oldPath.replace(/\//g, "[\\/\\\\]").replace(/\./g, "\\.")), path.resolve(__dirname, newPath), ); }); } const moduleReplacementPlugins = [ - ...parseOverridesToReplacements(require('./components.json')), + ...parseOverridesToReplacements(require("./components.json")), // Allow customisations to override the default components too ...parseOverridesToReplacements(fileOverrides), @@ -82,42 +87,42 @@ module.exports = (env, argv) => { // process.env.CI_PACKAGE is set when yarn build is called from scripts/ci_package.sh // (called to build nightly and develop.element.io) const nodeEnv = argv.mode; - const devMode = nodeEnv !== 'production'; - const useHMR = process.env.CSS_HOT_RELOAD === '1' && devMode; + const devMode = nodeEnv !== "production"; + const useHMR = process.env.CSS_HOT_RELOAD === "1" && devMode; const enableMinification = !devMode && !process.env.CI_PACKAGE; const development = {}; if (devMode) { // High quality, embedded source maps for dev builds - development['devtool'] = "eval-source-map"; + development["devtool"] = "eval-source-map"; } else { if (process.env.CI_PACKAGE) { // High quality source maps in separate .map files which include the source. This doesn't bulk up the .js // payload file size, which is nice for performance but also necessary to get the bundle to a small enough // size that sentry will accept the upload. - development['devtool'] = 'source-map'; + development["devtool"] = "source-map"; } else { // High quality source maps in separate .map files which don't include the source - development['devtool'] = 'nosources-source-map'; + development["devtool"] = "nosources-source-map"; } } // Resolve the directories for the react-sdk and js-sdk for later use. We resolve these early, so we // don't have to call them over and over. We also resolve to the package.json instead of the src // directory, so we don't have to rely on an index.js or similar file existing. - const reactSdkSrcDir = path.resolve(require.resolve("matrix-react-sdk/package.json"), '..', 'src'); - const jsSdkSrcDir = path.resolve(require.resolve("matrix-js-sdk/package.json"), '..', 'src'); + const reactSdkSrcDir = path.resolve(require.resolve("matrix-react-sdk/package.json"), "..", "src"); + const jsSdkSrcDir = path.resolve(require.resolve("matrix-js-sdk/package.json"), "..", "src"); const ACTIVE_THEMES = getActiveThemes(); function getThemesImports() { const imports = ACTIVE_THEMES.map((t) => { - return cssThemes[`theme-${ t }`].replace('./node_modules/', ''); // theme import path + return cssThemes[`theme-${t}`].replace("./node_modules/", ""); // theme import path }); const s = JSON.stringify(ACTIVE_THEMES); return ` window.MX_insertedThemeStylesCounter = 0; - window.MX_DEV_ACTIVE_THEMES = (${ s }); - ${ imports.map(i => `import("${ i }")`).join('\n') }; + window.MX_DEV_ACTIVE_THEMES = (${s}); + ${imports.map((i) => `import("${i}")`).join("\n")}; `; } @@ -125,17 +130,17 @@ module.exports = (env, argv) => { ...development, node: { // Mock out the NodeFS module: The opus decoder imports this wrongly. - fs: 'empty', - net: 'empty', - tls: 'empty', - crypto: 'empty', + fs: "empty", + net: "empty", + tls: "empty", + crypto: "empty", }, entry: { - "bundle": "./src/vector/index.ts", - "mobileguide": "./src/vector/mobile_guide/index.ts", - "jitsi": "./src/vector/jitsi/index.ts", - "usercontent": "./node_modules/matrix-react-sdk/src/usercontent/index.ts", + bundle: "./src/vector/index.ts", + mobileguide: "./src/vector/mobile_guide/index.ts", + jitsi: "./src/vector/jitsi/index.ts", + usercontent: "./node_modules/matrix-react-sdk/src/usercontent/index.ts", ...(useHMR ? {} : cssThemes), }, @@ -146,7 +151,7 @@ module.exports = (env, argv) => { splitChunks: { cacheGroups: { styles: { - name: 'styles', + name: "styles", test: /\.css$/, enforce: true, // Do not add `chunks: 'all'` here because you'll break the app entry point. @@ -181,27 +186,26 @@ module.exports = (env, argv) => { // the package.json for the dependency. Instead, we rely on the package.json of each // layer to have our custom alternate fields to load things in the right order. These are // the defaults of webpack prepended with `matrix_src_`. - mainFields: ['matrix_src_browser', 'matrix_src_main', 'browser', 'main'], - aliasFields: ['matrix_src_browser', 'browser'], + mainFields: ["matrix_src_browser", "matrix_src_main", "browser", "main"], + aliasFields: ["matrix_src_browser", "browser"], // We need to specify that TS can be resolved without an extension - extensions: ['.js', '.json', '.ts', '.tsx'], + extensions: [".js", ".json", ".ts", ".tsx"], alias: { // alias any requires to the react module to the one in our path, // otherwise we tend to get the react source included twice when // using `npm link` / `yarn link`. - "react": path.resolve(__dirname, 'node_modules/react'), - "react-dom": path.resolve(__dirname, 'node_modules/react-dom'), + "react": path.resolve(__dirname, "node_modules/react"), + "react-dom": path.resolve(__dirname, "node_modules/react-dom"), // Same goes for js/react-sdk - we don't need two copies. - "matrix-js-sdk": path.resolve(__dirname, 'node_modules/matrix-js-sdk'), - "matrix-react-sdk": path.resolve(__dirname, 'node_modules/matrix-react-sdk'), - // and prop-types and sanitize-html - "prop-types": path.resolve(__dirname, 'node_modules/prop-types'), - "sanitize-html": path.resolve(__dirname, 'node_modules/sanitize-html'), + "matrix-js-sdk": path.resolve(__dirname, "node_modules/matrix-js-sdk"), + "matrix-react-sdk": path.resolve(__dirname, "node_modules/matrix-react-sdk"), + // and sanitize-html + "sanitize-html": path.resolve(__dirname, "node_modules/sanitize-html"), // Define a variable so the i18n stuff can load - "$webapp": path.resolve(__dirname, 'webapp'), + "$webapp": path.resolve(__dirname, "webapp"), }, }, @@ -223,7 +227,7 @@ module.exports = (env, argv) => { rules: [ useHMR && { test: /devcss\.ts$/, - loader: 'string-replace-loader', + loader: "string-replace-loader", options: { search: '"use theming";', replace: getThemesImports(), @@ -237,7 +241,7 @@ module.exports = (env, argv) => { test: /\.(ts|js)x?$/, include: (f) => { // our own source needs babel-ing - if (f.startsWith(path.resolve(__dirname, 'src'))) return true; + if (f.startsWith(path.resolve(__dirname, "src"))) return true; // we use the original source files of react-sdk and js-sdk, so we need to // run them through babel. Because the path tested is the resolved, absolute @@ -252,7 +256,7 @@ module.exports = (env, argv) => { // not necessary anyway). So, for anything else, don't babel. return false; }, - loader: 'babel-loader', + loader: "babel-loader", options: { cacheDirectory: true, }, @@ -262,18 +266,18 @@ module.exports = (env, argv) => { use: [ MiniCssExtractPlugin.loader, { - loader: 'css-loader', + loader: "css-loader", options: { importLoaders: 1, sourceMap: true, }, }, { - loader: 'postcss-loader', - ident: 'postcss', + loader: "postcss-loader", + ident: "postcss", options: { - sourceMap: true, - plugins: () => [ + "sourceMap": true, + "plugins": () => [ // Note that we use significantly fewer plugins on the plain // CSS parser. If we start to parse plain CSS, we end with all // kinds of nasty problems (like stylesheets not loading). @@ -297,9 +301,9 @@ module.exports = (env, argv) => { // It's important that this plugin is last otherwise we end // up with broken CSS. - require('postcss-preset-env')({ stage: 3, browsers: 'last 2 versions' }), + require("postcss-preset-env")({ stage: 3, browsers: "last 2 versions" }), ], - parser: "postcss-scss", + "parser": "postcss-scss", "local-plugins": true, }, }, @@ -313,50 +317,52 @@ module.exports = (env, argv) => { * of the JS/TS files. * Should be MUCH better with webpack 5, but we're stuck to this solution for now. */ - useHMR ? { - loader: 'style-loader', - /** - * If we refactor the `theme.js` in `matrix-react-sdk` a little bit, - * we could try using `lazyStyleTag` here to add and remove styles on demand, - * that would nicely resolve issues of race conditions for themes, - * at least for development purposes. - */ - options: { - - insert: function insertBeforeAt(element) { - const parent = document.querySelector('head'); - // We're in iframe - if (!window.MX_DEV_ACTIVE_THEMES) { - parent.appendChild(element); - return; - } - // Properly disable all other instances of themes - element.disabled = true; - element.onload = () => { - element.disabled = true; - }; - const theme = window.MX_DEV_ACTIVE_THEMES[window.MX_insertedThemeStylesCounter]; - element.setAttribute('data-mx-theme', theme); - window.MX_insertedThemeStylesCounter++; - parent.appendChild(element); - }, - }, - } : MiniCssExtractPlugin.loader, + useHMR + ? { + loader: "style-loader", + /** + * If we refactor the `theme.js` in `matrix-react-sdk` a little bit, + * we could try using `lazyStyleTag` here to add and remove styles on demand, + * that would nicely resolve issues of race conditions for themes, + * at least for development purposes. + */ + options: { + insert: function insertBeforeAt(element) { + const parent = document.querySelector("head"); + // We're in iframe + if (!window.MX_DEV_ACTIVE_THEMES) { + parent.appendChild(element); + return; + } + // Properly disable all other instances of themes + element.disabled = true; + element.onload = () => { + element.disabled = true; + }; + const theme = + window.MX_DEV_ACTIVE_THEMES[window.MX_insertedThemeStylesCounter]; + element.setAttribute("data-mx-theme", theme); + window.MX_insertedThemeStylesCounter++; + parent.appendChild(element); + }, + }, + } + : MiniCssExtractPlugin.loader, { - loader: 'css-loader', + loader: "css-loader", options: { importLoaders: 1, sourceMap: true, }, }, { - loader: 'postcss-loader', - ident: 'postcss', + loader: "postcss-loader", + ident: "postcss", options: { - sourceMap: true, - plugins: () => [ + "sourceMap": true, + "plugins": () => [ // Note that we use slightly different plugins for PostCSS. - require('postcss-import')(), + require("postcss-import")(), require("postcss-mixins")(), require("postcss-simple-vars")(), require("postcss-nested")(), @@ -365,9 +371,9 @@ module.exports = (env, argv) => { // It's important that this plugin is last otherwise we end // up with broken CSS. - require('postcss-preset-env')({ stage: 3, browsers: 'last 2 versions' }), + require("postcss-preset-env")({ stage: 3, browsers: "last 2 versions" }), ], - parser: "postcss-scss", + "parser": "postcss-scss", "local-plugins": true, }, }, @@ -383,8 +389,8 @@ module.exports = (env, argv) => { loader: "file-loader", type: "javascript/auto", options: { - name: '[name].[hash:7].[ext]', - outputPath: '.', + name: "[name].[hash:7].[ext]", + outputPath: ".", }, }, { @@ -395,8 +401,8 @@ module.exports = (env, argv) => { type: "javascript/auto", options: { // We deliberately override the name so it makes sense in debugging - name: 'opus-encoderWorker.min.[hash:7].[ext]', - outputPath: '.', + name: "opus-encoderWorker.min.[hash:7].[ext]", + outputPath: ".", }, }, { @@ -405,12 +411,13 @@ module.exports = (env, argv) => { // however it seems to work fine for our purposes. test: /RecorderWorklet\.ts$/, type: "javascript/auto", - use: [ // executed last -> first, for some reason. + use: [ + // executed last -> first, for some reason. { loader: "worklet-loader", options: { // Override name so we know what it is in the output. - name: 'recorder-worklet.[hash:7].js', + name: "recorder-worklet.[hash:7].js", }, }, { @@ -427,8 +434,8 @@ module.exports = (env, argv) => { type: "javascript/auto", // https://github.com/webpack/webpack/issues/6725 options: { // We deliberately override the name so it makes sense in debugging - name: 'opus-decoderWorker.min.[hash:7].[ext]', - outputPath: '.', + name: "opus-decoderWorker.min.[hash:7].[ext]", + outputPath: ".", }, }, { @@ -440,8 +447,8 @@ module.exports = (env, argv) => { options: { // We deliberately don't change the name because the decoderWorker has this // hardcoded. This is here to avoid the default wasm rule from adding a hash. - name: 'decoderWorker.min.wasm', - outputPath: '.', + name: "decoderWorker.min.wasm", + outputPath: ".", }, }, { @@ -452,8 +459,8 @@ module.exports = (env, argv) => { type: "javascript/auto", // https://github.com/webpack/webpack/issues/6725 options: { // We deliberately override the name so it makes sense in debugging - name: 'wave-encoderWorker.min.[hash:7].[ext]', - outputPath: '.', + name: "wave-encoderWorker.min.[hash:7].[ext]", + outputPath: ".", }, }, { @@ -461,9 +468,9 @@ module.exports = (env, argv) => { // element-web/webapp/i18n during build by copy-res.js test: /\.*languages.json$/, type: "javascript/auto", - loader: 'file-loader', + loader: "file-loader", options: { - name: 'i18n/[name].[hash:7].[ext]', + name: "i18n/[name].[hash:7].[ext]", }, }, { @@ -471,15 +478,15 @@ module.exports = (env, argv) => { issuer: /\.(js|ts|jsx|tsx|html)$/, use: [ { - loader: '@svgr/webpack', + loader: "@svgr/webpack", options: { - namedExport: 'Icon', + namedExport: "Icon", svgProps: { - role: 'presentation', - 'aria-hidden': true, + "role": "presentation", + "aria-hidden": true, }, // props set on the svg will override defaults - expandProps: 'end', + expandProps: "end", svgoConfig: { plugins: { // generates a viewbox if missing @@ -487,21 +494,21 @@ module.exports = (env, argv) => { }, }, esModule: false, - name: '[name].[hash:7].[ext]', + name: "[name].[hash:7].[ext]", outputPath: getAssetOutputPath, - publicPath: function(url, resourcePath) { + publicPath: function (url, resourcePath) { const outputPath = getAssetOutputPath(url, resourcePath); return toPublicPath(outputPath); }, }, }, { - loader: 'file-loader', + loader: "file-loader", options: { esModule: false, - name: '[name].[hash:7].[ext]', + name: "[name].[hash:7].[ext]", outputPath: getAssetOutputPath, - publicPath: function(url, resourcePath) { + publicPath: function (url, resourcePath) { const outputPath = getAssetOutputPath(url, resourcePath); return toPublicPath(outputPath); }, @@ -514,12 +521,12 @@ module.exports = (env, argv) => { issuer: /\.(pcss|scss|css)$/, use: [ { - loader: 'file-loader', + loader: "file-loader", options: { esModule: false, - name: '[name].[hash:7].[ext]', + name: "[name].[hash:7].[ext]", outputPath: getAssetOutputPath, - publicPath: function(url, resourcePath) { + publicPath: function (url, resourcePath) { // CSS image usages end up in the `bundles/[hash]` output // directory, so we adjust the final path to navigate up // twice. @@ -538,12 +545,12 @@ module.exports = (env, argv) => { { // Assets referenced in CSS files issuer: /\.(pcss|scss|css)$/, - loader: 'file-loader', + loader: "file-loader", options: { esModule: false, - name: '[name].[hash:7].[ext]', + name: "[name].[hash:7].[ext]", outputPath: getAssetOutputPath, - publicPath: function(url, resourcePath) { + publicPath: function (url, resourcePath) { // CSS image usages end up in the `bundles/[hash]` output // directory, so we adjust the final path to navigate up // twice. @@ -554,12 +561,12 @@ module.exports = (env, argv) => { }, { // Assets referenced in HTML and JS files - loader: 'file-loader', + loader: "file-loader", options: { esModule: false, - name: '[name].[hash:7].[ext]', + name: "[name].[hash:7].[ext]", outputPath: getAssetOutputPath, - publicPath: function(url, resourcePath) { + publicPath: function (url, resourcePath) { const outputPath = getAssetOutputPath(url, resourcePath); return toPublicPath(outputPath); }, @@ -582,13 +589,13 @@ module.exports = (env, argv) => { // This is the app's main entry point. new HtmlWebpackPlugin({ - template: './src/vector/index.html', + template: "./src/vector/index.html", // we inject the links ourselves via the template, because // HtmlWebpackPlugin will screw up our formatting like the names // of the themes and which chunks we actually care about. inject: false, - excludeChunks: ['mobileguide', 'usercontent', 'jitsi'], + excludeChunks: ["mobileguide", "usercontent", "jitsi"], minify: false, templateParameters: { og_image_url: ogImageUrl, @@ -598,40 +605,40 @@ module.exports = (env, argv) => { // This is the jitsi widget wrapper (embedded, so isolated stack) new HtmlWebpackPlugin({ - template: './src/vector/jitsi/index.html', - filename: 'jitsi.html', + template: "./src/vector/jitsi/index.html", + filename: "jitsi.html", minify: false, - chunks: ['jitsi'], + chunks: ["jitsi"], }), // This is the mobile guide's entry point (separate for faster mobile loading) new HtmlWebpackPlugin({ - template: './src/vector/mobile_guide/index.html', - filename: 'mobile_guide/index.html', + template: "./src/vector/mobile_guide/index.html", + filename: "mobile_guide/index.html", minify: false, - chunks: ['mobileguide'], + chunks: ["mobileguide"], }), // These are the static error pages for when the javascript env is *really unsupported* new HtmlWebpackPlugin({ - template: './src/vector/static/unable-to-load.html', - filename: 'static/unable-to-load.html', + template: "./src/vector/static/unable-to-load.html", + filename: "static/unable-to-load.html", minify: false, chunks: [], }), new HtmlWebpackPlugin({ - template: './src/vector/static/incompatible-browser.html', - filename: 'static/incompatible-browser.html', + template: "./src/vector/static/incompatible-browser.html", + filename: "static/incompatible-browser.html", minify: false, chunks: [], }), // This is the usercontent sandbox's entry point (separate for iframing) new HtmlWebpackPlugin({ - template: './node_modules/matrix-react-sdk/src/usercontent/index.html', - filename: 'usercontent/index.html', + template: "./node_modules/matrix-react-sdk/src/usercontent/index.html", + filename: "usercontent/index.html", minify: false, - chunks: ['usercontent'], + chunks: ["usercontent"], }), new HtmlWebpackInjectPreload({ @@ -644,11 +651,11 @@ module.exports = (env, argv) => { release: process.env.VERSION, include: "./webapp/bundles", errorHandler: (err, invokeErr, compilation) => { - compilation.warnings.push('Sentry CLI Plugin: ' + err.message); + compilation.warnings.push("Sentry CLI Plugin: " + err.message); console.log(`::warning title=Sentry error::${err.message}`); }, }), - new webpack.EnvironmentPlugin(['VERSION']), + new webpack.EnvironmentPlugin(["VERSION"]), ].filter(Boolean), output: { @@ -669,13 +676,11 @@ module.exports = (env, argv) => { // configuration for the webpack-dev-server devServer: { // serve unwebpacked assets from webapp. - contentBase: [ - './webapp', - ], + contentBase: ["./webapp"], // Only output errors, warnings, or new compilations. // This hides the massive list of modules. - stats: 'minimal', + stats: "minimal", hotOnly: true, inline: true, }, @@ -714,5 +719,5 @@ function getAssetOutputPath(url, resourcePath) { * @returns {string} converted path */ function toPublicPath(path) { - return path.replace(/\\/g, '/'); + return path.replace(/\\/g, "/"); } diff --git a/yarn.lock b/yarn.lock index 4c8edaaf191..3c8212b9e49 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,17 +3,17 @@ "@actions/core@^1.4.0": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.9.1.tgz#97c0201b1f9856df4f7c3a375cdcdb0c2a2f750b" - integrity sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA== + version "1.10.0" + resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.10.0.tgz#44551c3c71163949a2f06e94d9ca2157a0cfac4f" + integrity sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug== dependencies: "@actions/http-client" "^2.0.1" uuid "^8.3.2" "@actions/github@^5.0.0": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@actions/github/-/github-5.0.3.tgz#b305765d6173962d113451ea324ff675aa674f35" - integrity sha512-myjA/pdLQfhUGLtRZC/J4L1RXOG4o6aYdiEq+zr5wVVKljzbFld+xv10k1FX6IkIJtNxbAq44BdwSNpQ015P0A== + version "5.1.1" + resolved "https://registry.yarnpkg.com/@actions/github/-/github-5.1.1.tgz#40b9b9e1323a5efcf4ff7dadd33d8ea51651bbcb" + integrity sha512-Nk59rMDoJaV+mHCOJPXuvB1zIbomlKS0dmSIqPGxd0enAXBnOfn4VWF+CGtRCwXZG9Epa54tZA7VIRlJDS8A6g== dependencies: "@actions/http-client" "^2.0.1" "@octokit/core" "^3.6.0" @@ -43,25 +43,25 @@ "@babel/highlight" "^7.18.6" "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.0", "@babel/compat-data@^7.20.1": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.1.tgz#f2e6ef7790d8c8dbf03d379502dcc246dcce0b30" - integrity sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" + integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== "@babel/core@^7.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.10", "@babel/core@^7.12.3": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.2.tgz#8dc9b1620a673f92d3624bd926dc49a52cf25b92" - integrity sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" + integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.2" + "@babel/generator" "^7.20.5" "@babel/helper-compilation-targets" "^7.20.0" "@babel/helper-module-transforms" "^7.20.2" - "@babel/helpers" "^7.20.1" - "@babel/parser" "^7.20.2" + "@babel/helpers" "^7.20.5" + "@babel/parser" "^7.20.5" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.1" - "@babel/types" "^7.20.2" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -84,21 +84,12 @@ dependencies: eslint-rule-composer "^0.3.0" -"@babel/generator@^7.18.10": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.0.tgz#785596c06425e59334df2ccee63ab166b738419a" - integrity sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg== +"@babel/generator@^7.20.5", "@babel/generator@^7.7.2": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95" + integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA== dependencies: - "@babel/types" "^7.19.0" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/generator@^7.20.1", "@babel/generator@^7.20.2", "@babel/generator@^7.7.2": - version "7.20.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.4.tgz#4d9f8f0c30be75fd90a0562099a26e5839602ab8" - integrity sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA== - dependencies: - "@babel/types" "^7.20.2" + "@babel/types" "^7.20.5" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" @@ -127,10 +118,10 @@ browserslist "^4.21.3" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz#3c08a5b5417c7f07b5cf3dfb6dc79cbec682e8c2" - integrity sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.2", "@babel/helper-create-class-features-plugin@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz#327154eedfb12e977baa4ecc72e5806720a85a06" + integrity sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-environment-visitor" "^7.18.9" @@ -140,26 +131,13 @@ "@babel/helper-replace-supers" "^7.19.1" "@babel/helper-split-export-declaration" "^7.18.6" -"@babel/helper-create-class-features-plugin@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz#d802ee16a64a9e824fcbf0a2ffc92f19d58550ce" - integrity sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.9" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz#7976aca61c0984202baca73d84e2337a5424a41b" - integrity sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" + integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.1.0" + regexpu-core "^5.2.1" "@babel/helper-define-polyfill-provider@^0.3.3": version "0.3.3" @@ -250,7 +228,7 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9", "@babel/helper-replace-supers@^7.19.1": +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== @@ -282,7 +260,7 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-string-parser@^7.18.10", "@babel/helper-string-parser@^7.19.4": +"@babel/helper-string-parser@^7.19.4": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== @@ -298,23 +276,23 @@ integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== "@babel/helper-wrap-function@^7.18.9": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz#89f18335cff1152373222f76a4b37799636ae8b1" - integrity sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== dependencies: "@babel/helper-function-name" "^7.19.0" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" -"@babel/helpers@^7.20.1": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.1.tgz#2ab7a0fcb0a03b5bf76629196ed63c2d7311f4c9" - integrity sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg== +"@babel/helpers@^7.20.5": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763" + integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w== dependencies: "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.1" - "@babel/types" "^7.20.0" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" "@babel/highlight@^7.18.6": version "7.18.6" @@ -325,20 +303,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.20.1", "@babel/parser@^7.20.2": - version "7.20.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.3.tgz#5358cf62e380cf69efcb87a7bb922ff88bfac6e2" - integrity sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg== - -"@babel/parser@^7.18.11": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.1.tgz#6f6d6c2e621aad19a92544cc217ed13f1aac5b4c" - integrity sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A== - -"@babel/parser@^7.18.5": - version "7.18.11" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9" - integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.5", "@babel/parser@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" + integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -476,13 +444,13 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503" - integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" + integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": @@ -626,14 +594,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" - integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-typescript@^7.7.2": +"@babel/plugin-syntax-typescript@^7.20.0", "@babel/plugin-syntax-typescript@^7.7.2": version "7.20.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== @@ -664,9 +625,9 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-block-scoping@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz#f59b1767e6385c663fd0bce655db6ca9c8b236ed" - integrity sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz#401215f9dc13dc5262940e2e527c9536b3d7f237" + integrity sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -788,12 +749,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz#ec7455bab6cd8fb05c525a94876f435a48128888" - integrity sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.19.0" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-new-target@^7.18.6": version "7.18.6" @@ -811,9 +772,9 @@ "@babel/helper-replace-supers" "^7.18.6" "@babel/plugin-transform-parameters@^7.20.1": - version "7.20.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz#7b3468d70c3c5b62e46be0a47b6045d8590fb748" - integrity sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz#f8f9186c681d10c3de7620c916156d893c8a019e" + integrity sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -825,11 +786,11 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-constant-elements@^7.12.1": - version "7.18.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.12.tgz#edf3bec47eb98f14e84fa0af137fcc6aad8e0443" - integrity sha512-Q99U9/ttiu+LMnRU8psd23HhvwXmKWDQIpocm0JKaICcZHnw+mdQbHm6xnSy7dOl8I5PELakYtNBubNQlBXbZw== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz#3f02c784e0b711970d7d8ccc96c4359d64e27ac7" + integrity sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-react-display-name@^7.18.6": version "7.18.6" @@ -846,15 +807,15 @@ "@babel/plugin-transform-react-jsx" "^7.18.6" "@babel/plugin-transform-react-jsx@^7.18.6": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz#ea47b2c4197102c196cbd10db9b3bb20daa820f1" - integrity sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A== + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9" + integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.18.10" + "@babel/types" "^7.19.0" "@babel/plugin-transform-react-pure-annotations@^7.18.6": version "7.18.6" @@ -865,12 +826,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-regenerator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73" - integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" + integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - regenerator-transform "^0.15.0" + "@babel/helper-plugin-utils" "^7.20.2" + regenerator-transform "^0.15.1" "@babel/plugin-transform-reserved-words@^7.18.6": version "7.18.6" @@ -928,13 +889,13 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typescript@^7.18.6": - version "7.18.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.12.tgz#712e9a71b9e00fde9f8c0238e0cceee86ab2f8fd" - integrity sha512-2vjjam0cum0miPkenUbQswKowuxs/NjMwIKEq0zwegRxXk12C9YOF9STXnaUptITOtOJHKHpzvvWYOjbm6tc0w== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz#91515527b376fc122ba83b13d70b01af8fe98f3f" + integrity sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-typescript" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.20.2" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-typescript" "^7.20.0" "@babel/plugin-transform-unicode-escapes@^7.18.10": version "7.18.10" @@ -1076,11 +1037,11 @@ source-map-support "^0.5.16" "@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.1.tgz#1148bb33ab252b165a06698fde7576092a78b4a9" - integrity sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg== + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" + integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== dependencies: - regenerator-runtime "^0.13.10" + regenerator-runtime "^0.13.11" "@babel/template@^7.18.10", "@babel/template@^7.3.3": version "7.18.10" @@ -1091,56 +1052,31 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" -"@babel/traverse@^7.18.5": - version "7.18.11" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.11.tgz#3d51f2afbd83ecf9912bcbb5c4d94e3d2ddaa16f" - integrity sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.10" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.18.11" - "@babel/types" "^7.18.10" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.7.2": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.1.tgz#9b15ccbf882f6d107eeeecf263fbcdd208777ec8" - integrity sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA== +"@babel/traverse@^7.18.5", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.7.2": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133" + integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.1" + "@babel/generator" "^7.20.5" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.1" - "@babel/types" "^7.20.0" + "@babel/parser" "^7.20.5" + "@babel/types" "^7.20.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.2.tgz#67ac09266606190f496322dbaff360fdaa5e7842" - integrity sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog== +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84" + integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg== dependencies: "@babel/helper-string-parser" "^7.19.4" "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@babel/types@^7.12.6": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.10.tgz#4908e81b6b339ca7c6b7a555a5fc29446f26dde6" - integrity sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ== - dependencies: - "@babel/helper-string-parser" "^7.18.10" - "@babel/helper-validator-identifier" "^7.18.6" - to-fast-properties "^2.0.0" - "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1165,10 +1101,17 @@ resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz#1bfafe4b7ed0f3e4105837e056e0a89b108ebe36" integrity sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg== -"@eslint/eslintrc@^1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.2.tgz#58b69582f3b7271d8fa67fe5251767a5b38ea356" - integrity sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ== +"@eslint-community/eslint-utils@^4.1.0": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.1.2.tgz#14ca568ddaa291dd19a4a54498badc18c6cfab78" + integrity sha512-7qELuQWWjVDdVsFQ5+beUl+KPczrEDA7S3zM4QUd/bJl7oXgsmpXaEVqrRTnOBqenOV4rWf2kVZk2Ot085zPWA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint/eslintrc@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95" + integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1180,19 +1123,19 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@humanwhocodes/config-array@^0.10.4": - version "0.10.4" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c" - integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw== +"@gar/promisify@^1.0.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + +"@humanwhocodes/config-array@^0.11.6": + version "0.11.7" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.7.tgz#38aec044c6c828f6ed51d5d7ae3d9b9faf6dbb0f" + integrity sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" - minimatch "^3.0.4" - -"@humanwhocodes/gitignore-to-minimatch@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" - integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== + minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" @@ -1446,7 +1389,7 @@ "@jridgewell/set-array" "^1.0.0" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/gen-mapping@^0.3.2": +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== @@ -1465,6 +1408,14 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" @@ -1533,10 +1484,10 @@ resolved "https://registry.yarnpkg.com/@matrix-org/analytics-events/-/analytics-events-0.3.0.tgz#a428f7e3f164ffadf38f35bc0f0f9a3e47369ce6" integrity sha512-f1WIMA8tjNB3V5g1C34yIpIJK47z6IJ4SLiY4j+J9Gw4X8C3TKGTAx563rMcMvW3Uk/PFqnIBXtkavHBXoYJ9A== -"@matrix-org/matrix-wysiwyg@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@matrix-org/matrix-wysiwyg/-/matrix-wysiwyg-0.6.0.tgz#f06577eec5a98fa414d2cd66688d32d984544c94" - integrity sha512-6wq6RzpGZLxAcczHL7+QuGLJwGcvUSAm1zXd/0FzevfIKORbGKF2uCWgQ4JoZVpe4rbBNJgtPGb1r36W/i66/A== +"@matrix-org/matrix-wysiwyg@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@matrix-org/matrix-wysiwyg/-/matrix-wysiwyg-0.9.0.tgz#8651eacdc0bbfa313501e4feeb713c74dbf099cc" + integrity sha512-utxLZPSmBR/oKFeLLteAfqprhSW8prrH9IKzeMK1VswQYganPusYYO8u86kCQt4SuDz/1Zc8C7r76xmOiVJ9JQ== "@matrix-org/olm@https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz": version "3.2.12" @@ -1582,7 +1533,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -1590,6 +1541,22 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/fs@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" + integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + "@octokit/auth-token@^2.4.4": version "2.5.0" resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.5.0.tgz#27c37ea26c205f28443402477ffd261311f21e36" @@ -1696,20 +1663,20 @@ resolved "https://registry.yarnpkg.com/@principalstudio/html-webpack-inject-preload/-/html-webpack-inject-preload-1.2.7.tgz#0c1f0b32a34d814b36ce84111f89990441cc64e8" integrity sha512-KJKkiKG63ugBjf8U0e9jUcI9CLPTFIsxXplEDE0oi3mPpxd90X9SJovo3W2l7yh/ARKIYXhQq8fSXUN7M29TzQ== -"@sentry/browser@^6.11.0": - version "6.19.7" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.19.7.tgz#a40b6b72d911b5f1ed70ed3b4e7d4d4e625c0b5f" - integrity sha512-oDbklp4O3MtAM4mtuwyZLrgO1qDVYIujzNJQzXmi9YzymJCuzMLSRDvhY83NNDCRxf0pds4DShgYeZdbSyKraA== +"@sentry/browser@^7.0.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.23.0.tgz#ca2a01ce2b00727036906158efaa1c7af1395cc0" + integrity sha512-2/dLGOSaM5AvlRdMgYxDyxPxkUUqYyxF7QZ0NicdIXkKXa0fM38IdibeXrE8XzC7rF2B7DQZ6U7uDb1Yry60ig== dependencies: - "@sentry/core" "6.19.7" - "@sentry/types" "6.19.7" - "@sentry/utils" "6.19.7" + "@sentry/core" "7.23.0" + "@sentry/types" "7.23.0" + "@sentry/utils" "7.23.0" tslib "^1.9.3" -"@sentry/cli@^1.74.4": - version "1.74.5" - resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.74.5.tgz#4a5c622913087c9ab6f82994da9a7526423779b8" - integrity sha512-Ze1ec306ZWHtrxKypOJ8nhtFqkrx2f/6bRH+DcJzEQ3bBePQ0ZnqJTTe4BBHADYBtxFIaUWzCZ6DquLz2Zv/sw== +"@sentry/cli@^1.74.6": + version "1.74.6" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.74.6.tgz#c4f276e52c6f5e8c8d692845a965988068ebc6f5" + integrity sha512-pJ7JJgozyjKZSTjOGi86chIngZMLUlYt2HOog+OJn+WGvqEkVymu8m462j1DiXAnex9NspB4zLLNuZ/R6rTQHg== dependencies: https-proxy-agent "^5.0.0" mkdirp "^0.5.5" @@ -1719,65 +1686,50 @@ proxy-from-env "^1.1.0" which "^2.0.2" -"@sentry/core@6.19.7": - version "6.19.7" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.19.7.tgz#156aaa56dd7fad8c89c145be6ad7a4f7209f9785" - integrity sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw== +"@sentry/core@7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.23.0.tgz#d320b2b6e5620b41f345bc01d69b547cdf28f78d" + integrity sha512-oNLGsscSdMs1urCbpwe868NsoJWyeTOQXOm5w2e78yE7G6zm2Ra473NQio3lweaEvjQgSGpFyEfAn/3ubZbtPw== dependencies: - "@sentry/hub" "6.19.7" - "@sentry/minimal" "6.19.7" - "@sentry/types" "6.19.7" - "@sentry/utils" "6.19.7" + "@sentry/types" "7.23.0" + "@sentry/utils" "7.23.0" tslib "^1.9.3" -"@sentry/hub@6.19.7": - version "6.19.7" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.19.7.tgz#58ad7776bbd31e9596a8ec46365b45cd8b9cfd11" - integrity sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA== +"@sentry/tracing@^7.0.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.23.0.tgz#9b6c5d3761d7664b6e40c476912281589d7cbe43" + integrity sha512-sbwvf6gjLgUTkBwZQOV7RkZPah7KnnpeVcwnNl+vigq6FNgNtejz53FFCo6t4mNGZSerfWbEy/c3C1LMX9AaXw== dependencies: - "@sentry/types" "6.19.7" - "@sentry/utils" "6.19.7" + "@sentry/core" "7.23.0" + "@sentry/types" "7.23.0" + "@sentry/utils" "7.23.0" tslib "^1.9.3" -"@sentry/minimal@6.19.7": - version "6.19.7" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.19.7.tgz#b3ee46d6abef9ef3dd4837ebcb6bdfd01b9aa7b4" - integrity sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ== - dependencies: - "@sentry/hub" "6.19.7" - "@sentry/types" "6.19.7" - tslib "^1.9.3" +"@sentry/types@7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.23.0.tgz#5d2ce94d81d7c1fad702645306f3c0932708cad5" + integrity sha512-fZ5XfVRswVZhKoCutQ27UpIHP16tvyc6ws+xq+njHv8Jg8gFBCoOxlJxuFhegD2xxylAn1aiSHNAErFWdajbpA== -"@sentry/tracing@^6.11.0": - version "6.19.7" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.19.7.tgz#54bb99ed5705931cd33caf71da347af769f02a4c" - integrity sha512-ol4TupNnv9Zd+bZei7B6Ygnr9N3Gp1PUrNI761QSlHtPC25xXC5ssSD3GMhBgyQrcvpuRcCFHVNNM97tN5cZiA== - dependencies: - "@sentry/hub" "6.19.7" - "@sentry/minimal" "6.19.7" - "@sentry/types" "6.19.7" - "@sentry/utils" "6.19.7" - tslib "^1.9.3" +"@sentry/types@^7.2.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.26.0.tgz#2fe8a38a143797abecbcd53175ebf8bf736e18de" + integrity sha512-U2s0q3ALwWFdHJBgn8nrG9bCTJZ3hAqL/I2Si4Mf0ZWnJ/KTJKbtyrputHr8wMbHvX0NZTJGTxFVUO46J+GBRA== -"@sentry/types@6.19.7": - version "6.19.7" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.19.7.tgz#c6b337912e588083fc2896eb012526cf7cfec7c7" - integrity sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg== - -"@sentry/utils@6.19.7": - version "6.19.7" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.19.7.tgz#6edd739f8185fd71afe49cbe351c1bbf5e7b7c79" - integrity sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA== +"@sentry/utils@7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.23.0.tgz#5f38640fe49f5abac88f048b92d3e83375d7ddf7" + integrity sha512-ad/XXH03MfgDH/7N7FjKEOVaKrfQWdMaE0nCxZCr2RrvlitlmGQmPpms95epr1CpzSU3BDRImlILx6+TlrXOgg== dependencies: - "@sentry/types" "6.19.7" + "@sentry/types" "7.23.0" tslib "^1.9.3" "@sentry/webpack-plugin@^1.18.1": - version "1.19.0" - resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-1.19.0.tgz#2b134318f1552ba7f3e3f9c83c71a202095f7a44" - integrity sha512-qSpdgdGMtdzagGveSWgo2b+t8PdPUscuOjbOyWCsJme9jlTFnNk0rX7JEA55OUozikKHM/+vVh08USLBnPboZw== + version "1.20.0" + resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-1.20.0.tgz#e7add76122708fb6b4ee7951294b521019720e58" + integrity sha512-Ssj1mJVFsfU6vMCOM2d+h+KQR7QHSfeIP16t4l20Uq/neqWXZUQ2yvQfe4S3BjdbJXz/X4Rw8Hfy1Sd0ocunYw== dependencies: - "@sentry/cli" "^1.74.4" + "@sentry/cli" "^1.74.6" + webpack-sources "^2.0.0 || ^3.0.0" "@sinclair/typebox@^0.24.1": version "0.24.51" @@ -1785,9 +1737,9 @@ integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== "@sinonjs/commons@^1.7.0": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.5.tgz#e280c94c95f206dcfd5aca00a43f2156b758c764" - integrity sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA== + version "1.8.6" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== dependencies: type-detect "4.0.8" @@ -1902,9 +1854,9 @@ loader-utils "^2.0.0" "@testing-library/dom@^8.0.0": - version "8.17.1" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.17.1.tgz#2d7af4ff6dad8d837630fecd08835aee08320ad7" - integrity sha512-KnH2MnJUzmFNPW6RIKfd+zf2Wue8mEKX0M3cpX6aKl5ZXrJM1/c/Pc8c2xDNYQCnJO48Sm5ITbMXgqTr3h4jxQ== + version "8.19.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.19.0.tgz#bd3f83c217ebac16694329e413d9ad5fdcfd785f" + integrity sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" @@ -1979,9 +1931,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.2.tgz#235bf339d17185bdec25e024ca19cce257cc7309" - integrity sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg== + version "7.18.3" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" + integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== dependencies: "@babel/types" "^7.3.0" @@ -2003,11 +1955,6 @@ "@types/fbemitter" "*" "@types/react" "*" -"@types/geojson@^7946.0.8": - version "7946.0.10" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.10.tgz#6dfbf5ea17142f7f9a043809f1cd4c448cb68249" - integrity sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA== - "@types/glob@^7.1.1": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" @@ -2088,9 +2035,9 @@ integrity sha512-05S2f4lGaWgCwFHsa3OEirc4VJf/sJRfhofzxUbuFbmm6NbffPXZrnJqquQAtS3g4C8Z0L9NHgW0znmtDxNoTQ== "@types/minimatch@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/minimist@^1.2.0": version "1.2.2" @@ -2107,10 +2054,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== -"@types/node@^14.18.28": - version "14.18.29" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.29.tgz#a0c58d67a42f8953c13d32f0acda47ed26dfce40" - integrity sha512-LhF+9fbIX4iPzhsRLpK5H7iPdvW8L4IwGciXQIOEcuF62+9nw/VQVsOViAOOGxY3OlOKGLFv0sWwJXdwQeTn6A== +"@types/node@^16": + version "16.18.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.4.tgz#712ba61b4caf091fc6490301b1888356638c17bd" + integrity sha512-9qGjJ5GyShZjUfx2ArBIGM+xExdfLvvaCyQR0t6yRXKPcWCVYF/WemtX/uIU3r7FYECXRXkIiw2Vnhn6y8d+pw== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2137,13 +2084,20 @@ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== -"@types/react-dom@<18.0.0", "@types/react-dom@^17.0.17": +"@types/react-dom@17.0.17": version "17.0.17" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.17.tgz#2e3743277a793a96a99f1bf87614598289da68a1" integrity sha512-VjnqEmqGnasQKV0CWLevqMTXBYG9GbwuE6x3VetERLh0cq2LTptFE73MrQi2S7GkKXCf2GgwItB/melLnxfnsg== dependencies: "@types/react" "^17" +"@types/react-dom@<18.0.0": + version "17.0.18" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.18.tgz#8f7af38f5d9b42f79162eea7492e5a1caff70dc2" + integrity sha512-rLVtIfbwyur2iFKykP2w0pl/1unw26b5td16d5xMgp7/yjTHomkyxPYChFoCr/FtEX1lN9wY6lFj1qvKdS5kDw== + dependencies: + "@types/react" "^17" + "@types/react-redux@^7.1.20": version "7.1.24" resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.24.tgz#6caaff1603aba17b27d20f8ad073e4c077e975c0" @@ -2154,7 +2108,7 @@ hoist-non-react-statics "^3.3.0" redux "^4.0.0" -"@types/react@*", "@types/react@^17", "@types/react@^17.0.49": +"@types/react@*", "@types/react@17.0.49", "@types/react@^17": version "17.0.49" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.49.tgz#df87ba4ca8b7942209c3dc655846724539dc1049" integrity sha512-CCBPMZaPhcKkYUTqFs/hOWqKjPxhTEmnZWjlHHgIMop67DsXywf9B5Os9Hz8KSacjNOgIdnZVJamwl232uxoPg== @@ -2180,11 +2134,6 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== -"@types/sdp-transform@^2.4.5": - version "2.4.5" - resolved "https://registry.yarnpkg.com/@types/sdp-transform/-/sdp-transform-2.4.5.tgz#3167961e0a1a5265545e278627aa37c606003f53" - integrity sha512-GVO0gnmbyO3Oxm2HdPsYUNcyihZE3GyCY8ysMYHuQGfLhGZq89Nm4lSzULWTzZoyHtg+VO/IdrnxZHPnPSGnAg== - "@types/semver@^7.3.12": version "7.3.13" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" @@ -2216,9 +2165,9 @@ integrity sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ== "@types/uglify-js@*": - version "3.16.0" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.16.0.tgz#2cf74a0e6ebb6cd54c0d48e509d5bd91160a9602" - integrity sha512-0yeUr92L3r0GLRnBOvtYK1v2SjqMIqQDHMl7GLb+l2L8+6LSFWEEWEIgVsPdMn5ImLM8qzWT8xFPtQYpp8co0g== + version "3.17.1" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.17.1.tgz#e0ffcef756476410e5bce2cb01384ed878a195b5" + integrity sha512-GkewRA4i5oXacU/n4MA9+bLgt5/L3F1mKrYvFGm7r2ouLXhRKjuWwo9XHNnbx6WF3vlGW21S3fCvgqxvxXXc5g== dependencies: source-map "^0.6.1" @@ -2232,9 +2181,9 @@ source-map "^0.7.3" "@types/webpack@^4.41.8": - version "4.41.32" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.32.tgz#a7bab03b72904070162b2f169415492209e94212" - integrity sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg== + version "4.41.33" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.33.tgz#16164845a5be6a306bcbe554a8e67f9cac215ffc" + integrity sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g== dependencies: "@types/node" "*" "@types/tapable" "^1" @@ -2249,20 +2198,20 @@ integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^17.0.8": - version "17.0.13" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.13.tgz#34cced675ca1b1d51fcf4d34c3c6f0fa142a5c76" - integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg== + version "17.0.15" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.15.tgz#5b62c89fb049e2fc8378394a2861a593055f0866" + integrity sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^5.6.0": - version "5.43.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.43.0.tgz#4a5248eb31b454715ddfbf8cfbf497529a0a78bc" - integrity sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA== + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.0.tgz#ffa505cf961d4844d38cfa19dcec4973a6039e41" + integrity sha512-CXXHNlf0oL+Yg021cxgOdMHNTXD17rHkq7iW6RFHoybdFgQBjU3yIXhhcPpGwr1CjZlo6ET8C6tzX5juQoXeGA== dependencies: - "@typescript-eslint/scope-manager" "5.43.0" - "@typescript-eslint/type-utils" "5.43.0" - "@typescript-eslint/utils" "5.43.0" + "@typescript-eslint/scope-manager" "5.45.0" + "@typescript-eslint/type-utils" "5.45.0" + "@typescript-eslint/utils" "5.45.0" debug "^4.3.4" ignore "^5.2.0" natural-compare-lite "^1.4.0" @@ -2271,71 +2220,71 @@ tsutils "^3.21.0" "@typescript-eslint/parser@^5.6.0": - version "5.43.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.43.0.tgz#9c86581234b88f2ba406f0b99a274a91c11630fd" - integrity sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug== + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.45.0.tgz#b18a5f6b3cf1c2b3e399e9d2df4be40d6b0ddd0e" + integrity sha512-brvs/WSM4fKUmF5Ot/gEve6qYiCMjm6w4HkHPfS6ZNmxTS0m0iNN4yOChImaCkqc1hRwFGqUyanMXuGal6oyyQ== dependencies: - "@typescript-eslint/scope-manager" "5.43.0" - "@typescript-eslint/types" "5.43.0" - "@typescript-eslint/typescript-estree" "5.43.0" + "@typescript-eslint/scope-manager" "5.45.0" + "@typescript-eslint/types" "5.45.0" + "@typescript-eslint/typescript-estree" "5.45.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.43.0": - version "5.43.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz#566e46303392014d5d163704724872e1f2dd3c15" - integrity sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw== +"@typescript-eslint/scope-manager@5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.45.0.tgz#7a4ac1bfa9544bff3f620ab85947945938319a96" + integrity sha512-noDMjr87Arp/PuVrtvN3dXiJstQR1+XlQ4R1EvzG+NMgXi8CuMCXpb8JqNtFHKceVSQ985BZhfRdowJzbv4yKw== dependencies: - "@typescript-eslint/types" "5.43.0" - "@typescript-eslint/visitor-keys" "5.43.0" + "@typescript-eslint/types" "5.45.0" + "@typescript-eslint/visitor-keys" "5.45.0" -"@typescript-eslint/type-utils@5.43.0": - version "5.43.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.43.0.tgz#91110fb827df5161209ecca06f70d19a96030be6" - integrity sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg== +"@typescript-eslint/type-utils@5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.45.0.tgz#aefbc954c40878fcebeabfb77d20d84a3da3a8b2" + integrity sha512-DY7BXVFSIGRGFZ574hTEyLPRiQIvI/9oGcN8t1A7f6zIs6ftbrU0nhyV26ZW//6f85avkwrLag424n+fkuoJ1Q== dependencies: - "@typescript-eslint/typescript-estree" "5.43.0" - "@typescript-eslint/utils" "5.43.0" + "@typescript-eslint/typescript-estree" "5.45.0" + "@typescript-eslint/utils" "5.45.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.43.0": - version "5.43.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.43.0.tgz#e4ddd7846fcbc074325293515fa98e844d8d2578" - integrity sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg== +"@typescript-eslint/types@5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.45.0.tgz#794760b9037ee4154c09549ef5a96599621109c5" + integrity sha512-QQij+u/vgskA66azc9dCmx+rev79PzX8uDHpsqSjEFtfF2gBUTRCpvYMh2gw2ghkJabNkPlSUCimsyBEQZd1DA== -"@typescript-eslint/typescript-estree@5.43.0": - version "5.43.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz#b6883e58ba236a602c334be116bfc00b58b3b9f2" - integrity sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg== +"@typescript-eslint/typescript-estree@5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.0.tgz#f70a0d646d7f38c0dfd6936a5e171a77f1e5291d" + integrity sha512-maRhLGSzqUpFcZgXxg1qc/+H0bT36lHK4APhp0AEUVrpSwXiRAomm/JGjSG+kNUio5kAa3uekCYu/47cnGn5EQ== dependencies: - "@typescript-eslint/types" "5.43.0" - "@typescript-eslint/visitor-keys" "5.43.0" + "@typescript-eslint/types" "5.45.0" + "@typescript-eslint/visitor-keys" "5.45.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.43.0": - version "5.43.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.43.0.tgz#00fdeea07811dbdf68774a6f6eacfee17fcc669f" - integrity sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A== +"@typescript-eslint/utils@5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.45.0.tgz#9cca2996eee1b8615485a6918a5c763629c7acf5" + integrity sha512-OUg2JvsVI1oIee/SwiejTot2OxwU8a7UfTFMOdlhD2y+Hl6memUSL4s98bpUTo8EpVEr0lmwlU7JSu/p2QpSvA== dependencies: "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.43.0" - "@typescript-eslint/types" "5.43.0" - "@typescript-eslint/typescript-estree" "5.43.0" + "@typescript-eslint/scope-manager" "5.45.0" + "@typescript-eslint/types" "5.45.0" + "@typescript-eslint/typescript-estree" "5.45.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.43.0": - version "5.43.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz#cbbdadfdfea385310a20a962afda728ea106befa" - integrity sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg== +"@typescript-eslint/visitor-keys@5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.0.tgz#e0d160e9e7fdb7f8da697a5b78e7a14a22a70528" + integrity sha512-jc6Eccbn2RtQPr1s7th6jJWQHBHI6GBVQkCHoJFQ5UreaKm59Vxw+ynQUPPY2u2Amquc+7tmEoC2G52ApsGNNg== dependencies: - "@typescript-eslint/types" "5.43.0" + "@typescript-eslint/types" "5.45.0" eslint-visitor-keys "^3.3.0" "@webassemblyjs/ast@1.9.0": @@ -2529,7 +2478,7 @@ acorn@^6.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^8.1.0, acorn@^8.8.0: +acorn@^8.1.0, acorn@^8.5.0, acorn@^8.8.0, acorn@^8.8.1: version "8.8.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== @@ -2570,9 +2519,9 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5: uri-js "^4.2.2" ajv@^8.0.1: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + version "8.11.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" + integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -2671,9 +2620,9 @@ anymatch@^2.0.0: normalize-path "^2.1.1" anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -2704,9 +2653,11 @@ argparse@^2.0.1: integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== aria-query@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c" - integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg== + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" arr-diff@^2.0.0: version "2.0.0" @@ -2740,15 +2691,15 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.4, array-includes@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" - integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== +array-includes@^3.1.4, array-includes@^3.1.5, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" - get-intrinsic "^1.1.1" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" is-string "^1.0.7" array-union@^1.0.1: @@ -2779,36 +2730,47 @@ array-unique@^0.3.2: integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== array.prototype.flat@^1.2.5: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" - integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" - integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" -array.prototype.reduce@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz#8167e80089f78bff70a99e20bd4201d4663b0a6f" - integrity sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw== +array.prototype.reduce@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" + integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -2874,18 +2836,6 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^10.4.8: - version "10.4.12" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.12.tgz#183f30bf0b0722af54ee5ef257f7d4320bb33129" - integrity sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q== - dependencies: - browserslist "^4.21.4" - caniuse-lite "^1.0.30001407" - fraction.js "^4.2.0" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - autoprefixer@^9.6.1: version "9.8.8" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" @@ -2899,6 +2849,11 @@ autoprefixer@^9.6.1: postcss "^7.0.32" postcss-value-parser "^4.1.0" +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + await-lock@^2.1.0: version "2.2.2" resolved "https://registry.yarnpkg.com/await-lock/-/await-lock-2.2.2.tgz#a95a9b269bfd2f69d22b17a321686f551152bcef" @@ -3026,7 +2981,7 @@ base64-arraybuffer-es6@^0.7.0: resolved "https://registry.yarnpkg.com/base64-arraybuffer-es6/-/base64-arraybuffer-es6-0.7.0.tgz#dbe1e6c87b1bf1ca2875904461a7de40f21abc86" integrity sha512-ESyU/U1CFZDJUdr+neHRhNozeCv72Y7Vm0m1DCbjX3KBjT6eYocvAJlSk6+8+HkVwXlT1FNxhGW6q3UKAlCvvw== -base64-js@^1.0.2, base64-js@^1.3.1: +base64-js@^1.0.2: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -3050,9 +3005,9 @@ batch@0.6.1: integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== before-after-hook@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e" - integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ== + version "2.2.3" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" + integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== big.js@^5.2.2: version "5.2.2" @@ -3096,10 +3051,10 @@ bn.js@^5.0.0, bn.js@^5.1.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" - integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== dependencies: bytes "3.1.2" content-type "~1.0.4" @@ -3109,7 +3064,7 @@ body-parser@1.20.0: http-errors "2.0.0" iconv-lite "0.4.24" on-finished "2.4.1" - qs "6.10.3" + qs "6.11.0" raw-body "2.5.1" type-is "~1.6.18" unpipe "1.0.0" @@ -3237,17 +3192,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.6.4: - version "4.21.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a" - integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== - dependencies: - caniuse-lite "^1.0.30001370" - electron-to-chromium "^1.4.202" - node-releases "^2.0.6" - update-browserslist-db "^1.0.5" - -browserslist@^4.21.3, browserslist@^4.21.4: +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.6.4: version "4.21.4" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== @@ -3271,25 +3216,7 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== - -buffer-from@^1.0.0, buffer-from@^1.1.1: +buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== @@ -3313,14 +3240,6 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.4.3: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - builtin-modules@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" @@ -3362,28 +3281,28 @@ cacache@^12.0.2: unique-filename "^1.1.1" y18n "^4.0.0" -cacache@^13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" - integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== +cacache@^15.0.5: + version "15.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== dependencies: - chownr "^1.1.2" - figgy-pudding "^3.5.1" + "@npmcli/fs" "^1.0.0" + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" fs-minipass "^2.0.0" glob "^7.1.4" - graceful-fs "^4.2.2" infer-owner "^1.0.4" - lru-cache "^5.1.1" - minipass "^3.0.0" + lru-cache "^6.0.0" + minipass "^3.1.1" minipass-collect "^1.0.2" minipass-flush "^1.0.5" minipass-pipeline "^1.2.2" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - p-map "^3.0.0" + mkdirp "^1.0.3" + p-map "^4.0.0" promise-inflight "^1.0.1" - rimraf "^2.7.1" - ssri "^7.0.0" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" unique-filename "^1.1.1" cache-base@^1.0.1: @@ -3410,9 +3329,9 @@ call-bind@^1.0.0, call-bind@^1.0.2: get-intrinsic "^1.0.2" call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw== + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" + integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== caller-callsite@^2.0.0: version "2.0.0" @@ -3465,7 +3384,7 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.2.0: +camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -3480,30 +3399,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0: - version "1.0.30001375" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz#8e73bc3d1a4c800beb39f3163bf0190d7e5d7672" - integrity sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw== - -caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109: - version "1.0.30001393" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001393.tgz#1aa161e24fe6af2e2ccda000fc2b94be0b0db356" - integrity sha512-N/od11RX+Gsk+1qY/jbPa0R6zJupEa0lxeBG598EbrtblxVCTJsQwbRBm6+V+rxpc5lHKdsXb9RY83cZIPLseA== - -caniuse-lite@^1.0.30001370: - version "1.0.30001408" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001408.tgz#8f5e96bd9c5fd1a8c629e4415cdbaf556333a591" - integrity sha512-DdUCktgMSM+1ndk9EFMZcavsGszV7zxV9O7MtOHniTa/iyAIwJCF0dFVBdU9SijJbfh29hC9bCs07wu8pjnGJQ== - -caniuse-lite@^1.0.30001400: - version "1.0.30001434" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz#ec1ec1cfb0a93a34a0600d37903853030520a4e5" - integrity sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA== - -caniuse-lite@^1.0.30001407: - version "1.0.30001409" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001409.tgz#6135da9dcab34cd9761d9cdb12a68e6740c5e96e" - integrity sha512-V0mnJ5dwarmhYv8/MzhJ//aW68UpvnQBXv8lJ2QUsvn2pHcmAuNtu8hQEDz37XnA1iE+lRR9CIfGWWpgJ5QedQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001400: + version "1.0.30001435" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001435.tgz#502c93dbd2f493bee73a408fe98e98fb1dad10b2" + integrity sha512-kdCkUTjR+v4YAJelyiDTqiu82BDr4W4CP5sgTA0ZBmqn30XfS2ZghPLMowik9TPhS+psWJiUNxsqLyurDbmutA== chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" @@ -3602,25 +3501,25 @@ chokidar@^3.4.1, chokidar@^3.5.1: optionalDependencies: fsevents "~2.3.2" -chownr@^1.1.1, chownr@^1.1.2: +chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== -ci-info@^3.2.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.6.1.tgz#7594f1c95cb7fdfddee7af95a13af7dbc67afdcf" - integrity sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w== - -ci-info@^3.4.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.5.0.tgz#bfac2a29263de4c829d806b1ab478e35091e171f" - integrity sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw== +ci-info@^3.2.0, ci-info@^3.6.1: + version "3.7.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.0.tgz#6d01b3696c59915b6ce057e4aa4adfc2fa25f5ef" + integrity sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -3646,9 +3545,9 @@ class-utils@^0.3.5: static-extend "^0.1.1" classnames@^2.2.6: - version "2.3.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" - integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== clean-css@^4.2.3: version "4.2.4" @@ -3698,15 +3597,6 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -3814,7 +3704,7 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -commander@^2.19.0, commander@^2.20.0: +commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -3839,10 +3729,10 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== -commonmark@^0.29.3: - version "0.29.3" - resolved "https://registry.yarnpkg.com/commonmark/-/commonmark-0.29.3.tgz#bb1d5733bfe3ea213b412f33f16439cc12999c2c" - integrity sha512-fvt/NdOFKaL2gyhltSy6BC4LxbbxbnPxBMl923ittqO/JBM0wQHaoYZliE4tp26cRxX/ZZtRsJlZzQrVdUkXAA== +commonmark@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/commonmark/-/commonmark-0.30.0.tgz#38811dc7bbf0f59d277ae09054d4d73a332f2e45" + integrity sha512-j1yoUo4gxPND1JWV9xj5ELih0yMv1iCWDG6eEQIPLSWLxzCXiFoyS7kvB+WwU+tZMf4snwJMMtaubV0laFpiBA== dependencies: entities "~2.0" mdurl "~1.0.1" @@ -3889,20 +3779,20 @@ concat-stream@^1.5.0: readable-stream "^2.2.2" typedarray "^0.0.6" -concurrently@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.3.0.tgz#7500de6410d043c912b2da27de3202cb489b1e7b" - integrity sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ== +concurrently@^7.0.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-7.6.0.tgz#531a6f5f30cf616f355a4afb8f8fcb2bba65a49a" + integrity sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw== dependencies: - chalk "^2.4.2" - date-fns "^2.0.1" - lodash "^4.17.15" - read-pkg "^4.0.1" - rxjs "^6.5.2" + chalk "^4.1.0" + date-fns "^2.29.1" + lodash "^4.17.21" + rxjs "^7.0.0" + shell-quote "^1.7.3" spawn-command "^0.0.2-1" - supports-color "^6.1.0" + supports-color "^8.1.0" tree-kill "^1.2.2" - yargs "^13.3.0" + yargs "^17.3.1" connect-history-api-fallback@^1.6.0: version "1.6.0" @@ -3980,25 +3870,15 @@ core-js-compat@^3.25.1: dependencies: browserslist "^4.21.4" -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - integrity sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA== - core-js@^2.4.0: version "2.6.12" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.0.0: - version "3.25.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.25.5.tgz#e86f651a2ca8a0237a5f064c2fe56cef89646e27" - integrity sha512-nbm6eZSjm+ZuBQxCUPQKQCoUEfFOXjUZ8dTTyikyKaWrTYmAVbykQfwsKE5dBK88u3QCkCrzsx/PPlKfhsvgpw== - -core-js@^3.4: - version "3.24.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.24.1.tgz#cf7724d41724154010a6576b7b57d94c5d66e64f" - integrity sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg== + version "3.26.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.26.1.tgz#7a9816dabd9ee846c1c0fe0e8fcad68f3709134e" + integrity sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA== core-util-is@~1.0.0: version "1.0.3" @@ -4015,10 +3895,10 @@ cosmiconfig@^5.0.0: js-yaml "^3.13.1" parse-json "^4.0.0" -cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1, cosmiconfig@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" @@ -4090,6 +3970,13 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +cross-fetch@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -4167,24 +4054,23 @@ css-has-pseudo@^0.10.0: postcss "^7.0.6" postcss-selector-parser "^5.0.0-rc.4" -css-loader@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" - integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== +css-loader@^4: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.3.0.tgz#c888af64b2a5b2e85462c72c0f4a85c7e2e0821e" + integrity sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg== dependencies: - camelcase "^5.3.1" + camelcase "^6.0.0" cssesc "^3.0.0" icss-utils "^4.1.1" - loader-utils "^1.2.3" - normalize-path "^3.0.0" + loader-utils "^2.0.0" postcss "^7.0.32" postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.2" + postcss-modules-local-by-default "^3.0.3" postcss-modules-scope "^2.2.0" postcss-modules-values "^3.0.0" postcss-value-parser "^4.1.0" - schema-utils "^2.7.0" - semver "^6.3.0" + schema-utils "^2.7.1" + semver "^7.3.2" css-prefers-color-scheme@^3.1.1: version "3.1.1" @@ -4400,10 +4286,10 @@ data-urls@^3.0.2: whatwg-mimetype "^3.0.0" whatwg-url "^11.0.0" -date-fns@^2.0.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.1.tgz#9667c2615525e552b5135a3116b95b1961456e60" - integrity sha512-dlLD5rKaKxpFdnjrs+5azHDFOPEu4ANy/LTh04A1DTzMM7qoajmKCBc8pkKRFT41CNzw+4gQh79X5C+Jq27HAw== +date-fns@^2.29.1: + version "2.29.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== date-names@^0.1.11: version "0.1.13" @@ -4432,9 +4318,9 @@ debug@^3.2.7: ms "^2.1.1" decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg== + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== dependencies: decamelize "^1.1.0" map-obj "^1.0.0" @@ -4444,7 +4330,7 @@ decamelize@^1.1.0, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -decimal.js@^10.4.1: +decimal.js@^10.4.2: version "10.4.2" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.2.tgz#0341651d1d997d86065a2ce3a441fbd0d8e8b98e" integrity sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA== @@ -4471,6 +4357,27 @@ deep-equal@^1.0.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" +deep-equal@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.1.0.tgz#5ba60402cf44ab92c2c07f3f3312c3d857a0e1dd" + integrity sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA== + dependencies: + call-bind "^1.0.2" + es-get-iterator "^1.1.2" + get-intrinsic "^1.1.3" + is-arguments "^1.1.1" + is-date-object "^1.0.5" + is-regex "^1.1.4" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.8" + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -4591,9 +4498,9 @@ detect-node@^2.0.4: integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== diff-dom@^4.2.2: - version "4.2.5" - resolved "https://registry.yarnpkg.com/diff-dom/-/diff-dom-4.2.5.tgz#5e093486d4ce706c702f0151c1b674aa015ac0a6" - integrity sha512-muGbiH5Mkj+bCigiG4x8tGES1JQQHp8UpAEaemOqfQkiwtCxKqDYPOeqBzoTRG+L7mKwHgTPY2WBlgOnnnUmAw== + version "4.2.8" + resolved "https://registry.yarnpkg.com/diff-dom/-/diff-dom-4.2.8.tgz#4280b28c4dc1da951c40ee6969d895f782b8edbc" + integrity sha512-OIL+sf1bFBQ/Z1gjo3xlHyDViVaRiDVMOM5jTM30aFATu3tLlNloeixKCg7p7nFyTjI1eQmdlVu1admV/BwVJw== diff-match-patch@^1.0.5: version "1.0.5" @@ -4804,9 +4711,9 @@ dot-prop@^5.2.0: is-obj "^2.0.0" dotenv@^16.0.2: - version "16.0.2" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.2.tgz#0b0f8652c016a3858ef795024508cddc4bffc5bf" - integrity sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA== + version "16.0.3" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" + integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== duplexer@^0.1.1: version "0.1.2" @@ -4833,11 +4740,6 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.202: - version "1.4.256" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.256.tgz#c735032f412505e8e0482f147a8ff10cfca45bf4" - integrity sha512-x+JnqyluoJv8I0U9gVe+Sk2st8vF0CzMt78SXxuoWCooLLY2k5VerIBdpvG7ql6GKI4dzNnPjmqgDJ76EdaAKw== - electron-to-chromium@^1.4.251: version "1.4.284" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" @@ -4871,38 +4773,36 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emojibase-data@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/emojibase-data/-/emojibase-data-7.0.0.tgz#5e16ed265871d58b3ca7c3b2bc7d80853a55f34f" - integrity sha512-ka3p06egA+jqWnUUjNfOwYAw4j9/+KyUcCpFjSItM0NjbL8n5qZfe1mskmGUP4TkuE5SbiOvG++CC1iN+53jKg== +emojibase-data@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/emojibase-data/-/emojibase-data-7.0.1.tgz#a81d7fcd12247f7d94a96dcbdb143e6b6dd5c328" + integrity sha512-BLZpOdwyFpZ7lzBWyDtnxmKVm/SJMYgAfp1if3o6n1TVUMSXAf0nikONXl90LZuJ/m3XWPBkkubgCet2BsCGGQ== -emojibase-regex@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/emojibase-regex/-/emojibase-regex-6.0.0.tgz#2d236f6bd38e6aa69089707eb06fe1f6a3270198" - integrity sha512-vpo76XcjjFapY4Q1vZAp8fu07p9lNCZi0TMtpZ3XyHYRqnqYZTzHgSI7tMvpYmnD8xt9o4XC5oUaSJXT4Ky9Tw== +emojibase-regex@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/emojibase-regex/-/emojibase-regex-6.0.1.tgz#dc0b33d05c02f045ea44795d453698b205d41f0f" + integrity sha512-Mj1UT6IIk4j91yMFE0QetpUYcmsr5ZDkkOIMSGafhIgC086mBMaCh2Keaykx8YEllmV7hmx5zdANDzCYBYAVDw== -emojibase@6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/emojibase/-/emojibase-6.0.2.tgz#1e76996b2bd9e6927e51f54c3995245b03eacb02" - integrity sha512-2h2eblOm86tj+lsJLgLYmEni13H74KNNu1NI1ZgMOX9ByWuvjFZLhETEUH1edpcd8srAlzhfJSD892UbpxfwsA== +emojibase@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/emojibase/-/emojibase-6.1.0.tgz#c3bc281e998a0e06398416090c23bac8c5ed3ee8" + integrity sha512-1GkKJPXP6tVkYJHOBSJHoGOr/6uaDxZ9xJ6H7m6PfdGXTmQgbALHLWaVRY4Gi/qf5x/gT/NUXLPuSHYLqtLtrQ== emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== +encode-utf8@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" + integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -encoding@^0.1.11: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -4924,12 +4824,7 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -entities@^4.2.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.3.1.tgz#c34062a94c865c322f9d67b4384e4169bcede6a4" - integrity sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg== - -entities@^4.3.0, entities@^4.4.0: +entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== @@ -4958,51 +4853,22 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.2, es-abstract@^1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" - integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-weakref "^1.0.2" - object-inspect "^1.12.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - regexp.prototype.flags "^1.4.3" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" - unbox-primitive "^1.0.2" - -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: - version "1.20.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.2.tgz#8495a07bc56d342a3b8ea3ab01bd986700c2ccb3" - integrity sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ== +es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.20.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" + integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.1.2" + get-intrinsic "^1.1.3" get-symbol-description "^1.0.0" has "^1.0.3" has-property-descriptors "^1.0.0" has-symbols "^1.0.3" internal-slot "^1.0.3" - is-callable "^1.2.4" + is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" @@ -5012,6 +4878,7 @@ es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19 object-keys "^1.1.1" object.assign "^4.1.4" regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" string.prototype.trimend "^1.0.5" string.prototype.trimstart "^1.0.5" unbox-primitive "^1.0.2" @@ -5021,6 +4888,20 @@ es-array-method-boxes-properly@^1.0.0: resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== +es-get-iterator@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" + integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.0" + has-symbols "^1.0.1" + is-arguments "^1.1.0" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.5" + isarray "^2.0.5" + 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" @@ -5115,6 +4996,11 @@ eslint-config-google@^0.14.0: resolved "https://registry.yarnpkg.com/eslint-config-google/-/eslint-config-google-0.14.0.tgz#4f5f8759ba6e11b424294a219dbfa18c508bcc1a" integrity sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw== +eslint-config-prettier@^8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + eslint-import-resolver-node@^0.3.6: version "0.3.6" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" @@ -5124,12 +5010,11 @@ eslint-import-resolver-node@^0.3.6: resolve "^1.20.0" eslint-module-utils@^2.7.3: - version "2.7.3" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" - integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== + version "2.7.4" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== dependencies: debug "^3.2.7" - find-up "^2.1.0" eslint-plugin-deprecate@^0.7.0: version "0.7.0" @@ -5155,10 +5040,10 @@ eslint-plugin-import@^2.25.4: resolve "^1.22.0" tsconfig-paths "^3.14.1" -eslint-plugin-matrix-org@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-matrix-org/-/eslint-plugin-matrix-org-0.8.0.tgz#daa1396900a8cb1c1d88f1a370e45fc32482cd9e" - integrity sha512-/Poz/F8lXYDsmQa29iPSt+kO+Jn7ArvRdq10g0CCk8wbRS0sb2zb6fvd9xL1BgR5UDQL771V0l8X32etvY5yKA== +eslint-plugin-matrix-org@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-matrix-org/-/eslint-plugin-matrix-org-0.9.0.tgz#b2a5186052ddbfa7dc9878779bafa5d68681c7b4" + integrity sha512-+j6JuMnFH421Z2vOxc+0YMt5Su5vD76RSatviy3zHBaZpgd+sOeAWoCLBHD5E7mMz5oKae3Y3wewCt9LRzq2Nw== eslint-plugin-react-hooks@^4.3.0: version "4.6.0" @@ -5166,43 +5051,46 @@ eslint-plugin-react-hooks@^4.3.0: integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.28.0: - version "7.31.8" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz#3a4f80c10be1bcbc8197be9e8b641b2a3ef219bf" - integrity sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw== + version "7.31.11" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz#011521d2b16dcf95795df688a4770b4eaab364c8" + integrity sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw== dependencies: - array-includes "^3.1.5" - array.prototype.flatmap "^1.3.0" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.5" - object.fromentries "^2.0.5" - object.hasown "^1.1.1" - object.values "^1.1.5" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" prop-types "^15.8.1" resolve "^2.0.0-next.3" semver "^6.3.0" - string.prototype.matchall "^4.0.7" + string.prototype.matchall "^4.0.8" -eslint-plugin-unicorn@^44.0.2: - version "44.0.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-44.0.2.tgz#6324a001c0a5e2ac00fb51b30db27d14c6c36ab3" - integrity sha512-GLIDX1wmeEqpGaKcnMcqRvMVsoabeF0Ton0EX4Th5u6Kmf7RM9WBl705AXFEsns56ESkEs0uyelLuUTvz9Tr0w== +eslint-plugin-unicorn@^45.0.0: + version "45.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-45.0.1.tgz#2307f4620502fd955c819733ce1276bed705b736" + integrity sha512-tLnIw5oDJJc3ILYtlKtqOxPP64FZLTkZkgeuoN6e7x6zw+rhBjOxyvq2c7577LGxXuIhBYrwisZuKNqOOHp3BA== dependencies: "@babel/helper-validator-identifier" "^7.19.1" - ci-info "^3.4.0" + "@eslint-community/eslint-utils" "^4.1.0" + ci-info "^3.6.1" clean-regexp "^1.0.0" - eslint-utils "^3.0.0" esquery "^1.4.0" indent-string "^4.0.0" is-builtin-module "^3.2.0" + jsesc "^3.0.2" lodash "^4.17.21" pluralize "^8.0.0" read-pkg-up "^7.0.1" regexp-tree "^0.1.24" + regjsparser "^0.9.1" safe-regex "^2.1.1" - semver "^7.3.7" + semver "^7.3.8" strip-indent "^3.0.0" eslint-rule-composer@^0.3.0: @@ -5251,15 +5139,15 @@ eslint-visitor-keys@^3.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@8.23.1: - version "8.23.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.23.1.tgz#cfd7b3f7fdd07db8d16b4ac0516a29c8d8dca5dc" - integrity sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg== +eslint@8.28.0: + version "8.28.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.28.0.tgz#81a680732634677cc890134bcdd9fdfea8e63d6e" + integrity sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ== dependencies: - "@eslint/eslintrc" "^1.3.2" - "@humanwhocodes/config-array" "^0.10.4" - "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" + "@eslint/eslintrc" "^1.3.3" + "@humanwhocodes/config-array" "^0.11.6" "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -5275,14 +5163,14 @@ eslint@8.23.1: fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" find-up "^5.0.0" - glob-parent "^6.0.1" + glob-parent "^6.0.2" globals "^13.15.0" - globby "^11.1.0" grapheme-splitter "^1.0.4" ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" + is-path-inside "^3.0.3" js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" @@ -5297,9 +5185,9 @@ eslint@8.23.1: text-table "^0.2.0" espree@^9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" - integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== + version "9.4.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" + integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== dependencies: acorn "^8.8.0" acorn-jsx "^5.3.2" @@ -5472,13 +5360,13 @@ expect@^29.0.0, expect@^29.3.1: jest-util "^29.3.1" express@^4.17.1: - version "4.18.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" - integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.0" + body-parser "1.20.1" content-disposition "0.5.4" content-type "~1.0.4" cookie "0.5.0" @@ -5497,7 +5385,7 @@ express@^4.17.1: parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.10.3" + qs "6.11.0" range-parser "~1.2.1" safe-buffer "5.2.1" send "0.18.0" @@ -5566,12 +5454,12 @@ extract-text-webpack-plugin@^4.0.0-beta.0: schema-utils "^0.4.5" webpack-sources "^1.1.0" -fake-indexeddb@^3.1.2: - version "3.1.8" - resolved "https://registry.yarnpkg.com/fake-indexeddb/-/fake-indexeddb-3.1.8.tgz#229e3cff6fa7355aebb3f147b908d2efa4605d70" - integrity sha512-7umIgcdnDfNcjw0ZaoD6yR2BflngKmPsyzZC+sV2fdttwz5bH6B6CCaNzzD+MURfRg8pvr/aL0trfNx65FLiDg== +fake-indexeddb@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/fake-indexeddb/-/fake-indexeddb-4.0.1.tgz#09bb2468e21d0832b2177e894765fb109edac8fb" + integrity sha512-hFRyPmvEZILYgdcLBxVdHLik4Tj3gDTu/g7s9ZDOiU3sTNiGx+vEu1ri/AMsFJUZ/1sdRbAVrEcKndh3sViBcA== dependencies: - realistic-structured-clone "^2.0.1" + realistic-structured-clone "^3.0.0" fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" @@ -5590,7 +5478,7 @@ fast-glob@^2.0.2: merge2 "^1.2.3" micromatch "^3.1.10" -fast-glob@^3.2.12, fast-glob@^3.2.9: +fast-glob@^3.2.12, fast-glob@^3.2.7, fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== @@ -5601,17 +5489,6 @@ fast-glob@^3.2.12, fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-glob@^3.2.7: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -5648,29 +5525,25 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fbemitter@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-2.1.1.tgz#523e14fdaf5248805bb02f62efc33be703f51865" - integrity sha512-hd8PgD+Q6RQtlcGrkM9oY3MFIjq6CA6wurCK1TKn2eaA76Ww4VAOihmq98NyjRhjJi/axgznZnh9lF8+TcTsNQ== +fbemitter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" + integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== dependencies: - fbjs "^0.8.4" + fbjs "^3.0.0" -fbjs@0.1.0-alpha.7: - version "0.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.1.0-alpha.7.tgz#ad4308b8f232fb3c73603349ea725d1e9c39323c" - integrity sha512-dJbzq7AfRYmVXZ3a/dsKLe2B00KGmsOlmKeUcyOCKZWixK6F4Fz8JM6btWgEoHxs2uwxJ1bTR9L+OKkVGPOyag== - dependencies: - core-js "^1.0.0" - promise "^7.0.3" - whatwg-fetch "^0.9.0" +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== -fbjs@^0.8.4: - version "0.8.18" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.18.tgz#9835e0addb9aca2eff53295cd79ca1cfc7c9662a" - integrity sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA== +fbjs@^3.0.0, fbjs@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.4.tgz#e1871c6bd3083bac71ff2da868ad5067d37716c6" + integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" + cross-fetch "^3.1.5" + fbjs-css-vars "^1.0.0" loose-envify "^1.0.0" object-assign "^4.1.0" promise "^7.1.1" @@ -5717,13 +5590,13 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -file-loader@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-5.1.0.tgz#cb56c070efc0e40666424309bd0d9e45ac6f2bb8" - integrity sha512-u/VkLGskw3Ue59nyOwUwXI/6nuBCo7KBkniB/l7ICwr/7cPNGsL1WCXUp3GB0qgOOKU1TiP49bv4DZF/LJqprg== +file-loader@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== dependencies: - loader-utils "^1.4.0" - schema-utils "^2.5.0" + loader-utils "^2.0.0" + schema-utils "^3.0.0" file-saver@^2.0.5: version "2.0.5" @@ -5745,10 +5618,10 @@ filename-regex@^2.0.0: resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" integrity sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ== -filesize@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" - integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== +filesize@10.0.5: + version "10.0.5" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-10.0.5.tgz#d77553eb00a525f4cc7983047d2197cda6fff321" + integrity sha512-qrzyt8gLh86nsyYiC3ibI5KyIYRCWg2yqIklYrWF4a0qNfekik4OQfn7AoPJG2hRrPMSlH6fET4VEITweZAzjA== fill-range@^2.1.0: version "2.2.4" @@ -5814,13 +5687,6 @@ find-index@^0.1.1: resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" integrity sha512-uJ5vWrfBKMcE6y2Z8834dwEZj9mNGxYa3t3I53OwFeuZ8D9oc2E5zcsrkuhX6h4iYrjhiv0T3szQmxlAV9uxDg== -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -5880,19 +5746,18 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -flux@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/flux/-/flux-2.1.1.tgz#2c6ac652d4337488968489c6586f3aff26a38ea4" - integrity sha512-A1t4GVH4QNxwHN+n/aXHi5xH4FN4gmHMrIRdHZrt011rcuTGfjbx6rdVyOi1+1eE/JautcFgUm4cGGUXYQEKAg== +flux@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.3.tgz#573b504a24982c4768fdfb59d8d2ea5637d72ee7" + integrity sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw== dependencies: - fbemitter "^2.0.0" - fbjs "0.1.0-alpha.7" - immutable "^3.7.4" + fbemitter "^3.0.0" + fbjs "^3.0.1" focus-lock@^0.11.2: - version "0.11.2" - resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.11.2.tgz#aeef3caf1cea757797ac8afdebaec8fd9ab243ed" - integrity sha512-pZ2bO++NWLHhiKkgP1bEXHhR1/OjVcSvlCJ98aNJDFeb7H5OOQaO+SKOZle6041O9rv2tmbrO4JzClAvDUHf0g== + version "0.11.4" + resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.11.4.tgz#fbf84894d7c384f25a2c7cf5d97c848131d97f6f" + integrity sha512-LzZWJcOBIcHslQ46N3SUu/760iLPSrUtp8omM4gh9du438V2CQdks8TcOu1yvmu2C68nVOBnl1WFiKGPbQ8L6g== dependencies: tslib "^2.0.3" @@ -5902,9 +5767,16 @@ focus-visible@^5.2.0: integrity sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ== follow-redirects@^1.0.0: - version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" @@ -5937,11 +5809,6 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fraction.js@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" - integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== - fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -5962,16 +5829,14 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== +fs-extra@^11.0.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.0.tgz#5784b102104433bb0e090f48bfc4a30742c357ed" + integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" fs-minipass@^2.0.0: version "2.1.0" @@ -6057,7 +5922,7 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.2: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== @@ -6136,7 +6001,7 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.1: +glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -6214,9 +6079,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.15.0: - version "13.17.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" - integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== + version "13.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" + integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== dependencies: type-fest "^0.20.2" @@ -6261,7 +6126,14 @@ globjoin@^0.1.4: resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.2, graceful-fs@^4.2.9: +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, 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== @@ -6391,9 +6263,9 @@ hex-color-regex@^1.1.0: integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== highlight.js@^11.3.1: - version "11.6.0" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.6.0.tgz#a50e9da05763f1bb0c1322c8f4f755242cff3f5a" - integrity sha512-ig1eqDzJaB0pqEvlPVIpSSyMaO92bH1N2rJpLMN/nX396wTpDA4Eq0uK+7I/2XG17pFaaKE0kjV/XPeGt7Evjw== + version "11.7.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.7.0.tgz#3ff0165bc843f8c9bce1fd89e2fda9143d24b11e" + integrity sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ== hmac-drbg@^1.0.1: version "1.0.1" @@ -6462,11 +6334,16 @@ html-encoding-sniffer@^3.0.0: dependencies: whatwg-encoding "^2.0.0" -html-entities@^1.3.1, html-entities@^1.4.0: +html-entities@^1.3.1: version "1.4.0" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== +html-entities@^2.0.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -6609,7 +6486,7 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@0.6.3, iconv-lite@^0.6.2: +iconv-lite@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -6623,7 +6500,7 @@ icss-utils@^4.0.0, icss-utils@^4.1.1: dependencies: postcss "^7.0.14" -ieee754@^1.1.12, ieee754@^1.1.13, ieee754@^1.1.4: +ieee754@^1.1.12, ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -6639,20 +6516,15 @@ ignore@^3.3.5: integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + version "5.2.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" + integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== -immutable@^3.7.4: - version "3.8.2" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" - integrity sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg== - import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" @@ -6828,7 +6700,7 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-arguments@^1.0.4: +is-arguments@^1.0.4, is-arguments@^1.1.0, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -6887,10 +6759,10 @@ is-builtin-module@^3.2.0: dependencies: builtin-modules "^3.3.0" -is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.6" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.6.tgz#fd6170b0b8c7e2cc73de342ef8284a2202023c44" - integrity sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-color-stop@^1.0.0: version "1.1.0" @@ -6904,14 +6776,7 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.5.0, is-core-module@^2.8.1: - version "2.10.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" - integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== - dependencies: - has "^1.0.3" - -is-core-module@^2.9.0: +is-core-module@^2.5.0, is-core-module@^2.8.1, is-core-module@^2.9.0: version "2.11.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== @@ -6932,7 +6797,7 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -7046,6 +6911,11 @@ is-ip@^3.1.0: dependencies: ip-regex "^4.0.0" +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -7106,6 +6976,11 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -7156,6 +7031,11 @@ is-resolvable@^1.0.0: resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -7163,7 +7043,7 @@ is-shared-array-buffer@^1.0.2: dependencies: call-bind "^1.0.2" -is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== @@ -7192,6 +7072,22 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" +is-typed-array@^1.1.10: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -7199,6 +7095,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -7214,7 +7118,7 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== -isarray@^2.0.1: +isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== @@ -7236,14 +7140,6 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - integrity sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA== - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" @@ -7706,11 +7602,12 @@ jest-watcher@^29.3.1: jest-util "^29.3.1" string-length "^4.0.1" -jest-worker@^25.4.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" - integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== +jest-worker@^26.5.0: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== dependencies: + "@types/node" "*" merge-stream "^2.0.0" supports-color "^7.0.0" @@ -7735,9 +7632,9 @@ jest@^29.0.0: jest-cli "^29.3.1" js-sdsl@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.4.tgz#78793c90f80e8430b7d8dc94515b6c77d98a26a6" - integrity sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw== + version "4.2.0" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0" + integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" @@ -7760,17 +7657,17 @@ js-yaml@^4.1.0: argparse "^2.0.1" jsdom@^20.0.0: - version "20.0.2" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.2.tgz#65ccbed81d5e877c433f353c58bb91ff374127db" - integrity sha512-AHWa+QO/cgRg4N+DsmHg1Y7xnz+8KU3EflM0LVDTdmrYOc1WWTSkOjtpUveQH+1Bqd5rtcVnb/DuxV/UjDO4rA== + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== dependencies: abab "^2.0.6" - acorn "^8.8.0" + acorn "^8.8.1" acorn-globals "^7.0.0" cssom "^0.5.0" cssstyle "^2.3.0" data-urls "^3.0.2" - decimal.js "^10.4.1" + decimal.js "^10.4.2" domexception "^4.0.0" escodegen "^2.0.0" form-data "^4.0.0" @@ -7783,12 +7680,12 @@ jsdom@^20.0.0: saxes "^6.0.0" symbol-tree "^3.2.4" tough-cookie "^4.1.2" - w3c-xmlserializer "^3.0.0" + w3c-xmlserializer "^4.0.0" webidl-conversions "^7.0.0" whatwg-encoding "^2.0.0" whatwg-mimetype "^3.0.0" whatwg-url "^11.0.0" - ws "^8.9.0" + ws "^8.11.0" xml-name-validator "^4.0.0" jsesc@^2.5.1: @@ -7796,6 +7693,11 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" @@ -7843,17 +7745,19 @@ json5@^2.1.2, json5@^2.1.3, json5@^2.2.1: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" optionalDependencies: graceful-fs "^4.1.6" jsrsasign@^10.5.25: - version "10.5.27" - resolved "https://registry.yarnpkg.com/jsrsasign/-/jsrsasign-10.5.27.tgz#481defb1206aa48cd740c3fce8ff546efb5bb45e" - integrity sha512-1F4LmDeJZHYwoVvB44jEo2uZL3XuwYNzXCDOu53Ui6vqofGQ/gCYDmaxfVZtN0TGd92UKXr/BONcfrPonUIcQQ== + version "10.6.1" + resolved "https://registry.yarnpkg.com/jsrsasign/-/jsrsasign-10.6.1.tgz#dcdfa890241f4cb72e717116f95b5ba9315bfda0" + integrity sha512-emiQ05haY9CRj1Ho/LiuCqr/+8RgJuWdiHYNglIg2Qjfz0n+pnUq9I2QHplXuOMO2EnAW1oCGC1++aU5VoWSlw== "jsx-ast-utils@^2.4.1 || ^3.0.0": version "3.3.3" @@ -7873,17 +7777,10 @@ jszip@^3.7.0: readable-stream "~2.3.6" setimmediate "^1.0.5" -katex@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.12.0.tgz#2fb1c665dbd2b043edcf8a1f5c555f46beaa0cb9" - integrity sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg== - dependencies: - commander "^2.19.0" - katex@^0.16.0: - version "0.16.2" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.2.tgz#9d3dc2a7e65fb8aa31101b1f86888ec40eed7b24" - integrity sha512-70DJdQAyh9EMsthw3AaQlDyFf54X7nWEUIa5W+rq8XOpEk//w5Th7/8SqFqpvi/KZ2t6MHUj4f9wLmztBmAYQA== + version "0.16.3" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.3.tgz#29640560b8fa0403e45f3aa20da5fdbb6d2b83a8" + integrity sha512-3EykQddareoRmbtNiNEDgl3IGjryyrp2eg/25fHDEnlHymIDi33bptkMv6K4EOC2LZCybLW/ZkEo6Le+EM9pmA== dependencies: commander "^8.0.0" @@ -7921,22 +7818,15 @@ kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== - optionalDependencies: - graceful-fs "^4.1.9" - kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -known-css-properties@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.25.0.tgz#6ebc4d4b412f602e5cfbeb4086bd544e34c0a776" - integrity sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA== +known-css-properties@^0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.26.0.tgz#008295115abddc045a9f4ed7e2a84dc8b3a77649" + integrity sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg== last-call-webpack-plugin@^3.0.0: version "3.0.0" @@ -8007,15 +7897,15 @@ loader-runner@^2.4.0: integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== loader-utils@^1.0.0, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + version "1.4.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" json5 "^1.0.1" -loader-utils@^2.0.0, loader-utils@^2.0.3: +loader-utils@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== @@ -8024,13 +7914,10 @@ loader-utils@^2.0.0, loader-utils@^2.0.3: emojis-list "^3.0.0" json5 "^2.1.2" -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" +loader-utils@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== locate-path@^3.0.0: version "3.0.0" @@ -8089,15 +7976,15 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.7.0: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== loglevel@^1.6.8, loglevel@^1.7.1: - version "1.8.0" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" - integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== + version "1.8.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4" + integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" @@ -8243,13 +8130,12 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -matrix-js-sdk@22.0.0: - version "22.0.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-22.0.0.tgz#8e396a1798d6d1515a92cf8f544b0010bd0c9e85" - integrity sha512-mpKqeD3nCobjGiUiATUyEoP44n+AzDW5cSeBTIBY5fPhj0AkzLJhblHt40vzSOJazj8tT0PhsSzhEIR9hGzYGA== +matrix-js-sdk@23.0.0: + version "23.0.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-23.0.0.tgz#b25a727c0bc8821168a450a2d801dc77dc340f00" + integrity sha512-FbbVxbH+K9ekec4hfnAD64KaP1X4DRQw1htw0qnx761saJEW3rQc1bTQtEyKFi4dZz7XaFYbspVUXeWkVqnqew== dependencies: "@babel/runtime" "^7.12.5" - "@types/sdp-transform" "^2.4.5" another-json "^0.2.0" bs58 "^5.0.0" content-type "^1.0.4" @@ -8260,51 +8146,50 @@ matrix-js-sdk@22.0.0: qs "^6.9.6" sdp-transform "^2.14.1" unhomoglyph "^1.0.6" + uuid "7" matrix-mock-request@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/matrix-mock-request/-/matrix-mock-request-2.5.0.tgz#78da2590e82be2e31edcf9814833af5e5f8d2f1a" - integrity sha512-7T3gklpW+4rfHsTnp/FDML7aWoBrXhAh8+1ltinQfAh9TDj6y382z/RUMR7i03d1WDzt/ed1UTihqO5GDoOq9Q== + version "2.6.0" + resolved "https://registry.yarnpkg.com/matrix-mock-request/-/matrix-mock-request-2.6.0.tgz#0855c10b250668ce542b697251087be2bcc23f92" + integrity sha512-D0n+FsoMvHBrBoo60IeGhyrNoCBdT8n+Wl+LMW+k5aR+k9QAxqGopPzJNk1tqeaJLFUhmvYLuNc8/VBKRpPy+Q== dependencies: expect "^28.1.0" -matrix-react-sdk@3.62.0: - version "3.62.0" - resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.62.0.tgz#00e2b990d1a17f9323b7b23de6e595faf4e95041" - integrity sha512-uFtWPTjbbw84ouDEzyLqPuQ4ihiR9jpgP5wS40AdN+cZQZbEMH6XYT585eQPRU3ryoYK1OokPPEiz+20JkEzxg== +matrix-react-sdk@3.63.0: + version "3.63.0" + resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.63.0.tgz#c3c4657df6915c7bc395ac818f55610b68c87164" + integrity sha512-M0evib+9d7Kp3R/A3hMnsY7RP5Mem/3SthSy8T6E1PNmuJnqV9vl+4RtSGmjS5A0QQhJC0E7nqMQ1ij+cubjyg== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/analytics-events" "^0.3.0" - "@matrix-org/matrix-wysiwyg" "^0.6.0" + "@matrix-org/matrix-wysiwyg" "^0.9.0" "@matrix-org/react-sdk-module-api" "^0.0.3" - "@sentry/browser" "^6.11.0" - "@sentry/tracing" "^6.11.0" + "@sentry/browser" "^7.0.0" + "@sentry/tracing" "^7.0.0" "@testing-library/react-hooks" "^8.0.1" - "@types/geojson" "^7946.0.8" - "@types/ua-parser-js" "^0.7.36" await-lock "^2.1.0" blurhash "^1.1.3" cheerio "^1.0.0-rc.9" classnames "^2.2.6" - commonmark "^0.29.3" + commonmark "^0.30.0" counterpart "^0.18.6" diff-dom "^4.2.2" diff-match-patch "^1.0.5" - emojibase "6.0.2" - emojibase-data "7.0.0" - emojibase-regex "6.0.0" + emojibase "6.1.0" + emojibase-data "7.0.1" + emojibase-regex "6.0.1" escape-html "^1.0.3" file-saver "^2.0.5" - filesize "6.1.0" - flux "2.1.1" + filesize "10.0.5" + flux "4.0.3" focus-visible "^5.2.0" gfm.css "^1.1.2" glob-to-regexp "^0.4.1" highlight.js "^11.3.1" - html-entities "^1.4.0" + html-entities "^2.0.0" is-ip "^3.1.0" jszip "^3.7.0" - katex "^0.12.0" + katex "^0.16.0" linkify-element "4.0.0-beta.4" linkify-string "4.0.0-beta.4" linkifyjs "4.0.0-beta.4" @@ -8312,20 +8197,19 @@ matrix-react-sdk@3.62.0: maplibre-gl "^1.15.2" matrix-encrypt-attachment "^1.0.3" matrix-events-sdk "0.0.1" - matrix-js-sdk "22.0.0" + matrix-js-sdk "23.0.0" matrix-widget-api "^1.1.1" minimist "^1.2.5" opus-recorder "^8.0.3" pako "^2.0.3" parse5 "^6.0.1" png-chunks-extract "^1.0.0" - posthog-js "1.12.2" - prop-types "^15.7.2" - qrcode "1.4.4" + posthog-js "1.36.0" + qrcode "1.5.1" re-resizable "^6.9.0" react "17.0.2" react-beautiful-dnd "^13.1.0" - react-blurhash "^0.1.3" + react-blurhash "^0.2.0" react-dom "17.0.2" react-focus-lock "^2.5.1" react-transition-group "^4.4.1" @@ -8562,7 +8446,7 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -8579,9 +8463,9 @@ minimist-options@4.1.0: kind-of "^6.0.3" minimist@>=1.2.2, minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== minipass-collect@^1.0.2: version "1.0.2" @@ -8605,12 +8489,20 @@ minipass-pipeline@^1.2.2: minipass "^3.0.0" minipass@^3.0.0, minipass@^3.1.1: - version "3.3.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" - integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" @@ -8642,7 +8534,7 @@ mkdirp@0.5.5: dependencies: minimist "^1.2.5" -mkdirp@1.0.4, mkdirp@^1.0.4: +mkdirp@1.0.4, mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -8720,9 +8612,9 @@ murmurhash-js@^1.0.0: integrity sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw== nan@^2.12.1: - version "2.16.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916" - integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA== + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== nanoid@^3.3.4: version "3.3.4" @@ -8784,15 +8676,7 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-fetch@^2.6.7: +node-fetch@2.6.7, node-fetch@^2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== @@ -8843,7 +8727,7 @@ node-releases@^2.0.6: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: +normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -8952,12 +8836,12 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.12.0, object-inspect@^1.12.2, object-inspect@^1.9.0: +object-inspect@^1.12.2, object-inspect@^1.9.0: version "1.12.2" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== -object-is@^1.0.1: +object-is@^1.0.1, object-is@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== @@ -8977,7 +8861,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.2, object.assign@^4.1.3, object.assign@^4.1.4: +object.assign@^4.1.3, object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== @@ -8987,41 +8871,41 @@ object.assign@^4.1.2, object.assign@^4.1.3, object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" - integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== +object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" -object.fromentries@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" - integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: - version "2.1.4" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz#7965e6437a57278b587383831a9b829455a4bc37" - integrity sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ== + version "2.1.5" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" + integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== dependencies: - array.prototype.reduce "^1.0.4" + array.prototype.reduce "^1.0.5" call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.20.1" + es-abstract "^1.20.4" -object.hasown@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" - integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== dependencies: define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" object.omit@^2.0.0: version "2.0.1" @@ -9038,14 +8922,14 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== +object.values@^1.1.0, object.values@^1.1.5, object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" @@ -9132,14 +9016,7 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0: +p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -9153,13 +9030,6 @@ p-limit@^3.0.2, p-limit@^3.1.0: dependencies: yocto-queue "^0.1.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== - dependencies: - p-limit "^1.1.0" - p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -9186,10 +9056,10 @@ p-map@^2.0.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" @@ -9208,20 +9078,15 @@ p-retry@^3.0.1: dependencies: retry "^0.12.0" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pako@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" - integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== + version "2.1.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== pako@~1.0.2, pako@~1.0.5: version "1.0.11" @@ -9315,9 +9180,9 @@ parse5@^6.0.1: integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== parse5@^7.0.0, parse5@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.1.tgz#4649f940ccfb95d8754f37f73078ea20afe0c746" - integrity sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg== + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== dependencies: entities "^4.4.0" @@ -9508,15 +9373,15 @@ png-chunks-extract@^1.0.0: dependencies: crc-32 "^0.3.0" -pngjs@^3.3.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" - integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== +pngjs@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" + integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== portfinder@^1.0.26: - version "1.0.29" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.29.tgz#d06ff886f4ff91274ed3e25c7e6b0c68d2a0735a" - integrity sha512-Z5+DarHWCKlufshB9Z1pN95oLtANoY5Wn9X3JGELGyQ6VhEcBfT2t+1fGUBq7MwUant6g/mqowH+4HifByPbiQ== + version "1.0.32" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" + integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== dependencies: async "^2.6.4" debug "^3.2.7" @@ -9883,7 +9748,7 @@ postcss-modules-extract-imports@^2.0.0: dependencies: postcss "^7.0.5" -postcss-modules-local-by-default@^3.0.2: +postcss-modules-local-by-default@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== @@ -10125,9 +9990,9 @@ postcss-safe-parser@^6.0.0: integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== postcss-scss@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.5.tgz#8ee33c1dda8d9d4753b565ec79014803dc6edabf" - integrity sha512-F7xpB6TrXyqUh3GKdyB4Gkp3QL3DDW1+uI+gxx/oJnUt/qXI4trj5OGlp9rOKdoABGULuqtqeG+3HEVQk4DjmA== + version "4.0.6" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.6.tgz#5d62a574b950a6ae12f2aa89b60d63d9e4432bfd" + integrity sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ== postcss-selector-matches@^4.0.0: version "4.0.0" @@ -10164,9 +10029,9 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: uniq "^1.0.1" postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.6: - version "6.0.10" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" - integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + version "6.0.11" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" + integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -10223,21 +10088,23 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.1 picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.3.11, postcss@^8.4.16: - version "8.4.16" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c" - integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== +postcss@^8.3.11, postcss@^8.4.16, postcss@^8.4.19: + version "8.4.19" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc" + integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA== dependencies: nanoid "^3.3.4" picocolors "^1.0.0" source-map-js "^1.0.2" -posthog-js@1.12.2: - version "1.12.2" - resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.12.2.tgz#ff76e26634067e003f8af7df654d7ea0e647d946" - integrity sha512-I0d6c+Yu2f91PFidz65AIkkqZM219EY9Z1wlbTkW5Zqfq5oXqogBMKS8BaDBOrMc46LjLX7IH67ytCcBFRo1uw== +posthog-js@1.36.0: + version "1.36.0" + resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.36.0.tgz#cbefa031a1e7ee6ff25dae29b8aa77bd741adbba" + integrity sha512-LL9lbJxN46GbckRKSFZxX7fwNAvKUbi5nLFF0hMkmKY9o9zoz58oA0DJBZkqyEXK+15XzNoyLxF+wnxSPNwn3g== dependencies: + "@sentry/types" "^7.2.0" fflate "^0.4.1" + rrweb-snapshot "^1.1.14" potpack@^1.0.1: version "1.0.2" @@ -10259,6 +10126,11 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" integrity sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ== +prettier@2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.0.tgz#c7df58393c9ba77d6fba3921ae01faf994fb9dc9" + integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA== + pretty-error@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" @@ -10315,7 +10187,7 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== -promise@^7.0.3, promise@^7.1.1: +promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== @@ -10424,27 +10296,17 @@ q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== -qrcode@1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.4.4.tgz#f0c43568a7e7510a55efc3b88d9602f71963ea83" - integrity sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q== +qrcode@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.1.tgz#0103f97317409f7bc91772ef30793a54cd59f0cb" + integrity sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg== dependencies: - buffer "^5.4.3" - buffer-alloc "^1.2.0" - buffer-from "^1.1.1" dijkstrajs "^1.0.1" - isarray "^2.0.1" - pngjs "^3.3.0" - yargs "^13.2.4" - -qs@6.10.3: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== - dependencies: - side-channel "^1.0.4" + encode-utf8 "^1.0.3" + pngjs "^5.0.0" + yargs "^15.3.1" -qs@^6.9.6: +qs@6.11.0, qs@^6.9.6: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== @@ -10544,9 +10406,9 @@ re-resizable@^6.9.0: integrity sha512-l+MBlKZffv/SicxDySKEEh42hR6m5bAHfNu3Tvxks2c4Ah+ldnWjfnVRwxo/nxF27SsUsxDS0raAzFuJNKABXA== react-beautiful-dnd@^13.1.0: - version "13.1.0" - resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.0.tgz#ec97c81093593526454b0de69852ae433783844d" - integrity sha512-aGvblPZTJowOWUNiwd6tNfEpgkX5OxmpqxHKNW/4VmvZTNTbeiq7bA3bn5T+QSF2uibXB0D1DmJsb1aC/+3cUA== + version "13.1.1" + resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz#b0f3087a5840920abf8bb2325f1ffa46d8c4d0a2" + integrity sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ== dependencies: "@babel/runtime" "^7.9.2" css-box-model "^1.2.0" @@ -10556,10 +10418,10 @@ react-beautiful-dnd@^13.1.0: redux "^4.0.4" use-memo-one "^1.1.1" -react-blurhash@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/react-blurhash/-/react-blurhash-0.1.3.tgz#735f28f8f07fb358d7efe7e7e6dc65a7272bf89e" - integrity sha512-Q9lqbXg92NU6/2DoIl/cBM8YWL+Z4X66OiG4aT9ozOgjBwx104LHFCH5stf6aF+s0Q9Wf310Ul+dG+VXJltmPg== +react-blurhash@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/react-blurhash/-/react-blurhash-0.2.0.tgz#5c62ab827eaebddb3f9dcda695c7c7cf784c7f37" + integrity sha512-MfhPLfFTNCX3MCJ8nM5t+T5qAixBUv8QHVcHORs5iVaqdpg+IW/e4lpOphc0bm6AvKz//4MuHESIeKKoxi3wnA== react-clientside-effect@^1.2.6: version "1.2.6" @@ -10585,9 +10447,9 @@ react-error-boundary@^3.1.0: "@babel/runtime" "^7.12.5" react-focus-lock@^2.5.1: - version "2.9.1" - resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.9.1.tgz#094cfc19b4f334122c73bb0bff65d77a0c92dd16" - integrity sha512-pSWOQrUmiKLkffPO6BpMXN7SNKXMsuOakl652IBuALAu1esk+IcpJyM+ALcYzPTTFz1rD0R54aB9A4HuP5t1Wg== + version "2.9.2" + resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.9.2.tgz#a57dfd7c493e5a030d87f161c96ffd082bd920f2" + integrity sha512-5JfrsOKyA5Zn3h958mk7bAcfphr24jPoMoznJ8vaJF6fUrPQ8zrtEd3ILLOK8P5jvGxdMd96OxWNjDzATfR2qw== dependencies: "@babel/runtime" "^7.0.0" focus-lock "^0.11.2" @@ -10612,9 +10474,9 @@ react-is@^18.0.0: integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== react-redux@^7.2.0: - version "7.2.8" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.8.tgz#a894068315e65de5b1b68899f9c6ee0923dd28de" - integrity sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw== + version "7.2.9" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d" + integrity sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ== dependencies: "@babel/runtime" "^7.15.4" "@types/react-redux" "^7.1.20" @@ -10657,15 +10519,6 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" - integrity sha512-+UBirHHDm5J+3WDmLBZYSklRYg82nMlz+enn+GMZ22nSR2f4bzxmhso6rzQW/3mT2PVzpzDTiYIZahk8UmZ44w== - dependencies: - normalize-package-data "^2.3.2" - parse-json "^4.0.0" - pify "^3.0.0" - read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" @@ -10714,12 +10567,11 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -realistic-structured-clone@^2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/realistic-structured-clone/-/realistic-structured-clone-2.0.4.tgz#7eb4c2319fc3cb72f4c8d3c9e888b11647894b50" - integrity sha512-lItAdBIFHUSe6fgztHPtmmWqKUgs+qhcYLi3wTRUl4OTB3Vb8aBVSjGfQZUvkmJCKoX3K9Wf7kyLp/F/208+7A== +realistic-structured-clone@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/realistic-structured-clone/-/realistic-structured-clone-3.0.0.tgz#7b518049ce2dad41ac32b421cd297075b00e3e35" + integrity sha512-rOjh4nuWkAqf9PWu6JVpOWD4ndI+JHfgiZeMmujYcPi+fvILUu7g6l26TC1K5aBIp34nV+jE1cDO75EKOfHC5Q== dependencies: - core-js "^3.4" domexception "^1.0.1" typeson "^6.1.0" typeson-registry "^1.0.0-alpha.20" @@ -10756,12 +10608,12 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.13.10: +regenerator-runtime@^0.13.11: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.0: +regenerator-transform@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== @@ -10788,7 +10640,7 @@ regexp-tree@^0.1.24, regexp-tree@~0.1.1: resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.24.tgz#3d6fa238450a4d66e5bc9c4c14bb720e2196829d" integrity sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw== -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== @@ -10802,7 +10654,7 @@ regexpp@^3.2.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^5.1.0: +regexpu-core@^5.2.1: version "5.2.2" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== @@ -10989,7 +10841,7 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg== -rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: +rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -11011,6 +10863,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +rrweb-snapshot@^1.1.14: + version "1.1.14" + resolved "https://registry.yarnpkg.com/rrweb-snapshot/-/rrweb-snapshot-1.1.14.tgz#9d4d9be54a28a893373428ee4393ec7e5bd83fcc" + integrity sha512-eP5pirNjP5+GewQfcOQY4uBiDnpqxNRc65yKPW0eSoU1XamDfc4M8oqpXGMyUyvLyxFDB0q0+DChuxxiU2FXBQ== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -11030,12 +10887,12 @@ rw@^1.3.3: resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== -rxjs@^6.5.2: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== +rxjs@^7.0.0: + version "7.5.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39" + integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA== dependencies: - tslib "^1.9.0" + tslib "^2.1.0" safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" @@ -11047,6 +10904,15 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -11074,9 +10940,9 @@ sanitize-filename@^1.6.3: truncate-utf8-bytes "^1.0.0" sanitize-html@^2.3.2: - version "2.7.2" - resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.7.2.tgz#54c5189af75e3237d996e4b9a5e3eaad12c7f7fc" - integrity sha512-DggSTe7MviO+K4YTCwprG6W1vsG+IIX67yp/QY55yQqKCJYSWzCA1rZbaXzkjoKeL9+jqwm56wD6srYLtUNivg== + version "2.7.3" + resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.7.3.tgz#166c868444ee4f9fd7352ac8c63fa86c343fc2bd" + integrity sha512-jMaHG29ak4miiJ8wgqA1849iInqORgNv7SLfSw9LtfOhEUQ1C0YHKH73R+hgyufBW9ZFeJrb057k9hjlfBCVlw== dependencies: deepmerge "^4.2.2" escape-string-regexp "^4.0.0" @@ -11122,7 +10988,7 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.5.0, schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: +schema-utils@^2.6.5, schema-utils@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== @@ -11167,14 +11033,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.4, semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.5: +semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: version "7.3.8" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== @@ -11207,6 +11066,13 @@ serialize-javascript@^4.0.0: dependencies: randombytes "^2.1.0" +serialize-javascript@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" @@ -11299,15 +11165,10 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-escape@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/shell-escape/-/shell-escape-0.2.0.tgz#68fd025eb0490b4f567a027f0bf22480b5f84133" - integrity sha512-uRRBT2MfEOyxuECseCZd28jC1AJ8hmqqneWQ4VWUTgCAFvb3wKU1jLqj6egC4Exrr88ogg3dp+zroH4wJuaXzw== - -shell-quote@^1.6.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" - integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== +shell-quote@^1.6.1, shell-quote@^1.7.3: + version "1.7.4" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" + integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== side-channel@^1.0.4: version "1.0.4" @@ -11417,9 +11278,9 @@ sockjs@^0.3.21: websocket-driver "^0.7.4" socks@^2.3.2: - version "2.7.0" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.0.tgz#f9225acdb841e874dca25f870e9130990f3913d0" - integrity sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA== + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== dependencies: ip "^2.0.0" smart-buffer "^4.2.0" @@ -11453,7 +11314,7 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.5.16, source-map-support@~0.5.12: +source-map-support@^0.5.16, source-map-support@~0.5.12, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -11559,12 +11420,11 @@ ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" -ssri@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.1.tgz#33e44f896a967158e3c63468e47ec46613b95b5f" - integrity sha512-w+daCzXN89PseTL99MkA+fxJEcU3wfaE/ah0i0lnOlpG1CYLJ2ZjzEry68YBKfLs4JfoTShrTEsJkAZuNZ/stw== +ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== dependencies: - figgy-pudding "^3.5.1" minipass "^3.1.1" stable@^0.1.8: @@ -11637,13 +11497,13 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-replace-loader@2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/string-replace-loader/-/string-replace-loader-2.3.0.tgz#7f29be7d73c94dd92eccd5c5a15651181d7ecd3d" - integrity sha512-HYBIHStViMKLZC/Lehxy42OuwsBaPzX/LjcF5mkJlE2SnHXmW6SW6eiHABTXnY8ZCm/REbdJ8qnA0ptmIzN0Ng== +string-replace-loader@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-replace-loader/-/string-replace-loader-3.1.0.tgz#11ac6ee76bab80316a86af358ab773193dd57a4f" + integrity sha512-5AOMUZeX5HE/ylKDnEa/KKBqvlnFmRZudSOjVJHxhoJg9QYTwl1rECx7SLR8BBH7tfxb4Rp7EM2XVfQFxIhsbQ== dependencies: - loader-utils "^1.2.3" - schema-utils "^2.6.5" + loader-utils "^2.0.0" + schema-utils "^3.0.0" string-width@^1.0.1: version "1.0.2" @@ -11672,18 +11532,18 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string.prototype.matchall@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" - integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== +string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" has-symbols "^1.0.3" internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.1" + regexp.prototype.flags "^1.4.3" side-channel "^1.0.4" string.prototype.repeat@^0.2.0: @@ -11692,22 +11552,22 @@ string.prototype.repeat@^0.2.0: integrity sha512-1BH+X+1hSthZFW+X+JaUkjkkUPwIlLEMJBLANN3hOob3RhEk5snLWNECDnYbgn/m5c5JV7Ersu1Yubaf+05cIA== string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -11798,17 +11658,22 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" -stylelint-config-recommended@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-8.0.0.tgz#7736be9984246177f017c39ec7b1cd0f19ae9117" - integrity sha512-IK6dWvE000+xBv9jbnHOnBq01gt6HGVB2ZTsot+QsMpe82doDQ9hvplxfv4YnpEuUwVGGd9y6nbaAnhrjcxhZQ== +stylelint-config-prettier@^9.0.4: + version "9.0.4" + resolved "https://registry.yarnpkg.com/stylelint-config-prettier/-/stylelint-config-prettier-9.0.4.tgz#1b1dda614d5b3ef6c1f583fa6fa55f88245eb00b" + integrity sha512-38nIGTGpFOiK5LjJ8Ma1yUgpKENxoKSOhbDNSemY7Ep0VsJoXIW9Iq/2hSt699oB9tReynfWicTAoIHiq8Rvbg== + +stylelint-config-recommended@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz#1c9e07536a8cd875405f8ecef7314916d94e7e40" + integrity sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ== -stylelint-config-standard@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-26.0.0.tgz#4701b8d582d34120eec7d260ba779e4c2d953635" - integrity sha512-hUuB7LaaqM8abvkOO84wh5oYSkpXgTzHu2Zza6e7mY+aOmpNTjoFBRxSLlzY0uAOMWEFx0OMKzr+reG1BUtcqQ== +stylelint-config-standard@^29.0.0: + version "29.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz#4cc0e0f05512a39bb8b8e97853247d3a95d66fa2" + integrity sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg== dependencies: - stylelint-config-recommended "^8.0.0" + stylelint-config-recommended "^9.0.0" stylelint-scss@^4.2.0: version "4.3.0" @@ -11822,14 +11687,14 @@ stylelint-scss@^4.2.0: postcss-value-parser "^4.1.0" stylelint@^14.9.1: - version "14.12.0" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.12.0.tgz#86d5b60d0f30a6bd0b59e1d4c85a267f0caef97e" - integrity sha512-9Sa+IsT31PN9zf9q5ZVZNvhT6jMVu6YhpI38g3Akn7vONipGL0GNd9QCblwtJ3ysaoM80P/+9mOcFB1xnytiQQ== + version "14.15.0" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.15.0.tgz#4df55078e734869f81f6b85bbec2d56a4b478ece" + integrity sha512-JOgDAo5QRsqiOZPZO+B9rKJvBm64S0xasbuRPAbPs6/vQDgDCnZLIiw6XcAS6GQKk9k1sBWR6rmH3Mfj8OknKg== dependencies: "@csstools/selector-specificity" "^2.0.2" balanced-match "^2.0.0" colord "^2.9.3" - cosmiconfig "^7.0.1" + cosmiconfig "^7.1.0" css-functions-list "^3.1.0" debug "^4.3.4" fast-glob "^3.2.12" @@ -11843,13 +11708,13 @@ stylelint@^14.9.1: import-lazy "^4.0.0" imurmurhash "^0.1.4" is-plain-object "^5.0.0" - known-css-properties "^0.25.0" + known-css-properties "^0.26.0" mathml-tag-names "^2.1.3" meow "^9.0.0" micromatch "^4.0.5" normalize-path "^3.0.0" picocolors "^1.0.0" - postcss "^8.4.16" + postcss "^8.4.19" postcss-media-query-parser "^0.2.3" postcss-resolve-nested-selector "^0.1.1" postcss-safe-parser "^6.0.0" @@ -11861,7 +11726,7 @@ stylelint@^14.9.1: style-search "^0.1.0" supports-hyperlinks "^2.3.0" svg-tags "^1.0.0" - table "^6.8.0" + table "^6.8.1" v8-compile-cache "^2.3.0" write-file-atomic "^4.0.2" @@ -11907,7 +11772,7 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: +supports-color@^8.0.0, supports-color@^8.1.0: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -11961,10 +11826,10 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== +table@^6.8.1: + version "6.8.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2" @@ -11982,6 +11847,18 @@ tar-js@^0.3.0: resolved "https://registry.yarnpkg.com/tar-js/-/tar-js-0.3.0.tgz#6949aabfb0ba18bb1562ae51a439fd0f30183a17" integrity sha512-9uqP2hJUZNKRkwPDe5nXxXdzo6w+BFBPq9x/tyi5/U/DneuSesO/HMb0y5TeWpfcv49YDJTs7SrrZeeu8ZHWDA== +tar@^6.0.2: + version "6.1.12" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.12.tgz#3b742fb05669b55671fb769ab67a7791ea1a62e6" + integrity sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + terser-webpack-plugin@^1.4.3: version "1.4.5" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" @@ -11997,22 +11874,22 @@ terser-webpack-plugin@^1.4.3: webpack-sources "^1.4.0" worker-farm "^1.7.0" -terser-webpack-plugin@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz#894764a19b0743f2f704e7c2a848c5283a696724" - integrity sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w== +terser-webpack-plugin@^4.0.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" + integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== dependencies: - cacache "^13.0.1" + cacache "^15.0.5" find-cache-dir "^3.3.1" - jest-worker "^25.4.0" - p-limit "^2.3.0" - schema-utils "^2.6.6" - serialize-javascript "^4.0.0" + jest-worker "^26.5.0" + p-limit "^3.0.2" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" source-map "^0.6.1" - terser "^4.6.12" + terser "^5.3.4" webpack-sources "^1.4.3" -terser@^4.1.2, terser@^4.6.12, terser@^4.6.3: +terser@^4.1.2, terser@^4.6.3: version "4.8.1" resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f" integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== @@ -12021,6 +11898,16 @@ terser@^4.1.2, terser@^4.6.12, terser@^4.6.3: source-map "~0.6.1" source-map-support "~0.5.12" +terser@^5.3.4: + version "5.16.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.0.tgz#29362c6f5506e71545c73b069ccd199bb28f7f54" + integrity sha512-KjTV81QKStSfwbNiwlBXfcgMcOloyuRdb62/iLFPGBcVNF4EXjhdYBhYHmbJpiBrVxZhDvltE11j+LBQUxEEJg== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -12069,9 +11956,9 @@ timsort@^0.3.0: integrity sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A== tiny-invariant@^1.0.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" - integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== + version "1.3.1" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== tinyqueue@^2.0.3: version "2.0.3" @@ -12218,15 +12105,15 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.8.1, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.3: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== tsutils@^3.21.0: version "3.21.0" @@ -12312,10 +12199,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@4.7.4: - version "4.7.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" - integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== +typescript@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" + integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== typeson-registry@^1.0.0-alpha.20: version "1.0.0-alpha.39" @@ -12332,19 +12219,14 @@ typeson@^6.0.0, typeson@^6.1.0: integrity sha512-6FTtyGr8ldU0pfbvW/eOZrEtEkczHRUtduBnA90Jh9kMPCiFNnXIon3vF41N0S4tV1HHQt4Hk1j4srpESziCaA== ua-parser-js@^0.7.30: - version "0.7.31" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" - integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== - -ua-parser-js@^0.8.0: - version "0.8.1" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.8.1.tgz#aa3fea52565c5e36cd84ad5a47497e8f2abadc9a" - integrity sha512-top37bpoaHp+wJBAqjm5KNz7qNfSZ/tmHEisuMMK5uzjdIo/L6uWovDFuYboO+q8EMz1f67exTnd+OPYESuu8Q== + version "0.7.32" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.32.tgz#cd8c639cdca949e30fa68c44b7813ef13e36d211" + integrity sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw== -ua-parser-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.2.tgz#e2976c34dbfb30b15d2c300b2a53eac87c57a775" - integrity sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg== +ua-parser-js@^1.0.0, ua-parser-js@^1.0.2: + version "1.0.32" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.32.tgz#786bf17df97de159d5b1c9d5e8e9e89806f8a030" + integrity sha512-dXVsz3M4j+5tTiovFVyVqssXBu5HM47//YSOeZ9fQkdDKkfzv2v3PP1jmH6FUyPW+yCSn7aBVK1fGGKNhowdDA== uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" @@ -12433,6 +12315,11 @@ universalify@^0.2.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -12456,14 +12343,6 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.5: - version "1.0.9" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz#2924d3927367a38d5c555413a7ce138fc95fcb18" - integrity sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - update-browserslist-db@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" @@ -12508,9 +12387,9 @@ use-callback-ref@^1.3.0: tslib "^2.0.0" use-memo-one@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.2.tgz#0c8203a329f76e040047a35a1197defe342fab20" - integrity sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ== + version "1.1.3" + resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.3.tgz#2fd2e43a2169eabc7496960ace8c79efef975e99" + integrity sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ== use-sidecar@^1.1.2: version "1.1.2" @@ -12577,6 +12456,11 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +uuid@7: + version "7.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" + integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== + uuid@8.3.2, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -12633,10 +12517,10 @@ vt-pbf@^3.1.1: "@mapbox/vector-tile" "^1.3.1" pbf "^3.2.1" -w3c-xmlserializer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" - integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== dependencies: xml-name-validator "^4.0.0" @@ -12782,6 +12666,11 @@ webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack- source-list-map "^2.0.0" source-map "~0.6.1" +"webpack-sources@^2.0.0 || ^3.0.0": + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + webpack@^4.46.0: version "4.46.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" @@ -12837,16 +12726,6 @@ whatwg-encoding@^2.0.0: dependencies: iconv-lite "0.6.3" -whatwg-fetch@>=0.10.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" - integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== - -whatwg-fetch@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-0.9.0.tgz#0e3684c6cb9995b43efc9df03e4c365d95fd9cc0" - integrity sha512-DIuh7/cloHxHYwS/oRXGgkALYAntijL63nsgMQsNSnBj825AysosAqA2ZbYXGRqpPRiNH7335dTqV364euRpZw== - whatwg-mimetype@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" @@ -12897,11 +12776,33 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== +which-typed-array@^1.1.8: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + which@^1.2.14, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -12999,7 +12900,7 @@ ws@^6.2.1: dependencies: async-limiter "~1.0.0" -ws@^8.9.0: +ws@^8.11.0: version "8.11.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== @@ -13050,9 +12951,9 @@ yaml@^1.10.0: integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yaml@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.1.tgz#1e06fb4ca46e60d9da07e4f786ea370ed3c3cfec" - integrity sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw== + version "2.1.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.3.tgz#9b3a4c8aff9821b696275c79a8bee8399d945207" + integrity sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg== yargs-parser@^13.1.2: version "13.1.2" @@ -13075,12 +12976,12 @@ yargs-parser@^20.2.3: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@^21.0.0, yargs-parser@^21.1.1: +yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^13.2.4, yargs@^13.3.0, yargs@^13.3.2: +yargs@^13.3.2: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== @@ -13096,7 +12997,7 @@ yargs@^13.2.4, yargs@^13.3.0, yargs@^13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@^15.4.1: +yargs@^15.3.1, yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== @@ -13113,20 +13014,7 @@ yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^17.0.1: - version "17.5.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" - integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.0.0" - -yargs@^17.3.1: +yargs@^17.0.1, yargs@^17.3.1: version "17.6.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==