From b90b9a301e78419b72f2f95d97cfbf6cd5d1cb15 Mon Sep 17 00:00:00 2001 From: Sky Blaise <69448615+SkyBlaise99@users.noreply.github.com> Date: Thu, 7 Mar 2024 10:38:57 +0800 Subject: [PATCH] [#944] Resolve Merge Conflict (#2139) Currently the branch is ready but out of sync with the master branch, which had some major revamp in both the frontend and backend. Let's merge the master branch into this branch to keep it up to date. --- README.md | 4 + docs/dg/learningBasics.md | 24 +- docs/dg/settingUp.md | 2 +- docs/dg/styleGuides.md | 24 +- docs/ug/cli.md | 3 +- docs/ug/configFiles.md | 6 +- frontend/.eslintrc.json | 21 +- frontend/.stylelintrc.json | 4 +- frontend/cypress/support.js | 4 + .../chartView/chartView_zoomFeature.cy.js | 11 + .../codeView/codeView_renderFilterHash.cy.js | 495 +++++++++++++++++ frontend/cypress/tests/general/general.cy.js | 4 + frontend/package-lock.json | 515 ++++++++++-------- frontend/package.json | 2 + frontend/public/favicon.ico | Bin 1150 -> 3760 bytes frontend/src/app.vue | 4 +- frontend/src/components/c-authorship-file.vue | 351 ++++++++++++ frontend/src/components/c-ramp.vue | 9 +- .../src/components/c-segment-collection.vue | 4 +- frontend/src/components/c-segment.vue | 87 ++- .../src/components/c-stacked-bar-chart.vue | 4 +- frontend/src/components/c-summary-charts.vue | 33 +- frontend/src/components/c-title.vue | 38 ++ frontend/src/mixin/dynamicTooltipMixin.ts | 13 +- frontend/src/router/index.ts | 2 +- frontend/src/styles/panels.scss | 1 - frontend/src/types/vuex.d.ts | 3 +- frontend/src/types/window.ts | 7 +- frontend/src/utils/api.ts | 11 +- frontend/src/utils/segment.ts | 21 - frontend/src/utils/user.ts | 40 -- frontend/src/views/c-authorship.vue | 413 ++------------ frontend/src/views/c-home.vue | 3 + frontend/src/views/c-summary.vue | 40 +- frontend/src/views/c-zoom.vue | 18 +- src/main/java/reposense/RepoSense.java | 6 +- .../authorship/FileInfoAnalyzer.java | 26 +- src/main/java/reposense/model/Author.java | 9 +- .../java/reposense/model/CliArguments.java | 169 ++---- .../reposense/model/CliRunConfiguration.java | 10 +- .../model/ConfigRunConfiguration.java | 4 +- .../reposense/model/RepoConfiguration.java | 482 +++++++++++++--- .../java/reposense/model/RepoLocation.java | 2 +- .../reposense/model/RunConfiguration.java | 6 +- .../java/reposense/parser/ArgsParser.java | 161 +++--- .../parser/AuthorConfigCsvParser.java | 2 + .../parser/ConfigurationBuildException.java | 8 + src/main/java/reposense/parser/CsvParser.java | 3 + .../parser/GroupConfigCsvParser.java | 1 + .../reposense/parser/RepoConfigCsvParser.java | 44 +- .../{ => exceptions}/InvalidCsvException.java | 2 +- .../InvalidHeaderException.java | 2 +- .../InvalidLocationException.java | 2 +- .../{ => exceptions}/ParseException.java | 2 +- .../{ => types}/AlphanumericArgumentType.java | 2 +- .../AnalysisThreadsArgumentType.java | 2 +- .../{ => types}/AssetsFolderArgumentType.java | 2 +- .../CloningThreadsArgumentType.java | 2 +- .../{ => types}/ConfigFolderArgumentType.java | 3 +- .../parser/{ => types}/DateArgumentType.java | 2 +- .../{ => types}/OutputFolderArgumentType.java | 3 +- .../{ => types}/PeriodArgumentType.java | 3 +- .../{ => types}/ReportFolderArgumentType.java | 2 +- .../{ => types}/SinceDateArgumentType.java | 2 +- .../{ => types}/UntilDateArgumentType.java | 2 +- .../{ => types}/ZoneIdArgumentType.java | 2 +- .../reposense/report/ReportGenerator.java | 3 +- src/main/java/reposense/util/StringsUtil.java | 6 +- src/main/java/reposense/util/TimeUtil.java | 31 +- .../java/reposense/ConfigSystemTest.java | 2 +- .../java/reposense/LocalRepoSystemTest.java | 18 +- .../java/reposense/util/SystemTestUtil.java | 15 +- .../authorship/FileAnalyzerTest.java | 44 +- .../authorship/FileResultAggregatorTest.java | 6 +- .../java/reposense/git/GitBranchTest.java | 6 +- .../model/RepoConfigurationTest.java | 297 ++++++++-- .../reposense/model/RepoLocationTest.java | 2 +- .../java/reposense/parser/ArgsParserTest.java | 33 ++ .../parser/AuthorConfigParserTest.java | 2 + .../parser/GroupConfigParserTest.java | 2 + .../parser/RepoConfigParserTest.java | 30 +- .../StandaloneConfigJsonParserTest.java | 9 +- .../reposense/report/ErrorSummaryTest.java | 2 +- .../java/reposense/report/RepoClonerTest.java | 9 +- .../reposense/template/GitTestTemplate.java | 10 +- 85 files changed, 2474 insertions(+), 1242 deletions(-) create mode 100644 frontend/cypress/tests/codeView/codeView_renderFilterHash.cy.js create mode 100644 frontend/src/components/c-authorship-file.vue create mode 100644 frontend/src/components/c-title.vue delete mode 100644 frontend/src/utils/segment.ts delete mode 100644 frontend/src/utils/user.ts create mode 100644 src/main/java/reposense/parser/ConfigurationBuildException.java rename src/main/java/reposense/parser/{ => exceptions}/InvalidCsvException.java (87%) rename src/main/java/reposense/parser/{ => exceptions}/InvalidHeaderException.java (85%) rename src/main/java/reposense/parser/{ => exceptions}/InvalidLocationException.java (86%) rename src/main/java/reposense/parser/{ => exceptions}/ParseException.java (83%) rename src/main/java/reposense/parser/{ => types}/AlphanumericArgumentType.java (96%) rename src/main/java/reposense/parser/{ => types}/AnalysisThreadsArgumentType.java (94%) rename src/main/java/reposense/parser/{ => types}/AssetsFolderArgumentType.java (96%) rename src/main/java/reposense/parser/{ => types}/CloningThreadsArgumentType.java (94%) rename src/main/java/reposense/parser/{ => types}/ConfigFolderArgumentType.java (94%) rename src/main/java/reposense/parser/{ => types}/DateArgumentType.java (96%) rename src/main/java/reposense/parser/{ => types}/OutputFolderArgumentType.java (92%) rename src/main/java/reposense/parser/{ => types}/PeriodArgumentType.java (96%) rename src/main/java/reposense/parser/{ => types}/ReportFolderArgumentType.java (96%) rename src/main/java/reposense/parser/{ => types}/SinceDateArgumentType.java (98%) rename src/main/java/reposense/parser/{ => types}/UntilDateArgumentType.java (95%) rename src/main/java/reposense/parser/{ => types}/ZoneIdArgumentType.java (96%) diff --git a/README.md b/README.md index 826ba90910..47b6943e09 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,10 @@ RepoSense is a contribution analysis tool for Git repositories. It is particular - [User Guide for the latest `master` (not yet released to users)](https://reposense.github.io/RepoSense) --- +### Our Contributors : + + + **Acknowledgements**: The web previews of RepoSense is powered by Netlify and Surge. diff --git a/docs/dg/learningBasics.md b/docs/dg/learningBasics.md index de958aae0c..d69923593c 100644 --- a/docs/dg/learningBasics.md +++ b/docs/dg/learningBasics.md @@ -82,13 +82,13 @@ Here are some small tasks for you to gain some basic knowledge of the code relat Therefore, the first step you can take is to add the following to `ArgsParser`. - ``` + ```java public static final String[] JSON_PRINT_MODE_FLAGS = new String[]{"--use-json-pretty-printing", "-j"}; ``` In `getArgumentParser` method, add the following content to make `ArgumentParser` capture the new argument. - ``` + ```java parser.addArgument(JSON_PRINT_MODE_FLAGS) .dest(JSON_PRINT_MODE_FLAGS[0]) .action(Arguments.storeTrue()) @@ -102,7 +102,7 @@ Here are some small tasks for you to gain some basic knowledge of the code relat 1. Add the following content to `CliArguments` to include `isPrettyPrintingUsed` as a new attribute to the class. - ``` + ```java protected boolean isPrettyPrintingUsed; public boolean isPrettyPrintingUsed() { @@ -112,13 +112,13 @@ Here are some small tasks for you to gain some basic knowledge of the code relat 2. In the constructor of `ConfigCliArguments`, add `isPrettyPrintingUsed` as a new parameter of the method, and add the following instruction to the method body. - ``` + ```java this.isPrettyPrintingUsed = isPrettyPrintingUsed; ``` 3. In the `parse` method of `ArgsParser`, add the following instruction to get `isJsonPrettyPrintingUsed` from `ArgmentParser`. - ``` + ```java boolean isJsonPrettyPrintingUsed = results.get(JSON_PRINT_MODE_FLAGS[0]); ``` @@ -139,13 +139,13 @@ Here are some small tasks for you to gain some basic knowledge of the code relat 2. Add the following content to `FileUtil`. - ``` + ```java private static boolean isPrettyPrintingUsed = false; ``` 3. In the `writeJsonFile` method, Replace the creation of the `Gson` object with the following instructions. - ``` + ```java GsonBuilder gsonBuilder = new GsonBuilder() .registerTypeAdapter(LocalDateTime.class, (JsonSerializer) (date, typeOfSrc, context) -> new JsonPrimitive(date.format(DateTimeFormatter.ofPattern(GITHUB_API_DATE_FORMAT)))) @@ -160,7 +160,7 @@ Here are some small tasks for you to gain some basic knowledge of the code relat 4. To notify `FileUtil` of the switch between different printing mode, add the following method to `FileUtil`. - ``` + ```java public static void setPrettyPrintingMode(boolean isPrettyPrintingAdopted) { isPrettyPrintingUsed = isPrettyPrintingAdopted; } @@ -168,7 +168,7 @@ Here are some small tasks for you to gain some basic knowledge of the code relat 5. It is now possible to notify `FileUtil` of the printing mode switch by extracting the argument from the `CliArguments` object in the `main` method of `RepoSense.java` and passing it to the corresponding method in `FileUtil`. - ``` + ```java FileUtil.setPrettyPrintingMode(cliArguments.isPrettyPrintingUsed()); ``` @@ -225,7 +225,7 @@ Here are some small tasks for you to gain some basic knowledge of the code relat Add this to the catch block of `spawnCloneProcess` and `waitForCloneProcess`, so that the message will be captured in `summary.json`. - ``` + ```java ErrorSummary.getInstance().addErrorMessage(config.getDisplayName(), e.getMessage()); ``` @@ -358,7 +358,7 @@ Here are some small tasks for you to gain some basic knowledge of the code relat Add this to `c_summary.scss`. - ``` + ```css .active-text { color: mui-color('green'); } @@ -485,4 +485,4 @@ You can now proceed to learn the [contributing workflow](workflow.html). ## DevOps -If you want to understand and contribute to the DevOps aspect of RepoSense, you can refer to the [DevOps guide](https://github.com/reposense/RepoSense/wiki/DevOps-guide) for more information. +If you want to understand and contribute to the DevOps aspect of RepoSense, you can refer to the [DevOps guide](devOpsGuide.html) for more information. diff --git a/docs/dg/settingUp.md b/docs/dg/settingUp.md index a82a04e90b..6542919046 100644 --- a/docs/dg/settingUp.md +++ b/docs/dg/settingUp.md @@ -15,7 +15,7 @@ - Type `java -version`, `npm -v` and `git --version` respectively on your OS terminal and ensure that you have the correct version of each prerequisite installed. + Type `java -version`, `node -v` and `git --version` respectively on your OS terminal and ensure that you have the correct version of each prerequisite installed. diff --git a/docs/dg/styleGuides.md b/docs/dg/styleGuides.md index 13fd1191f4..69a607c0e1 100644 --- a/docs/dg/styleGuides.md +++ b/docs/dg/styleGuides.md @@ -22,7 +22,7 @@ Our coding standards are mostly based on those at [se-education.org/guides](http ## Note on Ternary Operators: Ternary operators can be used to shorten if-else blocks such as this: -``` +```java LocalDateTime min = ARBITRARY_FIRST_COMMIT_DATE_UTC.withZoneSameInstant(zoneId).toLocalDateTime(); if (!commitInfos.isEmpty()) { min = commitInfos.get(0).getTime(); @@ -31,7 +31,7 @@ return min; ``` The result would look something like this: -``` +```java return (commitInfos.isEmpty()) ? ARBITRARY_FIRST_COMMIT_DATE_UTC.withZoneSameInstant(zoneId).toLocalDateTime() : commitInfos.get(0).getTime(); @@ -48,8 +48,8 @@ In addition to what has been mentioned in the [**Java** coding standard (SE-EDU) * This is not necessary (although still recommended) for methods with `@Override` annotations if Javadoc is used. However, if the method that is being overriden is part of your code and has Javadoc, all parameters must be described. Negative Examples: -``` -Not okay (Only mentions zoneId parameter): +```java +// Not okay (Only mentions zoneId parameter): /** * Returns a {@link LocalDateTime} object adjusted for timezone given by {@code zoneId}. */ @@ -57,7 +57,7 @@ public LocalDateTime adjustTimeZone(LocalDateTime sinceDate, ZoneId zoneId) { //Code here } -Not okay (@param tag used only for zoneId) +// Not okay (@param tag used only for zoneId) /** * Returns a {@link LocalDateTime} object by adjusting {@code sinceDate} * to the timezone given by {@code zoneId}. @@ -69,8 +69,8 @@ public LocalDateTime adjustTimeZone(LocalDateTime sinceDate, ZoneId zoneId) { } ``` Positive Example #1: -``` -Okay (No @param tags): +```java +// Okay (No @param tags): /** * Returns a {@link LocalDateTime} object by adjusting {@code sinceDate} * to the timezone given by {@code zoneId}. @@ -80,8 +80,8 @@ public LocalDateTime adjustTimeZone(LocalDateTime sinceDate, ZoneId zoneId) { } ``` Positive Example #2: -``` -Okay (@param tags used for all inputs): +```java +// Okay (@param tags used for all inputs): /** * Returns a {@link LocalDateTime} object by adjusting {@code sinceDate} * to the timezone given by {@code zoneId}. @@ -98,8 +98,8 @@ public LocalDateTime adjustTimeZone(LocalDateTime sinceDate, ZoneId zoneId) { * This requirement does not apply to test code. * One `@throws` tag per unique exception. * The order of exceptions in the `@throws` tag block should match that of the method's `throws` statement. -``` -Not okay (order of exceptions in tag block and method signature do not match): +```java +// Not okay (order of exceptions in tag block and method signature do not match): /** * Returns a {@link LocalDateTime} object from {@code dateString}. * @@ -111,7 +111,7 @@ public LocalDateTime parseDate(String dateString) throws NullPointerException, P // Code here } -Should be: +// Should be: /** * Returns a {@link LocalDateTime} object from {@code dateString}. * diff --git a/docs/ug/cli.md b/docs/ug/cli.md index 2deb769b4b..55bbbb84a0 100644 --- a/docs/ug/cli.md +++ b/docs/ug/cli.md @@ -31,7 +31,8 @@ The section below provides explanations for each of the flags.
**`--assets ASSETS_DIRECTORY`**: Specifies where to place assets for report generation. -* Parameter: `ASSETS_DIRECTORY` The directory containing the assets files. A `favicon.ico` file can be placed here to customize the favicon of the dashboard. +* Parameter: `ASSETS_DIRECTORY` The directory containing the assets files. A `favicon.ico` file can be placed here to customize the favicon of the dashboard, +while a `title.md` file can be placed to customize the header of the report using [Markdown syntax](https://www.markdownguide.org/basic-syntax/). * Alias: `-a` * Example: `--assets ./assets` or `-a ./assets` diff --git a/docs/ug/configFiles.md b/docs/ug/configFiles.md index cb74d8ffff..1797f8e4ea 100644 --- a/docs/ug/configFiles.md +++ b/docs/ug/configFiles.md @@ -190,15 +190,15 @@ Date: Fri Feb 9 19:13:13 2018 +0800 ``` `ActualGitHostId` and `ConfiguredAuthorName` are both `Git Author Name` of the same author.
To find the author name that you are currently using for your current git repository, run the following command within your git repository: -``` {.no-line-numbers} +``` shell {.no-line-numbers} git config user.name ``` To set the author name to the value you want (e.g., to set it to your GitHub username) for your current git repository, you can use the following command ([more info](https://www.git-tower.com/learn/git/faq/change-author-name-email)): -``` {.no-line-numbers} +``` shell {.no-line-numbers} git config user.name "YOUR_AUTHOR_NAME” ``` To set the author name to use a default value you want for future git repositories, you can use the following command: -``` {.no-line-numbers} +``` shell {.no-line-numbers} git config --global user.name "YOUR_AUTHOR_NAME” ``` RepoSense expects the Git Author Name to be the same as author's username on the Git hosting platform (GitHub, GitLab, BitBucket). If an author's `Git Author Name` is different from their username on the Git hosting platform, the `Git Author Name` needs to be specified in the standalone config file. If the author has more than one `Git Author Name`, multiple values can be entered too. diff --git a/frontend/.eslintrc.json b/frontend/.eslintrc.json index 9b52391b50..7899f4ecf6 100644 --- a/frontend/.eslintrc.json +++ b/frontend/.eslintrc.json @@ -78,7 +78,26 @@ } ], "@typescript-eslint/member-delimiter-style": "error", - "@typescript-eslint/type-annotation-spacing": "error" + "@typescript-eslint/type-annotation-spacing": "error", + "@typescript-eslint/array-type": [ + "error", + { + "default": "array-simple", + "readonly": "array-simple" + } + ] + } + }, + { + "files": ["*.vue"], + "rules": { + "@typescript-eslint/array-type": [ + "error", + { + "default": "generic", + "readonly": "generic" + } + ] } } ] diff --git a/frontend/.stylelintrc.json b/frontend/.stylelintrc.json index ebef44f98c..7014b2f332 100644 --- a/frontend/.stylelintrc.json +++ b/frontend/.stylelintrc.json @@ -36,6 +36,8 @@ "scss/no-global-function-names": null, "selector-type-no-unknown": null, "at-rule-no-unknown": null, - "no-duplicate-selectors": null + "no-duplicate-selectors": null, + "block-opening-brace-space-before": "always", + "declaration-colon-space-before": "never" } } diff --git a/frontend/cypress/support.js b/frontend/cypress/support.js index d2376e351a..415bf86082 100644 --- a/frontend/cypress/support.js +++ b/frontend/cypress/support.js @@ -7,4 +7,8 @@ Cypress.Screenshot.defaults({ beforeEach(() => { cy.visit('/'); + cy.intercept({ + method: 'GET', + url: '/title.md', + }, '# RepoSense Intro').as('getTitleMd'); }); diff --git a/frontend/cypress/tests/chartView/chartView_zoomFeature.cy.js b/frontend/cypress/tests/chartView/chartView_zoomFeature.cy.js index ac8599ef95..4bb5e03a0b 100644 --- a/frontend/cypress/tests/chartView/chartView_zoomFeature.cy.js +++ b/frontend/cypress/tests/chartView/chartView_zoomFeature.cy.js @@ -251,6 +251,9 @@ describe('range changes in chartview should reflect in zoom', () => { cy.get('div.mui-textfield.search_box > input:visible') .should('be.visible') .type('jamessspanggg'); + cy.get('input[name="until"]:visible') + .type('2023-12-31'); + cy.get('body').type(zoomKey, { release: false }) .get('#summary-charts .summary-chart__ramp .ramp') .first() @@ -277,6 +280,9 @@ describe('range changes in chartview should reflect in zoom', () => { cy.get('div.mui-textfield.search_box > input:visible') .should('be.visible') .type('jamessspanggg'); + cy.get('input[name="until"]:visible') + .type('2023-12-31'); + cy.get('body').type(zoomKey, { release: false }) .get('#summary-charts .summary-chart__ramp .ramp') .first() @@ -303,6 +309,9 @@ describe('range changes in chartview should reflect in zoom', () => { cy.get('div.mui-textfield.search_box > input:visible') .should('be.visible') .type('jamessspanggg'); + cy.get('input[name="until"]:visible') + .type('2023-12-31'); + cy.get('body').type(zoomKey, { release: false }) .get('#summary-charts .summary-chart__ramp .ramp') .first() @@ -329,6 +338,8 @@ describe('range changes in chartview should reflect in zoom', () => { cy.get('div.mui-textfield.search_box > input:visible') .should('be.visible') .type('jamessspanggg'); + cy.get('input[name="until"]:visible') + .type('2023-12-31'); cy.get('body').type(zoomKey, { release: false }) .get('#summary-charts .summary-chart__ramp .ramp') diff --git a/frontend/cypress/tests/codeView/codeView_renderFilterHash.cy.js b/frontend/cypress/tests/codeView/codeView_renderFilterHash.cy.js new file mode 100644 index 0000000000..ec2c91e869 --- /dev/null +++ b/frontend/cypress/tests/codeView/codeView_renderFilterHash.cy.js @@ -0,0 +1,495 @@ +describe('render filter hash', () => { + it('search: url params should persist after change and reload', () => { + /* Check initial state */ + cy.get('div.mui-textfield.search_box > input:visible') + .should('be.visible') + .invoke('val') + .should('eq', ''); + + /* Enter search and test URL before and after reload */ + cy.get('div.mui-textfield.search_box > input:visible') + .should('be.visible') + .type('eugene{enter}'); + + cy.url() + .should('contain', 'search=eugene'); + + cy.reload(); + + cy.url() + .should('contain', 'search=eugene'); + }); + + it('group by: url params should persist after change and reload', () => { + /* Check initial state */ + cy.get('div.mui-select.grouping > select:visible') + .invoke('val') + .should('eq', 'groupByRepos'); + + cy.url() + .should('contain', 'groupSelect=groupByRepos'); + + /* Select group by none and test URL before and after reload */ + cy.get('div.mui-select.grouping > select:visible') + .select('groupByNone'); + + cy.url() + .should('contain', 'groupSelect=groupByNone'); + + cy.reload(); + + cy.url() + .should('contain', 'groupSelect=groupByNone'); + + /* Select group by authors and test URL before and after reload */ + cy.get('div.mui-select.grouping > select:visible') + .select('groupByAuthors'); + + cy.url() + .should('contain', 'groupSelect=groupByAuthors'); + + cy.reload(); + + cy.url() + .should('contain', 'groupSelect=groupByAuthors'); + }); + + it('sort groups by: url params should persist after change and reload', () => { + /* Check initial state */ + cy.get('div.mui-select.sort-group > select:visible') + .invoke('val') + .should('eq', 'groupTitle dsc'); + + cy.url() + .should('contain', 'sort=groupTitle%20dsc'); + + /* Select sort by group title ascending and test URL before and after reload */ + cy.get('div.mui-select.sort-group > select:visible') + .select('groupTitle'); + + cy.url() + .should('contain', 'sort=groupTitle'); + + cy.reload(); + + cy.url() + .should('contain', 'sort=groupTitle'); + + /* Select sort by contribution descending and test URL before and after reload */ + cy.get('div.mui-select.sort-group > select:visible') + .select('totalCommits dsc'); + + cy.url() + .should('contain', 'sort=totalCommits%20dsc'); + + cy.reload(); + + cy.url() + .should('contain', 'sort=totalCommits%20dsc'); + + /* Select sort by contribution ascending and test URL before and after reload */ + cy.get('div.mui-select.sort-group > select:visible') + .select('totalCommits'); + + cy.url() + .should('contain', 'sort=totalCommits'); + + cy.reload(); + + cy.url() + .should('contain', 'sort=totalCommits'); + + /* Select sort by variance descending and test URL before and after reload */ + cy.get('div.mui-select.sort-group > select:visible') + .select('variance dsc'); + + cy.url() + .should('contain', 'sort=variance%20dsc'); + + cy.reload(); + + cy.url() + .should('contain', 'sort=variance%20dsc'); + + /* Select sort by variance ascending and test URL before and after reload */ + cy.get('div.mui-select.sort-group > select:visible') + .select('variance'); + + cy.url() + .should('contain', 'sort=variance'); + + cy.reload(); + + cy.url() + .should('contain', 'sort=variance'); + }); + + it('sort within groups by: url params should persist after change and reload', () => { + /* Check initial state */ + cy.get('div.mui-select.sort-within-group > select:visible') + .invoke('val') + .should('eq', 'title'); + + cy.url() + .should('contain', 'sortWithin=title'); + + /* Select sort by group title ascending and test URL before and after reload */ + cy.get('div.mui-select.sort-within-group > select:visible') + .select('title dsc'); + + cy.url() + .should('contain', 'sortWithin=title'); + + cy.reload(); + + cy.url() + .should('contain', 'sortWithin=title'); + + /* Select sort by contribution descending and test URL before and after reload */ + cy.get('div.mui-select.sort-within-group > select:visible') + .select('totalCommits dsc'); + + cy.url() + .should('contain', 'sortWithin=totalCommits%20dsc'); + + cy.reload(); + + cy.url() + .should('contain', 'sortWithin=totalCommits%20dsc'); + + /* Select sort by contribution ascending and test URL before and after reload */ + cy.get('div.mui-select.sort-within-group > select:visible') + .select('totalCommits'); + + cy.url() + .should('contain', 'sortWithin=totalCommits'); + + cy.reload(); + + cy.url() + .should('contain', 'sortWithin=totalCommits'); + + /* Select sort by variance descending and test URL before and after reload */ + cy.get('div.mui-select.sort-within-group > select:visible') + .select('variance dsc'); + + cy.url() + .should('contain', 'sortWithin=variance%20dsc'); + + cy.reload(); + + cy.url() + .should('contain', 'sortWithin=variance%20dsc'); + + /* Select sort by variance ascending and test URL before and after reload */ + cy.get('div.mui-select.sort-within-group > select:visible') + .select('variance'); + + cy.url() + .should('contain', 'sortWithin=variance'); + + cy.reload(); + + cy.url() + .should('contain', 'sortWithin=variance'); + }); + + it('granularity: url params should persist after change and reload', () => { + /* Check initial state */ + cy.get('div.mui-select.granularity > select:visible') + .invoke('val') + .should('eq', 'commit'); + + cy.url() + .should('contain', 'timeframe=commit'); + + /* Select timeframe as day and test URL before and after reload */ + cy.get('div.mui-select.granularity > select:visible') + .select('day'); + + cy.url() + .should('contain', 'timeframe=day'); + + cy.reload(); + + cy.url() + .should('contain', 'timeframe=day'); + + /* Select timeframe as week and test URL before and after reload */ + cy.get('div.mui-select.granularity > select:visible') + .select('week'); + + cy.url() + .should('contain', 'timeframe=week'); + + cy.reload(); + + cy.url() + .should('contain', 'timeframe=week'); + }); + + it('since: url params should persist after change and reload', () => { + /* Check initial state */ + cy.get('input[name="since"]:visible') + .invoke('val') + .should('eq', '2018-05-03'); + + cy.url() + .should('contain', 'since=2018-05-03'); + + /* Modify since date and test URL before and after reload */ + cy.get('input[name="since"]:visible') + .type('2019-06-04'); + + cy.url() + .should('contain', 'since=2019-06-04'); + + cy.reload(); + + cy.url() + .should('contain', 'since=2019-06-04'); + }); + + it('until: url params should persist after change and reload', () => { + /* Check initial state (will require dayjs for getting current date) */ + // cy.get('input[name="until"]:visible') + // .invoke('val') + // .should('eq', dayjs().format('YYYY-MM-DD')); + + // cy.url() + // .should('contain', 'date=2023-07-06'); + + /* Modify since date and test URL before and after reload */ + cy.get('input[name="until"]:visible') + .type('2019-06-04'); + + cy.url() + .should('contain', 'until=2019-06-04'); + + cy.reload(); + + cy.url() + .should('contain', 'until=2019-06-04'); + }); + + it('breakdown by file type: url params should persist after change and reload', () => { + cy.get('#summary label.filter-breakdown input:visible') + .should('not.be.checked'); + + cy.url() + .should('contain', 'breakdown=false'); + + cy.get('#summary label.filter-breakdown input:visible') + .check(); + + cy.reload(); + + cy.url() + .should('contain', 'breakdown=true'); + }); + + it('merge all groups: url params should persist after change and reload', () => { + cy.get('#summary label.merge-group > input:visible') + .should('be.visible') + .check(); + + cy.url() + .should('contain', 'mergegroup=reposense%2FRepoSense%5Bcypress%5D'); + + cy.reload(); + + cy.url() + .should('contain', 'mergegroup=reposense%2FRepoSense%5Bcypress%5D'); + }); + + it('checked file types: url params should persist after change and reload', () => { + cy.get('#summary label.filter-breakdown input:visible') + .should('not.be.checked'); + + // Assumption: gradle is the first file type and yml is the last file type to appear in the list + cy.url() + .should('not.contain', 'gradle'); + + cy.url() + .should('not.contain', 'yml'); + + cy.get('#summary label.filter-breakdown input:visible') + .check() + .should('be.checked'); + + cy.get('#summary div.fileTypes input[id="gradle"]') + .should('be.checked'); + + cy.get('#summary div.fileTypes input[id="yml"]') + .should('be.checked'); + + cy.url() + .should('contain', 'gradle'); + + cy.url() + .should('contain', 'yml'); + + cy.reload(); + + cy.get('#summary div.fileTypes input[id="gradle"]') + .should('be.checked'); + + cy.get('#summary div.fileTypes input[id="yml"]') + .should('be.checked'); + + cy.url() + .should('contain', 'gradle'); + + cy.url() + .should('contain', 'yml'); + + cy.get('#summary div.fileTypes input[id="gradle"]') + .uncheck() + .should('not.be.checked'); + + cy.url() + .should('not.contain', 'gradle'); + + cy.url() + .should('contain', 'yml'); + + cy.reload(); + + cy.get('#summary div.fileTypes input[id="gradle"]') + .should('not.be.checked'); + + cy.get('#summary div.fileTypes input[id="yml"]') + .should('be.checked'); + + cy.url() + .should('not.contain', 'gradle'); + + cy.url() + .should('contain', 'yml'); + }); + + it('code panel: sort by: url params should persist after change and reload', () => { + // open the code panel + cy.get('.icon-button.fa-code') + .should('be.visible') + .first() + .click(); + + cy.get('div.mui-select.sort-by > select:visible') + .invoke('val') + .should('eq', 'linesOfCode'); + + cy.url() + .should('not.contain', 'authorshipSortBy'); + + /* Select file name and test URL before and after reload */ + cy.get('div.mui-select.sort-by > select:visible') + .select('fileName'); + + cy.url() + .should('contain', 'authorshipSortBy=fileName'); + + cy.reload(); + + cy.url() + .should('not.contain', '%23%2F'); + + cy.url() + .should('contain', 'authorshipSortBy=fileName'); + + /* Select file type and test URL before and after reload */ + cy.get('div.mui-select.sort-by > select:visible') + .select('fileType'); + + cy.url() + .should('contain', 'authorshipSortBy=fileType'); + + cy.reload(); + + cy.url() + .should('not.contain', '%23%2F'); + + cy.url() + .should('contain', 'authorshipSortBy=fileType'); + }); + + it('code panel: order: url params should persist after change and reload', () => { + // open the code panel + cy.get('.icon-button.fa-code') + .should('be.visible') + .first() + .click(); + + cy.get('div.mui-select.sort-order > select:visible') + .invoke('val') + .should('eq', 'true'); // true is Descending + + cy.url() + .should('not.contain', 'reverseAuthorshipOrder'); + + /* Select ascending and test URL before and after reload */ + cy.get('div.mui-select.sort-order > select:visible') + .select('false'); + + cy.url() + .should('contain', 'reverseAuthorshipOrder=false'); + + cy.reload(); + + cy.url() + .should('not.contain', '%23%2F'); + + cy.url() + .should('contain', 'reverseAuthorshipOrder=false'); + + /* Select descending and test URL before and after reload */ + + cy.get('div.mui-select.sort-order > select:visible') + .select('true'); + + cy.url() + .should('contain', 'reverseAuthorshipOrder=true'); + + cy.reload(); + + cy.url() + .should('not.contain', '%23%2F'); + + cy.url() + .should('contain', 'reverseAuthorshipOrder=true'); + }); + + it('code panel: filter by glob: url params should persist after change and reload', () => { + // open the code panel + cy.get('.icon-button.fa-code') + .should('be.visible') + .first() + .click(); + + // click on filter glob radio button + cy.get('.radio-button--search') + .should('be.visible') + .click(); + + // enter some input + cy.get('#search') + .type('README.md'); + + // submit + cy.get('#search') + .type('{enter}'); + + cy.url() + .should('contain', 'authorshipFilesGlob=README.md'); + + // Some bugs appear after two reloads, so reload twice here + cy.reload(); + cy.reload(); + + cy.url() + .should('not.contain', '%23%2F'); + + cy.url() + .should('contain', 'authorshipFilesGlob=README.md'); + }); +}); diff --git a/frontend/cypress/tests/general/general.cy.js b/frontend/cypress/tests/general/general.cy.js index 8dc8bfe150..a7023b57b1 100644 --- a/frontend/cypress/tests/general/general.cy.js +++ b/frontend/cypress/tests/general/general.cy.js @@ -2,4 +2,8 @@ describe('general', () => { it('correctly replaces report title', () => { cy.title().should('eq', 'RepoSense Test Report'); }); + + it('correctly contains given title', () => { + cy.get('h1').should('contain', 'RepoSense Intro'); + }); }); diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 56afac2e4f..559a5e5ee9 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -14,15 +14,18 @@ "@fortawesome/free-brands-svg-icons": "^6.0.0", "@fortawesome/free-solid-svg-icons": "^6.0.0", "@fortawesome/vue-fontawesome": "^3.0.3", + "@types/markdown-it": "^13.0.7", "@types/minimatch": "^5.1.2", "@types/seedrandom": "^3.0.5", "core-js": "^3.6.5", "highlight.js": "^10.5.0", "jszip": "^3.5.0", + "markdown-it": "^14.0.0", "minimatch": "^5.0.1", "muicss": "^0.10.3", "normalize.css": "^8.0.1", "pug-lint-vue": "^0.4.0", + "raw-loader": "^4.0.2", "seedrandom": "^3.0.5", "vue": "^3.2.47", "vue-loading-overlay": "^5.0.3", @@ -2002,7 +2005,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -2011,7 +2013,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -2020,7 +2021,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -2030,7 +2030,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -2043,14 +2042,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.17", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -2366,7 +2363,6 @@ "version": "8.4.10", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "dev": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -2376,7 +2372,6 @@ "version": "3.7.4", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -2385,8 +2380,7 @@ "node_modules/@types/estree": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "dev": true + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" }, "node_modules/@types/express": { "version": "4.17.15", @@ -2429,8 +2423,7 @@ "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -2438,6 +2431,25 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/linkify-it": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==" + }, + "node_modules/@types/markdown-it": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.7.tgz", + "integrity": "sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==", + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", + "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==" + }, "node_modules/@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", @@ -2458,8 +2470,7 @@ "node_modules/@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "dev": true + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -3631,7 +3642,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1" @@ -3640,26 +3650,22 @@ "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", @@ -3669,14 +3675,12 @@ "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -3688,7 +3692,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -3697,7 +3700,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -3705,14 +3707,12 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -3728,7 +3728,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", @@ -3741,7 +3740,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -3753,7 +3751,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", @@ -3767,7 +3764,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" @@ -3776,14 +3772,12 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/abbrev": { "version": "1.1.1", @@ -3808,7 +3802,6 @@ "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -3820,7 +3813,6 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, "peerDependencies": { "acorn": "^8" } @@ -3895,7 +3887,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3950,7 +3941,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -4072,8 +4062,7 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-flatten": { "version": "2.1.2", @@ -4471,7 +4460,6 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, "engines": { "node": "*" } @@ -4641,7 +4629,6 @@ "version": "4.21.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, "funding": [ { "type": "opencollective", @@ -4692,8 +4679,7 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/bytes": { "version": "3.0.0", @@ -4836,7 +4822,6 @@ "version": "1.0.30001446", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001446.tgz", "integrity": "sha512-fEoga4PrImGcwUUGEol/PoFCSBnSkA9drgdkxXkJLsUBOnJ8rs3zDv6ApqYXGQFOyMPsjh79naWhF4DAxbF8rw==", - "dev": true, "funding": [ { "type": "opencollective", @@ -4996,7 +4981,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, "engines": { "node": ">=6.0" } @@ -6234,8 +6218,7 @@ "node_modules/electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -6247,7 +6230,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, "engines": { "node": ">= 4" } @@ -6284,7 +6266,6 @@ "version": "5.12.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "dev": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -6297,7 +6278,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -6396,8 +6376,7 @@ "node_modules/es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" }, "node_modules/es-set-tostringtag": { "version": "2.0.1", @@ -6443,7 +6422,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -6728,7 +6706,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -7092,7 +7069,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -7104,7 +7080,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "engines": { "node": ">=4.0" } @@ -7113,7 +7088,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, "engines": { "node": ">=4.0" } @@ -7159,7 +7133,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, "engines": { "node": ">=0.8.x" } @@ -7374,8 +7347,7 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.2.12", @@ -7408,8 +7380,7 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -7574,9 +7545,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "dev": true, "funding": [ { @@ -8070,8 +8041,7 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.11", @@ -8252,8 +8222,7 @@ "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "node_modules/grapheme-splitter": { "version": "1.0.4", @@ -9301,7 +9270,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -9315,7 +9283,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -9324,7 +9291,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -9422,8 +9388,7 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema": { "version": "0.4.0", @@ -9434,8 +9399,7 @@ "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -9453,7 +9417,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -9588,11 +9551,18 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, "engines": { "node": ">=6.11.5" } @@ -10003,6 +9973,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/markdown-it": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.0.0.tgz", + "integrity": "sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.0.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, "node_modules/mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", @@ -10019,6 +10005,11 @@ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", "dev": true }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -10084,8 +10075,7 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", @@ -10134,7 +10124,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -10143,7 +10132,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -10492,8 +10480,7 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/nice-try": { "version": "1.0.5", @@ -10661,8 +10648,7 @@ "node_modules/node-releases": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", - "dev": true + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==" }, "node_modules/node-sass": { "version": "7.0.3", @@ -12752,7 +12738,14 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "engines": { "node": ">=6" } @@ -12799,7 +12792,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -12849,6 +12841,55 @@ "node": ">=0.10.0" } }, + "node_modules/raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/raw-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/raw-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/react": { "version": "16.14.0", "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", @@ -13677,7 +13718,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, "dependencies": { "randombytes": "^2.1.0" } @@ -13996,7 +14036,6 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -14858,7 +14897,6 @@ "version": "5.16.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", - "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -14876,7 +14914,6 @@ "version": "5.3.6", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", - "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.14", "jest-worker": "^27.4.5", @@ -14910,7 +14947,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -14927,8 +14963,7 @@ "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/text-table": { "version": "0.2.0", @@ -15354,6 +15389,11 @@ "node": ">=4.2.0" } }, + "node_modules/uc.micro": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.0.0.tgz", + "integrity": "sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig==" + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -15449,7 +15489,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -15475,7 +15514,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -15851,7 +15889,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -15888,7 +15925,6 @@ "version": "5.76.2", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz", "integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==", - "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", @@ -16277,7 +16313,6 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, "engines": { "node": ">=10.13.0" } @@ -16291,14 +16326,12 @@ "node_modules/webpack/node_modules/@types/estree": { "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -16316,7 +16349,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -18089,20 +18121,17 @@ "@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, "@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" }, "@jridgewell/source-map": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -18112,7 +18141,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, "requires": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -18124,14 +18152,12 @@ "@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "@jridgewell/trace-mapping": { "version": "0.3.17", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, "requires": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -18396,7 +18422,6 @@ "version": "8.4.10", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "dev": true, "requires": { "@types/estree": "*", "@types/json-schema": "*" @@ -18406,7 +18431,6 @@ "version": "3.7.4", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, "requires": { "@types/eslint": "*", "@types/estree": "*" @@ -18415,8 +18439,7 @@ "@types/estree": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "dev": true + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" }, "@types/express": { "version": "4.17.15", @@ -18459,8 +18482,7 @@ "@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "@types/json5": { "version": "0.0.29", @@ -18468,6 +18490,25 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "@types/linkify-it": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==" + }, + "@types/markdown-it": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.7.tgz", + "integrity": "sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==", + "requires": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "@types/mdurl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", + "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==" + }, "@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", @@ -18488,8 +18529,7 @@ "@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "dev": true + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" }, "@types/normalize-package-data": { "version": "2.4.1", @@ -19387,7 +19427,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1" @@ -19396,26 +19435,22 @@ "@webassemblyjs/floating-point-hex-parser": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" }, "@webassemblyjs/helper-api-error": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" }, "@webassemblyjs/helper-buffer": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" }, "@webassemblyjs/helper-numbers": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, "requires": { "@webassemblyjs/floating-point-hex-parser": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", @@ -19425,14 +19460,12 @@ "@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" }, "@webassemblyjs/helper-wasm-section": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -19444,7 +19477,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } @@ -19453,7 +19485,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, "requires": { "@xtuc/long": "4.2.2" } @@ -19461,14 +19492,12 @@ "@webassemblyjs/utf8": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" }, "@webassemblyjs/wasm-edit": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -19484,7 +19513,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", @@ -19497,7 +19525,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -19509,7 +19536,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", @@ -19523,7 +19549,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" @@ -19532,14 +19557,12 @@ "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "abbrev": { "version": "1.1.1", @@ -19560,14 +19583,12 @@ "acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" }, "acorn-import-assertions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, "requires": {} }, "acorn-jsx": { @@ -19623,7 +19644,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -19664,7 +19684,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, "requires": {} }, "ansi-escapes": { @@ -19748,8 +19767,7 @@ "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "array-flatten": { "version": "2.1.2", @@ -20044,8 +20062,7 @@ "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, "binary-extensions": { "version": "2.2.0", @@ -20188,7 +20205,6 @@ "version": "4.21.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, "requires": { "caniuse-lite": "^1.0.30001400", "electron-to-chromium": "^1.4.251", @@ -20209,8 +20225,7 @@ "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "bytes": { "version": "3.0.0", @@ -20326,8 +20341,7 @@ "caniuse-lite": { "version": "1.0.30001446", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001446.tgz", - "integrity": "sha512-fEoga4PrImGcwUUGEol/PoFCSBnSkA9drgdkxXkJLsUBOnJ8rs3zDv6ApqYXGQFOyMPsjh79naWhF4DAxbF8rw==", - "dev": true + "integrity": "sha512-fEoga4PrImGcwUUGEol/PoFCSBnSkA9drgdkxXkJLsUBOnJ8rs3zDv6ApqYXGQFOyMPsjh79naWhF4DAxbF8rw==" }, "case-sensitive-paths-webpack-plugin": { "version": "2.4.0", @@ -20442,8 +20456,7 @@ "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" }, "ci-info": { "version": "1.6.0", @@ -21353,8 +21366,7 @@ "electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" }, "emoji-regex": { "version": "8.0.0", @@ -21365,8 +21377,7 @@ "emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, "encodeurl": { "version": "1.0.2", @@ -21397,7 +21408,6 @@ "version": "5.12.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "dev": true, "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -21406,8 +21416,7 @@ "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" } } }, @@ -21490,8 +21499,7 @@ "es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" }, "es-set-tostringtag": { "version": "2.0.1", @@ -21527,8 +21535,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-html": { "version": "1.0.3", @@ -21871,7 +21878,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -22012,7 +22018,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "requires": { "estraverse": "^5.2.0" }, @@ -22020,16 +22025,14 @@ "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" } } }, "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "estree-walker": { "version": "2.0.2", @@ -22062,8 +22065,7 @@ "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "execa": { "version": "1.0.0", @@ -22229,8 +22231,7 @@ "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { "version": "3.2.12", @@ -22259,8 +22260,7 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", @@ -22394,9 +22394,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "dev": true }, "for-each": { @@ -22762,8 +22762,7 @@ "glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "global-modules": { "version": "2.0.0", @@ -22889,8 +22888,7 @@ "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "grapheme-splitter": { "version": "1.0.4", @@ -23644,7 +23642,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -23654,14 +23651,12 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -23739,8 +23734,7 @@ "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema": { "version": "0.4.0", @@ -23751,8 +23745,7 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -23769,8 +23762,7 @@ "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "jsonfile": { "version": "6.1.0", @@ -23882,11 +23874,18 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "requires": { + "uc.micro": "^2.0.0" + } + }, "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" }, "loader-utils": { "version": "1.4.2", @@ -24212,6 +24211,19 @@ "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true }, + "markdown-it": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.0.0.tgz", + "integrity": "sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==", + "requires": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.0.0" + } + }, "mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", @@ -24224,6 +24236,11 @@ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", "dev": true }, + "mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -24277,8 +24294,7 @@ "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "merge2": { "version": "1.4.1", @@ -24311,14 +24327,12 @@ "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "requires": { "mime-db": "1.52.0" } @@ -24584,8 +24598,7 @@ "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "nice-try": { "version": "1.0.5", @@ -24714,8 +24727,7 @@ "node-releases": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", - "dev": true + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==" }, "node-sass": { "version": "7.0.3", @@ -26258,8 +26270,12 @@ "punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + }, + "punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==" }, "qs": { "version": "6.5.3", @@ -26283,7 +26299,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -26323,6 +26338,37 @@ } } }, + "raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, "react": { "version": "16.14.0", "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", @@ -26950,7 +26996,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, "requires": { "randombytes": "^2.1.0" } @@ -27207,7 +27252,6 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -27874,7 +27918,6 @@ "version": "5.16.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", - "dev": true, "requires": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -27885,8 +27928,7 @@ "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" } } }, @@ -27894,7 +27936,6 @@ "version": "5.3.6", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", - "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.14", "jest-worker": "^27.4.5", @@ -27907,7 +27948,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -28236,6 +28276,11 @@ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true }, + "uc.micro": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.0.0.tgz", + "integrity": "sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig==" + }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -28310,7 +28355,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -28320,7 +28364,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -28612,7 +28655,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -28646,7 +28688,6 @@ "version": "5.76.2", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz", "integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==", - "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", @@ -28677,14 +28718,12 @@ "@types/estree": { "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -28694,8 +28733,7 @@ "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" } } }, @@ -28943,8 +28981,7 @@ "webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" }, "webpack-virtual-modules": { "version": "0.4.6", diff --git a/frontend/package.json b/frontend/package.json index 549cbed432..86dd372108 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,11 +19,13 @@ "@fortawesome/free-brands-svg-icons": "^6.0.0", "@fortawesome/free-solid-svg-icons": "^6.0.0", "@fortawesome/vue-fontawesome": "^3.0.3", + "@types/markdown-it": "^13.0.7", "@types/minimatch": "^5.1.2", "@types/seedrandom": "^3.0.5", "core-js": "^3.6.5", "highlight.js": "^10.5.0", "jszip": "^3.5.0", + "markdown-it": "^14.0.0", "minimatch": "^5.0.1", "muicss": "^0.10.3", "normalize.css": "^8.0.1", diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico index cce77ba0c5d82a86e1ece22516d70fe92aade0fe..6321b8272f79378379214a87cf21787627116632 100644 GIT binary patch literal 3760 zcmbVPc{r478&763rerPQbWBtfN!BPd8ij0;v2U3u`>q*8Q&|pKL#W8Uk7g{<;5a3t zFqVc8QnoRcBU{GyJu~N=>-*>XhTS$ zwal=RqTh7J=3T z852I)uaJ#m?;&R3 zhkip^=QpbX={N*XdS4V(ly$k9Xw9Au%T1hCxA|B)3Mu0r-A68EPv2{zJ>Sak=_gmTME? zmt!=;j>t&0H4$gYKnRIE{Uy%6FY1*aZp*!_Yd_2L`G3#`W0~@3Y2EWL5r-G%->kukeDut+qp7cr^%l)!sv>>tfaWtWe2D2l%xk7yH#7Q9N6#LiefRkgFBAvo8TtMu~PB!<{HM163QvymqIuQFj3TB|mC(Xx{eqtq<-e zMlhZ4h}T{3z42;eP2Crq==jM!U6Zi*J|WBOds|0INZT_4(tIMDY82`$XPB+ntP`&C zAZGNceU+1Z&-C!?s7S!#c_i7$W+gMw{vL?99K`Om+NXi{HfQ{Qh{5qXGteY+q43AH zf&Klx(|re601h2DvpuI}lXB-Y{}@#lGd~}*Uogw z&1YfUBQBxXPvqX6;IcE#fRO5Z1VatC9zi-4pY)bME40cYyC5E-nP6{yj(3R9} z3=PLZ<%oY$p4m3uyMhG)m7zT}5M0gjr9gglzaI3?aR7yu_$RSwL&-#8A;zSb*EbRUy(e^gB#{{Y23*D( zeOs1Q_3rp<5f|DdctN5@aGO@Si9X7D9PmC_5^a|Uh=%AV;-m27k&V)_dWprrW+$48 z0Be<18>Kf#Gyjm)qw538e~(xMuQM)Nw+kt{#75aQvGpa_xrxTiT}%x)=e<4mPOq%? zI`FM@w04s=Eq2bcm>~*c9*>vKml-f5<1C9<1-Vsbp89%7lzDp+t23aomt7d6qO=Cq z$2l`}M@VkuuTdq6%x?5STy-%gv}Lb8pOfo=iht-zqMFu5#fI-}IZ3`|PVcVcZNhTV zn;o*n+yeIFvm+Ng)}l-G+!ay7g(vjcOMH%1aNx}!jXj% zcI3YrE|!T7jaX6z&1D&Lf=P<2!!`(n9X%51^zY}SW6y|v+Dcy0!aJ#n=?c))6im+lvfH(#vV3rfI|=0w#ifnhdi4KwqyN;>ZXZH=b&%Z~rg$@3 zT2owh;ZX06q0ppS|QLE;emd&M?;4bJSkrTO<2lF{A6 z>ir#VzU>`^mCU4{R=Q4r8l+&pB2!#3eL?Es{)M=!AjBKb(1yPCMmT=}>m2ejQ=M(rzf79_qnn=~GH8%j2jM#qVJj5lV zKq+GUJ)poK*iQrs*bV3d%Mu~=f*ZD*CW>{E;x;uEd!ZbhdVCoca%SnXlcT-2%4*I3 z+U3Sol6acOv2jYiyA21>n~6{u`(ilN8(cnwj$nf)>o8RIXS75%r_ekA(A#*}{)}Vu ze?+#Yn|A$-@sccN^GJ_dD7)~I-tt5v?0%0ikc-B{6iZY*kt4Fxh0k6Iji3|3hBQ+CavE52Z(!pDHqgkXk<+axVONjjv6v#=dj(J~+ zCyz%&BOFquEO09t%_S51r~FlY zTPQ!Ynddtr@e%w&$kGF{&*ZVfeSRaTG@j(Om2;WgP!368kOEFKW2<$;usd4TCCX`( zuMpt~xt@5MX!>pB9oF>)^ZS*w6G!8-YvadN*-2xng96b@96ueCAh6MyKfEpoVqFGi zs)N=MG2U7EOqDkKI8af`@_vs#{zj6Q?I6X>9`nUx-{Gd(p;cDO$iPh}r{+S8g1t_w z<}L0vBpC(_xdz*K;&`AOd8tq_T5)^MCdT(I1va5yN zNPIeA{*U9)2&z=9)w&=tS7rn)X0MI>9hQYy9~{T^=aOe;rr+3rl|FF4@HtffMxfwe zr1bzeesD;Z<6%Tz-S*Z{!Hkh&_eKDf-vtR#6^2)cUpJ2Wh7 z%^W@erP-%xsW&}ct`3fCjt}klM9vU|GlnZ!C!z@cAfy*{o~CKJ(*OZ~&dA!=`ExbpS18Z_%0(!xkKF%(&zP!ytb3UtA2<7tO7l?IN z8iUy@V_X+!H~Z?51zdU!H&>@sKW?iXlVqAGOZLv<2&@!@5vy^=W7)gL*oxaz7EA;0 zxoGosX<*{Hk8(w0A1oSO$|tXZD#VYfmGwypz0+!iztR78_J!8Z?lYe;se*%H`YHo@ zl}1l%)OjZu-(3e5a3Jud@hEZU5j*THyQ!?AW&V^8RJ99}qYg}0!|+e$heJa{EH1Nk zrqPkQ3aXPAi)NOWS>^9Hgx4Fp#yHuTuYv1+8f--{g|}y4%`RBwCnb#%mnIG|LNhs7 ziJW*^fy=h`sVuG$nZIEaMb^8ZB@FpQVhl>wUn=eyOXLl~7`edR=#xHhm1caz7k rIcEtY+eDlVA literal 1150 zcmbW1Ur19?7{E`^TQAZ>)LRr}89|^lneB#8)>pPo@mcbU6-}&?1^E=-;-@_qfAAS`T z1lyzJ)_y_`5kgKP7{W*~jvXQR@8E$Vg*i5tOm$Cc^`|G1;7&C9s!+YLwyk?*+S0M2 zgpgooHXd|kW5ISD<9rh5&!|&*^9bxkO=G3lo|zi8E=%D3J`a(f83=Ev(36`18gqP= zqow#ZT#LB?^MZdp2_H6=(2tbm(>?mWCE(+)91O27mgUo2gKG-~*RwhYbT3M&=Wj)S zEdL2YKhp4ebrzmyW83%F{G)y+ZX5<$KYqDbKOXNsl25{T{xdi?eLL1q$7rqRZdXkp z!Y&$5i5CnSi%Xp{+f_-ls}bSpCUlIkfHM@1P{g-2LoSxV3=lsiE-j(k7iWc zbqwmdj{ily`%IMj`ltzpm&Sl!=myuK8%8n#xGO){_V;pWY^U#21qkINh_B5;+q@I# zo?H1#@!zZC;7z@Q{?uC-O8bG{sa$^`?Snyd{dksge7e?}=zzY|5WGmf0jx>MK09OM v8HI}&, userUpdated: false, loadingOverlayOpacity: 1, @@ -132,7 +132,7 @@ const app = defineComponent({ } }, getUsers() { - const full: Repo[] = []; + const full: Array = []; Object.keys(this.repos).forEach((repo) => { if (this.repos[repo].users) { full.push(this.repos[repo]); diff --git a/frontend/src/components/c-authorship-file.vue b/frontend/src/components/c-authorship-file.vue new file mode 100644 index 0000000000..96bd83dd53 --- /dev/null +++ b/frontend/src/components/c-authorship-file.vue @@ -0,0 +1,351 @@ + + + + + diff --git a/frontend/src/components/c-ramp.vue b/frontend/src/components/c-ramp.vue index 7440e6d2e1..55e130d7ec 100644 --- a/frontend/src/components/c-ramp.vue +++ b/frontend/src/components/c-ramp.vue @@ -35,10 +35,9 @@ - diff --git a/frontend/src/components/c-stacked-bar-chart.vue b/frontend/src/components/c-stacked-bar-chart.vue index 56a3398f55..4825aae309 100644 --- a/frontend/src/components/c-stacked-bar-chart.vue +++ b/frontend/src/components/c-stacked-bar-chart.vue @@ -9,13 +9,13 @@ + + diff --git a/frontend/src/mixin/dynamicTooltipMixin.ts b/frontend/src/mixin/dynamicTooltipMixin.ts index 5d504c9f8f..c5ecbb5554 100644 --- a/frontend/src/mixin/dynamicTooltipMixin.ts +++ b/frontend/src/mixin/dynamicTooltipMixin.ts @@ -3,17 +3,26 @@ import { defineComponent } from 'vue'; export default defineComponent({ methods: { onTooltipHover(refName: string): void { - const tooltipTextElement = (this.$refs[refName] as HTMLElement[])[0]; + const tooltipTextElement = this.getElementByRef(refName); if (this.isElementAboveViewport(tooltipTextElement)) { tooltipTextElement.classList.add('bottom-aligned'); } }, resetTooltip(refName: string): void { - const tooltipTextElement = (this.$refs[refName] as HTMLElement[])[0]; + const tooltipTextElement = this.getElementByRef(refName); tooltipTextElement.classList.remove('bottom-aligned'); }, isElementAboveViewport(el: Element): boolean { return el.getBoundingClientRect().top <= 0; }, + /** + * Note: this.$refs[refName] can be an array of HTMLElements + * if the ref is on a v-for loop, else it will be a single HTMLElement. + */ + getElementByRef(refName: string): HTMLElement { + return Array.isArray(this.$refs[refName]) + ? (this.$refs[refName] as HTMLElement[])[0] + : this.$refs[refName] as HTMLElement; + }, }, }); diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index 145ead4415..0d212752b5 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -3,7 +3,7 @@ import { } from 'vue-router'; import Home from '../views/c-home.vue'; -const routes: Array = [ +const routes: RouteRecordRaw[] = [ { path: '/', component: Home, diff --git a/frontend/src/styles/panels.scss b/frontend/src/styles/panels.scss index 00c988ffb8..7432371be2 100644 --- a/frontend/src/styles/panels.scss +++ b/frontend/src/styles/panels.scss @@ -9,7 +9,6 @@ display: flex; height: 100vh; left: 0; - position: absolute; top: 0; width: 100%; z-index: z-index('app-wrapper'); diff --git a/frontend/src/types/vuex.d.ts b/frontend/src/types/vuex.d.ts index 40e15a73e6..cedee8c21d 100644 --- a/frontend/src/types/vuex.d.ts +++ b/frontend/src/types/vuex.d.ts @@ -1,6 +1,5 @@ import { Store } from 'vuex'; -import { AuthorshipFile } from './types'; -import User from '../utils/user'; +import { AuthorshipFile, User } from './types'; interface AuthorshipInfo { author: string; diff --git a/frontend/src/types/window.ts b/frontend/src/types/window.ts index 8180527408..ffc01a5b5a 100644 --- a/frontend/src/types/window.ts +++ b/frontend/src/types/window.ts @@ -1,6 +1,5 @@ import JSZip from 'jszip'; -import User from '../utils/user'; -import { Repo, User as UserType } from './types'; +import { Repo, User } from './types'; import { AuthorshipSchema } from './zod/authorship-type'; import { AuthorDailyContributions } from './zod/commits-type'; import { DomainUrlMap, ErrorMessage } from './zod/summary-type'; @@ -61,8 +60,8 @@ declare global { getCommitLink: (repoId: string, commitHash: string) => string | undefined; getBlameLink: (repoId: string, branch: string, filepath: string) => string | undefined; getHistoryLink: (repoId: string, branch: string, filepath: string) => string | undefined; - getGroupName: (group: UserType[], filterGroupSelection: string) => string; - getAuthorDisplayName: (authorRepos: UserType[]) => string; + getGroupName: (group: User[], filterGroupSelection: string) => string; + getAuthorDisplayName: (authorRepos: User[]) => string; api: Api; sinceDate: string; untilDate: string; diff --git a/frontend/src/utils/api.ts b/frontend/src/utils/api.ts index 10cfa7d656..1ac4d3c96b 100644 --- a/frontend/src/utils/api.ts +++ b/frontend/src/utils/api.ts @@ -1,8 +1,7 @@ -import { DailyCommit, CommitResult } from '../types/types'; +import { DailyCommit, CommitResult, User } from '../types/types'; import { authorshipSchema } from '../types/zod/authorship-type'; import { commitsSchema } from '../types/zod/commits-type'; import { ErrorMessage, summarySchema } from '../types/zod/summary-type'; -import User from './user'; // utility functions // window.$ = (id) => document.getElementById(id); @@ -71,7 +70,9 @@ window.decodeHash = function decodeHash() { const hashParams: { [key: string]: string } = {}; const hashIndex = window.location.href.indexOf(HASH_ANCHOR); - const parameterString = hashIndex === -1 ? '' : window.location.href.slice(hashIndex + 1); + + // split by # to remove "#/" string at the end of URLs generated by Vue Hash Router + const parameterString = hashIndex === -1 ? '' : window.location.href.slice(hashIndex + 1).split('#')[0]; parameterString.split('&') .forEach((param) => { @@ -258,7 +259,7 @@ window.api = { ]; // commits and checkedFileTypeContribution are set in c-summary - const user = new User({ + const user: User = { name: author, repoId: repoName, variance: commits.authorContributionVariance[author], @@ -270,7 +271,7 @@ window.api = { repoName: `${repo.displayName}`, location: `${repo.location.location}`, checkedFileTypeContribution: undefined, - }); + }; res.push(user); } diff --git a/frontend/src/utils/segment.ts b/frontend/src/utils/segment.ts deleted file mode 100644 index a764524493..0000000000 --- a/frontend/src/utils/segment.ts +++ /dev/null @@ -1,21 +0,0 @@ -export default class Segment { - knownAuthor: string | null; - - isFullCredit: boolean; - - lineNumbers: Array; - - lines: Array; - - constructor( - knownAuthor: string | null, - isFullCredit: boolean, - lineNumbers: Array, - lines: Array, - ) { - this.knownAuthor = knownAuthor; - this.isFullCredit = isFullCredit; - this.lineNumbers = lineNumbers; - this.lines = lines; - } -} diff --git a/frontend/src/utils/user.ts b/frontend/src/utils/user.ts deleted file mode 100644 index 5225aa48d9..0000000000 --- a/frontend/src/utils/user.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Commit, DailyCommit, User as UserType } from '../types/types'; -import { AuthorFileTypeContributions } from '../types/zod/commits-type'; - -export default class User implements UserType { - checkedFileTypeContribution: number | undefined; - - commits: Commit[]; - - dailyCommits: DailyCommit[]; - - displayName: string; - - fileTypeContribution: AuthorFileTypeContributions; - - location: string; - - name: string; - - repoId: string; - - repoName: string; - - searchPath: string; - - variance: number; - - constructor(userObj: User) { - this.checkedFileTypeContribution = userObj.checkedFileTypeContribution; - this.commits = userObj.commits || []; - this.dailyCommits = userObj.dailyCommits || []; - this.displayName = userObj.displayName || ''; - this.fileTypeContribution = userObj.fileTypeContribution || {}; - this.location = userObj.location || ''; - this.name = userObj.name || ''; - this.repoId = userObj.repoId || ''; - this.repoName = userObj.repoName || ''; - this.searchPath = userObj.searchPath || ''; - this.variance = userObj.variance || 0; - } -} diff --git a/frontend/src/views/c-authorship.vue b/frontend/src/views/c-authorship.vue index 550025dfd6..5a9824cb68 100644 --- a/frontend/src/views/c-authorship.vue +++ b/frontend/src/views/c-authorship.vue @@ -99,99 +99,11 @@ .files(v-if="isLoaded") .empty(v-if="info.files.length === 0") nothing to see here :( - template(v-for="(file, i) in selectedFiles", v-bind:key="file.path") - .file(v-bind:ref="file.path") - .title( - v-bind:class="{'sticky':\ file.active}", - v-bind:ref="`${file.path}-title`" - ) - span.caret(v-on:click="toggleFileActiveProperty(file)") - .tooltip( - v-show="file.active", - v-on:mouseover="onTitleTooltipHover(`${file.path}-hide-file-tooltip`, `${file.path}-title`)", - v-on:mouseout="resetTitleTooltip(`${file.path}-hide-file-tooltip`, `${file.path}-title`)" - ) - font-awesome-icon(icon="caret-down", fixed-width) - span.tooltip-text(v-bind:ref="`${file.path}-hide-file-tooltip`") Click to hide file details - .tooltip( - v-show="!file.active", - v-on:mouseover="onTitleTooltipHover(`${file.path}-show-file-tooltip`, `${file.path}-title`)", - v-on:mouseout="resetTitleTooltip(`${file.path}-show-file-tooltip`, `${file.path}-title`)" - ) - font-awesome-icon(icon="caret-right", fixed-width) - span.tooltip-text(v-bind:ref="`${file.path}-show-file-tooltip`") Click to show file details - span.index {{ i + 1 }}.   - span.path - span( - v-bind:class="{'selected-parameter':\ - this.filesSortType === 'path' || this.filesSortType === 'fileName'}" - ) {{ getFirstPartOfPath(file) }}  - span.in(v-if="this.filesSortType === 'fileName'") in  - span(v-if="this.filesSortType === 'fileName'") {{ getSecondPartOfPath(file) }}  - span.fileTypeLabel( - v-if="!file.isBinary && !file.isIgnored", - v-bind:style="{\ - 'background-color': fileTypeColors[file.fileType],\ - 'color': getFontColor(fileTypeColors[file.fileType])\ - }", - v-bind:class="{'selected-label':\ - this.filesSortType === 'linesOfCode' || this.filesSortType === 'fileType'}" - ) - span( - v-bind:class="{'selected-parameter':\ - this.filesSortType === 'linesOfCode' || this.filesSortType === 'fileType'}" - ) {{ getFirstPartOfLabel(file) }}  - span {{ getSecondPartOfLabel(file) }} - span.fileTypeLabel.binary(v-if='file.isBinary') binary   - span.ignored-tag.fileTypeLabel( - v-if='file.isIgnored' - ) ignored ({{ file.lineCount }})   - span.icons - a( - v-bind:class="!isBrokenLink(getHistoryLink(file)) ? '' : 'broken-link'", - v-bind:href="getHistoryLink(file)", target="_blank" - ) - .tooltip( - v-on:mouseover="onTitleTooltipHover(`${file.path}-view-history-tooltip`, `${file.path}-title`)", - v-on:mouseout="resetTitleTooltip(`${file.path}-view-history-tooltip`, `${file.path}-title`)" - ) - font-awesome-icon.button(icon="history") - span.tooltip-text( - v-bind:ref="`${file.path}-view-history-tooltip`" - ) {{getLinkMessage(getHistoryLink(file), 'Click to view the history view of file')}} - a( - v-if='!file.isBinary', - v-bind:class="!isBrokenLink(getBlameLink(file)) ? '' : 'broken-link'", - v-bind:href="getBlameLink(file)", target="_blank", - title="click to view the blame view of file" - ) - .tooltip( - v-on:mouseover="onTitleTooltipHover(`${file.path}-view-blame-tooltip`, `${file.path}-title`)", - v-on:mouseout="resetTitleTooltip(`${file.path}-view-blame-tooltip`, `${file.path}-title`)" - ) - font-awesome-icon.button(icon="user-edit") - span.tooltip-text( - v-bind:ref="`${file.path}-view-blame-tooltip`" - ) {{getLinkMessage(getBlameLink(file), 'Click to view the blame view of file')}} - .author-breakdown(v-if="info.isMergeGroup") - .author-breakdown__legend( - v-for="author in getAuthors(file)", - v-bind:key="author" - ) - font-awesome-icon( - icon="circle", - v-bind:style="{ 'color': authorColors[author] }" - ) - span   {{ author }}   - pre.file-content(v-if="file.isBinary", v-show="file.active") - .binary-segment - .indicator BIN - .bin-text Binary file not shown. - pre.file-content(v-else-if="file.isIgnored", v-show="file.active") - .ignored-segment - .ignore-text File is ignored. - pre.hljs.file-content(v-else-if="file.wasCodeLoaded", v-show="file.active") - c-segment-collection(v-bind:segments="file.segments", v-bind:path="file.path") + template(v-for="(file, index) in selectedFiles", v-bind:key="file.path") + c-authorship-file(v-bind:file="file", v-bind:index="index", + v-bind:files-sort-type="this.filesSortType", v-bind:info="this.info", + v-bind:author-colors="this.authorColors", v-bind:file-type-colors="this.fileTypeColors", + @toggle-file-active-property="toggleFileActiveProperty")