├── .gitignore ├── README.md ├── credentials.js ├── img ├── index-coverage-excel-results.png ├── index-coverage-extractor-email-pass-prompt.png ├── running-index-cov-script.png └── select-gsc-props-terminal.png ├── index.js ├── package-lock.json ├── package.json └── report-names.js /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules* 2 | archive 3 | cookies.json 4 | index-results* 5 | DOM* -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Google Search Console Index Coverage Extractor 2 | 3 | This script allows users of Google Search Console (GSC) to extract all the different reports from the [Index Coverage report section](https://support.google.com/webmasters/answer/7440203?hl=en) of the platform and the [Sitemap Coverage report section](https://support.google.com/webmasters/answer/7451001?hl=en&ref_topic=9456557). I wrote a blog post about [why I built this script](https://jlhernando.com/blog/index-coverage-extractor/). 4 | 5 | ## Installing and running the script 6 | 7 | The script uses the ECMAScript modules import/export syntax so double check that you are above version 20 to run the script. 8 | 9 | ```bash 10 | # Check Node version 11 | node -v 12 | ``` 13 | 14 | After downloading/cloning the repo, install the necessary modules to run the script. 15 | 16 | ```bash 17 | npm install 18 | ``` 19 | 20 | After that you can run the script with _npm start_ command from your terminal. 21 | 22 | ```bash 23 | npm start 24 | ``` 25 | 26 | You will get a prompt message in your terminal asking for your Google Account email address and your password. This is to login automatically through the headless browser. 27 | 28 | ![Prompt email and password](/img/index-coverage-extractor-email-pass-prompt.png) 29 | 30 | If you have 2-step Verification enabled it will prompt a warning message and wait for 30 seconds to give the user time to verify access through one of your devices. 31 | 32 | Once verified and logged in, the script will extract all the list of GSC properties present in your account. At this point you will have to choose which properties you would like to extract data from. 33 | 34 | ![Select GSC properties](/img/select-gsc-props-terminal.png) 35 | 36 | Select one or multiple properties using the spacebar. Move up and down using the arrow keys. 37 | 38 | When this is done, your will see the processing messages in your terminal while the script runs. 39 | 40 | ![Messages while running index coverage script](/img/running-index-cov-script.png) 41 | 42 | ## Output 43 | 44 | The script will create a "index-results\_${date}.xlsx" Excel file. The file will contain 1 summary tab with the number of Indexed URLs per property when you choose more than 1 property and up to 4 tabs per property including: 45 | 46 | - A summary of the index coverage extraction of the property. 47 | - The individual URLs extracted from the Coverage section. 48 | - A summary of the index coverage extraction from the Sitemap section. 49 | - The individual URLs extracted from the Sitemap section. 50 | 51 | ![Results Excel report detail](/img/index-coverage-excel-results.png 'index coverage report export Excel detail') 52 | 53 | The "sitename_COV" tab and the "coverage.csv" file will contain all the URLs that have been extracted from each individual coverage report. If you have requested a domain property the tab in Excel and the CSV will be precded by DOM. 54 | 55 | ![Coverage report detail csv](https://jlhernando.com/img/coverage-csv.jpg 'index coverage report export detail csv') 56 | 57 | The "sitename_SUM" tab and the "summary.csv" file will contain the amount of urls per report that have been extracted, the total number that GSC reports in the user interface (either the same or higher) and an "extraction ratio" which is a division between the URLs extracted and the total number of URLs reported by GSC. 58 | 59 | ![Coverage report summary csv](https://jlhernando.com/img/coverage-summary.jpg 'index coverage report export summary csv') 60 | This is useful because GSC has an export limit of 1000 rows per report. Hence, the "extraction ratio" may be small compared to the total amount of total URLs within a specific report. 61 | 62 | The "sitename_MAPS" tab and the "sitemap.csv" file will contain all the URLs that have been extracted from each individual sitemap coverage report. 63 | 64 | ![Coverage report detail csv](https://jlhernando.com/img/coverage-csv.jpg 'index coverage report export detail csv') 65 | 66 | The "sitename_SUM_MAPS" tab and the "sum-sitemap.csv" file will contain a summary of the top-level coverage numbers per sitemap reported by GSC. 67 | 68 | ## Additional optional settings 69 | 70 | ### _credentials.js File_ 71 | 72 | #### Email & Password 73 | 74 | You can choose to fill in the `credentials.js` file with your email and password to avoid adding them in the terminal during the running of the script. 75 | 76 | ![Update credentials.js with your Search Console user & password](https://jlhernando.com/img/credentials.jpg 'update credentials.js with your Search Console user & password') 77 | 78 | #### Sites 79 | 80 | Verified GSC properties can be added in the `credentials.js` file. You can add them as a single string for only 1 property OR as an array for multiple properties. 81 | 82 | Remember that if you want to extract data from a Domain Property you should add `sc-domain:` in front of the domain (_sc-domain:yourdomain.com_). 83 | 84 | ```js 85 | // Single property 86 | const site = 'https://yoursite.com/'; 87 | 88 | // OR Multiple properties 89 | const site = ['https://yoursite.com/', 'sc-domain:yourdomain.com']; 90 | ``` 91 | 92 | ### Cookies 93 | After your first login using the tool a `cookies.json` file will be created to avoid the log in process multiple times. If you use multiple accounts remember to delete this file. 94 | 95 | ### Headless 96 | 97 | In some cases you might want to see how the browser automation is happenning in real-time. For that, you can change the `headless` variable. 98 | 99 | ```js 100 | // Change to false to see the automation 101 | const headless = false; 102 | ``` 103 | 104 | ### sitemapExtract 105 | 106 | Since each GSC property can contain many sitemaps and this can take more time, you can choose wether you would like to extract sitemap coverage data or not. 107 | 108 | ```js 109 | // Change to false to prevent the script from extracting sitemap coverage data 110 | const sitemapExtract = false; 111 | ``` 112 | 113 | ### Dates 114 | 115 | The script extracts the "Latest updated" dates that GSC provides. Hence the date can be in two different formats: American date (mm/dd/yyyy) and European date (dd/mm/yyyy). Therefore there is an option to set which date format you would like the script to output the dates: 116 | ![Date format settings for extraction](https://jlhernando.com/img/date-format-settings.png 'GSC date format settings for extarction') 117 | 118 | The default setting assumes your property shows the dates in European date format (dd/mm/yyyy). If your GSC property shows the dates in American date format then you would need to change `americanDate = true`. Also if your property is in American date format but you'd like to change it to European date format you can do that by changing `americanDateChange = true`. 119 | 120 | ## Notable changes in the last version 121 | 122 | A big difference in this version is that it will only extract the reports that are available instead of looping through all the coverage reports GSC offers (old `report-types.js`). This minimises the amount of requests to Google Search Console tot he absolute minimum required. 123 | 124 | ## Reports that extracts 125 | 126 | ### Indexed 127 | 128 | - [x] All Indexed URLs 129 | 130 | #### (Old Warning reports) 131 | 132 | - [x] Indexed, though blocked by robots.txt 133 | - [x] Page indexed without content 134 | 135 | ### Not indexed 136 | 137 | - [x] Excluded by ‘noindex’ tag 138 | - [x] Blocked by page removal tool 139 | - [x] Blocked by robots.txt 140 | - [x] Blocked due to unauthorized request (401) 141 | - [x] Crawled - currently not indexed 142 | - [x] Discovered - currently not indexed 143 | - [x] Alternate page with proper canonical tag 144 | - [x] Duplicate without user-selected canonical 145 | - [x] Duplicate, Google chose different canonical than user 146 | - [x] Not found (404) 147 | - [x] Page with redirect 148 | - [x] Soft 404 149 | - [x] Duplicate, submitted URL not selected as canonical 150 | - [x] Blocked due to access forbidden (403) 151 | - [x] Blocked due to other 4xx issue 152 | 153 | #### (Old Error report) 154 | 155 | - [x] Server error (5xx) 156 | - [x] Redirect error 157 | - [x] Submitted URL blocked by robots.txt 158 | - [x] Submitted URL marked ‘noindex’ 159 | - [x] Submitted URL seems to be a Soft 404 160 | - [x] Submitted URL has crawl issue 161 | - [x] Submitted URL not found (404) 162 | - [x] Submitted URL returned 403 163 | - [x] Submitted URL returns unauthorized request (401) 164 | - [x] Submitted URL blocked due to other 4xx issue 165 | -------------------------------------------------------------------------------- /credentials.js: -------------------------------------------------------------------------------- 1 | // Edit this file with your credentials to access Google Search Console 2 | 3 | const email = ''; // Your Google Search Console Account Email (string) 4 | const pass = ''; // Your Search Console Account Password (string) 5 | const site = ''; // Website / Domain Properties to check. (string/array) 6 | 7 | export { email, pass, site }; 8 | -------------------------------------------------------------------------------- /img/index-coverage-excel-results.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jlhernando/index-coverage-extractor/4f94f65a37b83f11ed3e0bfb37e5029cb8b88dfc/img/index-coverage-excel-results.png -------------------------------------------------------------------------------- /img/index-coverage-extractor-email-pass-prompt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jlhernando/index-coverage-extractor/4f94f65a37b83f11ed3e0bfb37e5029cb8b88dfc/img/index-coverage-extractor-email-pass-prompt.png -------------------------------------------------------------------------------- /img/running-index-cov-script.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jlhernando/index-coverage-extractor/4f94f65a37b83f11ed3e0bfb37e5029cb8b88dfc/img/running-index-cov-script.png -------------------------------------------------------------------------------- /img/select-gsc-props-terminal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jlhernando/index-coverage-extractor/4f94f65a37b83f11ed3e0bfb37e5029cb8b88dfc/img/select-gsc-props-terminal.png -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /* Modules */ 2 | import { email, pass, site } from './credentials.js'; // Import Google Search Credentials - EDIT CREDENTIALS.JS 3 | import { writeFile, mkdir, readFile } from 'fs/promises'; // Module to access the File System - Extract only ones needed 4 | import { existsSync } from 'fs'; // File System sync 5 | import { firefox } from 'playwright'; // Choose browser - Currently firefox but you can choose 'chromium' or 'webkit'. 6 | import { parse } from 'json2csv'; // Convert JSON to CSV 7 | import { reportsNames } from './report-names.js'; // Custom array of objects with specific params to access GSC reports 8 | import Excel from 'exceljs'; // Create Excel docs in JS 9 | import moment from 'moment'; // Handle dates easily 10 | import * as readline from 'node:readline/promises'; // Create native NodeJS user prompts 11 | import { stdin as input, stdout as output } from 'node:process'; // Create user prompts 12 | import prompt from 'enquirer'; // Create prompts with more custom options 13 | import chalk from 'chalk'; // Add colors to console logs 14 | 15 | /* Settings */ 16 | const headless = true; // Wether if you want to see the browser automation (false) or not (true) - Default true 17 | const sitemapExtract = true; // Wether you want to extract data from sitemaps or not - Default true 18 | const sites = []; // Holding array for GSC properties 19 | const indexedSum = []; // Holding array for summary of indexed URLs from all GSC properties 20 | const americanDate = false; // Variable to identify that the GSC property has American Date (mm/dd/yy). If your GSC property does not have American Date this variable should be set as false 21 | const americanDateChange = false; // Converts American Date (mm/dd/yy) in GSC to European Date (dd/mm/yy) 22 | const reportSelector = '.OOHai'; // CSS Selector from report Urls 23 | const reportTitle = '.Iq9klb'; // CSS Selector to extract report name from sitemap coverage reports 24 | const reportStatus = '.DDFhO'; // CSS Selector to extract report status from sitemap coverage reports 25 | const warning = chalk.hex('#FFA500'); // Warning color 26 | const cookiesPath = './cookies.json'; // Path to cookies file 27 | const gscHomepage = 'https://search.google.com/search-console/welcome?hl=en'; // GSC Homepage URL 28 | 29 | /* Global functions */ 30 | // Create file system friendly names for properties 31 | const friendlySiteName = (str) => { 32 | const friendlystr = str 33 | .replace(/(http.*:\/\/)/g, '') 34 | .replace(/(sc-domain)/g, 'DOM') 35 | .replace(/\//g, '_') 36 | .replace(/\_$/g, '') 37 | .replaceAll(/\.|:/g, '_'); 38 | 39 | const short = friendlystr.slice(0, 22); // To fit Excel tab char limit 40 | 41 | return { file: friendlystr, short }; 42 | }; 43 | 44 | // Asynchronous IIFE - Immeditaly invoked function expression 45 | (async () => { 46 | console.log('Launching browser...'); // Initial log to let the user know the script is running 47 | 48 | // Setup browser 49 | const browser = await firefox.launch({ headless: headless }); // Switch headless to false if you want to see the broswer automation 50 | const context = await browser.newContext(); 51 | 52 | // Load cookies if they exist 53 | if (existsSync(cookiesPath)) { 54 | const cookies = JSON.parse(await readFile(cookiesPath, 'utf-8')); 55 | await context.addCookies(cookies); 56 | console.log('Cookies loaded.'); 57 | } 58 | 59 | // Setup New Page 60 | let page = await context.newPage(); 61 | 62 | // Check if already logged in by visiting a page that requires authentication 63 | await page.goto(gscHomepage); 64 | let loggedIn = false; 65 | 66 | try { 67 | await page.waitForSelector('text="Welcome to Google Search Console"', { timeout: 2000 }); 68 | console.log('Already logged in.'); 69 | loggedIn = true; 70 | } catch (error) { 71 | console.log('Not logged in, proceeding with login...'); 72 | 73 | // Find and submit Email input 74 | let gmail = ''; 75 | 76 | try { 77 | // Check if there is an email in credentials file or let user add email in prompt 78 | if (!email) { 79 | const rl = readline.createInterface({ input, output }); 80 | gmail = await rl.question(warning('-> Input your Google Account email: ')); 81 | rl.close(); 82 | } else gmail = email; 83 | 84 | // Input email 85 | await page.getByRole('textbox', { name: 'Email or phone' }).type(gmail, { delay: 50 }); 86 | await page.keyboard.press('Enter'); 87 | console.log('Inputing email...'); 88 | 89 | // Check if there was an error message / issue 90 | await page.waitForResponse((resp) => 91 | resp.url().includes('https://accounts.google.com/v3/signin/_/AccountsSignInUi/') 92 | ); 93 | if (await page.getByText('Couldn’t find your Google Account').isVisible()) { 94 | console.log( 95 | chalk.red('Google couldn’t find your Google Account. Check the email you have added and run the script again.') 96 | ); 97 | process.exit(); 98 | } 99 | } catch (error) { 100 | console.log(chalk.red('There was an issue with you email address.', error)); 101 | process.exit(); 102 | } 103 | // Find and submit Password input 104 | let password = ''; 105 | 106 | try { 107 | if (!pass) { 108 | const rl = readline.createInterface({ input, output }); 109 | password = await rl.question(warning('-> Input your Google Account password: ')); 110 | rl.close(); 111 | } else password = pass; 112 | 113 | await page.getByRole('textbox', { name: 'Enter your password' }).type(password, { delay: 50 }); 114 | await page.keyboard.press('Enter'); 115 | console.log('Inputing password...'); 116 | 117 | // Check if there was an error message / issue 118 | await page.waitForResponse((resp) => 119 | resp.url().includes('https://accounts.google.com/v3/signin/_/AccountsSignInUi/') 120 | ); 121 | if (await page.getByText('Wrong password').isVisible()) { 122 | console.log(chalk.red('Wrong Password. Run the script and try again.')); 123 | process.exit(); 124 | } 125 | 126 | await page.waitForTimeout(2000); // Wait a bit for text to load 127 | if (page.url().includes('/challenge/')) { 128 | const twoStepVerificationHeading = page.locator('span', { hasText: '2-Step Verification' }).first(); 129 | if (twoStepVerificationHeading) { 130 | try { 131 | console.log( 132 | warning( 133 | 'You have 2-step Verification enabled. Check your device to pass to the next step. The script will only wait for 30 seconds' 134 | ) 135 | ); 136 | console.log('Waiting 30 seconds...'); 137 | 138 | // Check if the URL is GSC's Homepage every second for up to 30 seconds 139 | let checkDuration = 30000; // 30 seconds 140 | let interval = 1000; // 1 second 141 | let elapsed = 0; 142 | 143 | while (elapsed < checkDuration) { 144 | if (page.url().includes(gscHomepage)) { 145 | console.log(chalk.green('URL includes search.google.com. 2-step verification completed.')); 146 | break; 147 | } 148 | await page.waitForTimeout(interval); 149 | elapsed += interval; 150 | } 151 | 152 | if (elapsed >= checkDuration) { 153 | console.log(chalk.red('2-step Verification timeout. Please retry with your verification device ready.')); 154 | process.exit(); 155 | } 156 | 157 | } catch (e) { 158 | console.log(chalk.red('There was an issue with 2-step Verification: ', e)); 159 | process.exit(); 160 | } 161 | } 162 | } 163 | 164 | } catch (error) { 165 | console.error(chalk.red('There was an issue with your password: ', error)); 166 | process.exit(); 167 | 168 | } 169 | 170 | } 171 | // Wait until GSC property is loaded 172 | await page.waitForSelector('text="Welcome to Google Search Console"'); 173 | console.log(chalk.bgGreen('GSC access sucessful!')); 174 | loggedIn = true; 175 | // Save cookies after login 176 | try { 177 | const cookies = await context.cookies(); 178 | await writeFile(cookiesPath, JSON.stringify(cookies, null, 2)); 179 | console.log('Cookies saved.'); 180 | } catch (error) { 181 | console.log(chalk.red('Error saving cookies:', error)); 182 | } 183 | console.log('Logged in after cookies saved'); 184 | 185 | // Create Excel doc 186 | const workbook = new Excel.Workbook(); 187 | 188 | const createExcelTab = async (arr, wb, tabName) => { 189 | if (!arr || arr.length === 0) { 190 | console.log(chalk.red(`No data available to create Excel tab: ${tabName}`)); 191 | return; 192 | } 193 | const headers = Object.keys(arr[0]).map((name) => ({ name, filterButton: true, width: 32 })); 194 | 195 | const sheet = wb.addWorksheet(tabName); 196 | 197 | sheet.addTable({ 198 | name: tabName, 199 | ref: 'A1', 200 | headerRow: true, 201 | style: { 202 | showRowStripes: true, 203 | }, 204 | columns: headers, 205 | rows: arr.map((obj) => Object.values(obj)), 206 | }); 207 | }; 208 | 209 | // Proceed to the main logic if logged in 210 | if (loggedIn) { 211 | console.log('Logged in, proceeding with extraction...'); 212 | // Check if there is a site specified in credentials.js 213 | if (typeof site === 'string' && site.length > 0) sites.push(site); 214 | if (Array.isArray(site)) sites.push(...site); 215 | if (!site) { 216 | console.log('Looking for GSC properties...'); 217 | const gscProps = await page.evaluate(() => { 218 | var rawArray = Array.from(document.querySelectorAll('script[nonce]'), (el) => el.text); 219 | var sites = rawArray.filter((s) => s.includes('ds:1'))[1]; 220 | var regex = new RegExp('((?:http|sc-domain)[^"]+)', 'g'); 221 | var matches = [...sites.matchAll(regex)]; 222 | var clean = matches.reduce((acc, cur) => { 223 | const site = cur[0]; 224 | if (!site.includes('google.com')) acc.add(site); 225 | return acc; 226 | }, new Set()); 227 | return Array.from(clean); 228 | }); 229 | 230 | // Select properties you want to extract data from 231 | const promptMulti = new prompt.MultiSelect({ 232 | name: 'gscprops', 233 | message: 'Select properties (min. 1)', 234 | choices: gscProps, 235 | }); 236 | const selectedProps = await promptMulti 237 | .run() 238 | .catch((e) => console.log(chalk.red('No properties were selected: ', e))); 239 | sites.push(...selectedProps); 240 | } 241 | // Loop through site choices 242 | for (let site of sites) { 243 | console.log(chalk.bgCyanBright('Extracting data from: ', site)); 244 | 245 | /* Data */ 246 | const resource = encodeURIComponent(site); // Encode it to create the correct URL 247 | const { file, short } = friendlySiteName(site); 248 | const results = []; // Empty holding array to push report results 249 | const summary = []; // Empty holding array to push summary results per report 250 | const sitemapRes = []; // Empty holding array to push coverage results per sitemap 251 | const summarySitemaps = []; // Empty holding array to push coverage summary results per sitemap 252 | 253 | // Create folder to store CSV output 254 | !existsSync(file) ? mkdir(file) : console.log(`${file} folder already exists`); 255 | 256 | // Access Index Coverage page from site 257 | await page.goto(`https://search.google.com/search-console/index?resource_id=${resource}`); 258 | 259 | // Extract available reports for property 260 | const reportIDs = await page.evaluate( 261 | ([prop]) => { 262 | // Extract text content from desired script tags 263 | var rawArray = Array.from(document.querySelectorAll('script[nonce]'), (el) => el.text); 264 | var ruleNotIndexed = 'ds:11'; 265 | var ruleWarning = 'ds:13'; 266 | 267 | // Isolate the right script that match rules 268 | var notIndexed = rawArray.filter((s) => s.includes(ruleNotIndexed))[1]; 269 | var warning = rawArray.filter((s) => s.includes(ruleWarning))[1]; 270 | var script = notIndexed.concat(warning); 271 | console.log(script); 272 | 273 | // Match Report IDs 274 | var regex = new RegExp(`"${prop}",13,"([^"]+)"`, 'g'); 275 | var matches = [...script.matchAll(regex)]; 276 | 277 | // Capture unique IDs 278 | var ids = new Set(); 279 | 280 | for (const match of matches) { 281 | ids.add(match[1]); 282 | } 283 | 284 | // Create output with Indexed report already in 285 | const reports = [{ category: 'Indexed', key: 'pages', param: 'ALL_URLS' }]; 286 | ids.forEach((id) => reports.push({ category: 'Not indexed/Warning', key: 'item_key', param: id })); 287 | 288 | return reports; 289 | }, 290 | [site] 291 | ); 292 | 293 | console.log(`Found ${reportIDs.length} reports`); 294 | 295 | // Loop through report categories 296 | for (const { category, key, param } of reportIDs) { 297 | /* Individual site settings */ 298 | const report = `https://search.google.com/search-console/index/drilldown?resource_id=${resource}&${key}=${param}`; // URL to report each report 299 | 300 | // Individual report 301 | await page.goto(report); 302 | 303 | // Extract URLs from each report 304 | const reportUrls = await page.evaluate( 305 | ([sel, cat, rep]) => { 306 | // Extract Last Updated date 307 | const updated = document.querySelector('.zTJZxd.zOPr2c')?.innerText ?? 'No date'; 308 | 309 | // Extract URls and build result object 310 | const arr = Array.from(document.querySelectorAll(sel)).map((url) => ({ 311 | status: cat, 312 | 'report name': document.querySelector('.Iq9klb')?.innerText ?? 'No name', 313 | url: url.innerText.replace(//g, ''), 314 | updated: updated.replace(/[^\d|\/]+/g, ''), 315 | })); 316 | return Promise.resolve(arr); 317 | }, 318 | [reportSelector, category, param] 319 | ); 320 | 321 | // Push urls from each report into results array for future CSV rows 322 | results.push(...reportUrls); 323 | 324 | // Log extraction result 325 | console.log(`Checking ${reportsNames[param]} report - ${reportUrls.length} URLs found`); 326 | 327 | // If there is data in the report create unique objects (future CSV rows) per URL 328 | if (reportUrls.length !== 0) { 329 | // Extract total number of URLs reported by GSC 330 | const total = await page.evaluate(() => { 331 | const num = Array.from(document.querySelectorAll('.CO3mte')); 332 | return Promise.resolve(parseInt(num[num.length - 1].attributes.title.textContent.replace(',', ''))); 333 | }); 334 | 335 | // Create summary object per report type (for future CSV rows) 336 | summary.push({ 337 | status: category, 338 | 'report name': reportUrls[0]['report name'], 339 | '# URLs extracted': reportUrls.length, 340 | 'total reported': total, 341 | 'extraction ratio': reportUrls.length / total, 342 | }); 343 | 344 | if (param === 'ALL_URLS' && sites.length > 1) { 345 | console.log('Adding indexed summary of', sites.length, ' sites'); 346 | indexedSum.push({ 347 | 'GSC Property': site, 348 | status: category, 349 | 'report name': reportUrls[0]['report name'], 350 | '# URLs extracted': reportUrls.length, 351 | 'total reported': total, 352 | 'extraction ratio': reportUrls.length / total, 353 | }); 354 | } 355 | } 356 | } 357 | // Change date format from reportUrls objects 358 | const finalResults = results.map(({ updated, ...rest }) => { 359 | if (americanDate) { 360 | const lastUpdated = moment(updated, 'MM-DD-YYYY').format('DD-MM-YYYY'); 361 | const americanlastUpdated = moment(updated, 'MM-DD-YYYY').format('MM-DD-YYYY'); 362 | return { ...rest, 'last updated': americanDateChange ? lastUpdated : americanlastUpdated }; 363 | } else { 364 | const lastUpdated = moment(updated, 'DD-MM-YYYY').format('DD-MM-YYYY'); 365 | return { ...rest, 'last updated': lastUpdated }; 366 | } 367 | }); 368 | 369 | // Parse JSON to CSV if there is data to parse 370 | if (finalResults.length) { 371 | writeFile(`./${file}/coverage_${file}_${moment().format('DD-MM-YYYY')}.csv`, parse(finalResults)); // Parse results JSON to CSV 372 | writeFile(`./${file}/summary_${file}_${moment().format('DD-MM-YYYY')}.csv`, parse(summary)); // Parse summary JSON to CSV 373 | console.log(chalk.green('URL Coverage CSV outputs created!')); 374 | } 375 | 376 | // Add data to Excel doc as tabs 377 | createExcelTab(summary, workbook, `${short}_SUM`); 378 | createExcelTab(finalResults, workbook, `${short}_COV`); 379 | 380 | if (sitemapExtract) { 381 | // Extract sitemap index coverage 382 | const sitemapEndPoint = `https://search.google.com/search-console/sitemaps?resource_id=${resource}`; 383 | await page.goto(sitemapEndPoint); 384 | 385 | // Extract list of sitemaps into array 386 | const sitemaps = await page.evaluate(() => { 387 | const list = Array.from(document.querySelectorAll('.nJ0sOc.Ev7kWb.ptEsvc.s4dpBd')); 388 | return Promise.resolve(list.map((row) => row.dataset.rowid)); 389 | }); 390 | 391 | // Loop through each sitemap report 392 | for (const sitemap of sitemaps) { 393 | // Individual sitemap report 394 | const sitemapReport = `https://search.google.com/search-console/index?resource_id=${resource}&pages=SITEMAP&sitemap=${encodeURIComponent( 395 | sitemap 396 | )}`; 397 | // Go to Sitemap report and log URL 398 | const reportPage = await page.goto(sitemapReport); 399 | console.log(chalk.bgBlue(`Extracting coverage data from sitemap: ${sitemap}`)); 400 | // Intercept Doc Netowork request (raw HTML) 401 | const source = await reportPage.text(); 402 | // Find individual sitemap report keys (IDs) through pattern 403 | const reportKeys = [...source.matchAll(/CAES\w+/g)]; 404 | // Store individual sitemap report keys without duplicates 405 | const sitemapCoverageReports = new Set(); 406 | // Loop through matchAll values to extract individual sitemap report keys 407 | for (const val of reportKeys) { 408 | sitemapCoverageReports.add(val[0]); 409 | } 410 | 411 | // Get coverage summary of sitemap 412 | const sitemapNums = await page.evaluate( 413 | (origin) => { 414 | const topNums = Array.from(document.querySelectorAll('.nnLLaf')); 415 | if (topNums.length > 0) { 416 | const extractNums = topNums.map((num) => num.attributes.title.textContent); 417 | const summarySitemapCoverage = { 418 | sitemap: origin[0], 419 | 'Not indexed': parseInt(extractNums[0].replace(',', '')), 420 | indexed: parseInt(extractNums[1].replace(',', '')), 421 | }; 422 | return Promise.resolve(summarySitemapCoverage); 423 | } else 424 | return Promise.resolve({ 425 | sitemap: origin[0], 426 | 'Not indexed': 'Sitemap fetching error', 427 | indexed: 'Sitemap fetching error', 428 | }); 429 | }, 430 | [sitemap] 431 | ); 432 | 433 | // Add individual sitemap summary numbers to summarySitemaps array 434 | summarySitemaps.push(sitemapNums); 435 | 436 | // Access & Extract Indexed URLs from sitemap 437 | const indexedReport = `https://search.google.com/search-console/index/drilldown?resource_id=${resource}&pages=SITEMAP&sitemap=${encodeURIComponent( 438 | sitemap 439 | )}`; 440 | await page.goto(indexedReport); 441 | 442 | // Extract report title and URLs from each report 443 | const validURLs = await page.evaluate( 444 | ([sel, cat, title, origin]) => { 445 | const reportName = document.querySelector(title).innerText ?? 'No title'; 446 | const date = document.querySelector('.J54Vt').nextSibling ?? 'No date'; 447 | const urls = Array.from(document.querySelectorAll(sel)).map((row) => { 448 | return { 449 | sitemap: origin, 450 | 'report name': reportName, 451 | url: row.innerText.replace(//g, ''), 452 | date: date.textContent, 453 | }; 454 | }); 455 | return Promise.resolve(urls); 456 | }, 457 | [reportSelector, reportStatus, reportTitle, sitemap] 458 | ); 459 | 460 | // Push sitemap coverage results to holding array 461 | sitemapRes.push(...validURLs); 462 | 463 | // Access each individual coverage reports from each sitemap 464 | for (const key of sitemapCoverageReports) { 465 | const indReport = `https://search.google.com/search-console/index/drilldown?resource_id=${site}&item_key=${key}`; 466 | await page.goto(indReport); 467 | 468 | // Extract report title and URLs from each report 469 | const indReportUrls = await page.evaluate( 470 | ([sel, title, origin]) => { 471 | const reportName = document.querySelector(title).innerText ?? 'No title'; 472 | const date = document.querySelector('.J54Vt').nextSibling ?? 'No date'; 473 | const urls = Array.from(document.querySelectorAll(sel)).map((row) => { 474 | return { 475 | sitemap: origin, 476 | 'report name': reportName, 477 | url: row.innerText.replace(//g, ''), 478 | date: date.textContent, 479 | }; 480 | }); 481 | return Promise.resolve(urls); 482 | }, 483 | [reportSelector, reportTitle, sitemap] 484 | ); 485 | 486 | // Push sitemap coverage results to holding array 487 | sitemapRes.push(...indReportUrls); 488 | } 489 | // Force delay between sitemaps checks to prevent GSC detecting automated activity 490 | await new Promise((r) => setTimeout(r, 4000)); 491 | } 492 | 493 | // Change date format from reportUrls objects 494 | const finalSitemapRes = sitemapRes.map(({ date, ...rest }) => { 495 | if (americanDate) { 496 | const americanlastUpdated = moment(date, 'MM-DD-YYYY').format('MM-DD-YYYY'); 497 | const lastUpdated = moment(date, 'MM-DD-YYYY').format('DD-MM-YYYY'); 498 | return { ...rest, 'last updated': americanDateChange ? lastUpdated : americanlastUpdated }; 499 | } else { 500 | const lastUpdated = moment(date, 'DD-MM-YYYY').format('DD-MM-YYYY'); 501 | return { ...rest, 'last updated': lastUpdated }; 502 | } 503 | }); 504 | // Write summary sitemap coverage in CSV 505 | if (finalSitemapRes.length) { 506 | writeFile(`./${file}/sitemaps-${file}_${moment().format('DD-MM-YYYY')}.csv`, parse(finalSitemapRes)); // Parse sitemap results from JSON to CSV 507 | writeFile(`./${file}/sum-sitemaps-${file}_${moment().format('DD-MM-YYYY')}.csv`, parse(summarySitemaps)); 508 | console.log(chalk.green('Sitemap CSV outputs created!')); 509 | // Add sitemap data to Excel doc as tabs 510 | createExcelTab(summarySitemaps, workbook, `${short}_SUM_MAPS`); 511 | createExcelTab(finalSitemapRes, workbook, `${short}_MAPS`); 512 | } 513 | } 514 | } 515 | // Add indexed summary tab if there was data for more than 1 property 516 | if (indexedSum.length) { 517 | console.log('Adding indexed summary', indexedSum.length); 518 | 519 | createExcelTab(indexedSum, workbook, `Indexed_summary_ALL`); 520 | 521 | // Add summary tab at the beginning 522 | let tabs = workbook.worksheets; 523 | let last = tabs.length - 1; 524 | tabs[last].orderNo = 0; 525 | } 526 | // Close Browser 527 | await browser.close(); 528 | 529 | // Export Excel File 530 | await workbook.xlsx.writeFile(`index-results_${moment().format('DD-MM-YYYY')}.xlsx`); 531 | console.log(chalk.bgGreenBright('All data extracted - Find your results in the index-resuls.xlsx file')); 532 | 533 | } else { 534 | console.log(chalk.red('No properties were selected.')); 535 | process.exit(); 536 | } 537 | })(); 538 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "index-coverage-extractor", 3 | "version": "2.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "index-coverage-extractor", 9 | "version": "2.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "chalk": "^5.2.0", 13 | "enquirer": "^2.3.6", 14 | "exceljs": "^4.2.1", 15 | "fs": "0.0.1-security", 16 | "json2csv": "^5.0.6", 17 | "moment": "^2.29.1", 18 | "path": "^0.12.7", 19 | "playwright": "^1.30.0-alpha-dec-23-2022" 20 | } 21 | }, 22 | "node_modules/@fast-csv/format": { 23 | "version": "4.3.5", 24 | "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", 25 | "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", 26 | "dependencies": { 27 | "@types/node": "^14.0.1", 28 | "lodash.escaperegexp": "^4.1.2", 29 | "lodash.isboolean": "^3.0.3", 30 | "lodash.isequal": "^4.5.0", 31 | "lodash.isfunction": "^3.0.9", 32 | "lodash.isnil": "^4.0.0" 33 | } 34 | }, 35 | "node_modules/@fast-csv/parse": { 36 | "version": "4.3.6", 37 | "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", 38 | "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", 39 | "dependencies": { 40 | "@types/node": "^14.0.1", 41 | "lodash.escaperegexp": "^4.1.2", 42 | "lodash.groupby": "^4.6.0", 43 | "lodash.isfunction": "^3.0.9", 44 | "lodash.isnil": "^4.0.0", 45 | "lodash.isundefined": "^3.0.1", 46 | "lodash.uniq": "^4.5.0" 47 | } 48 | }, 49 | "node_modules/@types/node": { 50 | "version": "14.14.34", 51 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.34.tgz", 52 | "integrity": "sha512-dBPaxocOK6UVyvhbnpFIj2W+S+1cBTkHQbFQfeeJhoKFbzYcVUGHvddeWPSucKATb3F0+pgDq0i6ghEaZjsugA==" 53 | }, 54 | "node_modules/ansi-colors": { 55 | "version": "4.1.3", 56 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", 57 | "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", 58 | "engines": { 59 | "node": ">=6" 60 | } 61 | }, 62 | "node_modules/archiver": { 63 | "version": "5.3.0", 64 | "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", 65 | "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", 66 | "dependencies": { 67 | "archiver-utils": "^2.1.0", 68 | "async": "^3.2.0", 69 | "buffer-crc32": "^0.2.1", 70 | "readable-stream": "^3.6.0", 71 | "readdir-glob": "^1.0.0", 72 | "tar-stream": "^2.2.0", 73 | "zip-stream": "^4.1.0" 74 | }, 75 | "engines": { 76 | "node": ">= 10" 77 | } 78 | }, 79 | "node_modules/archiver-utils": { 80 | "version": "2.1.0", 81 | "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", 82 | "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", 83 | "dependencies": { 84 | "glob": "^7.1.4", 85 | "graceful-fs": "^4.2.0", 86 | "lazystream": "^1.0.0", 87 | "lodash.defaults": "^4.2.0", 88 | "lodash.difference": "^4.5.0", 89 | "lodash.flatten": "^4.4.0", 90 | "lodash.isplainobject": "^4.0.6", 91 | "lodash.union": "^4.6.0", 92 | "normalize-path": "^3.0.0", 93 | "readable-stream": "^2.0.0" 94 | }, 95 | "engines": { 96 | "node": ">= 6" 97 | } 98 | }, 99 | "node_modules/archiver-utils/node_modules/readable-stream": { 100 | "version": "2.3.7", 101 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 102 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 103 | "dependencies": { 104 | "core-util-is": "~1.0.0", 105 | "inherits": "~2.0.3", 106 | "isarray": "~1.0.0", 107 | "process-nextick-args": "~2.0.0", 108 | "safe-buffer": "~5.1.1", 109 | "string_decoder": "~1.1.1", 110 | "util-deprecate": "~1.0.1" 111 | } 112 | }, 113 | "node_modules/archiver-utils/node_modules/safe-buffer": { 114 | "version": "5.1.2", 115 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 116 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 117 | }, 118 | "node_modules/archiver-utils/node_modules/string_decoder": { 119 | "version": "1.1.1", 120 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 121 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 122 | "dependencies": { 123 | "safe-buffer": "~5.1.0" 124 | } 125 | }, 126 | "node_modules/async": { 127 | "version": "3.2.4", 128 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", 129 | "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" 130 | }, 131 | "node_modules/balanced-match": { 132 | "version": "1.0.0", 133 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 134 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 135 | }, 136 | "node_modules/base64-js": { 137 | "version": "1.5.1", 138 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 139 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 140 | "funding": [ 141 | { 142 | "type": "github", 143 | "url": "https://github.com/sponsors/feross" 144 | }, 145 | { 146 | "type": "patreon", 147 | "url": "https://www.patreon.com/feross" 148 | }, 149 | { 150 | "type": "consulting", 151 | "url": "https://feross.org/support" 152 | } 153 | ] 154 | }, 155 | "node_modules/big-integer": { 156 | "version": "1.6.48", 157 | "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", 158 | "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", 159 | "engines": { 160 | "node": ">=0.6" 161 | } 162 | }, 163 | "node_modules/binary": { 164 | "version": "0.3.0", 165 | "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", 166 | "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", 167 | "dependencies": { 168 | "buffers": "~0.1.1", 169 | "chainsaw": "~0.1.0" 170 | }, 171 | "engines": { 172 | "node": "*" 173 | } 174 | }, 175 | "node_modules/bl": { 176 | "version": "4.1.0", 177 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 178 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 179 | "dependencies": { 180 | "buffer": "^5.5.0", 181 | "inherits": "^2.0.4", 182 | "readable-stream": "^3.4.0" 183 | } 184 | }, 185 | "node_modules/bluebird": { 186 | "version": "3.4.7", 187 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", 188 | "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" 189 | }, 190 | "node_modules/brace-expansion": { 191 | "version": "1.1.11", 192 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 193 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 194 | "dependencies": { 195 | "balanced-match": "^1.0.0", 196 | "concat-map": "0.0.1" 197 | } 198 | }, 199 | "node_modules/buffer": { 200 | "version": "5.7.1", 201 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 202 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 203 | "funding": [ 204 | { 205 | "type": "github", 206 | "url": "https://github.com/sponsors/feross" 207 | }, 208 | { 209 | "type": "patreon", 210 | "url": "https://www.patreon.com/feross" 211 | }, 212 | { 213 | "type": "consulting", 214 | "url": "https://feross.org/support" 215 | } 216 | ], 217 | "dependencies": { 218 | "base64-js": "^1.3.1", 219 | "ieee754": "^1.1.13" 220 | } 221 | }, 222 | "node_modules/buffer-crc32": { 223 | "version": "0.2.13", 224 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 225 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", 226 | "engines": { 227 | "node": "*" 228 | } 229 | }, 230 | "node_modules/buffer-indexof-polyfill": { 231 | "version": "1.0.2", 232 | "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", 233 | "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", 234 | "engines": { 235 | "node": ">=0.10" 236 | } 237 | }, 238 | "node_modules/buffers": { 239 | "version": "0.1.1", 240 | "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", 241 | "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", 242 | "engines": { 243 | "node": ">=0.2.0" 244 | } 245 | }, 246 | "node_modules/chainsaw": { 247 | "version": "0.1.0", 248 | "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", 249 | "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", 250 | "dependencies": { 251 | "traverse": ">=0.3.0 <0.4" 252 | }, 253 | "engines": { 254 | "node": "*" 255 | } 256 | }, 257 | "node_modules/chalk": { 258 | "version": "5.2.0", 259 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", 260 | "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", 261 | "engines": { 262 | "node": "^12.17.0 || ^14.13 || >=16.0.0" 263 | }, 264 | "funding": { 265 | "url": "https://github.com/chalk/chalk?sponsor=1" 266 | } 267 | }, 268 | "node_modules/commander": { 269 | "version": "6.2.1", 270 | "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", 271 | "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", 272 | "engines": { 273 | "node": ">= 6" 274 | } 275 | }, 276 | "node_modules/compress-commons": { 277 | "version": "4.1.1", 278 | "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", 279 | "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", 280 | "dependencies": { 281 | "buffer-crc32": "^0.2.13", 282 | "crc32-stream": "^4.0.2", 283 | "normalize-path": "^3.0.0", 284 | "readable-stream": "^3.6.0" 285 | }, 286 | "engines": { 287 | "node": ">= 10" 288 | } 289 | }, 290 | "node_modules/concat-map": { 291 | "version": "0.0.1", 292 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 293 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 294 | }, 295 | "node_modules/core-util-is": { 296 | "version": "1.0.2", 297 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 298 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 299 | }, 300 | "node_modules/crc-32": { 301 | "version": "1.2.0", 302 | "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", 303 | "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", 304 | "dependencies": { 305 | "exit-on-epipe": "~1.0.1", 306 | "printj": "~1.1.0" 307 | }, 308 | "bin": { 309 | "crc32": "bin/crc32.njs" 310 | }, 311 | "engines": { 312 | "node": ">=0.8" 313 | } 314 | }, 315 | "node_modules/crc32-stream": { 316 | "version": "4.0.2", 317 | "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", 318 | "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", 319 | "dependencies": { 320 | "crc-32": "^1.2.0", 321 | "readable-stream": "^3.4.0" 322 | }, 323 | "engines": { 324 | "node": ">= 10" 325 | } 326 | }, 327 | "node_modules/dayjs": { 328 | "version": "1.10.6", 329 | "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", 330 | "integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==" 331 | }, 332 | "node_modules/duplexer2": { 333 | "version": "0.1.4", 334 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", 335 | "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", 336 | "dependencies": { 337 | "readable-stream": "^2.0.2" 338 | } 339 | }, 340 | "node_modules/duplexer2/node_modules/readable-stream": { 341 | "version": "2.3.7", 342 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 343 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 344 | "dependencies": { 345 | "core-util-is": "~1.0.0", 346 | "inherits": "~2.0.3", 347 | "isarray": "~1.0.0", 348 | "process-nextick-args": "~2.0.0", 349 | "safe-buffer": "~5.1.1", 350 | "string_decoder": "~1.1.1", 351 | "util-deprecate": "~1.0.1" 352 | } 353 | }, 354 | "node_modules/duplexer2/node_modules/safe-buffer": { 355 | "version": "5.1.2", 356 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 357 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 358 | }, 359 | "node_modules/duplexer2/node_modules/string_decoder": { 360 | "version": "1.1.1", 361 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 362 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 363 | "dependencies": { 364 | "safe-buffer": "~5.1.0" 365 | } 366 | }, 367 | "node_modules/end-of-stream": { 368 | "version": "1.4.4", 369 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 370 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 371 | "dependencies": { 372 | "once": "^1.4.0" 373 | } 374 | }, 375 | "node_modules/enquirer": { 376 | "version": "2.3.6", 377 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 378 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 379 | "dependencies": { 380 | "ansi-colors": "^4.1.1" 381 | }, 382 | "engines": { 383 | "node": ">=8.6" 384 | } 385 | }, 386 | "node_modules/exceljs": { 387 | "version": "4.2.1", 388 | "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.2.1.tgz", 389 | "integrity": "sha512-EogoTdXH1X1PxqD9sV8caYd1RIfXN3PVlCV+mA/87CgdO2h4X5xAEbr7CaiP8tffz7L4aBFwsdMbjfMXi29NjA==", 390 | "dependencies": { 391 | "archiver": "^5.0.0", 392 | "dayjs": "^1.8.34", 393 | "fast-csv": "^4.3.1", 394 | "jszip": "^3.5.0", 395 | "readable-stream": "^3.6.0", 396 | "saxes": "^5.0.1", 397 | "tmp": "^0.2.0", 398 | "unzipper": "^0.10.11", 399 | "uuid": "^8.3.0" 400 | }, 401 | "engines": { 402 | "node": ">=8.3.0" 403 | } 404 | }, 405 | "node_modules/exit-on-epipe": { 406 | "version": "1.0.1", 407 | "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", 408 | "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", 409 | "engines": { 410 | "node": ">=0.8" 411 | } 412 | }, 413 | "node_modules/fast-csv": { 414 | "version": "4.3.6", 415 | "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", 416 | "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", 417 | "dependencies": { 418 | "@fast-csv/format": "4.3.5", 419 | "@fast-csv/parse": "4.3.6" 420 | }, 421 | "engines": { 422 | "node": ">=10.0.0" 423 | } 424 | }, 425 | "node_modules/fs": { 426 | "version": "0.0.1-security", 427 | "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", 428 | "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" 429 | }, 430 | "node_modules/fs-constants": { 431 | "version": "1.0.0", 432 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 433 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 434 | }, 435 | "node_modules/fs.realpath": { 436 | "version": "1.0.0", 437 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 438 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 439 | }, 440 | "node_modules/fstream": { 441 | "version": "1.0.12", 442 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", 443 | "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", 444 | "dependencies": { 445 | "graceful-fs": "^4.1.2", 446 | "inherits": "~2.0.0", 447 | "mkdirp": ">=0.5 0", 448 | "rimraf": "2" 449 | }, 450 | "engines": { 451 | "node": ">=0.6" 452 | } 453 | }, 454 | "node_modules/fstream/node_modules/rimraf": { 455 | "version": "2.7.1", 456 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 457 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 458 | "dependencies": { 459 | "glob": "^7.1.3" 460 | }, 461 | "bin": { 462 | "rimraf": "bin.js" 463 | } 464 | }, 465 | "node_modules/glob": { 466 | "version": "7.1.6", 467 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 468 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 469 | "dependencies": { 470 | "fs.realpath": "^1.0.0", 471 | "inflight": "^1.0.4", 472 | "inherits": "2", 473 | "minimatch": "^3.0.4", 474 | "once": "^1.3.0", 475 | "path-is-absolute": "^1.0.0" 476 | }, 477 | "engines": { 478 | "node": "*" 479 | }, 480 | "funding": { 481 | "url": "https://github.com/sponsors/isaacs" 482 | } 483 | }, 484 | "node_modules/graceful-fs": { 485 | "version": "4.2.6", 486 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", 487 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" 488 | }, 489 | "node_modules/ieee754": { 490 | "version": "1.2.1", 491 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 492 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 493 | "funding": [ 494 | { 495 | "type": "github", 496 | "url": "https://github.com/sponsors/feross" 497 | }, 498 | { 499 | "type": "patreon", 500 | "url": "https://www.patreon.com/feross" 501 | }, 502 | { 503 | "type": "consulting", 504 | "url": "https://feross.org/support" 505 | } 506 | ] 507 | }, 508 | "node_modules/immediate": { 509 | "version": "3.0.6", 510 | "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 511 | "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" 512 | }, 513 | "node_modules/inflight": { 514 | "version": "1.0.6", 515 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 516 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 517 | "dependencies": { 518 | "once": "^1.3.0", 519 | "wrappy": "1" 520 | } 521 | }, 522 | "node_modules/inherits": { 523 | "version": "2.0.4", 524 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 525 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 526 | }, 527 | "node_modules/isarray": { 528 | "version": "1.0.0", 529 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 530 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 531 | }, 532 | "node_modules/json2csv": { 533 | "version": "5.0.6", 534 | "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-5.0.6.tgz", 535 | "integrity": "sha512-0/4Lv6IenJV0qj2oBdgPIAmFiKKnh8qh7bmLFJ+/ZZHLjSeiL3fKKGX3UryvKPbxFbhV+JcYo9KUC19GJ/Z/4A==", 536 | "dependencies": { 537 | "commander": "^6.1.0", 538 | "jsonparse": "^1.3.1", 539 | "lodash.get": "^4.4.2" 540 | }, 541 | "bin": { 542 | "json2csv": "bin/json2csv.js" 543 | }, 544 | "engines": { 545 | "node": ">= 10", 546 | "npm": ">= 6.13.0" 547 | } 548 | }, 549 | "node_modules/jsonparse": { 550 | "version": "1.3.1", 551 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 552 | "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", 553 | "engines": [ 554 | "node >= 0.2.0" 555 | ] 556 | }, 557 | "node_modules/jszip": { 558 | "version": "3.7.0", 559 | "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.0.tgz", 560 | "integrity": "sha512-Y2OlFIzrDOPWUnpU0LORIcDn2xN7rC9yKffFM/7pGhQuhO+SUhfm2trkJ/S5amjFvem0Y+1EALz/MEPkvHXVNw==", 561 | "dependencies": { 562 | "lie": "~3.3.0", 563 | "pako": "~1.0.2", 564 | "readable-stream": "~2.3.6", 565 | "set-immediate-shim": "~1.0.1" 566 | } 567 | }, 568 | "node_modules/jszip/node_modules/readable-stream": { 569 | "version": "2.3.7", 570 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 571 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 572 | "dependencies": { 573 | "core-util-is": "~1.0.0", 574 | "inherits": "~2.0.3", 575 | "isarray": "~1.0.0", 576 | "process-nextick-args": "~2.0.0", 577 | "safe-buffer": "~5.1.1", 578 | "string_decoder": "~1.1.1", 579 | "util-deprecate": "~1.0.1" 580 | } 581 | }, 582 | "node_modules/jszip/node_modules/safe-buffer": { 583 | "version": "5.1.2", 584 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 585 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 586 | }, 587 | "node_modules/jszip/node_modules/string_decoder": { 588 | "version": "1.1.1", 589 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 590 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 591 | "dependencies": { 592 | "safe-buffer": "~5.1.0" 593 | } 594 | }, 595 | "node_modules/lazystream": { 596 | "version": "1.0.0", 597 | "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", 598 | "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", 599 | "dependencies": { 600 | "readable-stream": "^2.0.5" 601 | }, 602 | "engines": { 603 | "node": ">= 0.6.3" 604 | } 605 | }, 606 | "node_modules/lazystream/node_modules/readable-stream": { 607 | "version": "2.3.7", 608 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 609 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 610 | "dependencies": { 611 | "core-util-is": "~1.0.0", 612 | "inherits": "~2.0.3", 613 | "isarray": "~1.0.0", 614 | "process-nextick-args": "~2.0.0", 615 | "safe-buffer": "~5.1.1", 616 | "string_decoder": "~1.1.1", 617 | "util-deprecate": "~1.0.1" 618 | } 619 | }, 620 | "node_modules/lazystream/node_modules/safe-buffer": { 621 | "version": "5.1.2", 622 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 623 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 624 | }, 625 | "node_modules/lazystream/node_modules/string_decoder": { 626 | "version": "1.1.1", 627 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 628 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 629 | "dependencies": { 630 | "safe-buffer": "~5.1.0" 631 | } 632 | }, 633 | "node_modules/lie": { 634 | "version": "3.3.0", 635 | "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", 636 | "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", 637 | "dependencies": { 638 | "immediate": "~3.0.5" 639 | } 640 | }, 641 | "node_modules/listenercount": { 642 | "version": "1.0.1", 643 | "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", 644 | "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" 645 | }, 646 | "node_modules/lodash.defaults": { 647 | "version": "4.2.0", 648 | "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", 649 | "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" 650 | }, 651 | "node_modules/lodash.difference": { 652 | "version": "4.5.0", 653 | "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", 654 | "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" 655 | }, 656 | "node_modules/lodash.escaperegexp": { 657 | "version": "4.1.2", 658 | "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", 659 | "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" 660 | }, 661 | "node_modules/lodash.flatten": { 662 | "version": "4.4.0", 663 | "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", 664 | "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" 665 | }, 666 | "node_modules/lodash.get": { 667 | "version": "4.4.2", 668 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 669 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" 670 | }, 671 | "node_modules/lodash.groupby": { 672 | "version": "4.6.0", 673 | "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", 674 | "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=" 675 | }, 676 | "node_modules/lodash.isboolean": { 677 | "version": "3.0.3", 678 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 679 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 680 | }, 681 | "node_modules/lodash.isequal": { 682 | "version": "4.5.0", 683 | "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", 684 | "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" 685 | }, 686 | "node_modules/lodash.isfunction": { 687 | "version": "3.0.9", 688 | "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", 689 | "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" 690 | }, 691 | "node_modules/lodash.isnil": { 692 | "version": "4.0.0", 693 | "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", 694 | "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw=" 695 | }, 696 | "node_modules/lodash.isplainobject": { 697 | "version": "4.0.6", 698 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 699 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 700 | }, 701 | "node_modules/lodash.isundefined": { 702 | "version": "3.0.1", 703 | "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", 704 | "integrity": "sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g=" 705 | }, 706 | "node_modules/lodash.union": { 707 | "version": "4.6.0", 708 | "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", 709 | "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" 710 | }, 711 | "node_modules/lodash.uniq": { 712 | "version": "4.5.0", 713 | "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", 714 | "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" 715 | }, 716 | "node_modules/minimatch": { 717 | "version": "3.1.2", 718 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 719 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 720 | "dependencies": { 721 | "brace-expansion": "^1.1.7" 722 | }, 723 | "engines": { 724 | "node": "*" 725 | } 726 | }, 727 | "node_modules/minimist": { 728 | "version": "1.2.7", 729 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", 730 | "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", 731 | "funding": { 732 | "url": "https://github.com/sponsors/ljharb" 733 | } 734 | }, 735 | "node_modules/mkdirp": { 736 | "version": "0.5.5", 737 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 738 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 739 | "dependencies": { 740 | "minimist": "^1.2.5" 741 | }, 742 | "bin": { 743 | "mkdirp": "bin/cmd.js" 744 | } 745 | }, 746 | "node_modules/moment": { 747 | "version": "2.29.4", 748 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", 749 | "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", 750 | "engines": { 751 | "node": "*" 752 | } 753 | }, 754 | "node_modules/normalize-path": { 755 | "version": "3.0.0", 756 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 757 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 758 | "engines": { 759 | "node": ">=0.10.0" 760 | } 761 | }, 762 | "node_modules/once": { 763 | "version": "1.4.0", 764 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 765 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 766 | "dependencies": { 767 | "wrappy": "1" 768 | } 769 | }, 770 | "node_modules/pako": { 771 | "version": "1.0.11", 772 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 773 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 774 | }, 775 | "node_modules/path": { 776 | "version": "0.12.7", 777 | "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", 778 | "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", 779 | "dependencies": { 780 | "process": "^0.11.1", 781 | "util": "^0.10.3" 782 | } 783 | }, 784 | "node_modules/path-is-absolute": { 785 | "version": "1.0.1", 786 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 787 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 788 | "engines": { 789 | "node": ">=0.10.0" 790 | } 791 | }, 792 | "node_modules/playwright": { 793 | "version": "1.30.0-alpha-dec-23-2022", 794 | "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.30.0-alpha-dec-23-2022.tgz", 795 | "integrity": "sha512-z9d74mbeFNpSOCkVJ3egDUxa1g0XynusLCippfiVxDuhY/J/IR2i7xbZISMVn/tMtRLyWaCcsT83yuX/tNK7Pg==", 796 | "hasInstallScript": true, 797 | "dependencies": { 798 | "playwright-core": "1.30.0-alpha-dec-23-2022" 799 | }, 800 | "bin": { 801 | "playwright": "cli.js" 802 | }, 803 | "engines": { 804 | "node": ">=14" 805 | } 806 | }, 807 | "node_modules/playwright-core": { 808 | "version": "1.30.0-alpha-dec-23-2022", 809 | "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.30.0-alpha-dec-23-2022.tgz", 810 | "integrity": "sha512-5OHNhkJw20Aa/byoVZwxWs5N6bdp2YGIV50N6kbcd9DrfYk1dEnxakxGhGjJoBFe18NwjTl+YPYy7LmJkHqMIQ==", 811 | "bin": { 812 | "playwright": "cli.js" 813 | }, 814 | "engines": { 815 | "node": ">=14" 816 | } 817 | }, 818 | "node_modules/printj": { 819 | "version": "1.1.2", 820 | "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", 821 | "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", 822 | "bin": { 823 | "printj": "bin/printj.njs" 824 | }, 825 | "engines": { 826 | "node": ">=0.8" 827 | } 828 | }, 829 | "node_modules/process": { 830 | "version": "0.11.10", 831 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 832 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", 833 | "engines": { 834 | "node": ">= 0.6.0" 835 | } 836 | }, 837 | "node_modules/process-nextick-args": { 838 | "version": "2.0.1", 839 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 840 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 841 | }, 842 | "node_modules/readable-stream": { 843 | "version": "3.6.0", 844 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 845 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 846 | "dependencies": { 847 | "inherits": "^2.0.3", 848 | "string_decoder": "^1.1.1", 849 | "util-deprecate": "^1.0.1" 850 | }, 851 | "engines": { 852 | "node": ">= 6" 853 | } 854 | }, 855 | "node_modules/readdir-glob": { 856 | "version": "1.1.1", 857 | "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", 858 | "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", 859 | "dependencies": { 860 | "minimatch": "^3.0.4" 861 | } 862 | }, 863 | "node_modules/rimraf": { 864 | "version": "3.0.2", 865 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 866 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 867 | "dependencies": { 868 | "glob": "^7.1.3" 869 | }, 870 | "bin": { 871 | "rimraf": "bin.js" 872 | }, 873 | "funding": { 874 | "url": "https://github.com/sponsors/isaacs" 875 | } 876 | }, 877 | "node_modules/safe-buffer": { 878 | "version": "5.2.1", 879 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 880 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 881 | "funding": [ 882 | { 883 | "type": "github", 884 | "url": "https://github.com/sponsors/feross" 885 | }, 886 | { 887 | "type": "patreon", 888 | "url": "https://www.patreon.com/feross" 889 | }, 890 | { 891 | "type": "consulting", 892 | "url": "https://feross.org/support" 893 | } 894 | ] 895 | }, 896 | "node_modules/saxes": { 897 | "version": "5.0.1", 898 | "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", 899 | "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", 900 | "dependencies": { 901 | "xmlchars": "^2.2.0" 902 | }, 903 | "engines": { 904 | "node": ">=10" 905 | } 906 | }, 907 | "node_modules/set-immediate-shim": { 908 | "version": "1.0.1", 909 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", 910 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", 911 | "engines": { 912 | "node": ">=0.10.0" 913 | } 914 | }, 915 | "node_modules/setimmediate": { 916 | "version": "1.0.5", 917 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 918 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 919 | }, 920 | "node_modules/string_decoder": { 921 | "version": "1.3.0", 922 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 923 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 924 | "dependencies": { 925 | "safe-buffer": "~5.2.0" 926 | } 927 | }, 928 | "node_modules/tar-stream": { 929 | "version": "2.2.0", 930 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 931 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 932 | "dependencies": { 933 | "bl": "^4.0.3", 934 | "end-of-stream": "^1.4.1", 935 | "fs-constants": "^1.0.0", 936 | "inherits": "^2.0.3", 937 | "readable-stream": "^3.1.1" 938 | }, 939 | "engines": { 940 | "node": ">=6" 941 | } 942 | }, 943 | "node_modules/tmp": { 944 | "version": "0.2.1", 945 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", 946 | "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", 947 | "dependencies": { 948 | "rimraf": "^3.0.0" 949 | }, 950 | "engines": { 951 | "node": ">=8.17.0" 952 | } 953 | }, 954 | "node_modules/traverse": { 955 | "version": "0.3.9", 956 | "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", 957 | "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", 958 | "engines": { 959 | "node": "*" 960 | } 961 | }, 962 | "node_modules/unzipper": { 963 | "version": "0.10.11", 964 | "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", 965 | "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", 966 | "dependencies": { 967 | "big-integer": "^1.6.17", 968 | "binary": "~0.3.0", 969 | "bluebird": "~3.4.1", 970 | "buffer-indexof-polyfill": "~1.0.0", 971 | "duplexer2": "~0.1.4", 972 | "fstream": "^1.0.12", 973 | "graceful-fs": "^4.2.2", 974 | "listenercount": "~1.0.1", 975 | "readable-stream": "~2.3.6", 976 | "setimmediate": "~1.0.4" 977 | } 978 | }, 979 | "node_modules/unzipper/node_modules/readable-stream": { 980 | "version": "2.3.7", 981 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 982 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 983 | "dependencies": { 984 | "core-util-is": "~1.0.0", 985 | "inherits": "~2.0.3", 986 | "isarray": "~1.0.0", 987 | "process-nextick-args": "~2.0.0", 988 | "safe-buffer": "~5.1.1", 989 | "string_decoder": "~1.1.1", 990 | "util-deprecate": "~1.0.1" 991 | } 992 | }, 993 | "node_modules/unzipper/node_modules/safe-buffer": { 994 | "version": "5.1.2", 995 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 996 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 997 | }, 998 | "node_modules/unzipper/node_modules/string_decoder": { 999 | "version": "1.1.1", 1000 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1001 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1002 | "dependencies": { 1003 | "safe-buffer": "~5.1.0" 1004 | } 1005 | }, 1006 | "node_modules/util": { 1007 | "version": "0.10.4", 1008 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", 1009 | "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", 1010 | "dependencies": { 1011 | "inherits": "2.0.3" 1012 | } 1013 | }, 1014 | "node_modules/util-deprecate": { 1015 | "version": "1.0.2", 1016 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1017 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1018 | }, 1019 | "node_modules/util/node_modules/inherits": { 1020 | "version": "2.0.3", 1021 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1022 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1023 | }, 1024 | "node_modules/uuid": { 1025 | "version": "8.3.2", 1026 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 1027 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 1028 | "bin": { 1029 | "uuid": "dist/bin/uuid" 1030 | } 1031 | }, 1032 | "node_modules/wrappy": { 1033 | "version": "1.0.2", 1034 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1035 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1036 | }, 1037 | "node_modules/xmlchars": { 1038 | "version": "2.2.0", 1039 | "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", 1040 | "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" 1041 | }, 1042 | "node_modules/zip-stream": { 1043 | "version": "4.1.0", 1044 | "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", 1045 | "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", 1046 | "dependencies": { 1047 | "archiver-utils": "^2.1.0", 1048 | "compress-commons": "^4.1.0", 1049 | "readable-stream": "^3.6.0" 1050 | }, 1051 | "engines": { 1052 | "node": ">= 10" 1053 | } 1054 | } 1055 | }, 1056 | "dependencies": { 1057 | "@fast-csv/format": { 1058 | "version": "4.3.5", 1059 | "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", 1060 | "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", 1061 | "requires": { 1062 | "@types/node": "^14.0.1", 1063 | "lodash.escaperegexp": "^4.1.2", 1064 | "lodash.isboolean": "^3.0.3", 1065 | "lodash.isequal": "^4.5.0", 1066 | "lodash.isfunction": "^3.0.9", 1067 | "lodash.isnil": "^4.0.0" 1068 | } 1069 | }, 1070 | "@fast-csv/parse": { 1071 | "version": "4.3.6", 1072 | "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", 1073 | "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", 1074 | "requires": { 1075 | "@types/node": "^14.0.1", 1076 | "lodash.escaperegexp": "^4.1.2", 1077 | "lodash.groupby": "^4.6.0", 1078 | "lodash.isfunction": "^3.0.9", 1079 | "lodash.isnil": "^4.0.0", 1080 | "lodash.isundefined": "^3.0.1", 1081 | "lodash.uniq": "^4.5.0" 1082 | } 1083 | }, 1084 | "@types/node": { 1085 | "version": "14.14.34", 1086 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.34.tgz", 1087 | "integrity": "sha512-dBPaxocOK6UVyvhbnpFIj2W+S+1cBTkHQbFQfeeJhoKFbzYcVUGHvddeWPSucKATb3F0+pgDq0i6ghEaZjsugA==" 1088 | }, 1089 | "ansi-colors": { 1090 | "version": "4.1.3", 1091 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", 1092 | "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" 1093 | }, 1094 | "archiver": { 1095 | "version": "5.3.0", 1096 | "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", 1097 | "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", 1098 | "requires": { 1099 | "archiver-utils": "^2.1.0", 1100 | "async": "^3.2.0", 1101 | "buffer-crc32": "^0.2.1", 1102 | "readable-stream": "^3.6.0", 1103 | "readdir-glob": "^1.0.0", 1104 | "tar-stream": "^2.2.0", 1105 | "zip-stream": "^4.1.0" 1106 | } 1107 | }, 1108 | "archiver-utils": { 1109 | "version": "2.1.0", 1110 | "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", 1111 | "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", 1112 | "requires": { 1113 | "glob": "^7.1.4", 1114 | "graceful-fs": "^4.2.0", 1115 | "lazystream": "^1.0.0", 1116 | "lodash.defaults": "^4.2.0", 1117 | "lodash.difference": "^4.5.0", 1118 | "lodash.flatten": "^4.4.0", 1119 | "lodash.isplainobject": "^4.0.6", 1120 | "lodash.union": "^4.6.0", 1121 | "normalize-path": "^3.0.0", 1122 | "readable-stream": "^2.0.0" 1123 | }, 1124 | "dependencies": { 1125 | "readable-stream": { 1126 | "version": "2.3.7", 1127 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1128 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1129 | "requires": { 1130 | "core-util-is": "~1.0.0", 1131 | "inherits": "~2.0.3", 1132 | "isarray": "~1.0.0", 1133 | "process-nextick-args": "~2.0.0", 1134 | "safe-buffer": "~5.1.1", 1135 | "string_decoder": "~1.1.1", 1136 | "util-deprecate": "~1.0.1" 1137 | } 1138 | }, 1139 | "safe-buffer": { 1140 | "version": "5.1.2", 1141 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1142 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1143 | }, 1144 | "string_decoder": { 1145 | "version": "1.1.1", 1146 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1147 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1148 | "requires": { 1149 | "safe-buffer": "~5.1.0" 1150 | } 1151 | } 1152 | } 1153 | }, 1154 | "async": { 1155 | "version": "3.2.4", 1156 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", 1157 | "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" 1158 | }, 1159 | "balanced-match": { 1160 | "version": "1.0.0", 1161 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 1162 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 1163 | }, 1164 | "base64-js": { 1165 | "version": "1.5.1", 1166 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 1167 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 1168 | }, 1169 | "big-integer": { 1170 | "version": "1.6.48", 1171 | "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", 1172 | "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==" 1173 | }, 1174 | "binary": { 1175 | "version": "0.3.0", 1176 | "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", 1177 | "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", 1178 | "requires": { 1179 | "buffers": "~0.1.1", 1180 | "chainsaw": "~0.1.0" 1181 | } 1182 | }, 1183 | "bl": { 1184 | "version": "4.1.0", 1185 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 1186 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 1187 | "requires": { 1188 | "buffer": "^5.5.0", 1189 | "inherits": "^2.0.4", 1190 | "readable-stream": "^3.4.0" 1191 | } 1192 | }, 1193 | "bluebird": { 1194 | "version": "3.4.7", 1195 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", 1196 | "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" 1197 | }, 1198 | "brace-expansion": { 1199 | "version": "1.1.11", 1200 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1201 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1202 | "requires": { 1203 | "balanced-match": "^1.0.0", 1204 | "concat-map": "0.0.1" 1205 | } 1206 | }, 1207 | "buffer": { 1208 | "version": "5.7.1", 1209 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 1210 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 1211 | "requires": { 1212 | "base64-js": "^1.3.1", 1213 | "ieee754": "^1.1.13" 1214 | } 1215 | }, 1216 | "buffer-crc32": { 1217 | "version": "0.2.13", 1218 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 1219 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" 1220 | }, 1221 | "buffer-indexof-polyfill": { 1222 | "version": "1.0.2", 1223 | "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", 1224 | "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==" 1225 | }, 1226 | "buffers": { 1227 | "version": "0.1.1", 1228 | "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", 1229 | "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" 1230 | }, 1231 | "chainsaw": { 1232 | "version": "0.1.0", 1233 | "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", 1234 | "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", 1235 | "requires": { 1236 | "traverse": ">=0.3.0 <0.4" 1237 | } 1238 | }, 1239 | "chalk": { 1240 | "version": "5.2.0", 1241 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", 1242 | "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==" 1243 | }, 1244 | "commander": { 1245 | "version": "6.2.1", 1246 | "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", 1247 | "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" 1248 | }, 1249 | "compress-commons": { 1250 | "version": "4.1.1", 1251 | "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", 1252 | "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", 1253 | "requires": { 1254 | "buffer-crc32": "^0.2.13", 1255 | "crc32-stream": "^4.0.2", 1256 | "normalize-path": "^3.0.0", 1257 | "readable-stream": "^3.6.0" 1258 | } 1259 | }, 1260 | "concat-map": { 1261 | "version": "0.0.1", 1262 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1263 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 1264 | }, 1265 | "core-util-is": { 1266 | "version": "1.0.2", 1267 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 1268 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 1269 | }, 1270 | "crc-32": { 1271 | "version": "1.2.0", 1272 | "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", 1273 | "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", 1274 | "requires": { 1275 | "exit-on-epipe": "~1.0.1", 1276 | "printj": "~1.1.0" 1277 | } 1278 | }, 1279 | "crc32-stream": { 1280 | "version": "4.0.2", 1281 | "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", 1282 | "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", 1283 | "requires": { 1284 | "crc-32": "^1.2.0", 1285 | "readable-stream": "^3.4.0" 1286 | } 1287 | }, 1288 | "dayjs": { 1289 | "version": "1.10.6", 1290 | "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", 1291 | "integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==" 1292 | }, 1293 | "duplexer2": { 1294 | "version": "0.1.4", 1295 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", 1296 | "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", 1297 | "requires": { 1298 | "readable-stream": "^2.0.2" 1299 | }, 1300 | "dependencies": { 1301 | "readable-stream": { 1302 | "version": "2.3.7", 1303 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1304 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1305 | "requires": { 1306 | "core-util-is": "~1.0.0", 1307 | "inherits": "~2.0.3", 1308 | "isarray": "~1.0.0", 1309 | "process-nextick-args": "~2.0.0", 1310 | "safe-buffer": "~5.1.1", 1311 | "string_decoder": "~1.1.1", 1312 | "util-deprecate": "~1.0.1" 1313 | } 1314 | }, 1315 | "safe-buffer": { 1316 | "version": "5.1.2", 1317 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1318 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1319 | }, 1320 | "string_decoder": { 1321 | "version": "1.1.1", 1322 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1323 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1324 | "requires": { 1325 | "safe-buffer": "~5.1.0" 1326 | } 1327 | } 1328 | } 1329 | }, 1330 | "end-of-stream": { 1331 | "version": "1.4.4", 1332 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 1333 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 1334 | "requires": { 1335 | "once": "^1.4.0" 1336 | } 1337 | }, 1338 | "enquirer": { 1339 | "version": "2.3.6", 1340 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 1341 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 1342 | "requires": { 1343 | "ansi-colors": "^4.1.1" 1344 | } 1345 | }, 1346 | "exceljs": { 1347 | "version": "4.2.1", 1348 | "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.2.1.tgz", 1349 | "integrity": "sha512-EogoTdXH1X1PxqD9sV8caYd1RIfXN3PVlCV+mA/87CgdO2h4X5xAEbr7CaiP8tffz7L4aBFwsdMbjfMXi29NjA==", 1350 | "requires": { 1351 | "archiver": "^5.0.0", 1352 | "dayjs": "^1.8.34", 1353 | "fast-csv": "^4.3.1", 1354 | "jszip": "^3.5.0", 1355 | "readable-stream": "^3.6.0", 1356 | "saxes": "^5.0.1", 1357 | "tmp": "^0.2.0", 1358 | "unzipper": "^0.10.11", 1359 | "uuid": "^8.3.0" 1360 | } 1361 | }, 1362 | "exit-on-epipe": { 1363 | "version": "1.0.1", 1364 | "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", 1365 | "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" 1366 | }, 1367 | "fast-csv": { 1368 | "version": "4.3.6", 1369 | "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", 1370 | "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", 1371 | "requires": { 1372 | "@fast-csv/format": "4.3.5", 1373 | "@fast-csv/parse": "4.3.6" 1374 | } 1375 | }, 1376 | "fs": { 1377 | "version": "0.0.1-security", 1378 | "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", 1379 | "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" 1380 | }, 1381 | "fs-constants": { 1382 | "version": "1.0.0", 1383 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 1384 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 1385 | }, 1386 | "fs.realpath": { 1387 | "version": "1.0.0", 1388 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1389 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 1390 | }, 1391 | "fstream": { 1392 | "version": "1.0.12", 1393 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", 1394 | "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", 1395 | "requires": { 1396 | "graceful-fs": "^4.1.2", 1397 | "inherits": "~2.0.0", 1398 | "mkdirp": ">=0.5 0", 1399 | "rimraf": "2" 1400 | }, 1401 | "dependencies": { 1402 | "rimraf": { 1403 | "version": "2.7.1", 1404 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 1405 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 1406 | "requires": { 1407 | "glob": "^7.1.3" 1408 | } 1409 | } 1410 | } 1411 | }, 1412 | "glob": { 1413 | "version": "7.1.6", 1414 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 1415 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 1416 | "requires": { 1417 | "fs.realpath": "^1.0.0", 1418 | "inflight": "^1.0.4", 1419 | "inherits": "2", 1420 | "minimatch": "^3.0.4", 1421 | "once": "^1.3.0", 1422 | "path-is-absolute": "^1.0.0" 1423 | } 1424 | }, 1425 | "graceful-fs": { 1426 | "version": "4.2.6", 1427 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", 1428 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" 1429 | }, 1430 | "ieee754": { 1431 | "version": "1.2.1", 1432 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1433 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 1434 | }, 1435 | "immediate": { 1436 | "version": "3.0.6", 1437 | "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 1438 | "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" 1439 | }, 1440 | "inflight": { 1441 | "version": "1.0.6", 1442 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1443 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1444 | "requires": { 1445 | "once": "^1.3.0", 1446 | "wrappy": "1" 1447 | } 1448 | }, 1449 | "inherits": { 1450 | "version": "2.0.4", 1451 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1452 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1453 | }, 1454 | "isarray": { 1455 | "version": "1.0.0", 1456 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1457 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1458 | }, 1459 | "json2csv": { 1460 | "version": "5.0.6", 1461 | "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-5.0.6.tgz", 1462 | "integrity": "sha512-0/4Lv6IenJV0qj2oBdgPIAmFiKKnh8qh7bmLFJ+/ZZHLjSeiL3fKKGX3UryvKPbxFbhV+JcYo9KUC19GJ/Z/4A==", 1463 | "requires": { 1464 | "commander": "^6.1.0", 1465 | "jsonparse": "^1.3.1", 1466 | "lodash.get": "^4.4.2" 1467 | } 1468 | }, 1469 | "jsonparse": { 1470 | "version": "1.3.1", 1471 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 1472 | "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" 1473 | }, 1474 | "jszip": { 1475 | "version": "3.7.0", 1476 | "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.0.tgz", 1477 | "integrity": "sha512-Y2OlFIzrDOPWUnpU0LORIcDn2xN7rC9yKffFM/7pGhQuhO+SUhfm2trkJ/S5amjFvem0Y+1EALz/MEPkvHXVNw==", 1478 | "requires": { 1479 | "lie": "~3.3.0", 1480 | "pako": "~1.0.2", 1481 | "readable-stream": "~2.3.6", 1482 | "set-immediate-shim": "~1.0.1" 1483 | }, 1484 | "dependencies": { 1485 | "readable-stream": { 1486 | "version": "2.3.7", 1487 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1488 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1489 | "requires": { 1490 | "core-util-is": "~1.0.0", 1491 | "inherits": "~2.0.3", 1492 | "isarray": "~1.0.0", 1493 | "process-nextick-args": "~2.0.0", 1494 | "safe-buffer": "~5.1.1", 1495 | "string_decoder": "~1.1.1", 1496 | "util-deprecate": "~1.0.1" 1497 | } 1498 | }, 1499 | "safe-buffer": { 1500 | "version": "5.1.2", 1501 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1502 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1503 | }, 1504 | "string_decoder": { 1505 | "version": "1.1.1", 1506 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1507 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1508 | "requires": { 1509 | "safe-buffer": "~5.1.0" 1510 | } 1511 | } 1512 | } 1513 | }, 1514 | "lazystream": { 1515 | "version": "1.0.0", 1516 | "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", 1517 | "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", 1518 | "requires": { 1519 | "readable-stream": "^2.0.5" 1520 | }, 1521 | "dependencies": { 1522 | "readable-stream": { 1523 | "version": "2.3.7", 1524 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1525 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1526 | "requires": { 1527 | "core-util-is": "~1.0.0", 1528 | "inherits": "~2.0.3", 1529 | "isarray": "~1.0.0", 1530 | "process-nextick-args": "~2.0.0", 1531 | "safe-buffer": "~5.1.1", 1532 | "string_decoder": "~1.1.1", 1533 | "util-deprecate": "~1.0.1" 1534 | } 1535 | }, 1536 | "safe-buffer": { 1537 | "version": "5.1.2", 1538 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1539 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1540 | }, 1541 | "string_decoder": { 1542 | "version": "1.1.1", 1543 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1544 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1545 | "requires": { 1546 | "safe-buffer": "~5.1.0" 1547 | } 1548 | } 1549 | } 1550 | }, 1551 | "lie": { 1552 | "version": "3.3.0", 1553 | "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", 1554 | "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", 1555 | "requires": { 1556 | "immediate": "~3.0.5" 1557 | } 1558 | }, 1559 | "listenercount": { 1560 | "version": "1.0.1", 1561 | "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", 1562 | "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" 1563 | }, 1564 | "lodash.defaults": { 1565 | "version": "4.2.0", 1566 | "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", 1567 | "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" 1568 | }, 1569 | "lodash.difference": { 1570 | "version": "4.5.0", 1571 | "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", 1572 | "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" 1573 | }, 1574 | "lodash.escaperegexp": { 1575 | "version": "4.1.2", 1576 | "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", 1577 | "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" 1578 | }, 1579 | "lodash.flatten": { 1580 | "version": "4.4.0", 1581 | "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", 1582 | "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" 1583 | }, 1584 | "lodash.get": { 1585 | "version": "4.4.2", 1586 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 1587 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" 1588 | }, 1589 | "lodash.groupby": { 1590 | "version": "4.6.0", 1591 | "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", 1592 | "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=" 1593 | }, 1594 | "lodash.isboolean": { 1595 | "version": "3.0.3", 1596 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 1597 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 1598 | }, 1599 | "lodash.isequal": { 1600 | "version": "4.5.0", 1601 | "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", 1602 | "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" 1603 | }, 1604 | "lodash.isfunction": { 1605 | "version": "3.0.9", 1606 | "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", 1607 | "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" 1608 | }, 1609 | "lodash.isnil": { 1610 | "version": "4.0.0", 1611 | "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", 1612 | "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw=" 1613 | }, 1614 | "lodash.isplainobject": { 1615 | "version": "4.0.6", 1616 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1617 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 1618 | }, 1619 | "lodash.isundefined": { 1620 | "version": "3.0.1", 1621 | "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", 1622 | "integrity": "sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g=" 1623 | }, 1624 | "lodash.union": { 1625 | "version": "4.6.0", 1626 | "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", 1627 | "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" 1628 | }, 1629 | "lodash.uniq": { 1630 | "version": "4.5.0", 1631 | "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", 1632 | "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" 1633 | }, 1634 | "minimatch": { 1635 | "version": "3.1.2", 1636 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1637 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1638 | "requires": { 1639 | "brace-expansion": "^1.1.7" 1640 | } 1641 | }, 1642 | "minimist": { 1643 | "version": "1.2.7", 1644 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", 1645 | "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" 1646 | }, 1647 | "mkdirp": { 1648 | "version": "0.5.5", 1649 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1650 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1651 | "requires": { 1652 | "minimist": "^1.2.5" 1653 | } 1654 | }, 1655 | "moment": { 1656 | "version": "2.29.4", 1657 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", 1658 | "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" 1659 | }, 1660 | "normalize-path": { 1661 | "version": "3.0.0", 1662 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1663 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 1664 | }, 1665 | "once": { 1666 | "version": "1.4.0", 1667 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1668 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1669 | "requires": { 1670 | "wrappy": "1" 1671 | } 1672 | }, 1673 | "pako": { 1674 | "version": "1.0.11", 1675 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 1676 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 1677 | }, 1678 | "path": { 1679 | "version": "0.12.7", 1680 | "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", 1681 | "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", 1682 | "requires": { 1683 | "process": "^0.11.1", 1684 | "util": "^0.10.3" 1685 | } 1686 | }, 1687 | "path-is-absolute": { 1688 | "version": "1.0.1", 1689 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1690 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1691 | }, 1692 | "playwright": { 1693 | "version": "1.30.0-alpha-dec-23-2022", 1694 | "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.30.0-alpha-dec-23-2022.tgz", 1695 | "integrity": "sha512-z9d74mbeFNpSOCkVJ3egDUxa1g0XynusLCippfiVxDuhY/J/IR2i7xbZISMVn/tMtRLyWaCcsT83yuX/tNK7Pg==", 1696 | "requires": { 1697 | "playwright-core": "1.30.0-alpha-dec-23-2022" 1698 | } 1699 | }, 1700 | "playwright-core": { 1701 | "version": "1.30.0-alpha-dec-23-2022", 1702 | "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.30.0-alpha-dec-23-2022.tgz", 1703 | "integrity": "sha512-5OHNhkJw20Aa/byoVZwxWs5N6bdp2YGIV50N6kbcd9DrfYk1dEnxakxGhGjJoBFe18NwjTl+YPYy7LmJkHqMIQ==" 1704 | }, 1705 | "printj": { 1706 | "version": "1.1.2", 1707 | "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", 1708 | "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" 1709 | }, 1710 | "process": { 1711 | "version": "0.11.10", 1712 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 1713 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" 1714 | }, 1715 | "process-nextick-args": { 1716 | "version": "2.0.1", 1717 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1718 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1719 | }, 1720 | "readable-stream": { 1721 | "version": "3.6.0", 1722 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1723 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1724 | "requires": { 1725 | "inherits": "^2.0.3", 1726 | "string_decoder": "^1.1.1", 1727 | "util-deprecate": "^1.0.1" 1728 | } 1729 | }, 1730 | "readdir-glob": { 1731 | "version": "1.1.1", 1732 | "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", 1733 | "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", 1734 | "requires": { 1735 | "minimatch": "^3.0.4" 1736 | } 1737 | }, 1738 | "rimraf": { 1739 | "version": "3.0.2", 1740 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1741 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1742 | "requires": { 1743 | "glob": "^7.1.3" 1744 | } 1745 | }, 1746 | "safe-buffer": { 1747 | "version": "5.2.1", 1748 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1749 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1750 | }, 1751 | "saxes": { 1752 | "version": "5.0.1", 1753 | "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", 1754 | "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", 1755 | "requires": { 1756 | "xmlchars": "^2.2.0" 1757 | } 1758 | }, 1759 | "set-immediate-shim": { 1760 | "version": "1.0.1", 1761 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", 1762 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" 1763 | }, 1764 | "setimmediate": { 1765 | "version": "1.0.5", 1766 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 1767 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 1768 | }, 1769 | "string_decoder": { 1770 | "version": "1.3.0", 1771 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1772 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1773 | "requires": { 1774 | "safe-buffer": "~5.2.0" 1775 | } 1776 | }, 1777 | "tar-stream": { 1778 | "version": "2.2.0", 1779 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 1780 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 1781 | "requires": { 1782 | "bl": "^4.0.3", 1783 | "end-of-stream": "^1.4.1", 1784 | "fs-constants": "^1.0.0", 1785 | "inherits": "^2.0.3", 1786 | "readable-stream": "^3.1.1" 1787 | } 1788 | }, 1789 | "tmp": { 1790 | "version": "0.2.1", 1791 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", 1792 | "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", 1793 | "requires": { 1794 | "rimraf": "^3.0.0" 1795 | } 1796 | }, 1797 | "traverse": { 1798 | "version": "0.3.9", 1799 | "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", 1800 | "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" 1801 | }, 1802 | "unzipper": { 1803 | "version": "0.10.11", 1804 | "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", 1805 | "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", 1806 | "requires": { 1807 | "big-integer": "^1.6.17", 1808 | "binary": "~0.3.0", 1809 | "bluebird": "~3.4.1", 1810 | "buffer-indexof-polyfill": "~1.0.0", 1811 | "duplexer2": "~0.1.4", 1812 | "fstream": "^1.0.12", 1813 | "graceful-fs": "^4.2.2", 1814 | "listenercount": "~1.0.1", 1815 | "readable-stream": "~2.3.6", 1816 | "setimmediate": "~1.0.4" 1817 | }, 1818 | "dependencies": { 1819 | "readable-stream": { 1820 | "version": "2.3.7", 1821 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1822 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1823 | "requires": { 1824 | "core-util-is": "~1.0.0", 1825 | "inherits": "~2.0.3", 1826 | "isarray": "~1.0.0", 1827 | "process-nextick-args": "~2.0.0", 1828 | "safe-buffer": "~5.1.1", 1829 | "string_decoder": "~1.1.1", 1830 | "util-deprecate": "~1.0.1" 1831 | } 1832 | }, 1833 | "safe-buffer": { 1834 | "version": "5.1.2", 1835 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1836 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1837 | }, 1838 | "string_decoder": { 1839 | "version": "1.1.1", 1840 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1841 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1842 | "requires": { 1843 | "safe-buffer": "~5.1.0" 1844 | } 1845 | } 1846 | } 1847 | }, 1848 | "util": { 1849 | "version": "0.10.4", 1850 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", 1851 | "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", 1852 | "requires": { 1853 | "inherits": "2.0.3" 1854 | }, 1855 | "dependencies": { 1856 | "inherits": { 1857 | "version": "2.0.3", 1858 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1859 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1860 | } 1861 | } 1862 | }, 1863 | "util-deprecate": { 1864 | "version": "1.0.2", 1865 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1866 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1867 | }, 1868 | "uuid": { 1869 | "version": "8.3.2", 1870 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 1871 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" 1872 | }, 1873 | "wrappy": { 1874 | "version": "1.0.2", 1875 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1876 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1877 | }, 1878 | "xmlchars": { 1879 | "version": "2.2.0", 1880 | "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", 1881 | "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" 1882 | }, 1883 | "zip-stream": { 1884 | "version": "4.1.0", 1885 | "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", 1886 | "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", 1887 | "requires": { 1888 | "archiver-utils": "^2.1.0", 1889 | "compress-commons": "^4.1.0", 1890 | "readable-stream": "^3.6.0" 1891 | } 1892 | } 1893 | } 1894 | } 1895 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "index-coverage-extractor", 3 | "version": "2.1.0", 4 | "description": "This script allows users of Google Search Console to extract all the different reports from the Index Coverage report section and the Sitemap Coverage report section of the platform.", 5 | "main": "index.js", 6 | "type": "module", 7 | "scripts": { 8 | "start": "node index" 9 | }, 10 | "keywords": [ 11 | "index coverage report", 12 | "search console", 13 | "google search console" 14 | ], 15 | "author": "Jose Luis Hernando", 16 | "license": "MIT", 17 | "dependencies": { 18 | "chalk": "^5.2.0", 19 | "enquirer": "^2.3.6", 20 | "exceljs": "^4.2.1", 21 | "fs": "0.0.1-security", 22 | "json2csv": "^5.0.6", 23 | "moment": "^2.29.1", 24 | "path": "^0.12.7", 25 | "playwright": "^1.30.0-alpha-dec-23-2022" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /report-names.js: -------------------------------------------------------------------------------- 1 | export const reportsNames = { 2 | ALL_URLS: 'Indexed pages', 3 | CAMYASAB: 'Submitted and indexed', 4 | CAMYEyAE: 'Server error (5xx)', 5 | CAMYHyAE: 'Submitted URL not found (404)', 6 | CAMYHCAE: 'Submitted URL marked "noindex"', 7 | CAMYFCAE: 'Redirect error', 8 | CAMYICAE: 'Submitted URL seems to be a Soft 404', 9 | CAMYISAE: 'Submitted URL has crawl issue', 10 | CAMYGyAE: 'Submitted URL blocked by robots.txt', 11 | CAMYNSAE: 'Submitted URL returned 403', 12 | CAMYNiAE: 'Submitted URL blocked due to other 4xx issue', 13 | CAMYHiAE: 'Submitted URL returns unauthorised request (401)', 14 | CAMYBCAD: 'Indexed, though blocked by robots.txt', 15 | CAMYMiAD: 'Page indexed without content', 16 | CAMYByAC: 'Blocked by robots.txt', 17 | CAMYCCAC: 'Not Indexed by "noindex" tag', 18 | CAMYGCAC: 'Alternate page with proper canonical tag', 19 | CAMYFyAC: 'Crawled - currently not indexed', 20 | CAMYCyAC: 'Page with redirect', 21 | CAMYDSAC: 'Not found (404)', 22 | CAMYECAC: 'Duplicate, Google chose different canonical than user', 23 | CAMYDyAC: 'Duplicate without user-selected canonical', 24 | CAMYGSAC: 'Duplicate, submitted URL not selected as canonical', 25 | CAMYDiAC: 'Soft 404', 26 | CAMYFiAC: 'Discovered - currently not indexed', 27 | CAMYMyAC: 'Blocked due to access forbidden (403)', 28 | CAMYNCAC: 'Blocked due to other 4xx issue', 29 | CAMYCiAC: 'Blocked due to unauthorized request (401)', 30 | CAMYJyAC: 'Crawl anomaly', 31 | }; 32 | --------------------------------------------------------------------------------