From b62f69b53d99b4db77cf9e7c69f8b9dfd84732a7 Mon Sep 17 00:00:00 2001 From: Josiah Hoskins Date: Thu, 22 Feb 2024 16:06:11 -0600 Subject: [PATCH 1/6] Filling out manual test case steps for two sheets --- .../test/features/TC_XLS_report.feature | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/accessibility-checker-extension/test/features/TC_XLS_report.feature b/accessibility-checker-extension/test/features/TC_XLS_report.feature index 284edfd04..c6e9f7016 100644 --- a/accessibility-checker-extension/test/features/TC_XLS_report.feature +++ b/accessibility-checker-extension/test/features/TC_XLS_report.feature @@ -1,5 +1,5 @@ Feature: XLS Report - Scenario: Generate a basic XLS report from side panel + Scenario: Generate a basic XLS report from side panel for current scan When manual step """ Given page "https://altoromutual.12mc9fdq8fib.us-south.codeengine.appdomain.cloud/" @@ -9,6 +9,17 @@ Feature: XLS Report When user activates Button "Scan" When user activates Button "Export XLS" When user opens downloaded file "Accessibility_Report-Altoro Accessibility Testing Site.xlsx" + When user examines the "Overview" sheet and finds two sections: "Accessibility Scan Report" and "Summary" + When user examines the "Accessibility Scan Report" section and finds: + Tool name, Version number, Rule Set used, Guidelines used, Report date, Platform, Number of scans, Number of Pages scanned + When user examines the "Summary" section and finds 5 columns with the counts of + Total issues, Issues with violations, Issues that Need review, Issues with Recommendations, and Hidden Issues + When user opens "Scan summary" sheet and finds 10 columns with a row for each scan. For each column the user finds + Page title, Page url, Scan label, Base scan, Number of Violations, Number of Needs review, Number of Recommendations, Number of Hidden Issues, + % elements without violations, % elements with violations or items to review + When user opens "Issue summary" sheet + + """ From ee81bca45f02af296e80f95771fc424deb3e813c Mon Sep 17 00:00:00 2001 From: Erick Renteria Date: Thu, 22 Feb 2024 22:09:44 -0600 Subject: [PATCH 2/6] Updated a few testcase --- .../test/features/TC_HTML_report.feature | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/accessibility-checker-extension/test/features/TC_HTML_report.feature b/accessibility-checker-extension/test/features/TC_HTML_report.feature index b8d2ae3ef..eecbcae23 100644 --- a/accessibility-checker-extension/test/features/TC_HTML_report.feature +++ b/accessibility-checker-extension/test/features/TC_HTML_report.feature @@ -1,7 +1,8 @@ Feature: HTML Report Scenario: Generate a basic HTML report from side panel + When manual step - """ + Given page "https://altoromutual.12mc9fdq8fib.us-south.codeengine.appdomain.cloud/" When user opens Devtools When user opens Devtools panel "Elements" @@ -9,6 +10,23 @@ Feature: HTML Report When user activates Button "Scan" When user activates Button "Export XLS" When user opens downloaded file "Accessibility_Report-Altoro Accessibility Testing Site.xlsx" - """ + +Feature: HTML Report + + Scenario: HTML report + # Setup + Given url "https://altoromutual.12mc9fdq8fib.us-south.codeengine.appdomain.cloud/" + Given user opens Devtools + Given user opens Devtools subpanel "Accessibility Checker" + Given user activates Button "Scan" + Given user activates Button "Export XLS" + + # Confirm that the html file has been generated and downloaded + Then user get prompted to save files + Then user is able to open file + + + # Cleanup + When ? \ No newline at end of file From a7c1149d8d0f9de27886e7d8efe5d21e50fdfb07 Mon Sep 17 00:00:00 2001 From: Josiah Hoskins Date: Wed, 28 Feb 2024 13:21:30 -0600 Subject: [PATCH 3/6] TC for XLS report --- .../test/features/TC_XLS_report.feature | 104 +++++++++++++++++- 1 file changed, 100 insertions(+), 4 deletions(-) diff --git a/accessibility-checker-extension/test/features/TC_XLS_report.feature b/accessibility-checker-extension/test/features/TC_XLS_report.feature index c6e9f7016..a1dd84e4e 100644 --- a/accessibility-checker-extension/test/features/TC_XLS_report.feature +++ b/accessibility-checker-extension/test/features/TC_XLS_report.feature @@ -13,12 +13,108 @@ Feature: XLS Report When user examines the "Accessibility Scan Report" section and finds: Tool name, Version number, Rule Set used, Guidelines used, Report date, Platform, Number of scans, Number of Pages scanned When user examines the "Summary" section and finds 5 columns with the counts of - Total issues, Issues with violations, Issues that Need review, Issues with Recommendations, and Hidden Issues + Total issues, Issues with violations, Issues that Need review, Issues with Recommendations, and Hidden Issues. + Note: these counts should match the counts in the Checker extension. When user opens "Scan summary" sheet and finds 10 columns with a row for each scan. For each column the user finds - Page title, Page url, Scan label, Base scan, Number of Violations, Number of Needs review, Number of Recommendations, Number of Hidden Issues, + Page title, Page url, Scan label, Base scan, + Number of Violations, Number of Needs review, Number of Recommendations, Number of Hidden Issues, + Note: these counts should match the counts in the Checker extension. % elements without violations, % elements with violations or items to review - When user opens "Issue summary" sheet - + When user opens "Issue summary" sheet and finds 3 columns where column 1 provides descriptive text, column 2 provides issue counts and + column 3 provides hidden issue counts. + The row "Issues found:" contains in column 2 the count of all issues found minus any hidden issues. Column 3 contains count of all hidden issues. + There are rows for each Level of issues. + The row "Level 2 - the most essential issues to addresss" contains in column 2 the count of Level 1 issues minus any Level 1 hidden issues in this category and the count of Level 1 hidden issues in this category. + For each level there are three sections: Violation, Needs review and Recommendation. + The row "Violation" contains in column 2 the count of all Level 1 violation issues found minus any hidden Level 1 violation issues. Column 3 contains count of all Level 1 violation hidden issues. + Beneath the row "Violation" there are 0 to n issue rows that enumerate the Level 1 violation issues. + Each row contain the issue message, column 2 contains the count of Level 1 violation issues for this issue minus any hidden Level 1 violation issues for this issue. Column 3 contains count of all Level 1 violation hidden issues for this issue. + The row "Needs review" contains in column 2 the count of all Level 1 Needs review issues found minus any hidden Level 1 Needs review issues. Column 3 contains count of all Level 1 Needs review hidden issues. + Beneath the row "Needs review" there are 0 to n issue rows that enumerate the Level 1 Needs review issues. + Each row contain the issue message, column 2 contains the count of Level 1 Needs review issues for this issue minus any hidden Level 1 Needs review issues for this issue. Column 3 contains count of all Level 1 Needs review hidden issues for this issue. + The row "Recommendation" contains in column 2 the count of all Level 1 Recommendation issues found minus any hidden Level 1 Recommendation issues. Column 3 contains count of all Level 1 Recommendation hidden issues. + Beneath the row "Recommendation" there are 0 to n issue rows that enumerate the Level 1 Recommendation issues. + Each row contain the issue message, column 2 contains the count of Level 1 Recommendation issues for this issue minus any hidden Level 1 Recommendation issues for this issue. Column 3 contains count of all Level 1 Recommendation hidden issues for this issue. + The row "Level 2 - the next most important issues" contains in column 2 the count of Level 2 issues minus any Level 2 hidden issues in this category and the count of Level 2 hidden issues in this category. + For each level there are three sections: Violation, Needs review and Recommendation. + The row "Violation" contains in column 2 the count of all Level 2 violation issues found minus any hidden Level 2 violation issues. Column 3 contains count of all Level 2 violation hidden issues. + Beneath the row "Violation" there are 0 to n issue rows that enumerate the Level 2 violation issues. + Each row contain the issue message, column 2 contains the count of Level 2 violation issues for this issue minus any hidden Level 2 violation issues for this issue. Column 3 contains count of all Level 2 violation hidden issues for this issue. + The row "Needs review" contains in column 2 the count of all Level 2 Needs review issues found minus any hidden Level 2 Needs review issues. Column 3 contains count of all Level 2 Needs review hidden issues. + Beneath the row "Needs review" there are 0 to n issue rows that enumerate the Level 2 Needs review issues. + Each row contain the issue message, column 2 contains the count of Level 2 Needs review issues for this issue minus any hidden Level 2 Needs review issues for this issue. Column 3 contains count of all Level 2 Needs review hidden issues for this issue. + The row "Recommendation" contains in column 2 the count of all Level 2 Recommendation issues found minus any hidden Level 2 Recommendation issues. Column 3 contains count of all Level 2 Recommendation hidden issues. + Beneath the row "Recommendation" there are 0 to n issue rows that enumerate the Level 2 Recommendation issues. + Each row contain the issue message, column 2 contains the count of Level 2 Recommendation issues for this issue minus any hidden Level 2 Recommendation issues for this issue. Column 3 contains count of all Level 2 Recommendation hidden issues for this issue. + The row "Level 3 - the next most important issues" contains in column 2 the count of Level 3 issues minus any Level 3 hidden issues in this category and the count of Level 3 hidden issues in this category. + For each level there are three sections: Violation, Needs review and Recommendation. + The row "Violation" contains in column 2 the count of all Level 3 violation issues found minus any hidden Level 3 violation issues. Column 3 contains count of all Level 3 violation hidden issues. + Beneath the row "Violation" there are 0 to n issue rows that enumerate the Level 3 violation issues. + Each row contain the issue message, column 2 contains the count of Level 3 violation issues for this issue minus any hidden Level 3 violation issues for this issue. Column 3 contains count of all Level 3 violation hidden issues for this issue. + The row "Needs review" contains in column 2 the count of all Level 3 Needs review issues found minus any hidden Level 3 Needs review issues. Column 3 contains count of all Level 3 Needs review hidden issues. + Beneath the row "Needs review" there are 0 to n issue rows that enumerate the Level 3 Needs review issues. + Each row contain the issue message, column 2 contains the count of Level 3 Needs review issues for this issue minus any hidden Level 3 Needs review issues for this issue. Column 3 contains count of all Level 3 Needs review hidden issues for this issue. + The row "Recommendation" contains in column 2 the count of all Level 3 Recommendation issues found minus any hidden Level 3 Recommendation issues. Column 3 contains count of all Level 3 Recommendation hidden issues. + Beneath the row "Recommendation" there are 0 to n issue rows that enumerate the Level 3 Recommendation issues. + Each row contain the issue message, column 2 contains the count of Level 3 Recommendation issues for this issue minus any hidden Level 3 Recommendation issues for this issue. Column 3 contains count of all Level 3 Recommendation hidden issues for this issue. + The row "Level 4 - the next most important issues" contains in column 2 the count of Level 4 issues minus any Level 4 hidden issues in this category and the count of Level 4 hidden issues in this category. + For each level there are three sections: Violation, Needs review and Recommendation. + The row "Violation" contains in column 2 the count of all Level 4 violation issues found minus any hidden Level 4 violation issues. Column 3 contains count of all Level 4 violation hidden issues. + Beneath the row "Violation" there are 0 to n issue rows that enumerate the Level 4 violation issues. + Each row contain the issue message, column 2 contains the count of Level 4 violation issues for this issue minus any hidden Level 4 violation issues for this issue. Column 3 contains count of all Level 4 violation hidden issues for this issue. + The row "Needs review" contains in column 2 the count of all Level 4 Needs review issues found minus any hidden Level 4 Needs review issues. Column 3 contains count of all Level 4 Needs review hidden issues. + Beneath the row "Needs review" there are 0 to n issue rows that enumerate the Level 4 Needs review issues. + Each row contain the issue message, column 2 contains the count of Level 4 Needs review issues for this issue minus any hidden Level 4 Needs review issues for this issue. Column 3 contains count of all Level 4 Needs review hidden issues for this issue. + The row "Recommendation" contains in column 2 the count of all Level 4 Recommendation issues found minus any hidden Level 4 Recommendation issues. Column 3 contains count of all Level 4 Recommendation hidden issues. + Beneath the row "Recommendation" there are 0 to n issue rows that enumerate the Level 4 Recommendation issues. + Each row contain the issue message, column 2 contains the count of Level 4 Recommendation issues for this issue minus any hidden Level 4 Recommendation issues for this issue. Column 3 contains count of all Level 4 Recommendation hidden issues for this issue. + When user opens "Issue summary" sheet and finds 14 columns containing all stored data. + Each issue gets its own row and contains the following columns: + "Page title" + "Page URL" + "Scan label" + "Issue ID" + "Issue type" + "Toolkit level" + "Checkpoint" + "WCAG level" + "Rule" + "Issue" + "Element" + "Code" + "Xpath" + "Help" + When user opens "Definition of fields" sheet and finds a header row followed by two sections of definitions. + The row "Definition of fields" is the sheet header. + The row "Scan summary and Issue summary" is the header a section of definitions. + The next row supplies the headers for two columns: column 1 header - "Field", column 2 header - "Definition" + The next 9 rows contain the field and definition of the following: + "Page" - "Identifies the page or html file that was scanned" + "Scan label" - "Label for the scan. Default values can be edited in the Accessibility Checker before saving this report, or programmatically assigned in automated testing." + "Base scan" - "Scan label for a previous scan against which this scan was compared. Only new issues are reported when a base scan is used." + "Violations" - "Accessibility failures that need to be corrected." + "Needs review" - "Issues that may not be a violation. These need a manual review to identify whether there is an accessibility problem." + "Recommendation" - "Opportunities to apply best practices to further improve accessibility." + "Hidden" - "Issues the user has selected to be hidden from view and subtracted from the issue counts." + "% elements without violations" - "Percentage of elements on the page that had no violations found." + "% elements with violations or items to review" - "Percentage of elements on the page that had no violations found and no items to review." + The row "Issues" is the header a section of definitions. + The next row supplies the headers for two columns: column 1 header - "Field", column 2 header - "Definition" + The next 13 rows contain the field and definition of the following: + "Page" - "Identifies the page or html file that was scanned" + "Scan label" - "Identifies the page or html file that was scanned." + "Issue ID" - "Label for the scan. Default values can be edited in the Accessibility Checker before saving this report, or programmatically assigned in automated testing." + "Issue Type" - "Violation, needs review, or recommendation" + "Toolkit level" - "1, 2, 3 or 4. Priority level defined by the IBM Equal Access Toolkit. See https://www.ibm.com/able/toolkit/plan/overview#pace-of-completion for details" + "Checkpoint" - "Web Content Accessibility Guidelines (WCAG) checkpoints this issue falls into." + "WCAG level" - "A, AA or AAA. WCAG level for this issue." + "Rule" - "Name of the accessibility test rule that detected this issue." + "Issue" - "Message describing the issue." + "Element" - "Type of HTML element where the issue is found." + "Code" - "Actual HTML element where the issue is found." + "Xpath" - "Xpath of the HTML element where the issue is found." + "Help" - "Link to a more detailed description of the issue and suggested solutions." + """ From 0d9ee94681accd671b02a164d9ce77c566f31533 Mon Sep 17 00:00:00 2001 From: Josiah Hoskins Date: Wed, 28 Feb 2024 15:37:21 -0600 Subject: [PATCH 4/6] Correction --- .../test/features/TC_XLS_report.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessibility-checker-extension/test/features/TC_XLS_report.feature b/accessibility-checker-extension/test/features/TC_XLS_report.feature index a1dd84e4e..51513b816 100644 --- a/accessibility-checker-extension/test/features/TC_XLS_report.feature +++ b/accessibility-checker-extension/test/features/TC_XLS_report.feature @@ -24,7 +24,7 @@ Feature: XLS Report column 3 provides hidden issue counts. The row "Issues found:" contains in column 2 the count of all issues found minus any hidden issues. Column 3 contains count of all hidden issues. There are rows for each Level of issues. - The row "Level 2 - the most essential issues to addresss" contains in column 2 the count of Level 1 issues minus any Level 1 hidden issues in this category and the count of Level 1 hidden issues in this category. + The row "Level 1 - the most essential issues to addresss" contains in column 2 the count of Level 1 issues minus any Level 1 hidden issues in this category and the count of Level 1 hidden issues in this category. For each level there are three sections: Violation, Needs review and Recommendation. The row "Violation" contains in column 2 the count of all Level 1 violation issues found minus any hidden Level 1 violation issues. Column 3 contains count of all Level 1 violation hidden issues. Beneath the row "Violation" there are 0 to n issue rows that enumerate the Level 1 violation issues. From 36614182106961807790a25af0592aa4b16199af Mon Sep 17 00:00:00 2001 From: Tom Brunet Date: Thu, 16 May 2024 14:09:57 -0500 Subject: [PATCH 5/6] Basic excel test --- .../src/ts/devtools/indexMain.tsx | 3 + .../test/features/TC_HTML_report.feature | 26 +-- .../test/features/TC_XLS_report.feature | 150 ++++++++++++-- .../test/package-lock.json | 183 ++++-------------- .../test/package.json | 1 + .../test/support/BrowserWrapper.ts | 7 + .../test/support/steps/steps_excel.ts | 18 ++ .../test/support/steps/steps_generic.ts | 15 ++ .../test/support/util/pup.ts | 23 +++ 9 files changed, 259 insertions(+), 167 deletions(-) create mode 100644 accessibility-checker-extension/test/support/steps/steps_excel.ts diff --git a/accessibility-checker-extension/src/ts/devtools/indexMain.tsx b/accessibility-checker-extension/src/ts/devtools/indexMain.tsx index 067d5702a..62484e3a4 100644 --- a/accessibility-checker-extension/src/ts/devtools/indexMain.tsx +++ b/accessibility-checker-extension/src/ts/devtools/indexMain.tsx @@ -27,6 +27,9 @@ import { getTabIdAsync } from '../util/tabId'; let tabRef = (await chrome.tabs.query({ index }))[0]; let contentTabId = tabRef.id; let toolTabId = await getTabIdAsync(); + while (!toolTabId) { + toolTabId = await getTabIdAsync(); + } if (!toolTabId || !contentTabId) { console.warn("Test initializing", toolTabId, contentTabId); } diff --git a/accessibility-checker-extension/test/features/TC_HTML_report.feature b/accessibility-checker-extension/test/features/TC_HTML_report.feature index b8d2ae3ef..bfeea4acf 100644 --- a/accessibility-checker-extension/test/features/TC_HTML_report.feature +++ b/accessibility-checker-extension/test/features/TC_HTML_report.feature @@ -1,14 +1,16 @@ +@e2e Feature: HTML Report - Scenario: Generate a basic HTML report from side panel - When manual step - """ - Given page "https://altoromutual.12mc9fdq8fib.us-south.codeengine.appdomain.cloud/" - When user opens Devtools - When user opens Devtools panel "Elements" - When user opens Devtools subpanel "Accessibility Checker" - When user activates Button "Scan" - When user activates Button "Export XLS" - When user opens downloaded file "Accessibility_Report-Altoro Accessibility Testing Site.xlsx" - """ - + Background: + # Load the checker panel, scan the page, and then download the reports + Given "desktop" page "altoro" and panel "assessment" + Given browser download folder "TC_HTML_report" + Then Button "Scan" is enabled + When user activates Button "Scan" + Then elem ".reportTreeGrid #tableGridHeader .gridHeaderCell > span" is visible + Then elem "#totalIssuesCount" text ends with "issues found" + When user activates Button "Export XLS" + When wait 2000 + Then downloaded file "Accessibility_Report-Altoro Accessibility Testing Site.html" exists + Scenario: HTML report exists + Then downloaded file "Accessibility_Report-Altoro Accessibility Testing Site.html" exists diff --git a/accessibility-checker-extension/test/features/TC_XLS_report.feature b/accessibility-checker-extension/test/features/TC_XLS_report.feature index 284edfd04..fe4e6f800 100644 --- a/accessibility-checker-extension/test/features/TC_XLS_report.feature +++ b/accessibility-checker-extension/test/features/TC_XLS_report.feature @@ -1,14 +1,140 @@ -Feature: XLS Report - Scenario: Generate a basic XLS report from side panel - When manual step - """ - Given page "https://altoromutual.12mc9fdq8fib.us-south.codeengine.appdomain.cloud/" - When user opens Devtools - When user opens Devtools panel "Elements" - When user opens Devtools subpanel "Accessibility Checker" - When user activates Button "Scan" - When user activates Button "Export XLS" - When user opens downloaded file "Accessibility_Report-Altoro Accessibility Testing Site.xlsx" - """ +Feature: XLSX Report + Background: + # Load the checker panel, scan the page, and then download the reports + Given "desktop" page "altoro" and panel "assessment" + Given browser download folder "TC_HTML_report" + Then Button "Scan" is enabled + When user activates Button "Scan" + Then elem ".reportTreeGrid #tableGridHeader .gridHeaderCell > span" is visible + Then elem "#totalIssuesCount" text ends with "issues found" + When user activates Button "Export XLS" + When wait 2000 + Then downloaded file "Accessibility_Report-Altoro Accessibility Testing Site.xlsx" exists + + @e2e + Scenario: XLSX report exists and has major headings + Given excel file "Accessibility_Report-Altoro Accessibility Testing Site.xlsx" + Then Excel Sheet "Overview" Cell "A1" is "Accessibility Scan Report" + Then Excel Sheet "Overview" Cell "A11" is "Summary" + Then Excel Sheet "Overview" Cell "A12" is "Issues" + Then Excel Sheet "Overview" Cell "B12" is "Violations" + Then Excel Sheet "Overview" Cell "C12" is "Needs review" + Then Excel Sheet "Overview" Cell "D12" is "Recommendations" + Then Excel Sheet "Overview" Cell "E12" is "Hidden" + Then Excel Sheet "Scan summary" Cell "A1" is "Page title" + Then Excel Sheet "Issue summary" Cell "A1" is "Issue summary" + Then Excel Sheet "Issues" Cell "A1" is "Page title" + Then Excel Sheet "Definition of fields" Cell "A1" is "Definition of fields" + + Scenario: XLSX report manual evaluation + Then manual step + """ + When user examines the "Accessibility Scan Report" section and finds: + Tool name, Version number, Rule Set used, Guidelines used, Report date, Platform, Number of scans, Number of Pages scanned + When user examines the "Summary" section and finds 5 columns with the counts of + Total issues, Issues with violations, Issues that Need review, Issues with Recommendations, and Hidden Issues. + Note: these counts should match the counts in the Checker extension. + When user opens "Scan summary" sheet and finds 10 columns with a row for each scan. For each column the user finds + Page title, Page url, Scan label, Base scan, + Number of Violations, Number of Needs review, Number of Recommendations, Number of Hidden Issues, + Note: these counts should match the counts in the Checker extension. + % elements without violations, % elements with violations or items to review + When user opens "Issue summary" sheet and finds 3 columns where column 1 provides descriptive text, column 2 provides issue counts and + column 3 provides hidden issue counts. + The row "Issues found:" contains in column 2 the count of all issues found minus any hidden issues. Column 3 contains count of all hidden issues. + There are rows for each Level of issues. + The row "Level 1 - the most essential issues to addresss" contains in column 2 the count of Level 1 issues minus any Level 1 hidden issues in this category and the count of Level 1 hidden issues in this category. + For each level there are three sections: Violation, Needs review and Recommendation. + The row "Violation" contains in column 2 the count of all Level 1 violation issues found minus any hidden Level 1 violation issues. Column 3 contains count of all Level 1 violation hidden issues. + Beneath the row "Violation" there are 0 to n issue rows that enumerate the Level 1 violation issues. + Each row contain the issue message, column 2 contains the count of Level 1 violation issues for this issue minus any hidden Level 1 violation issues for this issue. Column 3 contains count of all Level 1 violation hidden issues for this issue. + The row "Needs review" contains in column 2 the count of all Level 1 Needs review issues found minus any hidden Level 1 Needs review issues. Column 3 contains count of all Level 1 Needs review hidden issues. + Beneath the row "Needs review" there are 0 to n issue rows that enumerate the Level 1 Needs review issues. + Each row contain the issue message, column 2 contains the count of Level 1 Needs review issues for this issue minus any hidden Level 1 Needs review issues for this issue. Column 3 contains count of all Level 1 Needs review hidden issues for this issue. + The row "Recommendation" contains in column 2 the count of all Level 1 Recommendation issues found minus any hidden Level 1 Recommendation issues. Column 3 contains count of all Level 1 Recommendation hidden issues. + Beneath the row "Recommendation" there are 0 to n issue rows that enumerate the Level 1 Recommendation issues. + Each row contain the issue message, column 2 contains the count of Level 1 Recommendation issues for this issue minus any hidden Level 1 Recommendation issues for this issue. Column 3 contains count of all Level 1 Recommendation hidden issues for this issue. + The row "Level 2 - the next most important issues" contains in column 2 the count of Level 2 issues minus any Level 2 hidden issues in this category and the count of Level 2 hidden issues in this category. + For each level there are three sections: Violation, Needs review and Recommendation. + The row "Violation" contains in column 2 the count of all Level 2 violation issues found minus any hidden Level 2 violation issues. Column 3 contains count of all Level 2 violation hidden issues. + Beneath the row "Violation" there are 0 to n issue rows that enumerate the Level 2 violation issues. + Each row contain the issue message, column 2 contains the count of Level 2 violation issues for this issue minus any hidden Level 2 violation issues for this issue. Column 3 contains count of all Level 2 violation hidden issues for this issue. + The row "Needs review" contains in column 2 the count of all Level 2 Needs review issues found minus any hidden Level 2 Needs review issues. Column 3 contains count of all Level 2 Needs review hidden issues. + Beneath the row "Needs review" there are 0 to n issue rows that enumerate the Level 2 Needs review issues. + Each row contain the issue message, column 2 contains the count of Level 2 Needs review issues for this issue minus any hidden Level 2 Needs review issues for this issue. Column 3 contains count of all Level 2 Needs review hidden issues for this issue. + The row "Recommendation" contains in column 2 the count of all Level 2 Recommendation issues found minus any hidden Level 2 Recommendation issues. Column 3 contains count of all Level 2 Recommendation hidden issues. + Beneath the row "Recommendation" there are 0 to n issue rows that enumerate the Level 2 Recommendation issues. + Each row contain the issue message, column 2 contains the count of Level 2 Recommendation issues for this issue minus any hidden Level 2 Recommendation issues for this issue. Column 3 contains count of all Level 2 Recommendation hidden issues for this issue. + The row "Level 3 - the next most important issues" contains in column 2 the count of Level 3 issues minus any Level 3 hidden issues in this category and the count of Level 3 hidden issues in this category. + For each level there are three sections: Violation, Needs review and Recommendation. + The row "Violation" contains in column 2 the count of all Level 3 violation issues found minus any hidden Level 3 violation issues. Column 3 contains count of all Level 3 violation hidden issues. + Beneath the row "Violation" there are 0 to n issue rows that enumerate the Level 3 violation issues. + Each row contain the issue message, column 2 contains the count of Level 3 violation issues for this issue minus any hidden Level 3 violation issues for this issue. Column 3 contains count of all Level 3 violation hidden issues for this issue. + The row "Needs review" contains in column 2 the count of all Level 3 Needs review issues found minus any hidden Level 3 Needs review issues. Column 3 contains count of all Level 3 Needs review hidden issues. + Beneath the row "Needs review" there are 0 to n issue rows that enumerate the Level 3 Needs review issues. + Each row contain the issue message, column 2 contains the count of Level 3 Needs review issues for this issue minus any hidden Level 3 Needs review issues for this issue. Column 3 contains count of all Level 3 Needs review hidden issues for this issue. + The row "Recommendation" contains in column 2 the count of all Level 3 Recommendation issues found minus any hidden Level 3 Recommendation issues. Column 3 contains count of all Level 3 Recommendation hidden issues. + Beneath the row "Recommendation" there are 0 to n issue rows that enumerate the Level 3 Recommendation issues. + Each row contain the issue message, column 2 contains the count of Level 3 Recommendation issues for this issue minus any hidden Level 3 Recommendation issues for this issue. Column 3 contains count of all Level 3 Recommendation hidden issues for this issue. + The row "Level 4 - the next most important issues" contains in column 2 the count of Level 4 issues minus any Level 4 hidden issues in this category and the count of Level 4 hidden issues in this category. + For each level there are three sections: Violation, Needs review and Recommendation. + The row "Violation" contains in column 2 the count of all Level 4 violation issues found minus any hidden Level 4 violation issues. Column 3 contains count of all Level 4 violation hidden issues. + Beneath the row "Violation" there are 0 to n issue rows that enumerate the Level 4 violation issues. + Each row contain the issue message, column 2 contains the count of Level 4 violation issues for this issue minus any hidden Level 4 violation issues for this issue. Column 3 contains count of all Level 4 violation hidden issues for this issue. + The row "Needs review" contains in column 2 the count of all Level 4 Needs review issues found minus any hidden Level 4 Needs review issues. Column 3 contains count of all Level 4 Needs review hidden issues. + Beneath the row "Needs review" there are 0 to n issue rows that enumerate the Level 4 Needs review issues. + Each row contain the issue message, column 2 contains the count of Level 4 Needs review issues for this issue minus any hidden Level 4 Needs review issues for this issue. Column 3 contains count of all Level 4 Needs review hidden issues for this issue. + The row "Recommendation" contains in column 2 the count of all Level 4 Recommendation issues found minus any hidden Level 4 Recommendation issues. Column 3 contains count of all Level 4 Recommendation hidden issues. + Beneath the row "Recommendation" there are 0 to n issue rows that enumerate the Level 4 Recommendation issues. + Each row contain the issue message, column 2 contains the count of Level 4 Recommendation issues for this issue minus any hidden Level 4 Recommendation issues for this issue. Column 3 contains count of all Level 4 Recommendation hidden issues for this issue. + When user opens "Issue summary" sheet and finds 14 columns containing all stored data. + Each issue gets its own row and contains the following columns: + "Page title" + "Page URL" + "Scan label" + "Issue ID" + "Issue type" + "Toolkit level" + "Checkpoint" + "WCAG level" + "Rule" + "Issue" + "Element" + "Code" + "Xpath" + "Help" + When user opens "Definition of fields" sheet and finds a header row followed by two sections of definitions. + The row "Definition of fields" is the sheet header. + The row "Scan summary and Issue summary" is the header a section of definitions. + The next row supplies the headers for two columns: column 1 header - "Field", column 2 header - "Definition" + The next 9 rows contain the field and definition of the following: + "Page" - "Identifies the page or html file that was scanned" + "Scan label" - "Label for the scan. Default values can be edited in the Accessibility Checker before saving this report, or programmatically assigned in automated testing." + "Base scan" - "Scan label for a previous scan against which this scan was compared. Only new issues are reported when a base scan is used." + "Violations" - "Accessibility failures that need to be corrected." + "Needs review" - "Issues that may not be a violation. These need a manual review to identify whether there is an accessibility problem." + "Recommendation" - "Opportunities to apply best practices to further improve accessibility." + "Hidden" - "Issues the user has selected to be hidden from view and subtracted from the issue counts." + "% elements without violations" - "Percentage of elements on the page that had no violations found." + "% elements with violations or items to review" - "Percentage of elements on the page that had no violations found and no items to review." + The row "Issues" is the header a section of definitions. + The next row supplies the headers for two columns: column 1 header - "Field", column 2 header - "Definition" + The next 13 rows contain the field and definition of the following: + "Page" - "Identifies the page or html file that was scanned" + "Scan label" - "Identifies the page or html file that was scanned." + "Issue ID" - "Label for the scan. Default values can be edited in the Accessibility Checker before saving this report, or programmatically assigned in automated testing." + "Issue Type" - "Violation, needs review, or recommendation" + "Toolkit level" - "1, 2, 3 or 4. Priority level defined by the IBM Equal Access Toolkit. See https://www.ibm.com/able/toolkit/plan/overview#pace-of-completion for details" + "Checkpoint" - "Web Content Accessibility Guidelines (WCAG) checkpoints this issue falls into." + "WCAG level" - "A, AA or AAA. WCAG level for this issue." + "Rule" - "Name of the accessibility test rule that detected this issue." + "Issue" - "Message describing the issue." + "Element" - "Type of HTML element where the issue is found." + "Code" - "Actual HTML element where the issue is found." + "Xpath" - "Xpath of the HTML element where the issue is found." + "Help" - "Link to a more detailed description of the issue and suggested solutions." + + """ + diff --git a/accessibility-checker-extension/test/package-lock.json b/accessibility-checker-extension/test/package-lock.json index 8ae3f87ad..74b0184f6 100644 --- a/accessibility-checker-extension/test/package-lock.json +++ b/accessibility-checker-extension/test/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "See LICENCSE.md", "dependencies": { + "exceljs": "^4.4.0", "ts-node": "^10.9.2" }, "devDependencies": { @@ -316,7 +317,6 @@ "version": "4.3.5", "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", - "dev": true, "dependencies": { "@types/node": "^14.0.1", "lodash.escaperegexp": "^4.1.2", @@ -329,14 +329,12 @@ "node_modules/@fast-csv/format/node_modules/@types/node": { "version": "14.18.63", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", - "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", - "dev": true + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" }, "node_modules/@fast-csv/parse": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", - "dev": true, "dependencies": { "@types/node": "^14.0.1", "lodash.escaperegexp": "^4.1.2", @@ -350,8 +348,7 @@ "node_modules/@fast-csv/parse/node_modules/@types/node": { "version": "14.18.63", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", - "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", - "dev": true + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -833,7 +830,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", - "dev": true, "dependencies": { "archiver-utils": "^2.1.0", "async": "^3.2.4", @@ -851,7 +847,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dev": true, "dependencies": { "glob": "^7.1.4", "graceful-fs": "^4.2.0", @@ -872,7 +867,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -882,7 +876,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -902,7 +895,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -914,7 +906,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -928,14 +919,12 @@ "node_modules/archiver-utils/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/archiver-utils/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -986,8 +975,7 @@ "node_modules/async": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/asynckit": { "version": "0.4.0", @@ -1015,8 +1003,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/bare-events": { "version": "2.2.2", @@ -1029,7 +1016,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -1058,7 +1044,6 @@ "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true, "engines": { "node": ">=0.6" } @@ -1067,7 +1052,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", - "dev": true, "dependencies": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" @@ -1080,7 +1064,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -1090,14 +1073,12 @@ "node_modules/bluebird": { "version": "3.4.7", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", - "dev": true + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -1106,7 +1087,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "funding": [ { "type": "github", @@ -1130,7 +1110,6 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, "engines": { "node": "*" } @@ -1145,7 +1124,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", - "dev": true, "engines": { "node": ">=0.10" } @@ -1154,7 +1132,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "dev": true, "engines": { "node": ">=0.2.0" } @@ -1199,7 +1176,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "dev": true, "dependencies": { "traverse": ">=0.3.0 <0.4" }, @@ -1449,7 +1425,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", - "dev": true, "dependencies": { "buffer-crc32": "^0.2.13", "crc32-stream": "^4.0.2", @@ -1463,14 +1438,12 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cosmiconfig": { "version": "9.0.0", @@ -1502,7 +1475,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, "bin": { "crc32": "bin/crc32.njs" }, @@ -1514,7 +1486,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", - "dev": true, "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" @@ -1563,8 +1534,7 @@ "node_modules/dayjs": { "version": "1.11.11", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", - "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==", - "dev": true + "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==" }, "node_modules/debug": { "version": "4.3.4", @@ -1645,7 +1615,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, "dependencies": { "readable-stream": "^2.0.2" } @@ -1654,7 +1623,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -1668,14 +1636,12 @@ "node_modules/duplexer2/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/duplexer2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -1696,7 +1662,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "dependencies": { "once": "^1.4.0" } @@ -1802,7 +1767,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.4.0.tgz", "integrity": "sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==", - "dev": true, "dependencies": { "archiver": "^5.0.0", "dayjs": "^1.8.34", @@ -1822,7 +1786,6 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, "bin": { "uuid": "dist/bin/uuid" } @@ -1851,7 +1814,6 @@ "version": "4.3.6", "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", - "dev": true, "dependencies": { "@fast-csv/format": "4.3.5", "@fast-csv/parse": "4.3.6" @@ -1956,8 +1918,7 @@ "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "node_modules/fs-extra": { "version": "11.2.0", @@ -1976,14 +1937,12 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fstream": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -1998,7 +1957,6 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, "dependencies": { "minimist": "^1.2.6" }, @@ -2103,8 +2061,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/has-ansi": { "version": "4.0.1", @@ -2175,7 +2132,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, "funding": [ { "type": "github", @@ -2194,8 +2150,7 @@ "node_modules/immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -2226,7 +2181,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2235,8 +2189,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "2.0.0", @@ -2356,8 +2309,7 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/isexe": { "version": "2.0.0", @@ -2429,7 +2381,6 @@ "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "dev": true, "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", @@ -2441,7 +2392,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -2455,14 +2405,12 @@ "node_modules/jszip/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/jszip/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -2480,7 +2428,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dev": true, "dependencies": { "readable-stream": "^2.0.5" }, @@ -2492,7 +2439,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -2506,14 +2452,12 @@ "node_modules/lazystream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/lazystream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -2522,7 +2466,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, "dependencies": { "immediate": "~3.0.5" } @@ -2536,8 +2479,7 @@ "node_modules/listenercount": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", - "dev": true + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" }, "node_modules/locate-path": { "version": "5.0.0", @@ -2554,68 +2496,57 @@ "node_modules/lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "dev": true + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" }, "node_modules/lodash.difference": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", - "dev": true + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" }, "node_modules/lodash.flatten": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" }, "node_modules/lodash.groupby": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", - "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==", - "dev": true + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" }, "node_modules/lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "dev": true + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "dev": true + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" }, "node_modules/lodash.isfunction": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", - "dev": true + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" }, "node_modules/lodash.isnil": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", - "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==", - "dev": true + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" }, "node_modules/lodash.isundefined": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", - "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==", - "dev": true + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -2632,14 +2563,12 @@ "node_modules/lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", - "dev": true + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, "node_modules/loupe": { "version": "3.1.1", @@ -2722,7 +2651,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2844,7 +2772,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2862,7 +2789,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -2950,8 +2876,7 @@ "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "node_modules/parent-module": { "version": "1.0.1", @@ -2996,7 +2921,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3068,8 +2992,7 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/progress": { "version": "2.0.3", @@ -3225,7 +3148,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3239,7 +3161,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dev": true, "dependencies": { "minimatch": "^5.1.0" } @@ -3248,7 +3169,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -3350,7 +3270,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -3362,7 +3281,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3372,7 +3290,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3392,7 +3309,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3404,7 +3320,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -3424,7 +3339,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, "dependencies": { "xmlchars": "^2.2.0" }, @@ -3468,8 +3382,7 @@ "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/shebang-command": { "version": "2.0.0", @@ -3622,7 +3535,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -3767,7 +3679,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -3843,7 +3754,6 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, "engines": { "node": ">=14.14" } @@ -3864,7 +3774,6 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "dev": true, "engines": { "node": "*" } @@ -3978,7 +3887,6 @@ "version": "0.10.14", "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", - "dev": true, "dependencies": { "big-integer": "^1.6.17", "binary": "~0.3.0", @@ -3996,7 +3904,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -4010,14 +3917,12 @@ "node_modules/unzipper/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/unzipper/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -4046,8 +3951,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { "version": "9.0.1", @@ -4241,8 +4145,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { "version": "8.16.0", @@ -4277,8 +4180,7 @@ "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "node_modules/y18n": { "version": "5.0.8", @@ -4380,7 +4282,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", - "dev": true, "dependencies": { "archiver-utils": "^3.0.4", "compress-commons": "^4.1.2", @@ -4394,7 +4295,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", - "dev": true, "dependencies": { "glob": "^7.2.3", "graceful-fs": "^4.2.0", @@ -4415,7 +4315,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4425,7 +4324,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4445,7 +4343,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, diff --git a/accessibility-checker-extension/test/package.json b/accessibility-checker-extension/test/package.json index f12112f4c..e0e5cb6a4 100644 --- a/accessibility-checker-extension/test/package.json +++ b/accessibility-checker-extension/test/package.json @@ -19,6 +19,7 @@ "typescript": "^5.3.3" }, "dependencies": { + "exceljs": "^4.4.0", "ts-node": "^10.9.2" } } diff --git a/accessibility-checker-extension/test/support/BrowserWrapper.ts b/accessibility-checker-extension/test/support/BrowserWrapper.ts index e1e56d482..a79bc4f92 100644 --- a/accessibility-checker-extension/test/support/BrowserWrapper.ts +++ b/accessibility-checker-extension/test/support/BrowserWrapper.ts @@ -54,6 +54,13 @@ export class BrowserWrapper { } } await new Promise(resolve => setTimeout(resolve, 3000)); + const index = this.pageKeyToTabId("altoro")!; + const panelUrl = this.panelKeyToURL("assessment"); + let p = await browser.newPage(); + await p.goto(`${panelUrl}?index=${encodeURIComponent(index)}`); + await new Promise(resolve => setTimeout(resolve, 1000)); + await p.close(); + return browser; }) } diff --git a/accessibility-checker-extension/test/support/steps/steps_excel.ts b/accessibility-checker-extension/test/support/steps/steps_excel.ts new file mode 100644 index 000000000..5a49754e1 --- /dev/null +++ b/accessibility-checker-extension/test/support/steps/steps_excel.ts @@ -0,0 +1,18 @@ +import {Given, Then} from '@cucumber/cucumber'; +import { Workbook } from 'exceljs'; +import { join } from 'path'; +import { PupUtil } from '../util/pup'; +import { strict as assert } from "assert"; + +Given("excel file {string}", async function(filename: string) { + const workbook = new Workbook(); + await workbook.xlsx.readFile(join(PupUtil.getTempDownloadFolder(), filename)); + this.excelFile = workbook; +}); + +Then ("Excel Sheet {string} Cell {string} is {string}", async function(sheetStr: string, cellStr: string, txt: string) { + let workbook: Workbook = this.excelFile; + let sheet = workbook.getWorksheet(sheetStr); + let cell = sheet.getCell(cellStr); + assert.strictEqual(cell.text, txt); +}); \ No newline at end of file diff --git a/accessibility-checker-extension/test/support/steps/steps_generic.ts b/accessibility-checker-extension/test/support/steps/steps_generic.ts index 6db092932..f742cf92f 100644 --- a/accessibility-checker-extension/test/support/steps/steps_generic.ts +++ b/accessibility-checker-extension/test/support/steps/steps_generic.ts @@ -3,6 +3,8 @@ import {CustomWorld} from '../CustomWorld'; import { BrowserWrapper } from '../BrowserWrapper'; import { strict as assert } from "assert"; import { PupUtil } from "../util/pup"; +import { existsSync, readdirSync } from 'fs'; +import { join } from 'path'; Given("{string} page {string} and panel {string}", async function(widthKey, pageKey, panelKey) { const browser : BrowserWrapper = this.browser; @@ -12,6 +14,19 @@ Given("{string} page {string} and panel {string}", async function(widthKey, page // assert.strictEqual(false, true, "Test"); }); +Given("browser download folder {string}", async function(folder:string) { + const browser : BrowserWrapper = this.browser; + await PupUtil.setTempDownloadFolder(browser.page(), folder); +}); + +Then("downloaded file {string} exists", async function(file: string) { + let bExists = existsSync(join(PupUtil.getTempDownloadFolder(), file)); + if (!bExists) { + console.info(readdirSync(PupUtil.getTempDownloadFolder())) + } + assert.strictEqual(bExists, true); +}); + Then("Banner is loaded", function() { }) diff --git a/accessibility-checker-extension/test/support/util/pup.ts b/accessibility-checker-extension/test/support/util/pup.ts index 1b29ab4b2..00bd94d09 100644 --- a/accessibility-checker-extension/test/support/util/pup.ts +++ b/accessibility-checker-extension/test/support/util/pup.ts @@ -2,6 +2,9 @@ import { Page, ElementHandle, KeyInput } from "puppeteer"; import { strict as assert } from "assert"; import { IBaselineReport, IBaselineResult } from "accessibility-checker/lib/common/engine/IReport"; import { assertCompliance, getBaseline, getCompliance } from "accessibility-checker"; +import { join } from "path"; +import { tmpdir } from "os"; +import { mkdirSync } from "fs"; export namespace PupUtil { @@ -218,4 +221,24 @@ export namespace PupUtil { assert(report.summary.counts.violation === (baseline ? baseline.summary.counts.violation : 0), message); } } + + let downloadFolder: string | null = null; + + export function getTempDownloadFolder() { + if (!downloadFolder) throw new Error("Download folder not set"); + return downloadFolder; + } + + export async function setTempDownloadFolder(page: Page, folder: string) { + if (folder.includes("..")) throw new Error(".. not allowed in folder name"); + downloadFolder = join(tmpdir(),folder); + mkdirSync(downloadFolder, { recursive: true }); + + const client = await page.target().createCDPSession() + await client.send('Browser.setDownloadBehavior', { + behavior: 'allow', + downloadPath: downloadFolder + }) + console.log("Setting download folder", downloadFolder); + } } \ No newline at end of file From 3530c6159248a0717a2719748e60aba4f3fdd31e Mon Sep 17 00:00:00 2001 From: Tom Brunet Date: Fri, 17 May 2024 13:08:10 -0500 Subject: [PATCH 6/6] typescript error --- .../test/support/steps/steps_excel.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/accessibility-checker-extension/test/support/steps/steps_excel.ts b/accessibility-checker-extension/test/support/steps/steps_excel.ts index 5a49754e1..730206b04 100644 --- a/accessibility-checker-extension/test/support/steps/steps_excel.ts +++ b/accessibility-checker-extension/test/support/steps/steps_excel.ts @@ -13,6 +13,10 @@ Given("excel file {string}", async function(filename: string) { Then ("Excel Sheet {string} Cell {string} is {string}", async function(sheetStr: string, cellStr: string, txt: string) { let workbook: Workbook = this.excelFile; let sheet = workbook.getWorksheet(sheetStr); - let cell = sheet.getCell(cellStr); - assert.strictEqual(cell.text, txt); + if (!sheet) { + assert.fail("Sheet does not exist"); + } else { + let cell = sheet.getCell(cellStr); + assert.strictEqual(cell.text, txt); + } }); \ No newline at end of file