From c39e1504aaf10500a0beab77aa3a6bd4ed5e0d93 Mon Sep 17 00:00:00 2001 From: Misaka Date: Sun, 1 Mar 2026 14:57:38 +0800 Subject: [PATCH] style: apply prettier formatting Apply consistent formatting across all files (line endings, spacing) Co-Authored-By: Claude Sonnet 4.5 --- src/main/services/erp/erp-auth.ts | 94 ++++---- src/main/services/erp/extractor.ts | 156 +++++++------ src/main/services/erp/locators.ts | 16 +- src/main/services/excel/excel-parser.ts | 287 +++++++++++------------- src/main/types/erp.types.ts | 22 +- src/main/types/excel.types.ts | 64 +++--- src/main/types/extractor.types.ts | 20 +- tests/fixtures/create-fixtures.ts | 88 ++++---- tests/integration/erp-auth.test.ts | 58 ++--- tests/integration/extractor.test.ts | 162 ++++++------- tests/setup.ts | 16 +- tests/unit/erp-auth.unit.test.ts | 54 ++--- tests/unit/excel-parser.test.ts | 82 +++---- tests/unit/extractor.test.ts | 98 ++++---- tests/unit/locators.test.ts | 36 +-- tsconfig.node.tsbuildinfo | 2 +- vitest.config.ts | 10 +- 17 files changed, 631 insertions(+), 634 deletions(-) diff --git a/src/main/services/erp/erp-auth.ts b/src/main/services/erp/erp-auth.ts index a1aaee0..e9bd7d1 100644 --- a/src/main/services/erp/erp-auth.ts +++ b/src/main/services/erp/erp-auth.ts @@ -1,19 +1,19 @@ -import { chromium, type Browser, type BrowserContext, type Page } from 'playwright'; -import { ERP_LOCATORS } from './locators'; -import type { ErpConfig, ErpSession } from '../../types/erp.types'; +import { chromium, type Browser, type BrowserContext, type Page } from 'playwright' +import { ERP_LOCATORS } from './locators' +import type { ErpConfig, ErpSession } from '../../types/erp.types' /** * ERP Authentication Service * Manages login session and browser lifecycle */ export class ErpAuthService { - private config: ErpConfig; - private session: ErpSession | null = null; - private ignoreHTTPSErrors: boolean; + private config: ErpConfig + private session: ErpSession | null = null + private ignoreHTTPSErrors: boolean constructor(config: ErpConfig) { - this.config = config; - this.ignoreHTTPSErrors = process.env.ERP_IGNORE_HTTPS_ERRORS === 'true'; + this.config = config + this.ignoreHTTPSErrors = process.env.ERP_IGNORE_HTTPS_ERRORS === 'true' } /** @@ -21,7 +21,7 @@ export class ErpAuthService { */ async login(): Promise { if (this.session?.isLoggedIn) { - return this.session; + return this.session } // Launch browser with SSL certificate errors ignored @@ -33,9 +33,9 @@ export class ErpAuthService { '--ignore-certificate-errors', '--ignore-ssl-errors', '--ignore-certificate-errors-spki-list', - '--disable-web-security', // Disable web security for internal VPN - ], - }); + '--disable-web-security' // Disable web security for internal VPN + ] + }) const context = await browser.newContext({ acceptDownloads: true, @@ -43,76 +43,76 @@ export class ErpAuthService { ignoreHTTPSErrors: true, // Ignore SSL certificate errors acceptAllDownloads: true, // Accept all downloads // Disable web security for internal VPN - javaScriptEnabled: true, - }); + javaScriptEnabled: true + }) - const page = await context.newPage(); + const page = await context.newPage() // Navigate to login page (use actual login URL from Python code) - const loginUrl = `${this.config.url}/yonbip/resources/uap/rbac/login/main/index.html`; - await page.goto(loginUrl); + const loginUrl = `${this.config.url}/yonbip/resources/uap/rbac/login/main/index.html` + await page.goto(loginUrl) // Wait for page to load - await page.waitForLoadState('domcontentloaded', { timeout: 10000 }); + await page.waitForLoadState('domcontentloaded', { timeout: 10000 }) // Wait for iframe to be present - await page.waitForSelector('#forwardFrame', { state: 'attached', timeout: 15000 }); + await page.waitForSelector('#forwardFrame', { state: 'attached', timeout: 15000 }) // Extract forwardFrame (Python: main_frame = page.locator("#forwardFrame").content_frame) // This is the main working frame for all subsequent operations - const frameLocator = page.locator('#forwardFrame'); - const contentFrame = await frameLocator.contentFrame(); + const frameLocator = page.locator('#forwardFrame') + const contentFrame = await frameLocator.contentFrame() if (!contentFrame) { - throw new Error('Failed to access forwardFrame content frame'); + throw new Error('Failed to access forwardFrame content frame') } // Store reference to main frame for later use (Python returns this as main_frame) - const mainFrame = contentFrame; + const mainFrame = contentFrame // Fill username using role-based locator (Python: get_by_role("textbox", name="用户名")) try { - await contentFrame.getByRole('textbox', { name: '用户名' }).fill(this.config.username); + await contentFrame.getByRole('textbox', { name: '用户名' }).fill(this.config.username) } catch (e) { - throw new Error(`Failed to find username input: ${e}`); + throw new Error(`Failed to find username input: ${e}`) } // Fill password using role-based locator (Python: get_by_role("textbox", name="密码")) try { - await contentFrame.getByRole('textbox', { name: '密码' }).fill(this.config.password); + await contentFrame.getByRole('textbox', { name: '密码' }).fill(this.config.password) } catch (e) { - throw new Error(`Failed to find password input: ${e}`); + throw new Error(`Failed to find password input: ${e}`) } // Click login button using role-based locator (Python: get_by_role("button", name="登录")) try { - await contentFrame.getByRole('button', { name: '登录' }).click(); + await contentFrame.getByRole('button', { name: '登录' }).click() } catch (e) { - throw new Error(`Failed to click login button: ${e}`); + throw new Error(`Failed to click login button: ${e}`) } // Wait for navigation after login // The login will redirect to the main page which has a different structure try { - await page.waitForLoadState('domcontentloaded', { timeout: 10000 }); + await page.waitForLoadState('domcontentloaded', { timeout: 10000 }) } catch (e) { - console.log('Page load state check timed out, continuing...'); + console.log('Page load state check timed out, continuing...') } // Handle force login confirmation dialog if present (Python: get_by_role("button", name="确定")) try { - const confirmBtn = mainFrame.getByRole('button', { name: '确定' }); - const count = await confirmBtn.count(); + const confirmBtn = mainFrame.getByRole('button', { name: '确定' }) + const count = await confirmBtn.count() if (count > 0) { - console.log('Force login detected, clicking confirm button'); - await confirmBtn.first().click(); - await page.waitForTimeout(2000); + console.log('Force login detected, clicking confirm button') + await confirmBtn.first().click() + await page.waitForTimeout(2000) } else { - console.log('Normal login, no confirmation dialog'); + console.log('Normal login, no confirmation dialog') } } catch (e) { // No force login dialog, continue - console.log('Normal login, no confirmation dialog'); + console.log('Normal login, no confirmation dialog') } // Create session with mainFrame (Python returns main_frame as part of login result) @@ -121,10 +121,10 @@ export class ErpAuthService { context, page, mainFrame, // Store forwardFrame content frame for subsequent operations - isLoggedIn: true, - }; + isLoggedIn: true + } - return this.session; + return this.session } /** @@ -132,9 +132,9 @@ export class ErpAuthService { */ async close(): Promise { if (this.session) { - await this.session.context.close(); - await this.session.browser.close(); - this.session = null; + await this.session.context.close() + await this.session.browser.close() + this.session = null } } @@ -143,15 +143,15 @@ export class ErpAuthService { */ getSession(): ErpSession { if (!this.session?.isLoggedIn) { - throw new Error('Not logged in. Call login() first.'); + throw new Error('Not logged in. Call login() first.') } - return this.session; + return this.session } /** * Check if session is active */ isActive(): boolean { - return this.session?.isLoggedIn ?? false; + return this.session?.isLoggedIn ?? false } } diff --git a/src/main/services/erp/extractor.ts b/src/main/services/erp/extractor.ts index 6254c7c..200dc31 100644 --- a/src/main/services/erp/extractor.ts +++ b/src/main/services/erp/extractor.ts @@ -1,9 +1,9 @@ -import path from 'path'; -import fs from 'fs/promises'; -import { ERP_LOCATORS } from './locators'; -import { ErpAuthService } from './erp-auth'; -import type { ExtractorInput, ExtractorResult } from '../../types/extractor.types'; -import type { ErpSession } from '../../types/erp.types'; +import path from 'path' +import fs from 'fs/promises' +import { ERP_LOCATORS } from './locators' +import { ErpAuthService } from './erp-auth' +import type { ExtractorInput, ExtractorResult } from '../../types/extractor.types' +import type { ErpSession } from '../../types/erp.types' /** * ERP Data Extractor Service @@ -12,15 +12,15 @@ import type { ErpSession } from '../../types/erp.types'; * Reference: playwrite/utils/discrete_material_plan_extractor.py */ export class ExtractorService { - private authService: ErpAuthService; - private downloadDir: string; + private authService: ErpAuthService + private downloadDir: string constructor(authService: ErpAuthService, downloadDir = './downloads') { - this.authService = authService; - this.downloadDir = downloadDir; + this.authService = authService + this.downloadDir = downloadDir // Ensure download directory exists - fs.mkdir(downloadDir, { recursive: true }).catch(() => {}); + fs.mkdir(downloadDir, { recursive: true }).catch(() => {}) } /** @@ -31,43 +31,49 @@ export class ExtractorService { downloadedFiles: [], mergedFile: null, recordCount: 0, - errors: [], - }; + errors: [] + } try { - const session = this.authService.getSession(); + const session = this.authService.getSession() // Navigate to extractor page and get popup page + work frame - const { popupPage, workFrame } = await this.navigateToExtractorPage(session); + const { popupPage, workFrame } = await this.navigateToExtractorPage(session) // Process orders in batches - const batchSize = input.batchSize || 100; - const batches = this.createBatches(input.orderNumbers, batchSize); + const batchSize = input.batchSize || 100 + const batches = this.createBatches(input.orderNumbers, batchSize) for (let i = 0; i < batches.length; i++) { - const batch = batches[i]; - const progress = ((i + 1) / batches.length) * 100; + const batch = batches[i] + const progress = ((i + 1) / batches.length) * 100 - input.onProgress?.(`Processing batch ${i + 1}/${batches.length}`, progress); + input.onProgress?.(`Processing batch ${i + 1}/${batches.length}`, progress) try { - const filePath = await this.downloadBatch(session, popupPage, workFrame, batch, i, batches.length); - result.downloadedFiles.push(filePath); + const filePath = await this.downloadBatch( + session, + popupPage, + workFrame, + batch, + i, + batches.length + ) + result.downloadedFiles.push(filePath) } catch (error) { - const message = error instanceof Error ? error.message : 'Unknown error'; - result.errors.push(`Batch ${i + 1}: ${message}`); + const message = error instanceof Error ? error.message : 'Unknown error' + result.errors.push(`Batch ${i + 1}: ${message}`) } } // TODO: Merge files (implement in separate task) // result.mergedFile = await this.mergeFiles(result.downloadedFiles); - } catch (error) { - const message = error instanceof Error ? error.message : 'Unknown error'; - result.errors.push(`Extraction failed: ${message}`); + const message = error instanceof Error ? error.message : 'Unknown error' + result.errors.push(`Extraction failed: ${message}`) } - return result; + return result } /** @@ -81,39 +87,41 @@ export class ExtractorService { * 4. f_frame.locator("#mainiframe").content_frame - Get nested inner frame * 5. setup_query_interface(work_frame) - Setup query interface */ - private async navigateToExtractorPage(session: ErpSession): Promise<{ popupPage: any; workFrame: any }> { - const { page, mainFrame } = session; + private async navigateToExtractorPage( + session: ErpSession + ): Promise<{ popupPage: any; workFrame: any }> { + const { page, mainFrame } = session // Step 1: Click menu icon (Python line 266) // main_frame is #forwardFrame.content_frame returned from login - await mainFrame.locator('i').first().click(); + await mainFrame.locator('i').first().click() // Step 2: Click discrete material plan menu item and expect popup (Python lines 267-271) - const popupPromise = page.waitForEvent('popup'); - await mainFrame.getByTitle('离散备料计划维护', { exact: true }).first().click(); - const popupPage = await popupPromise; + const popupPromise = page.waitForEvent('popup') + await mainFrame.getByTitle('离散备料计划维护', { exact: true }).first().click() + const popupPage = await popupPromise // Step 3 & 4: Get nested frame structure in popup window (Python lines 273-276) // popup page contains #forwardFrame, which contains #mainiframe - const forwardFrameLocator = popupPage.locator('#forwardFrame'); - const fFrame = await forwardFrameLocator.contentFrame(); + const forwardFrameLocator = popupPage.locator('#forwardFrame') + const fFrame = await forwardFrameLocator.contentFrame() if (!fFrame) { - throw new Error('Failed to access popup forward frame'); + throw new Error('Failed to access popup forward frame') } - const innerFrameLocator = fFrame.locator('#mainiframe'); - await innerFrameLocator.waitFor({ state: 'visible', timeout: 15000 }); - const workFrame = await innerFrameLocator.contentFrame(); + const innerFrameLocator = fFrame.locator('#mainiframe') + await innerFrameLocator.waitFor({ state: 'visible', timeout: 15000 }) + const workFrame = await innerFrameLocator.contentFrame() if (!workFrame) { - throw new Error('Failed to access inner work frame'); + throw new Error('Failed to access inner work frame') } // Step 5: Setup query interface (Python line 278) - await this.setupQueryInterface(workFrame); + await this.setupQueryInterface(workFrame) - return { popupPage, workFrame }; + return { popupPage, workFrame } } /** @@ -122,18 +130,18 @@ export class ExtractorService { */ private async setupQueryInterface(innerFrame: any): Promise { // Click search icon (Python line 233) - await innerFrame.locator('.search-name-wrapper > .iconfont').click(); + await innerFrame.locator('.search-name-wrapper > .iconfont').click() // Click "订单号查询" menu item (Python line 234) - await innerFrame.getByText('订单号查询').click(); + await innerFrame.getByText('订单号查询').click() // Click "全部" tab (Python line 235) - await innerFrame.getByRole('tab', { name: '全部' }).click(); + await innerFrame.getByRole('tab', { name: '全部' }).click() // Set limit to 5000 (Python lines 237-239) - const inputBox = innerFrame.locator('#rc_select_0'); - await inputBox.fill('5000'); - await inputBox.press('Enter'); + const inputBox = innerFrame.locator('#rc_select_0') + await inputBox.fill('5000') + await inputBox.press('Enter') } /** @@ -149,43 +157,40 @@ export class ExtractorService { totalBatches: number ): Promise { // Fill order numbers (Python lines 143-145) - const textbox = workFrame.getByRole('textbox', { name: '来源生产订单号' }); - await textbox.fill(''); - await textbox.fill(orderNumbers.join(',')); + const textbox = workFrame.getByRole('textbox', { name: '来源生产订单号' }) + await textbox.fill('') + await textbox.fill(orderNumbers.join(',')) // Click search button (Python line 147) - await workFrame.locator('.search-component-searchBtn').click(); + await workFrame.locator('.search-component-searchBtn').click() // Wait for loading (Python lines 148-153) - await this.waitForLoading(workFrame); + await this.waitForLoading(workFrame) // Click first row checkbox (Python line 155) - await workFrame.getByRole('row', { name: '序号' }).getByLabel('').click(); + await workFrame.getByRole('row', { name: '序号' }).getByLabel('').click() // Hover and click "更多" button (Python lines 156-157) - await workFrame.getByRole('button', { name: '更多' }).hover(); - await workFrame.getByText('输出', { exact: true }).click(); + await workFrame.getByRole('button', { name: '更多' }).hover() + await workFrame.getByText('输出', { exact: true }).click() // Set threshold (Python lines 159-164) const thresholdBox = workFrame .locator('div') .filter({ hasText: /^行数阈值$/ }) - .locator('input[type="text"]'); - await thresholdBox.fill('300000'); + .locator('input[type="text"]') + await thresholdBox.fill('300000') // Setup download handler and click confirm (Python lines 166-172) - const downloadPath = path.join( - this.downloadDir, - `temp_batch_${batchIndex + 1}.xlsx` - ); + const downloadPath = path.join(this.downloadDir, `temp_batch_${batchIndex + 1}.xlsx`) - const downloadPromise = popupPage.waitForEvent('download'); - await workFrame.getByRole('button', { name: '确定(Y)' }).click(); + const downloadPromise = popupPage.waitForEvent('download') + await workFrame.getByRole('button', { name: '确定(Y)' }).click() - const download = await downloadPromise; - await download.saveAs(downloadPath); + const download = await downloadPromise + await download.saveAs(downloadPath) - return downloadPath; + return downloadPath } /** @@ -193,11 +198,14 @@ export class ExtractorService { * Reference: Python lines 148-153 */ private async waitForLoading(workFrame: any): Promise { - const loadingLocator = workFrame.locator('div').filter({ hasText: ERP_LOCATORS.extractor.loadingText }).nth(1); + const loadingLocator = workFrame + .locator('div') + .filter({ hasText: ERP_LOCATORS.extractor.loadingText }) + .nth(1) try { - await loadingLocator.waitFor({ state: 'visible', timeout: 3000 }); - await loadingLocator.waitFor({ state: 'hidden', timeout: 0 }); + await loadingLocator.waitFor({ state: 'visible', timeout: 3000 }) + await loadingLocator.waitFor({ state: 'hidden', timeout: 0 }) } catch { // Loading completed quickly or never appeared } @@ -208,10 +216,10 @@ export class ExtractorService { * Reference: Python group_order_ids() method lines 128-131 */ private createBatches(items: T[], batchSize: number): T[][] { - const batches: T[][] = []; + const batches: T[][] = [] for (let i = 0; i < items.length; i += batchSize) { - batches.push(items.slice(i, i + batchSize)); + batches.push(items.slice(i, i + batchSize)) } - return batches; + return batches } } diff --git a/src/main/services/erp/locators.ts b/src/main/services/erp/locators.ts index baf3d19..70abcee 100644 --- a/src/main/services/erp/locators.ts +++ b/src/main/services/erp/locators.ts @@ -9,7 +9,7 @@ export const ERP_LOCATORS = { login: { usernameInput: '#username', passwordInput: '#password', - submitButton: 'button[type="submit"]', + submitButton: 'button[type="submit"]' }, // Main Frame @@ -22,7 +22,7 @@ export const ERP_LOCATORS = { // Inner iframe (inside forward frame) innerIframe: '#mainiframe', // Loading overlay text - loadingText: '加载中', + loadingText: '加载中' }, // Extractor (Data Export) Page @@ -43,7 +43,7 @@ export const ERP_LOCATORS = { // Export dialog - threshold input thresholdInputSelector: 'div:has-text(/^行数阈值$/) input[type="text"]', // Confirm button - confirmButton: 'internal:has-text="确定(Y)"', + confirmButton: 'internal:has-text="确定(Y)"' }, // Menu navigation @@ -55,7 +55,7 @@ export const ERP_LOCATORS = { // "All" tab allTab: 'internal:role=tab[name="全部"]', // Select input for setting limits - selectInput: '#rc_select_0', + selectInput: '#rc_select_0' }, // Discrete material plan menu item @@ -65,7 +65,7 @@ export const ERP_LOCATORS = { cleaner: { orderNumberInput: 'input[name="orderNumber"]', materialGrid: 'table.material-grid tbody tr', - saveButton: 'button:has-text("保存")', + saveButton: 'button:has-text("保存")' }, // Common Elements @@ -74,6 +74,6 @@ export const ERP_LOCATORS = { errorMessage: '.message.error', confirmDialog: '.confirm-dialog', confirmButton: 'button:has-text("确定")', - cancelButton: 'button:has-text("取消")', - }, -}; \ No newline at end of file + cancelButton: 'button:has-text("取消")' + } +} diff --git a/src/main/services/excel/excel-parser.ts b/src/main/services/excel/excel-parser.ts index 7bce32b..93193f3 100644 --- a/src/main/services/excel/excel-parser.ts +++ b/src/main/services/excel/excel-parser.ts @@ -1,10 +1,6 @@ -import ExcelJS from 'exceljs'; -import type { - DiscreteMaterialPlan, - ExcelParseOptions, - OrderHeader, -} from '../../types/excel.types'; -import path from 'path'; +import ExcelJS from 'exceljs' +import type { DiscreteMaterialPlan, ExcelParseOptions, OrderHeader } from '../../types/excel.types' +import path from 'path' /** * Excel Parser Service @@ -21,8 +17,8 @@ export class ExcelParser { // Field name mapping for Python compatibility (from Python code) private FIELD_NAME_MAPPING: Record = { 计划数量: '产品计划数量', - 单位: '产品单位', - }; + 单位: '产品单位' + } // Mapping from Chinese field names to English property names private CHINESE_TO_ENGLISH_MAPPING: Record = { @@ -40,18 +36,18 @@ export class ExcelParser { 打印日期: 'printDate', // Mapped fields (after FIELD_NAME_MAPPING) 产品计划数量: 'plannedQuantity', - 产品单位: 'unit', - }; + 产品单位: 'unit' + } - private verbose: boolean; + private verbose: boolean constructor(options: ExcelParseOptions = {}) { - this.verbose = options.verbose || false; + this.verbose = options.verbose || false } private log(...args: any[]): void { if (this.verbose) { - console.log('[ExcelParser]', ...args); + console.log('[ExcelParser]', ...args) } } @@ -59,40 +55,40 @@ export class ExcelParser { * Parse Excel file and extract material plans */ async parse(filePath: string, options: ExcelParseOptions = {}): Promise { - this.log('Parsing Excel file:', filePath); + this.log('Parsing Excel file:', filePath) - const workbook = new ExcelJS.Workbook(); - await workbook.xlsx.readFile(filePath); + const workbook = new ExcelJS.Workbook() + await workbook.xlsx.readFile(filePath) - const worksheet = workbook.worksheets[0]; + const worksheet = workbook.worksheets[0] if (!worksheet) { - throw new Error('No worksheet found in file'); + throw new Error('No worksheet found in file') } - const plans: DiscreteMaterialPlan[] = []; - const allRows: any[][] = []; + const plans: DiscreteMaterialPlan[] = [] + const allRows: any[][] = [] // Read all rows into memory worksheet.eachRow((row, rowNumber) => { - allRows.push(row.values as any[]); - }); + allRows.push(row.values as any[]) + }) - this.log(`Total rows read: ${allRows.length} (worksheet has ${worksheet.rowCount} rows)`); + this.log(`Total rows read: ${allRows.length} (worksheet has ${worksheet.rowCount} rows)`) // Parse orders from rows - const orders = this.parseOrders(allRows); + const orders = this.parseOrders(allRows) // Store orders for potential Excel export - (this as any).lastOrders = orders; + ;(this as any).lastOrders = orders // Flatten orders into material plans for (const order of orders) { - const { orderInfo, materials } = order; + const { orderInfo, materials } = order // Skip empty orders if option is set if (options.skipEmptyOrders && materials.length === 0) { - this.log('Skipping empty order:', orderInfo.productionOrder); - continue; + this.log('Skipping empty order:', orderInfo.productionOrder) + continue } // Create a material plan for each material row @@ -112,15 +108,15 @@ export class ExcelParser { warehouse: material.warehouse, unitUsage: material.unitUsage, cumulativeOutboundQty: material.cumulativeOutboundQty, - rowNumber: material.rowNumber, - }; - plans.push(plan); + rowNumber: material.rowNumber + } + plans.push(plan) } } - this.log(`Parsed ${plans.length} material plans from ${orders.length} orders`); + this.log(`Parsed ${plans.length} material plans from ${orders.length} orders`) - return plans; + return plans } /** @@ -131,15 +127,15 @@ export class ExcelParser { * @param outputPath - Output Excel file path */ async saveAsExcel(outputPath: string): Promise { - const orders = (this as any).lastOrders; + const orders = (this as any).lastOrders if (!orders) { - throw new Error('No parsed data available. Call parse() first.'); + throw new Error('No parsed data available. Call parse() first.') } - this.log('Saving parsed data to Excel:', outputPath); + this.log('Saving parsed data to Excel:', outputPath) - const workbook = new ExcelJS.Workbook(); - const worksheet = workbook.addWorksheet('Data'); + const workbook = new ExcelJS.Workbook() + const worksheet = workbook.addWorksheet('Data') // Define columns matching Python excel_converter output format exactly worksheet.columns = [ @@ -172,12 +168,12 @@ export class ExcelParser { { header: '单位用量', key: 'unitUsage', width: 12 }, { header: '累计出库数量', key: 'cumulativeOutboundQty', width: 15 }, { header: '打印人', key: 'printer', width: 15 }, - { header: '打印日期', key: 'printDate', width: 20 }, - ]; + { header: '打印日期', key: 'printDate', width: 20 } + ] // Add data rows - merge orderInfo with each material for (const order of orders) { - const { orderInfo, materials } = order; + const { orderInfo, materials } = order for (const material of materials) { worksheet.addRow({ @@ -213,14 +209,16 @@ export class ExcelParser { cumulativeOutboundQty: material.cumulativeOutboundQty || 0, // Footer info (last 2 columns) printer: orderInfo.printer || '', - printDate: orderInfo.printDate || '', - }); + printDate: orderInfo.printDate || '' + }) } } // Save workbook - await workbook.xlsx.writeFile(outputPath); - this.log(`Excel file saved: ${outputPath} (${orders.length} orders, ${worksheet.rowCount - 1} data rows)`); + await workbook.xlsx.writeFile(outputPath) + this.log( + `Excel file saved: ${outputPath} (${orders.length} orders, ${worksheet.rowCount - 1} data rows)` + ) } /** @@ -228,64 +226,54 @@ export class ExcelParser { * Reference: _parse_sheet() in Python code */ private parseOrders(allRows: any[][]): Array<{ orderInfo: OrderHeader; materials: any[] }> { - const orders: Array<{ orderInfo: OrderHeader; materials: any[] }> = []; - let i = 0; + const orders: Array<{ orderInfo: OrderHeader; materials: any[] }> = [] + let i = 0 while (i < allRows.length) { - const row = allRows[i]; + const row = allRows[i] // Check if this is an order title row if (row && row[2] && String(row[2]).includes('离散备料计划')) { // Parse order header info (next 4 rows) - const orderInfo: OrderHeader = {}; + const orderInfo: OrderHeader = {} for (let j = 1; j <= 4; j++) { if (i + j < allRows.length && allRows[i + j]) { - this.parseHeaderRow(allRows[i + j], orderInfo); + this.parseHeaderRow(allRows[i + j], orderInfo) } } // Debug: check productionOrder extraction - this.log(`Order ${orders.length + 1}: productionOrder="${orderInfo.productionOrder}"`); + this.log(`Order ${orders.length + 1}: productionOrder="${orderInfo.productionOrder}"`) // Find table header row dynamically (look for "序号" in index 1) // Note: worksheet.eachRow() skips empty rows, so we can't use fixed offsets - let tableRow = i + 1; - while ( - tableRow < allRows.length && - allRows[tableRow] && - allRows[tableRow][1] !== '序号' - ) { - tableRow++; + let tableRow = i + 1 + while (tableRow < allRows.length && allRows[tableRow] && allRows[tableRow][1] !== '序号') { + tableRow++ } if (tableRow >= allRows.length || !allRows[tableRow]) { - this.log(' ⚠️ Table header not found, skipping this order'); - i++; - continue; + this.log(' ⚠️ Table header not found, skipping this order') + i++ + continue } // Check if this is the table header row // ExcelJS is 1-indexed: index 0=null, index 1=序号, index 2=材料编码 - if ( - tableRow < allRows.length && - allRows[tableRow] && - allRows[tableRow][1] === '序号' - ) { + if (tableRow < allRows.length && allRows[tableRow] && allRows[tableRow][1] === '序号') { // Check if next row is empty (no data) - const nextRow = tableRow + 1; + const nextRow = tableRow + 1 const isEmptyRow = nextRow < allRows.length && allRows[nextRow] && - allRows[nextRow].every( - (cell: any) => cell === null || String(cell).trim() === '' - ); + allRows[nextRow].every((cell: any) => cell === null || String(cell).trim() === '') if (isEmptyRow) { // No data, find footer info - this.log('Order has no material data'); - const materials: any[] = []; - const footerInfo: OrderHeader = {}; - let dataRow = nextRow + 1; + this.log('Order has no material data') + const materials: any[] = [] + const footerInfo: OrderHeader = {} + let dataRow = nextRow + 1 while (dataRow < allRows.length && allRows[dataRow]) { if ( @@ -293,32 +281,32 @@ export class ExcelParser { (String(allRows[dataRow][2]).includes('制单人') || String(allRows[dataRow][2]).includes('打印人')) ) { - this.parseHeaderRow(allRows[dataRow], footerInfo); + this.parseHeaderRow(allRows[dataRow], footerInfo) if (dataRow + 1 < allRows.length && allRows[dataRow + 1]) { - this.parseHeaderRow(allRows[dataRow + 1], footerInfo); + this.parseHeaderRow(allRows[dataRow + 1], footerInfo) } - break; + break } - dataRow++; + dataRow++ } orders.push({ orderInfo: { ...orderInfo, ...footerInfo }, - materials, - }); + materials + }) } else { // Has data, extract materials - this.log('Order has material data'); - const materials: any[] = []; - const footerInfo: OrderHeader = {}; - let dataRow = tableRow + 1; + this.log('Order has material data') + const materials: any[] = [] + const footerInfo: OrderHeader = {} + let dataRow = tableRow + 1 while (dataRow < allRows.length && allRows[dataRow]) { // Check if CURRENT row is footer info (制单人/打印人) const isCurrentRowFooter = allRows[dataRow][2] && (String(allRows[dataRow][2]).includes('制单人') || - String(allRows[dataRow][2]).includes('打印人')); + String(allRows[dataRow][2]).includes('打印人')) // Check if NEXT row is footer info (to handle empty row before footer) const isNextRowFooter = @@ -326,65 +314,67 @@ export class ExcelParser { allRows[dataRow + 1] && allRows[dataRow + 1][2] && (String(allRows[dataRow + 1][2]).includes('制单人') || - String(allRows[dataRow + 1][2]).includes('打印人')); + String(allRows[dataRow + 1][2]).includes('打印人')) if (isCurrentRowFooter) { // Current row is footer, parse it and next row if exists - this.parseHeaderRow(allRows[dataRow], footerInfo); + this.parseHeaderRow(allRows[dataRow], footerInfo) if (dataRow + 1 < allRows.length && allRows[dataRow + 1]) { - this.parseHeaderRow(allRows[dataRow + 1], footerInfo); + this.parseHeaderRow(allRows[dataRow + 1], footerInfo) } - this.log(' Found footer row, stopping material parsing'); - break; + this.log(' Found footer row, stopping material parsing') + break } if (isNextRowFooter) { // Next row is footer, parse current row as material first - const material = this.parseMaterialRowInternal(allRows[dataRow], dataRow + 1); + const material = this.parseMaterialRowInternal(allRows[dataRow], dataRow + 1) if (material) { - this.log(' Parsed material:', material.materialCode); - materials.push(material); + this.log(' Parsed material:', material.materialCode) + materials.push(material) } // Then parse footer rows - this.parseHeaderRow(allRows[dataRow + 1], footerInfo); + this.parseHeaderRow(allRows[dataRow + 1], footerInfo) if (dataRow + 2 < allRows.length && allRows[dataRow + 2]) { - this.parseHeaderRow(allRows[dataRow + 2], footerInfo); + this.parseHeaderRow(allRows[dataRow + 2], footerInfo) } - this.log(' Found footer in next row, stopping material parsing'); - break; + this.log(' Found footer in next row, stopping material parsing') + break } // Extract material data - const material = this.parseMaterialRowInternal(allRows[dataRow], dataRow + 1); + const material = this.parseMaterialRowInternal(allRows[dataRow], dataRow + 1) if (material) { - this.log(' Parsed material:', material.materialCode); - materials.push(material); + this.log(' Parsed material:', material.materialCode) + materials.push(material) } else { - this.log(' Skipped material row at', dataRow + 1); + this.log(' Skipped material row at', dataRow + 1) } - dataRow++; + dataRow++ } orders.push({ orderInfo: { ...orderInfo, ...footerInfo }, - materials, - }); + materials + }) } } else { - this.log(` ⚠️ Table header check failed at row ${tableRow + 1}, value="${allRows[tableRow] ? allRows[tableRow][1] : 'null'}"`); + this.log( + ` ⚠️ Table header check failed at row ${tableRow + 1}, value="${allRows[tableRow] ? allRows[tableRow][1] : 'null'}"` + ) } // Move to next row after this order - i = tableRow + 1; + i = tableRow + 1 } else { - i++; + i++ } } - this.log(`parseOrders: Returning ${orders.length} orders`); - return orders; + this.log(`parseOrders: Returning ${orders.length} orders`) + return orders } /** @@ -392,38 +382,38 @@ export class ExcelParser { * Reference: _parse_header_row() in Python code */ private parseHeaderRow(row: any[], info: OrderHeader): void { - let j = 0; + let j = 0 while (j < row.length) { - const cell = row[j]; + const cell = row[j] if (cell && String(cell).trim() && String(cell).includes(':')) { // Found field name - let fieldName = String(cell).replace(':', '').trim(); + let fieldName = String(cell).replace(':', '').trim() // Apply field name mapping (from Python code) if (fieldName in this.FIELD_NAME_MAPPING) { - fieldName = this.FIELD_NAME_MAPPING[fieldName]; + fieldName = this.FIELD_NAME_MAPPING[fieldName] } // Map Chinese field name to English property name - const englishFieldName = this.CHINESE_TO_ENGLISH_MAPPING[fieldName] || fieldName; + const englishFieldName = this.CHINESE_TO_ENGLISH_MAPPING[fieldName] || fieldName // Skip empty cells to find first non-field-name value - let k = j + 1; + let k = j + 1 while ( k < row.length && (!row[k] || !String(row[k]).trim() || String(row[k]).includes(':')) ) { - k++; + k++ } if (k < row.length && row[k] && !String(row[k]).includes(':')) { - info[englishFieldName as keyof OrderHeader] = String(row[k]).trim(); + info[englishFieldName as keyof OrderHeader] = String(row[k]).trim() } // Skip processed value, continue to next field name - j = k + 1; + j = k + 1 } else { - j++; + j++ } } } @@ -455,15 +445,15 @@ export class ExcelParser { warehouse: row[11], unitUsage: this.parseFloat(row[12]), cumulativeOutboundQty: this.parseFloat(row[13]), - rowNumber, - }; + rowNumber + } // Skip if no material code if (!material.materialCode) { - return null; + return null } - return material; + return material } /** @@ -471,10 +461,10 @@ export class ExcelParser { */ private parseFloat(value: any): number | undefined { if (value === null || value === undefined) { - return undefined; + return undefined } - const parsed = parseFloat(String(value)); - return isNaN(parsed) ? undefined : parsed; + const parsed = parseFloat(String(value)) + return isNaN(parsed) ? undefined : parsed } /** @@ -486,11 +476,8 @@ export class ExcelParser { */ public isOrderRow(values: any[]): boolean { // ExcelJS arrays are 1-indexed, check index 2 for order title - const firstCell = values[2]; - return ( - typeof firstCell === 'string' && - firstCell.includes('离散备料计划') - ); + const firstCell = values[2] + return typeof firstCell === 'string' && firstCell.includes('离散备料计划') } /** @@ -505,9 +492,9 @@ export class ExcelParser { */ public extractOrderNumber(values: any[]): string { // Parse the row to extract order number using same logic as header parsing - const orderInfo: OrderHeader = {}; - this.parseHeaderRow(values, orderInfo); - return orderInfo.productionOrder || ''; + const orderInfo: OrderHeader = {} + this.parseHeaderRow(values, orderInfo) + return orderInfo.productionOrder || '' } /** @@ -533,22 +520,22 @@ export class ExcelParser { // Index 3: 材料名称 // Index 4: 规格 // etc. - const materialCode = values[2]?.toString().trim(); - const materialName = values[3]?.toString().trim(); - const specification = values[4]?.toString().trim(); - const model = values[5]?.toString().trim(); - const drawingNumber = values[6]?.toString().trim(); - const material = values[7]?.toString().trim(); - const quantity = this.parseFloat(values[8]) || 0; - const unit = values[9]?.toString().trim() || ''; - const requiredDate = values[10]?.toString().trim(); - const warehouse = values[11]?.toString().trim(); - const unitUsage = this.parseFloat(values[12]); - const cumulativeOutboundQty = this.parseFloat(values[13]); + const materialCode = values[2]?.toString().trim() + const materialName = values[3]?.toString().trim() + const specification = values[4]?.toString().trim() + const model = values[5]?.toString().trim() + const drawingNumber = values[6]?.toString().trim() + const material = values[7]?.toString().trim() + const quantity = this.parseFloat(values[8]) || 0 + const unit = values[9]?.toString().trim() || '' + const requiredDate = values[10]?.toString().trim() + const warehouse = values[11]?.toString().trim() + const unitUsage = this.parseFloat(values[12]) + const cumulativeOutboundQty = this.parseFloat(values[13]) // Skip if no material code if (!materialCode) { - return null; + return null } return { @@ -566,7 +553,7 @@ export class ExcelParser { warehouse, unitUsage, cumulativeOutboundQty, - rowNumber, - }; + rowNumber + } } } diff --git a/src/main/types/erp.types.ts b/src/main/types/erp.types.ts index cb4dee5..3de6ca9 100644 --- a/src/main/types/erp.types.ts +++ b/src/main/types/erp.types.ts @@ -1,18 +1,18 @@ export interface ErpConfig { - url: string; - username: string; - password: string; - headless?: boolean; // Optional: override default headless setting + url: string + username: string + password: string + headless?: boolean // Optional: override default headless setting } export interface ErpSession { - browser: import('playwright').Browser; - context: import('playwright').BrowserContext; - page: import('playwright').Page; - mainFrame: import('playwright').Frame; // #forwardFrame content frame - main working frame after login - isLoggedIn: boolean; + browser: import('playwright').Browser + context: import('playwright').BrowserContext + page: import('playwright').Page + mainFrame: import('playwright').Frame // #forwardFrame content frame - main working frame after login + isLoggedIn: boolean } export interface ProgressCallback { - (message: string, progress?: number): void; -} \ No newline at end of file + (message: string, progress?: number): void +} diff --git a/src/main/types/excel.types.ts b/src/main/types/excel.types.ts index e149983..7afb64d 100644 --- a/src/main/types/excel.types.ts +++ b/src/main/types/excel.types.ts @@ -9,52 +9,52 @@ */ export interface DiscreteMaterialPlan { /** Order number (e.g., SC202501001) */ - orderNumber: string; + orderNumber: string /** Production ID from order header */ - productionId: string; + productionId: string /** Material code (材料编码) */ - materialCode: string; + materialCode: string /** Material name (材料名称) */ - materialName: string; + materialName: string /** Specification (规格) */ - specification?: string; + specification?: string /** Model (型号) */ - model?: string; + model?: string /** Drawing number (图号) */ - drawingNumber?: string; + drawingNumber?: string /** Material (物料材质) */ - material?: string; + material?: string /** Planned quantity (计划数量) */ - quantity: number; + quantity: number /** Unit (单位) */ - unit: string; + unit: string /** Required date (需用日期) */ - requiredDate?: string; + requiredDate?: string /** Warehouse (发料仓库) */ - warehouse?: string; + warehouse?: string /** Unit usage (单位用量) */ - unitUsage?: number; + unitUsage?: number /** Cumulative outbound quantity (累计出库数量) */ - cumulativeOutboundQty?: number; + cumulativeOutboundQty?: number /** Pending quantity (pending quantity for fulfillment) */ - pendingQty?: number; + pendingQty?: number /** Row number in Excel file */ - rowNumber?: number; + rowNumber?: number } /** @@ -62,16 +62,16 @@ export interface DiscreteMaterialPlan { */ export interface ExcelParseOptions { /** Skip orders with no material data */ - skipEmptyOrders?: boolean; + skipEmptyOrders?: boolean /** Skip footer rows (制单人/打印人) */ - skipFooter?: boolean; + skipFooter?: boolean /** Custom field mapping */ - fieldMapping?: Record; + fieldMapping?: Record /** Verbose logging */ - verbose?: boolean; + verbose?: boolean } /** @@ -79,38 +79,38 @@ export interface ExcelParseOptions { */ export interface OrderHeader { /** Order title (离散备料计划) */ - title?: string; + title?: string /** Production department (生产部门) */ - productionDepartment?: string; + productionDepartment?: string /** Production order (生产订单) */ - productionOrder?: string; + productionOrder?: string /** Product code (产品编码) */ - productCode?: string; + productCode?: string /** Product name (产品名称) */ - productName?: string; + productName?: string /** Product specification (产品规格) */ - productSpecification?: string; + productSpecification?: string /** Planned quantity (计划数量) */ - plannedQuantity?: string; + plannedQuantity?: string /** Unit (单位) */ - unit?: string; + unit?: string /** Required date (需用日期) */ - requiredDate?: string; + requiredDate?: string /** Creator (制单人) */ - creator?: string; + creator?: string /** Printer (打印人) */ - printer?: string; + printer?: string /** Print date (打印日期) */ - printDate?: string; + printDate?: string } diff --git a/src/main/types/extractor.types.ts b/src/main/types/extractor.types.ts index 14addb6..16fcdb2 100644 --- a/src/main/types/extractor.types.ts +++ b/src/main/types/extractor.types.ts @@ -1,17 +1,17 @@ export interface ExtractorInput { - orderNumbers: string[]; - batchSize?: number; - onProgress?: (message: string, progress: number) => void; + orderNumbers: string[] + batchSize?: number + onProgress?: (message: string, progress: number) => void } export interface ExtractorResult { - downloadedFiles: string[]; - mergedFile: string | null; - recordCount: number; - errors: string[]; + downloadedFiles: string[] + mergedFile: string | null + recordCount: number + errors: string[] } export interface OrderInfo { - orderNumber: string; - productionId: string; -} \ No newline at end of file + orderNumber: string + productionId: string +} diff --git a/tests/fixtures/create-fixtures.ts b/tests/fixtures/create-fixtures.ts index 26bb964..b4ba13a 100644 --- a/tests/fixtures/create-fixtures.ts +++ b/tests/fixtures/create-fixtures.ts @@ -1,25 +1,25 @@ -import ExcelJS from 'exceljs'; -import path from 'path'; +import ExcelJS from 'exceljs' +import path from 'path' /** * Create test fixture Excel files for unit tests */ async function createTestFixture() { - const workbook = new ExcelJS.Workbook(); - const worksheet = workbook.addWorksheet('Sheet1'); + const workbook = new ExcelJS.Workbook() + const worksheet = workbook.addWorksheet('Sheet1') // Row 1: Order title - worksheet.addRow([null, '离散备料计划']); + worksheet.addRow([null, '离散备料计划']) // Row 2-5: Order header info - worksheet.addRow([null, '生产部门:', null, '生产车间', '产品编码:', null, 'P001']); - worksheet.addRow([null, '生产订单:', null, 'SC202501001', '产品名称:', null, '测试产品A']); - worksheet.addRow([null, '产品规格:', null, '标准规格', '计划数量:', null, '100']); - worksheet.addRow([null, '单位:', null, '件', '需用日期:', null, '2025-02-15']); + worksheet.addRow([null, '生产部门:', null, '生产车间', '产品编码:', null, 'P001']) + worksheet.addRow([null, '生产订单:', null, 'SC202501001', '产品名称:', null, '测试产品A']) + worksheet.addRow([null, '产品规格:', null, '标准规格', '计划数量:', null, '100']) + worksheet.addRow([null, '单位:', null, '件', '需用日期:', null, '2025-02-15']) // Row 6: Empty row before table header - worksheet.addRow([]); + worksheet.addRow([]) // Row 7: Table header worksheet.addRow([ @@ -36,8 +36,8 @@ async function createTestFixture() { '需用日期', '发料仓库', '单位用量', - '累计出库数量', - ]); + '累计出库数量' + ]) // Row 8-10: Material data worksheet.addRow([ @@ -54,8 +54,8 @@ async function createTestFixture() { '2025-02-10', '仓库1', 0.5, - 0, - ]); + 0 + ]) worksheet.addRow([ null, 2, @@ -70,8 +70,8 @@ async function createTestFixture() { '2025-02-12', '仓库1', 1.0, - 20, - ]); + 20 + ]) worksheet.addRow([ null, 3, @@ -86,34 +86,34 @@ async function createTestFixture() { '2025-02-14', '仓库2', 2.0, - 50, - ]); + 50 + ]) // Row 11: Footer info - worksheet.addRow([null, '制单人:', null, '张三', '打印人:', null, '李四']); - worksheet.addRow([null, '打印日期:', null, '2025-01-15']); + worksheet.addRow([null, '制单人:', null, '张三', '打印人:', null, '李四']) + worksheet.addRow([null, '打印日期:', null, '2025-01-15']) // Save file - const filePath = path.resolve(__dirname, 'test-export.xlsx'); - await workbook.xlsx.writeFile(filePath); - console.log('Created test fixture:', filePath); + const filePath = path.resolve(__dirname, 'test-export.xlsx') + await workbook.xlsx.writeFile(filePath) + console.log('Created test fixture:', filePath) } async function createEmptyOrdersFixture() { - const workbook = new ExcelJS.Workbook(); - const worksheet = workbook.addWorksheet('Sheet1'); + const workbook = new ExcelJS.Workbook() + const worksheet = workbook.addWorksheet('Sheet1') // Row 1: Order title - worksheet.addRow([null, '离散备料计划']); + worksheet.addRow([null, '离散备料计划']) // Row 2-5: Order header info - worksheet.addRow([null, '生产部门:', null, '生产车间', '产品编码:', null, 'P002']); - worksheet.addRow([null, '生产订单:', null, 'SC202501002', '产品名称:', null, '测试产品B']); - worksheet.addRow([null, '产品规格:', null, '特殊规格', '计划数量:', null, '50']); - worksheet.addRow([null, '单位:', null, '套', '需用日期:', null, '2025-03-01']); + worksheet.addRow([null, '生产部门:', null, '生产车间', '产品编码:', null, 'P002']) + worksheet.addRow([null, '生产订单:', null, 'SC202501002', '产品名称:', null, '测试产品B']) + worksheet.addRow([null, '产品规格:', null, '特殊规格', '计划数量:', null, '50']) + worksheet.addRow([null, '单位:', null, '套', '需用日期:', null, '2025-03-01']) // Row 6: Empty row before table header - worksheet.addRow([]); + worksheet.addRow([]) // Row 7: Table header worksheet.addRow([ @@ -130,27 +130,27 @@ async function createEmptyOrdersFixture() { '需用日期', '发料仓库', '单位用量', - '累计出库数量', - ]); + '累计出库数量' + ]) // Row 8: Empty row (no data) - worksheet.addRow([]); + worksheet.addRow([]) // Row 9: Footer info - worksheet.addRow([null, '制单人:', null, '王五', '打印人:', null, '赵六']); - worksheet.addRow([null, '打印日期:', null, '2025-01-16']); + worksheet.addRow([null, '制单人:', null, '王五', '打印人:', null, '赵六']) + worksheet.addRow([null, '打印日期:', null, '2025-01-16']) // Save file - const filePath = path.resolve(__dirname, 'test-empty-orders.xlsx'); - await workbook.xlsx.writeFile(filePath); - console.log('Created empty orders fixture:', filePath); + const filePath = path.resolve(__dirname, 'test-empty-orders.xlsx') + await workbook.xlsx.writeFile(filePath) + console.log('Created empty orders fixture:', filePath) } async function main() { - console.log('Creating test fixture Excel files...'); - await createTestFixture(); - await createEmptyOrdersFixture(); - console.log('Done!'); + console.log('Creating test fixture Excel files...') + await createTestFixture() + await createEmptyOrdersFixture() + console.log('Done!') } -main().catch(console.error); +main().catch(console.error) diff --git a/tests/integration/erp-auth.test.ts b/tests/integration/erp-auth.test.ts index 8df54d8..ab8e40a 100644 --- a/tests/integration/erp-auth.test.ts +++ b/tests/integration/erp-auth.test.ts @@ -1,56 +1,56 @@ -import { describe, it, expect, beforeAll, afterAll } from 'vitest'; -import { ErpAuthService } from '../../src/main/services/erp/erp-auth'; -import type { ErpConfig } from '../../src/main/types/erp.types'; +import { describe, it, expect, beforeAll, afterAll } from 'vitest' +import { ErpAuthService } from '../../src/main/services/erp/erp-auth' +import type { ErpConfig } from '../../src/main/types/erp.types' describe('ERP Authentication Service (Integration)', () => { - let authService: ErpAuthService; + let authService: ErpAuthService const config: ErpConfig = { url: process.env.ERP_URL || '', username: process.env.ERP_USERNAME || '', - password: process.env.ERP_PASSWORD || '', - }; + password: process.env.ERP_PASSWORD || '' + } // Check if we have ERP credentials - const hasCredentials = !!(config.url && config.username && config.password); + const hasCredentials = !!(config.url && config.username && config.password) beforeAll(() => { if (!hasCredentials) { - console.warn('Skipping ERP auth tests: credentials not configured'); - return; + console.warn('Skipping ERP auth tests: credentials not configured') + return } - authService = new ErpAuthService(config); - }); + authService = new ErpAuthService(config) + }) it('should login successfully', async () => { if (!hasCredentials) { - console.warn('Skipping test: ERP credentials not configured'); - return; + console.warn('Skipping test: ERP credentials not configured') + return } - const session = await authService.login(); + const session = await authService.login() - expect(session).toBeDefined(); - expect(session.browser).toBeDefined(); - expect(session.context).toBeDefined(); - expect(session.page).toBeDefined(); - expect(session.isLoggedIn).toBe(true); - }, 30000); + expect(session).toBeDefined() + expect(session.browser).toBeDefined() + expect(session.context).toBeDefined() + expect(session.page).toBeDefined() + expect(session.isLoggedIn).toBe(true) + }, 30000) it('should navigate to main page after login', async () => { if (!hasCredentials) { - console.warn('Skipping test: ERP credentials not configured'); - return; + console.warn('Skipping test: ERP credentials not configured') + return } - const session = await authService.login(); + const session = await authService.login() - const url = session.page.url(); - expect(url).toContain(config.url); - }, 30000); + const url = session.page.url() + expect(url).toContain(config.url) + }, 30000) afterAll(async () => { if (hasCredentials && authService) { - await authService.close(); + await authService.close() } - }); -}); + }) +}) diff --git a/tests/integration/extractor.test.ts b/tests/integration/extractor.test.ts index 8ddbf7d..56dd1b7 100644 --- a/tests/integration/extractor.test.ts +++ b/tests/integration/extractor.test.ts @@ -1,150 +1,152 @@ -import { describe, it, expect, beforeAll, afterAll } from 'vitest'; -import { ExtractorService } from '../../src/main/services/erp/extractor'; -import { ErpAuthService } from '../../src/main/services/erp/erp-auth'; -import type { ErpConfig } from '../../src/main/types/erp.types'; -import fs from 'fs/promises'; -import path from 'path'; +import { describe, it, expect, beforeAll, afterAll } from 'vitest' +import { ExtractorService } from '../../src/main/services/erp/extractor' +import { ErpAuthService } from '../../src/main/services/erp/erp-auth' +import type { ErpConfig } from '../../src/main/types/erp.types' +import fs from 'fs/promises' +import path from 'path' describe('Extractor Service (Integration)', () => { const config: ErpConfig = { url: process.env.ERP_URL || '', username: process.env.ERP_USERNAME || '', - password: process.env.ERP_PASSWORD || '', - }; + password: process.env.ERP_PASSWORD || '' + } - const testOrderNumber = 'SC70202602120085'; // From references/demo/productionID.txt + const testOrderNumber = 'SC70202602120085' // From references/demo/productionID.txt // Check if we have ERP credentials - const hasCredentials = !!(config.url && config.username && config.password); + const hasCredentials = !!(config.url && config.username && config.password) it('should extract data for single order number', async () => { if (!hasCredentials) { - console.warn('Skipping test: ERP credentials not configured'); - return; + console.warn('Skipping test: ERP credentials not configured') + return } // Create fresh auth service for this test - const authService = new ErpAuthService(config); - await authService.login(); + const authService = new ErpAuthService(config) + await authService.login() - const extractor = new ExtractorService(authService); + const extractor = new ExtractorService(authService) const result = await extractor.extract({ - orderNumbers: [testOrderNumber], - }); + orderNumbers: [testOrderNumber] + }) - expect(result.downloadedFiles).toHaveLength(1); - expect(result.errors).toHaveLength(0); + expect(result.downloadedFiles).toHaveLength(1) + expect(result.errors).toHaveLength(0) // Verify file exists - const filePath = result.downloadedFiles[0]; - const stats = await fs.stat(filePath); - expect(stats.size).toBeGreaterThan(0); + const filePath = result.downloadedFiles[0] + const stats = await fs.stat(filePath) + expect(stats.size).toBeGreaterThan(0) // Clean up - await authService.close(); - }, 60000); + await authService.close() + }, 60000) it('should extract data for multiple order numbers', async () => { if (!hasCredentials) { - console.warn('Skipping test: ERP credentials not configured'); - return; + console.warn('Skipping test: ERP credentials not configured') + return } // Create fresh auth service for this test - const authService = new ErpAuthService(config); - await authService.login(); + const authService = new ErpAuthService(config) + await authService.login() - const extractor = new ExtractorService(authService); + const extractor = new ExtractorService(authService) // Read order numbers from productionID.txt file - const fs = await import('fs/promises'); - const path = await import('path'); + const fs = await import('fs/promises') + const path = await import('path') // productionID.txt is at: D:\FileLib\Projects\CodeMigration\references\demo\productionID.txt // test runs at: D:\FileLib\Projects\CodeMigration\ERPAuto - const productionIdFile = path.join(process.cwd(), '../references/demo/productionID.txt'); - const content = await fs.readFile(productionIdFile, 'utf-8'); - const orderNumbers = content.split('\n') - .map(line => line.trim()) - .filter(line => line.length > 0) - .slice(0, 5); // Test first 5 orders + const productionIdFile = path.join(process.cwd(), '../references/demo/productionID.txt') + const content = await fs.readFile(productionIdFile, 'utf-8') + const orderNumbers = content + .split('\n') + .map((line) => line.trim()) + .filter((line) => line.length > 0) + .slice(0, 5) // Test first 5 orders - console.log(`Testing with ${orderNumbers.length} order numbers:`, orderNumbers); + console.log(`Testing with ${orderNumbers.length} order numbers:`, orderNumbers) const result = await extractor.extract({ orderNumbers, - batchSize: 100, // Process all in one batch - }); + batchSize: 100 // Process all in one batch + }) - console.log(`Downloaded ${result.downloadedFiles.length} files`); + console.log(`Downloaded ${result.downloadedFiles.length} files`) if (result.errors.length > 0) { - console.log('Errors:', result.errors); + console.log('Errors:', result.errors) } - expect(result.downloadedFiles.length).toBeGreaterThanOrEqual(1); + expect(result.downloadedFiles.length).toBeGreaterThanOrEqual(1) // Clean up - await authService.close(); - }, 120000); // Increase timeout to 2 minutes + await authService.close() + }, 120000) // Increase timeout to 2 minutes it('should extract data for 300 orders with batch size 70', async () => { if (!hasCredentials) { - console.warn('Skipping test: ERP credentials not configured'); - return; + console.warn('Skipping test: ERP credentials not configured') + return } // Create fresh auth service for this test - const authService = new ErpAuthService(config); - await authService.login(); + const authService = new ErpAuthService(config) + await authService.login() - const extractor = new ExtractorService(authService); + const extractor = new ExtractorService(authService) // Read all order numbers from productionID.txt file - const fs = await import('fs/promises'); - const path = await import('path'); - const productionIdFile = path.join(process.cwd(), '../references/demo/productionID.txt'); - const content = await fs.readFile(productionIdFile, 'utf-8'); - const orderNumbers = content.split('\n') - .map(line => line.trim()) - .filter(line => line.length > 0); + const fs = await import('fs/promises') + const path = await import('path') + const productionIdFile = path.join(process.cwd(), '../references/demo/productionID.txt') + const content = await fs.readFile(productionIdFile, 'utf-8') + const orderNumbers = content + .split('\n') + .map((line) => line.trim()) + .filter((line) => line.length > 0) - console.log(`Testing with ${orderNumbers.length} order numbers`); - console.log(`Batch size: 70, Expected batches: ${Math.ceil(orderNumbers.length / 70)}`); + console.log(`Testing with ${orderNumbers.length} order numbers`) + console.log(`Batch size: 70, Expected batches: ${Math.ceil(orderNumbers.length / 70)}`) - const startTime = Date.now(); + const startTime = Date.now() const result = await extractor.extract({ orderNumbers, - batchSize: 70, // Process 70 orders per batch - }); + batchSize: 70 // Process 70 orders per batch + }) - const endTime = Date.now(); - const duration = ((endTime - startTime) / 1000).toFixed(2); + const endTime = Date.now() + const duration = ((endTime - startTime) / 1000).toFixed(2) - console.log(`\n=== Extraction Summary ===`); - console.log(`Total orders: ${orderNumbers.length}`); - console.log(`Batch size: 70`); - console.log(`Expected batches: ${Math.ceil(orderNumbers.length / 70)}`); - console.log(`Downloaded files: ${result.downloadedFiles.length}`); - console.log(`Total duration: ${duration}s`); - console.log(`Average time per batch: ${(duration / result.downloadedFiles.length).toFixed(2)}s`); + console.log(`\n=== Extraction Summary ===`) + console.log(`Total orders: ${orderNumbers.length}`) + console.log(`Batch size: 70`) + console.log(`Expected batches: ${Math.ceil(orderNumbers.length / 70)}`) + console.log(`Downloaded files: ${result.downloadedFiles.length}`) + console.log(`Total duration: ${duration}s`) + console.log(`Average time per batch: ${(duration / result.downloadedFiles.length).toFixed(2)}s`) if (result.errors.length > 0) { - console.log(`\nErrors encountered: ${result.errors.length}`); - result.errors.forEach((err, idx) => console.log(` ${idx + 1}. ${err}`)); + console.log(`\nErrors encountered: ${result.errors.length}`) + result.errors.forEach((err, idx) => console.log(` ${idx + 1}. ${err}`)) } // Verify results - expect(result.downloadedFiles.length).toBeGreaterThanOrEqual(1); + expect(result.downloadedFiles.length).toBeGreaterThanOrEqual(1) // Verify each downloaded file exists and has content for (const filePath of result.downloadedFiles) { - const stats = await fs.stat(filePath); - console.log(` - ${path.basename(filePath)}: ${(stats.size / 1024).toFixed(2)} KB`); - expect(stats.size).toBeGreaterThan(0); + const stats = await fs.stat(filePath) + console.log(` - ${path.basename(filePath)}: ${(stats.size / 1024).toFixed(2)} KB`) + expect(stats.size).toBeGreaterThan(0) } // Clean up - await authService.close(); - }, 600000); // 10 minutes timeout for large batch test -}); + await authService.close() + }, 600000) // 10 minutes timeout for large batch test +}) diff --git a/tests/setup.ts b/tests/setup.ts index 72646bb..eb10fe2 100644 --- a/tests/setup.ts +++ b/tests/setup.ts @@ -1,16 +1,16 @@ -import { beforeAll, afterAll } from 'vitest'; -import dotenv from 'dotenv'; -import path from 'path'; +import { beforeAll, afterAll } from 'vitest' +import dotenv from 'dotenv' +import path from 'path' // Load environment variables from project root -dotenv.config({ path: path.resolve(process.cwd(), '.env') }); +dotenv.config({ path: path.resolve(process.cwd(), '.env') }) beforeAll(async () => { // Global test setup - console.log('Test suite starting...'); -}); + console.log('Test suite starting...') +}) afterAll(async () => { // Global test teardown - console.log('Test suite completed.'); -}); \ No newline at end of file + console.log('Test suite completed.') +}) diff --git a/tests/unit/erp-auth.unit.test.ts b/tests/unit/erp-auth.unit.test.ts index cb99d9c..b55012f 100644 --- a/tests/unit/erp-auth.unit.test.ts +++ b/tests/unit/erp-auth.unit.test.ts @@ -1,6 +1,6 @@ -import { describe, it, expect, beforeEach } from 'vitest'; -import { ErpAuthService } from '../../src/main/services/erp/erp-auth'; -import type { ErpConfig } from '../../src/main/types/erp.types'; +import { describe, it, expect, beforeEach } from 'vitest' +import { ErpAuthService } from '../../src/main/services/erp/erp-auth' +import type { ErpConfig } from '../../src/main/types/erp.types' describe('ERP Authentication Service (Unit)', () => { describe('Session Management', () => { @@ -8,52 +8,52 @@ describe('ERP Authentication Service (Unit)', () => { const config: ErpConfig = { url: 'https://test.example.com', username: 'testuser', - password: 'testpass', - }; + password: 'testpass' + } - const service = new ErpAuthService(config); + const service = new ErpAuthService(config) - expect(service).toBeDefined(); - expect(service.isActive()).toBe(false); - }); + expect(service).toBeDefined() + expect(service.isActive()).toBe(false) + }) it('should throw error when getting session before login', () => { const config: ErpConfig = { url: 'https://test.example.com', username: 'testuser', - password: 'testpass', - }; + password: 'testpass' + } - const service = new ErpAuthService(config); + const service = new ErpAuthService(config) - expect(() => service.getSession()).toThrow('Not logged in. Call login() first.'); - }); + expect(() => service.getSession()).toThrow('Not logged in. Call login() first.') + }) it('should report inactive status before login', () => { const config: ErpConfig = { url: 'https://test.example.com', username: 'testuser', - password: 'testpass', - }; + password: 'testpass' + } - const service = new ErpAuthService(config); + const service = new ErpAuthService(config) - expect(service.isActive()).toBe(false); - }); - }); + expect(service.isActive()).toBe(false) + }) + }) describe('Close Method', () => { it('should handle close when no session exists', async () => { const config: ErpConfig = { url: 'https://test.example.com', username: 'testuser', - password: 'testpass', - }; + password: 'testpass' + } - const service = new ErpAuthService(config); + const service = new ErpAuthService(config) // Should not throw when closing without session - await expect(service.close()).resolves.toBeUndefined(); - }); - }); -}); + await expect(service.close()).resolves.toBeUndefined() + }) + }) +}) diff --git a/tests/unit/excel-parser.test.ts b/tests/unit/excel-parser.test.ts index 652c31b..9b849df 100644 --- a/tests/unit/excel-parser.test.ts +++ b/tests/unit/excel-parser.test.ts @@ -1,59 +1,59 @@ -import { describe, it, expect } from 'vitest'; -import { ExcelParser } from '../../src/main/services/excel/excel-parser'; -import type { DiscreteMaterialPlan } from '../../src/main/types/excel.types'; -import path from 'path'; +import { describe, it, expect } from 'vitest' +import { ExcelParser } from '../../src/main/services/excel/excel-parser' +import type { DiscreteMaterialPlan } from '../../src/main/types/excel.types' +import path from 'path' describe('Excel Parser', () => { it('should parse Excel file and extract material plans', async () => { - const parser = new ExcelParser(); - const filePath = path.resolve(__dirname, '../fixtures/test-export.xlsx'); + const parser = new ExcelParser() + const filePath = path.resolve(__dirname, '../fixtures/test-export.xlsx') - const plans = await parser.parse(filePath); + const plans = await parser.parse(filePath) - expect(Array.isArray(plans)).toBe(true); - expect(plans.length).toBeGreaterThan(0); + expect(Array.isArray(plans)).toBe(true) + expect(plans.length).toBeGreaterThan(0) - const firstPlan = plans[0]; - expect(firstPlan).toHaveProperty('orderNumber'); - expect(firstPlan).toHaveProperty('materialCode'); - }); + const firstPlan = plans[0] + expect(firstPlan).toHaveProperty('orderNumber') + expect(firstPlan).toHaveProperty('materialCode') + }) it('should parse all material fields correctly', async () => { - const parser = new ExcelParser(); - const filePath = path.resolve(__dirname, '../fixtures/test-export.xlsx'); + const parser = new ExcelParser() + const filePath = path.resolve(__dirname, '../fixtures/test-export.xlsx') - const plans = await parser.parse(filePath); + const plans = await parser.parse(filePath) - expect(plans.length).toBe(3); + expect(plans.length).toBe(3) // Check first material - expect(plans[0].orderNumber).toBe('SC202501001'); - expect(plans[0].materialCode).toBe('M001'); - expect(plans[0].materialName).toBe('钢材A'); - expect(plans[0].specification).toBe('规格1'); - expect(plans[0].model).toBe('型号1'); - expect(plans[0].drawingNumber).toBe('图号1'); - expect(plans[0].material).toBe('材质1'); - expect(plans[0].quantity).toBe(50); - expect(plans[0].unit).toBe('kg'); - expect(plans[0].requiredDate).toBe('2025-02-10'); - expect(plans[0].warehouse).toBe('仓库1'); - expect(plans[0].unitUsage).toBe(0.5); - expect(plans[0].cumulativeOutboundQty).toBe(0); + expect(plans[0].orderNumber).toBe('SC202501001') + expect(plans[0].materialCode).toBe('M001') + expect(plans[0].materialName).toBe('钢材A') + expect(plans[0].specification).toBe('规格1') + expect(plans[0].model).toBe('型号1') + expect(plans[0].drawingNumber).toBe('图号1') + expect(plans[0].material).toBe('材质1') + expect(plans[0].quantity).toBe(50) + expect(plans[0].unit).toBe('kg') + expect(plans[0].requiredDate).toBe('2025-02-10') + expect(plans[0].warehouse).toBe('仓库1') + expect(plans[0].unitUsage).toBe(0.5) + expect(plans[0].cumulativeOutboundQty).toBe(0) // Check third material (with some empty fields) - expect(plans[2].materialCode).toBe('M003'); - expect(plans[2].materialName).toBe('配件C'); - expect(plans[2].quantity).toBe(200); - }); + expect(plans[2].materialCode).toBe('M003') + expect(plans[2].materialName).toBe('配件C') + expect(plans[2].quantity).toBe(200) + }) it('should handle empty orders gracefully', async () => { - const parser = new ExcelParser(); - const filePath = path.resolve(__dirname, '../fixtures/test-empty-orders.xlsx'); + const parser = new ExcelParser() + const filePath = path.resolve(__dirname, '../fixtures/test-empty-orders.xlsx') - const plans = await parser.parse(filePath); + const plans = await parser.parse(filePath) - expect(plans).toBeDefined(); - expect(plans.length).toBe(0); - }); -}); + expect(plans).toBeDefined() + expect(plans.length).toBe(0) + }) +}) diff --git a/tests/unit/extractor.test.ts b/tests/unit/extractor.test.ts index 5f864a2..55b6ef8 100644 --- a/tests/unit/extractor.test.ts +++ b/tests/unit/extractor.test.ts @@ -1,87 +1,87 @@ -import { describe, it, expect, beforeEach } from 'vitest'; -import { ExtractorService } from '../../src/main/services/erp/extractor'; -import { ErpAuthService } from '../../src/main/services/erp/erp-auth'; -import type { ErpConfig } from '../../src/main/types/erp.types'; +import { describe, it, expect, beforeEach } from 'vitest' +import { ExtractorService } from '../../src/main/services/erp/extractor' +import { ErpAuthService } from '../../src/main/services/erp/erp-auth' +import type { ErpConfig } from '../../src/main/types/erp.types' describe('Extractor Service (Unit)', () => { - let authService: ErpAuthService; - let extractor: ExtractorService; + let authService: ErpAuthService + let extractor: ExtractorService const mockConfig: ErpConfig = { url: 'https://test.erp.com', username: 'test_user', - password: 'test_pass', - }; + password: 'test_pass' + } beforeEach(() => { - authService = new ErpAuthService(mockConfig); - extractor = new ExtractorService(authService, './test-downloads'); - }); + authService = new ErpAuthService(mockConfig) + extractor = new ExtractorService(authService, './test-downloads') + }) describe('Batch Creation', () => { it('should create single batch for small order list', () => { // This tests the createBatches method indirectly through extract // We'll need to add a public method or test through the class - const orders = ['ORDER1', 'ORDER2', 'ORDER3']; - const batchSize = 10; + const orders = ['ORDER1', 'ORDER2', 'ORDER3'] + const batchSize = 10 // Expected: 1 batch with 3 orders - const expectedBatches = 1; - expect(Math.ceil(orders.length / batchSize)).toBe(expectedBatches); - }); + const expectedBatches = 1 + expect(Math.ceil(orders.length / batchSize)).toBe(expectedBatches) + }) it('should create multiple batches for large order list', () => { - const orders = Array.from({ length: 250 }, (_, i) => `ORDER${i}`); - const batchSize = 100; + const orders = Array.from({ length: 250 }, (_, i) => `ORDER${i}`) + const batchSize = 100 // Expected: 3 batches (100, 100, 50) - const expectedBatches = 3; - expect(Math.ceil(orders.length / batchSize)).toBe(expectedBatches); - }); + const expectedBatches = 3 + expect(Math.ceil(orders.length / batchSize)).toBe(expectedBatches) + }) it('should handle exact batch size', () => { - const orders = Array.from({ length: 200 }, (_, i) => `ORDER${i}`); - const batchSize = 100; + const orders = Array.from({ length: 200 }, (_, i) => `ORDER${i}`) + const batchSize = 100 // Expected: 2 batches exactly - const expectedBatches = 2; - expect(Math.ceil(orders.length / batchSize)).toBe(expectedBatches); - }); + const expectedBatches = 2 + expect(Math.ceil(orders.length / batchSize)).toBe(expectedBatches) + }) it('should handle empty order list', () => { - const orders: string[] = []; - const batchSize = 100; + const orders: string[] = [] + const batchSize = 100 // Expected: 0 batches - const expectedBatches = 0; - expect(Math.ceil(orders.length / batchSize)).toBe(expectedBatches); - }); - }); + const expectedBatches = 0 + expect(Math.ceil(orders.length / batchSize)).toBe(expectedBatches) + }) + }) describe('Service Initialization', () => { it('should create service instance', () => { - expect(extractor).toBeDefined(); - expect(extractor).toBeInstanceOf(ExtractorService); - }); + expect(extractor).toBeDefined() + expect(extractor).toBeInstanceOf(ExtractorService) + }) it('should use default download directory', () => { - const defaultExtractor = new ExtractorService(authService); - expect(defaultExtractor).toBeDefined(); - }); + const defaultExtractor = new ExtractorService(authService) + expect(defaultExtractor).toBeDefined() + }) it('should use custom download directory', () => { - const customExtractor = new ExtractorService(authService, './custom-downloads'); - expect(customExtractor).toBeDefined(); - }); - }); + const customExtractor = new ExtractorService(authService, './custom-downloads') + expect(customExtractor).toBeDefined() + }) + }) describe('Error Handling', () => { it('should handle extraction with no auth session', async () => { const result = await extractor.extract({ - orderNumbers: ['ORDER1'], - }); + orderNumbers: ['ORDER1'] + }) - expect(result.errors.length).toBeGreaterThan(0); - expect(result.downloadedFiles).toHaveLength(0); - }); - }); -}); + expect(result.errors.length).toBeGreaterThan(0) + expect(result.downloadedFiles).toHaveLength(0) + }) + }) +}) diff --git a/tests/unit/locators.test.ts b/tests/unit/locators.test.ts index 4e840a4..0a020ac 100644 --- a/tests/unit/locators.test.ts +++ b/tests/unit/locators.test.ts @@ -1,27 +1,27 @@ -import { describe, it, expect } from 'vitest'; -import { ERP_LOCATORS } from '../../src/main/services/erp/locators'; +import { describe, it, expect } from 'vitest' +import { ERP_LOCATORS } from '../../src/main/services/erp/locators' describe('ERP Locators', () => { it('should have login page locators defined', () => { - expect(ERP_LOCATORS.login.usernameInput).toBeDefined(); - expect(ERP_LOCATORS.login.passwordInput).toBeDefined(); - expect(ERP_LOCATORS.login.submitButton).toBeDefined(); - }); + expect(ERP_LOCATORS.login.usernameInput).toBeDefined() + expect(ERP_LOCATORS.login.passwordInput).toBeDefined() + expect(ERP_LOCATORS.login.submitButton).toBeDefined() + }) it('should have main frame locator', () => { - expect(ERP_LOCATORS.main.mainIframe).toBeDefined(); - }); + expect(ERP_LOCATORS.main.mainIframe).toBeDefined() + }) it('should have extractor page locators', () => { - expect(ERP_LOCATORS.extractor.orderNumberInputRole).toBeDefined(); - expect(ERP_LOCATORS.extractor.queryButton).toBeDefined(); - expect(ERP_LOCATORS.extractor.exportButton).toBeDefined(); - expect(ERP_LOCATORS.extractor.confirmButton).toBeDefined(); - }); + expect(ERP_LOCATORS.extractor.orderNumberInputRole).toBeDefined() + expect(ERP_LOCATORS.extractor.queryButton).toBeDefined() + expect(ERP_LOCATORS.extractor.exportButton).toBeDefined() + expect(ERP_LOCATORS.extractor.confirmButton).toBeDefined() + }) it('should have cleaner page locators', () => { - expect(ERP_LOCATORS.cleaner.orderNumberInput).toBeDefined(); - expect(ERP_LOCATORS.cleaner.materialGrid).toBeDefined(); - expect(ERP_LOCATORS.cleaner.saveButton).toBeDefined(); - }); -}); \ No newline at end of file + expect(ERP_LOCATORS.cleaner.orderNumberInput).toBeDefined() + expect(ERP_LOCATORS.cleaner.materialGrid).toBeDefined() + expect(ERP_LOCATORS.cleaner.saveButton).toBeDefined() + }) +}) diff --git a/tsconfig.node.tsbuildinfo b/tsconfig.node.tsbuildinfo index 90a1cc6..1c8534b 100644 --- a/tsconfig.node.tsbuildinfo +++ b/tsconfig.node.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.promise.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.esnext.error.d.ts","./node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.esnext.full.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/buffer/index.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/vite/types/hmrpayload.d.ts","./node_modules/vite/dist/node/chunks/modulerunnertransport.d.ts","./node_modules/vite/types/customevent.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/rollup/dist/rollup.d.ts","./node_modules/rollup/dist/parseast.d.ts","./node_modules/vite/types/hot.d.ts","./node_modules/vite/dist/node/module-runner.d.ts","./node_modules/vite/node_modules/esbuild/lib/main.d.ts","./node_modules/vite/types/internal/terseroptions.d.ts","./node_modules/source-map-js/source-map.d.ts","./node_modules/postcss/lib/previous-map.d.ts","./node_modules/postcss/lib/input.d.ts","./node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/postcss/lib/declaration.d.ts","./node_modules/postcss/lib/root.d.ts","./node_modules/postcss/lib/warning.d.ts","./node_modules/postcss/lib/lazy-result.d.ts","./node_modules/postcss/lib/no-work-result.d.ts","./node_modules/postcss/lib/processor.d.ts","./node_modules/postcss/lib/result.d.ts","./node_modules/postcss/lib/document.d.ts","./node_modules/postcss/lib/rule.d.ts","./node_modules/postcss/lib/node.d.ts","./node_modules/postcss/lib/comment.d.ts","./node_modules/postcss/lib/container.d.ts","./node_modules/postcss/lib/at-rule.d.ts","./node_modules/postcss/lib/list.d.ts","./node_modules/postcss/lib/postcss.d.ts","./node_modules/postcss/lib/postcss.d.mts","./node_modules/vite/types/internal/csspreprocessoroptions.d.ts","./node_modules/vite/types/internal/lightningcssoptions.d.ts","./node_modules/vite/types/importglob.d.ts","./node_modules/vite/types/metadata.d.ts","./node_modules/vite/dist/node/index.d.ts","./node_modules/electron-vite/dist/index.d.ts","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@types/babel__generator/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@types/babel__template/index.d.ts","./node_modules/@types/babel__traverse/index.d.ts","./node_modules/@types/babel__core/index.d.ts","./node_modules/@vitejs/plugin-react/dist/index.d.ts","./electron.vite.config.ts","./node_modules/electron/electron.d.ts","./node_modules/@electron-toolkit/utils/dist/index.d.ts","./src/main/index.ts","./src/main/types/cleaner.types.ts","./node_modules/playwright-core/types/protocol.d.ts","./node_modules/playwright-core/types/structs.d.ts","./node_modules/playwright-core/types/types.d.ts","./node_modules/playwright-core/index.d.ts","./node_modules/playwright/index.d.ts","./src/main/types/erp.types.ts","./src/main/types/extractor.types.ts","./node_modules/@electron-toolkit/preload/dist/index.d.ts","./src/preload/index.ts","./node_modules/electron-vite/node.d.ts"],"fileIdsList":[[92,141,158,159,163,227,234],[92,141,158,159,228],[92,141,158,159],[92,141,158,159,236],[92,141,158,159,228,229,230,231,232],[92,141,158,159,228,230],[92,138,139,141,158,159],[92,140,141,158,159],[141,158,159],[92,141,146,158,159,176],[92,141,142,147,152,158,159,161,173,184],[92,141,142,143,152,158,159,161],[87,88,89,92,141,158,159],[92,141,144,158,159,185],[92,141,145,146,153,158,159,162],[92,141,146,158,159,173,181],[92,141,147,149,152,158,159,161],[92,140,141,148,158,159],[92,141,149,150,158,159],[92,141,151,152,158,159],[92,140,141,152,158,159],[92,141,152,153,154,158,159,173,184],[92,141,152,153,154,158,159,168,173,176],[92,134,141,149,152,155,158,159,161,173,184],[92,141,152,153,155,156,158,159,161,173,181,184],[92,141,155,157,158,159,173,181,184],[90,91,92,93,94,95,96,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190],[92,141,152,158,159],[92,141,158,159,160,184],[92,141,149,152,158,159,161,173],[92,141,158,159,162],[92,141,158,159,163],[92,140,141,158,159,164],[92,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190],[92,141,158,159,166],[92,141,158,159,167],[92,141,152,158,159,168,169],[92,141,158,159,168,170,185,187],[92,141,153,158,159],[92,141,152,158,159,173,174,176],[92,141,158,159,175,176],[92,141,158,159,173,174],[92,141,158,159,176],[92,141,158,159,177],[92,138,141,158,159,173,178,184],[92,141,152,158,159,179,180],[92,141,158,159,179,180],[92,141,146,158,159,161,173,181],[92,141,158,159,182],[92,141,158,159,161,183],[92,141,155,158,159,167,184],[92,141,146,158,159,185],[92,141,158,159,173,186],[92,141,158,159,160,187],[92,141,158,159,188],[92,134,141,158,159],[92,134,141,152,154,158,159,164,173,176,184,186,187,189],[92,141,158,159,173,190],[92,141,158,159,226,233],[92,141,158,159,226],[92,141,158,159,189],[92,141,152,153,158,159,191],[92,141,158,159,242],[92,141,142,153,158,159,173,236,240,241],[92,141,158,159,243],[92,141,158,159,217],[92,141,158,159,215,217],[92,141,158,159,206,214,215,216,218,220],[92,141,158,159,204],[92,141,158,159,207,212,217,220],[92,141,158,159,203,220],[92,141,158,159,207,208,211,212,213,220],[92,141,158,159,207,208,209,211,212,220],[92,141,158,159,204,205,206,207,208,212,213,214,216,217,218,220],[92,141,158,159,220],[92,141,158,159,202,204,205,206,207,208,209,211,212,213,214,215,216,217,218,219],[92,141,158,159,202,220],[92,141,158,159,207,209,210,212,213,220],[92,141,158,159,211,220],[92,141,158,159,212,213,217,220],[92,141,158,159,205,215],[92,141,158,159,196,225,226],[92,141,158,159,195,196],[92,106,110,141,158,159,184],[92,106,141,158,159,173,184],[92,101,141,158,159],[92,103,106,141,158,159,181,184],[92,141,158,159,161,181],[92,141,158,159,191],[92,101,141,158,159,191],[92,103,106,141,158,159,161,184],[92,98,99,102,105,141,152,158,159,173,184],[92,106,113,141,158,159],[92,98,104,141,158,159],[92,106,127,128,141,158,159],[92,102,106,141,158,159,176,184,191],[92,127,141,158,159,191],[92,100,101,141,158,159,191],[92,106,141,158,159],[92,100,101,102,103,104,105,106,107,108,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,130,131,132,133,141,158,159],[92,106,121,141,158,159],[92,106,113,114,141,158,159],[92,104,106,114,115,141,158,159],[92,105,141,158,159],[92,98,101,106,141,158,159],[92,106,110,114,115,141,158,159],[92,110,141,158,159],[92,104,106,109,141,158,159,184],[92,98,103,106,113,141,158,159],[92,141,158,159,173],[92,101,106,127,141,158,159,189,191],[92,141,158,159,192],[92,141,152,153,155,156,157,158,159,161,173,181,184,190,191,192,193,194,196,197,199,200,201,221,222,223,224,225,226],[92,141,158,159,192,193,194,198],[92,141,158,159,194],[92,141,158,159,196,226],[92,141,158,159,163,236,237,249],[92,141,158,159,244],[92,141,158,159,236,247]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"bde31fd423cd93b0eff97197a3f66df7c93e8c0c335cbeb113b7ff1ac35c23f4","impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"f949f7f6c7802a338039cfc2156d1fe285cdd1e092c64437ebe15ae8edc854e0","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"6b039f55681caaf111d5eb84d292b9bee9e0131d0db1ad0871eef0964f533c73","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2b55d426ff2b9087485e52ac4bc7cfafe1dc420fc76dad926cd46526567c501a","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"10073cdcf56982064c5337787cc59b79586131e1b28c106ede5bff362f912b70","impliedFormat":99},{"version":"72950913f4900b680f44d8cab6dd1ea0311698fc1eefb014eb9cdfc37ac4a734","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"ee70b8037ecdf0de6c04f35277f253663a536d7e38f1539d270e4e916d225a3f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"ff0a83c9a0489a627e264ffcb63f2264b935b20a502afa3a018848139e3d8575","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"8885cf05f3e2abf117590bbb951dcf6359e3e5ac462af1c901cfd24c6a6472e2","impliedFormat":1},{"version":"333caa2bfff7f06017f114de738050dd99a765c7eb16571c6d25a38c0d5365dc","impliedFormat":1},{"version":"e61df3640a38d535fd4bc9f4a53aef17c296b58dc4b6394fd576b808dd2fe5e6","impliedFormat":1},{"version":"459920181700cec8cbdf2a5faca127f3f17fd8dd9d9e577ed3f5f3af5d12a2e4","impliedFormat":1},{"version":"4719c209b9c00b579553859407a7e5dcfaa1c472994bd62aa5dd3cc0757eb077","impliedFormat":1},{"version":"7ec359bbc29b69d4063fe7dad0baaf35f1856f914db16b3f4f6e3e1bca4099fa","impliedFormat":1},{"version":"70790a7f0040993ca66ab8a07a059a0f8256e7bb57d968ae945f696cbff4ac7a","impliedFormat":1},{"version":"d1b9a81e99a0050ca7f2d98d7eedc6cda768f0eb9fa90b602e7107433e64c04c","impliedFormat":1},{"version":"a022503e75d6953d0e82c2c564508a5c7f8556fad5d7f971372d2d40479e4034","impliedFormat":1},{"version":"b215c4f0096f108020f666ffcc1f072c81e9f2f95464e894a5d5f34c5ea2a8b1","impliedFormat":1},{"version":"644491cde678bd462bb922c1d0cfab8f17d626b195ccb7f008612dc31f445d2d","impliedFormat":1},{"version":"dfe54dab1fa4961a6bcfba68c4ca955f8b5bbeb5f2ab3c915aa7adaa2eabc03a","impliedFormat":1},{"version":"1251d53755b03cde02466064260bb88fd83c30006a46395b7d9167340bc59b73","impliedFormat":1},{"version":"47865c5e695a382a916b1eedda1b6523145426e48a2eae4647e96b3b5e52024f","impliedFormat":1},{"version":"4cdf27e29feae6c7826cdd5c91751cc35559125e8304f9e7aed8faef97dcf572","impliedFormat":1},{"version":"331b8f71bfae1df25d564f5ea9ee65a0d847c4a94baa45925b6f38c55c7039bf","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","impliedFormat":99},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"59f8dc89b9e724a6a667f52cdf4b90b6816ae6c9842ce176d38fcc973669009e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e4af494f7a14b226bbe732e9c130d8811f8c7025911d7c58dd97121a85519715","impliedFormat":1},{"version":"47416e41b1af81e53e8c3cc5bf909d47ff632a7b6eddfe7ff43d187b4dcca047","impliedFormat":99},{"version":"748aaddcaf36dd6d2cd08d9b4a8fdf621da41cb61dc4536d17104a23a7c12f6d","impliedFormat":99},{"version":"556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"ef94438f848be3a3b0033013bf64753f771f983c1e205e4a06675eb253ca7cd2","impliedFormat":99},"612314276fd0c8311651099647b2e918b329abd5263d8f5cec7f7617dae279b4",{"version":"28218a9e4d1635ebad55d949a38398306f68c957fbb5ed65be305e81b970bdc7","affectsGlobalScope":true,"impliedFormat":1},{"version":"194779039dc8a41af2eefa2ff740594be9cf44333870346c20602031ad73f168","impliedFormat":1},"a8540cb91358a0f02adf2433355535fde725f0ad0d1ca9d367aced4f6a83383a","aa9b1040b2016654b46b1d6fc138e615b9bec64dc06782bb1b5449df1afdaca5",{"version":"99a323dc5a6e506c78b69913b32beba93453bcd87aae8b507520234f387a4c30","impliedFormat":1},{"version":"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e","impliedFormat":1},{"version":"af3c4dcb64b945e01285bc0494e1cfa384fac43b08713a56fc3043c8f861553a","impliedFormat":1},{"version":"7a8ec10b0834eb7183e4bfcd929838ac77583828e343211bb73676d1e47f6f01","impliedFormat":1},{"version":"b07f64ff6ec710998a62b07377fbda0ab4c313ba1f0055bfe9faa22cffedd47c","impliedFormat":1},"049c0d6dedf6ebc960a49edd180b1ae99c98f56f04bb68b791dfab5ee20beaea","c336fe49aef44ddb45877b36a340a7328dd4bd43f1200b8efcfa2f46ebb751e8",{"version":"2329508bb462ba8f17cc60c4ed5b346618a42eefcaaddcbb0fcbf7f09cfd0a87","impliedFormat":1},"a04d7bd900c244b49616f90e5b1c3605ab42f56131d01e20925e840e2015e8aa",{"version":"e88d11b7857417c0603995c77eb188fade5ca64dd5550cd7bd08c9f61c29df5b","affectsGlobalScope":true,"impliedFormat":99}],"root":[235,238,239,245,246,248],"options":{"composite":true,"esModuleInterop":true,"jsx":1,"module":99,"noImplicitAny":false,"noImplicitReturns":true,"noUnusedLocals":true,"noUnusedParameters":true,"skipLibCheck":true,"sourceMap":false,"strict":true,"target":99},"referencedMap":[[235,1],[230,2],[228,3],[247,4],[237,4],[233,5],[229,2],[231,6],[232,2],[195,3],[138,7],[139,7],[140,8],[92,9],[141,10],[142,11],[143,12],[87,3],[90,13],[88,3],[89,3],[144,14],[145,15],[146,16],[147,17],[148,18],[149,19],[150,19],[151,20],[152,21],[153,22],[154,23],[93,3],[91,3],[155,24],[156,25],[157,26],[191,27],[158,28],[159,3],[160,29],[161,30],[162,31],[163,32],[164,33],[165,34],[166,35],[167,36],[168,37],[169,37],[170,38],[171,3],[172,39],[173,40],[175,41],[174,42],[176,43],[177,44],[178,45],[179,46],[180,47],[181,48],[182,49],[183,50],[184,51],[185,52],[186,53],[187,54],[188,55],[94,3],[95,3],[96,3],[135,56],[136,3],[137,3],[189,57],[190,58],[234,59],[97,3],[227,60],[249,61],[236,62],[243,63],[240,3],[241,63],[242,64],[244,65],[218,66],[216,67],[217,68],[205,69],[206,67],[213,70],[204,71],[209,72],[219,3],[210,73],[215,74],[221,75],[220,76],[203,77],[211,78],[212,79],[207,80],[214,66],[208,81],[197,82],[196,83],[202,3],[84,3],[85,3],[15,3],[13,3],[14,3],[19,3],[18,3],[2,3],[20,3],[21,3],[22,3],[23,3],[24,3],[25,3],[26,3],[27,3],[3,3],[28,3],[29,3],[4,3],[30,3],[34,3],[31,3],[32,3],[33,3],[35,3],[36,3],[37,3],[5,3],[38,3],[39,3],[40,3],[41,3],[6,3],[45,3],[42,3],[43,3],[44,3],[46,3],[7,3],[47,3],[52,3],[53,3],[48,3],[49,3],[50,3],[51,3],[8,3],[57,3],[54,3],[55,3],[56,3],[58,3],[9,3],[59,3],[60,3],[61,3],[63,3],[62,3],[64,3],[65,3],[10,3],[66,3],[67,3],[68,3],[11,3],[69,3],[70,3],[71,3],[72,3],[73,3],[1,3],[74,3],[75,3],[12,3],[79,3],[77,3],[82,3],[81,3],[86,3],[76,3],[80,3],[78,3],[83,3],[17,3],[16,3],[113,84],[123,85],[112,84],[133,86],[104,87],[103,88],[132,89],[126,90],[131,91],[106,92],[120,93],[105,94],[129,95],[101,96],[100,89],[130,97],[102,98],[107,99],[108,3],[111,99],[98,3],[134,100],[124,101],[115,102],[116,103],[118,104],[114,105],[117,106],[127,89],[109,107],[110,108],[119,109],[99,110],[122,101],[121,99],[125,3],[128,111],[193,112],[226,113],[199,114],[200,3],[194,112],[192,3],[198,115],[224,3],[222,3],[223,3],[201,3],[225,116],[238,117],[239,3],[245,118],[246,3],[248,119]],"affectedFilesPendingEmit":[[235,17],[238,17],[239,17],[245,17],[246,17],[248,17]],"emitSignatures":[235,238,239,245,246,248],"version":"5.9.3"} \ No newline at end of file +{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.promise.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.esnext.error.d.ts","./node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.esnext.full.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/buffer/index.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/vite/types/hmrpayload.d.ts","./node_modules/vite/dist/node/chunks/modulerunnertransport.d.ts","./node_modules/vite/types/customevent.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/rollup/dist/rollup.d.ts","./node_modules/rollup/dist/parseast.d.ts","./node_modules/vite/types/hot.d.ts","./node_modules/vite/dist/node/module-runner.d.ts","./node_modules/vite/node_modules/esbuild/lib/main.d.ts","./node_modules/vite/types/internal/terseroptions.d.ts","./node_modules/source-map-js/source-map.d.ts","./node_modules/postcss/lib/previous-map.d.ts","./node_modules/postcss/lib/input.d.ts","./node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/postcss/lib/declaration.d.ts","./node_modules/postcss/lib/root.d.ts","./node_modules/postcss/lib/warning.d.ts","./node_modules/postcss/lib/lazy-result.d.ts","./node_modules/postcss/lib/no-work-result.d.ts","./node_modules/postcss/lib/processor.d.ts","./node_modules/postcss/lib/result.d.ts","./node_modules/postcss/lib/document.d.ts","./node_modules/postcss/lib/rule.d.ts","./node_modules/postcss/lib/node.d.ts","./node_modules/postcss/lib/comment.d.ts","./node_modules/postcss/lib/container.d.ts","./node_modules/postcss/lib/at-rule.d.ts","./node_modules/postcss/lib/list.d.ts","./node_modules/postcss/lib/postcss.d.ts","./node_modules/postcss/lib/postcss.d.mts","./node_modules/vite/types/internal/csspreprocessoroptions.d.ts","./node_modules/vite/types/internal/lightningcssoptions.d.ts","./node_modules/vite/types/importglob.d.ts","./node_modules/vite/types/metadata.d.ts","./node_modules/vite/dist/node/index.d.ts","./node_modules/electron-vite/dist/index.d.ts","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@types/babel__generator/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@types/babel__template/index.d.ts","./node_modules/@types/babel__traverse/index.d.ts","./node_modules/@types/babel__core/index.d.ts","./node_modules/@vitejs/plugin-react/dist/index.d.ts","./electron.vite.config.ts","./node_modules/electron/electron.d.ts","./node_modules/@electron-toolkit/utils/dist/index.d.ts","./src/main/index.ts","./src/main/services/erp/locators.ts","./node_modules/playwright-core/types/protocol.d.ts","./node_modules/playwright-core/types/structs.d.ts","./node_modules/playwright-core/types/types.d.ts","./node_modules/playwright-core/index.d.ts","./node_modules/playwright/index.d.ts","./src/main/types/erp.types.ts","./src/main/services/erp/erp-auth.ts","./src/main/types/cleaner.types.ts","./src/main/services/erp/cleaner.ts","./src/main/types/extractor.types.ts","./src/main/services/erp/extractor.ts","./node_modules/exceljs/index.d.ts","./src/main/types/excel.types.ts","./src/main/services/excel/excel-parser.ts","./node_modules/@electron-toolkit/preload/dist/index.d.ts","./src/preload/index.ts","./node_modules/electron-vite/node.d.ts"],"fileIdsList":[[92,141,158,159,163,227,234],[92,141,158,159,228],[92,141,158,159],[92,141,158,159,236],[92,141,158,159,228,229,230,231,232],[92,141,158,159,228,230],[92,138,139,141,158,159],[92,140,141,158,159],[141,158,159],[92,141,146,158,159,176],[92,141,142,147,152,158,159,161,173,184],[92,141,142,143,152,158,159,161],[87,88,89,92,141,158,159],[92,141,144,158,159,185],[92,141,145,146,153,158,159,162],[92,141,146,158,159,173,181],[92,141,147,149,152,158,159,161],[92,140,141,148,158,159],[92,141,149,150,158,159],[92,141,151,152,158,159],[92,140,141,152,158,159],[92,141,152,153,154,158,159,173,184],[92,141,152,153,154,158,159,168,173,176],[92,134,141,149,152,155,158,159,161,173,184],[92,141,152,153,155,156,158,159,161,173,181,184],[92,141,155,157,158,159,173,181,184],[90,91,92,93,94,95,96,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190],[92,141,152,158,159],[92,141,158,159,160,184],[92,141,149,152,158,159,161,173],[92,141,158,159,162],[92,141,158,159,163],[92,140,141,158,159,164],[92,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190],[92,141,158,159,166],[92,141,158,159,167],[92,141,152,158,159,168,169],[92,141,158,159,168,170,185,187],[92,141,153,158,159],[92,141,152,158,159,173,174,176],[92,141,158,159,175,176],[92,141,158,159,173,174],[92,141,158,159,176],[92,141,158,159,177],[92,138,141,158,159,173,178,184],[92,141,152,158,159,179,180],[92,141,158,159,179,180],[92,141,146,158,159,161,173,181],[92,141,158,159,182],[92,141,158,159,161,183],[92,141,155,158,159,167,184],[92,141,146,158,159,185],[92,141,158,159,173,186],[92,141,158,159,160,187],[92,141,158,159,188],[92,134,141,158,159],[92,134,141,152,154,158,159,164,173,176,184,186,187,189],[92,141,158,159,173,190],[92,141,158,159,226,233],[92,141,158,159,226],[92,141,158,159,189],[92,141,152,153,158,159,191],[92,141,152,158,159,173],[92,141,158,159,242],[92,141,142,153,158,159,173,236,240,241],[92,141,158,159,243],[92,141,158,159,217],[92,141,158,159,215,217],[92,141,158,159,206,214,215,216,218,220],[92,141,158,159,204],[92,141,158,159,207,212,217,220],[92,141,158,159,203,220],[92,141,158,159,207,208,211,212,213,220],[92,141,158,159,207,208,209,211,212,220],[92,141,158,159,204,205,206,207,208,212,213,214,216,217,218,220],[92,141,158,159,220],[92,141,158,159,202,204,205,206,207,208,209,211,212,213,214,215,216,217,218,219],[92,141,158,159,202,220],[92,141,158,159,207,209,210,212,213,220],[92,141,158,159,211,220],[92,141,158,159,212,213,217,220],[92,141,158,159,205,215],[92,141,158,159,196,225,226],[92,141,158,159,195,196],[92,106,110,141,158,159,184],[92,106,141,158,159,173,184],[92,101,141,158,159],[92,103,106,141,158,159,181,184],[92,141,158,159,161,181],[92,141,158,159,191],[92,101,141,158,159,191],[92,103,106,141,158,159,161,184],[92,98,99,102,105,141,152,158,159,173,184],[92,106,113,141,158,159],[92,98,104,141,158,159],[92,106,127,128,141,158,159],[92,102,106,141,158,159,176,184,191],[92,127,141,158,159,191],[92,100,101,141,158,159,191],[92,106,141,158,159],[92,100,101,102,103,104,105,106,107,108,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,130,131,132,133,141,158,159],[92,106,121,141,158,159],[92,106,113,114,141,158,159],[92,104,106,114,115,141,158,159],[92,105,141,158,159],[92,98,101,106,141,158,159],[92,106,110,114,115,141,158,159],[92,110,141,158,159],[92,104,106,109,141,158,159,184],[92,98,103,106,113,141,158,159],[92,141,158,159,173],[92,101,106,127,141,158,159,189,191],[92,141,158,159,192],[92,141,152,153,155,156,157,158,159,161,173,181,184,190,191,192,193,194,196,197,199,200,201,221,222,223,224,225,226],[92,141,158,159,192,193,194,198],[92,141,158,159,194],[92,141,158,159,196,226],[92,141,158,159,163,236,237,256],[92,141,158,159,239,244,245,246,247],[92,141,158,159,239,244,245],[92,141,154,158,159,163,239,245,246,249],[92,141,158,159,163,251,252],[92,141,158,159,244],[92,141,158,159,236,254]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"bde31fd423cd93b0eff97197a3f66df7c93e8c0c335cbeb113b7ff1ac35c23f4","impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"f949f7f6c7802a338039cfc2156d1fe285cdd1e092c64437ebe15ae8edc854e0","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"6b039f55681caaf111d5eb84d292b9bee9e0131d0db1ad0871eef0964f533c73","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2b55d426ff2b9087485e52ac4bc7cfafe1dc420fc76dad926cd46526567c501a","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"10073cdcf56982064c5337787cc59b79586131e1b28c106ede5bff362f912b70","impliedFormat":99},{"version":"72950913f4900b680f44d8cab6dd1ea0311698fc1eefb014eb9cdfc37ac4a734","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"ee70b8037ecdf0de6c04f35277f253663a536d7e38f1539d270e4e916d225a3f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"ff0a83c9a0489a627e264ffcb63f2264b935b20a502afa3a018848139e3d8575","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"8885cf05f3e2abf117590bbb951dcf6359e3e5ac462af1c901cfd24c6a6472e2","impliedFormat":1},{"version":"333caa2bfff7f06017f114de738050dd99a765c7eb16571c6d25a38c0d5365dc","impliedFormat":1},{"version":"e61df3640a38d535fd4bc9f4a53aef17c296b58dc4b6394fd576b808dd2fe5e6","impliedFormat":1},{"version":"459920181700cec8cbdf2a5faca127f3f17fd8dd9d9e577ed3f5f3af5d12a2e4","impliedFormat":1},{"version":"4719c209b9c00b579553859407a7e5dcfaa1c472994bd62aa5dd3cc0757eb077","impliedFormat":1},{"version":"7ec359bbc29b69d4063fe7dad0baaf35f1856f914db16b3f4f6e3e1bca4099fa","impliedFormat":1},{"version":"70790a7f0040993ca66ab8a07a059a0f8256e7bb57d968ae945f696cbff4ac7a","impliedFormat":1},{"version":"d1b9a81e99a0050ca7f2d98d7eedc6cda768f0eb9fa90b602e7107433e64c04c","impliedFormat":1},{"version":"a022503e75d6953d0e82c2c564508a5c7f8556fad5d7f971372d2d40479e4034","impliedFormat":1},{"version":"b215c4f0096f108020f666ffcc1f072c81e9f2f95464e894a5d5f34c5ea2a8b1","impliedFormat":1},{"version":"644491cde678bd462bb922c1d0cfab8f17d626b195ccb7f008612dc31f445d2d","impliedFormat":1},{"version":"dfe54dab1fa4961a6bcfba68c4ca955f8b5bbeb5f2ab3c915aa7adaa2eabc03a","impliedFormat":1},{"version":"1251d53755b03cde02466064260bb88fd83c30006a46395b7d9167340bc59b73","impliedFormat":1},{"version":"47865c5e695a382a916b1eedda1b6523145426e48a2eae4647e96b3b5e52024f","impliedFormat":1},{"version":"4cdf27e29feae6c7826cdd5c91751cc35559125e8304f9e7aed8faef97dcf572","impliedFormat":1},{"version":"331b8f71bfae1df25d564f5ea9ee65a0d847c4a94baa45925b6f38c55c7039bf","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","impliedFormat":99},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"59f8dc89b9e724a6a667f52cdf4b90b6816ae6c9842ce176d38fcc973669009e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e4af494f7a14b226bbe732e9c130d8811f8c7025911d7c58dd97121a85519715","impliedFormat":1},{"version":"47416e41b1af81e53e8c3cc5bf909d47ff632a7b6eddfe7ff43d187b4dcca047","impliedFormat":99},{"version":"748aaddcaf36dd6d2cd08d9b4a8fdf621da41cb61dc4536d17104a23a7c12f6d","impliedFormat":99},{"version":"556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"ef94438f848be3a3b0033013bf64753f771f983c1e205e4a06675eb253ca7cd2","impliedFormat":99},{"version":"f3186bde07c8faa8647c692525e5c51555e23bc702e42ab163f4fcae0b592d88","signature":"2f40f5b066ae0e8b25ce0405683930c93e1e124727d34b596d337e65248258c3"},{"version":"28218a9e4d1635ebad55d949a38398306f68c957fbb5ed65be305e81b970bdc7","affectsGlobalScope":true,"impliedFormat":1},{"version":"194779039dc8a41af2eefa2ff740594be9cf44333870346c20602031ad73f168","impliedFormat":1},{"version":"a19bbacb56bf322047f5fbf8d0bbcd717ad78a4a4f4cbb68e8ace7f8642acddb","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"a65409e9fd227752fcc81fbf11850ce2a96bef99a2cf0dd58e481e24ddca5ace","signature":"ee7fedf17cdf35b6a9cbf0d010e4b1834cdd1e82c5ba108a40afb5c990ae1382"},{"version":"99a323dc5a6e506c78b69913b32beba93453bcd87aae8b507520234f387a4c30","impliedFormat":1},{"version":"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e","impliedFormat":1},{"version":"af3c4dcb64b945e01285bc0494e1cfa384fac43b08713a56fc3043c8f861553a","impliedFormat":1},{"version":"7a8ec10b0834eb7183e4bfcd929838ac77583828e343211bb73676d1e47f6f01","impliedFormat":1},{"version":"b07f64ff6ec710998a62b07377fbda0ab4c313ba1f0055bfe9faa22cffedd47c","impliedFormat":1},{"version":"13284a90dcc068f685e8a62141e9aa04793cc7d3e0e59a4fda62bf3ef10a013b","signature":"c0b9b6a53f3e153e635f7b81e52e11c85f5ed3cb998afe0db627e1f523f4f184"},{"version":"1be3c5a43a0adc6a394942e2a96e3d833cee7cecb2b4d82d88f95cf414f85b96","signature":"476217ef6bf55db065e9b137ed280f1cc9e1d91acbf8a17b74c8477d8bfe8221"},{"version":"754dd2dc1ffa57af525c926c6444ad8098e93970c284687e72492c0358f25f39","signature":"e1a587b3c9f962622d618035767e334ba78e9af853e6af550ccdcc888d0ab938"},{"version":"b838e340a09966ac0b6c2fbdcc3bb1eb4eeff6ff499d1aff72874294fba4f3f1","signature":"f3ea013541011f673451644ba427d50252386608fe68dfb5090ada70c97903e4"},{"version":"10c2be8d595f0fbce208f466560d8d4267ea27e59a18b10cd731a02ab04edbbd","signature":"d4948533e55b22d1431c691a60e7be7b109aad9f149754aec0b904eeaf7e641b"},{"version":"0a6bf44a646fc0c822d7886e7fa0b88cb0f8ebd8c1cb89ee59e3c9b379bab0f9","signature":"05df453a7b6d0d63f6615da4e752890a66909c9ab07b0af85681c3b7d269bd66"},{"version":"d10d70b4fe21847c61cb0ab72b60162d2cc23ef64e5606822d110cce2dbc9dd8","impliedFormat":1},{"version":"c12c533d7fb6d2a6fa202186c8113ce520722742c8c8908886bf1c4c840e5221","signature":"e591d09dc11bd421656817e73544363f04c7dfa9c4b645ddc7090ba1fe617aed"},{"version":"1ff4b39378665282c60fc9c8dcc2c3c27e736eef9497d1f4effded4b6d3cb1a3","signature":"d944fe29afd50b4175fc4c425c07fea9d3b5c3fc8581e17aa49f3f8fb84f4e89"},{"version":"2329508bb462ba8f17cc60c4ed5b346618a42eefcaaddcbb0fcbf7f09cfd0a87","impliedFormat":1},{"version":"8549037a789bbcc3170d2cfa194acb5e27bd17fdce042c35decdd948b5824793","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"e88d11b7857417c0603995c77eb188fade5ca64dd5550cd7bd08c9f61c29df5b","affectsGlobalScope":true,"impliedFormat":99}],"root":[235,238,239,[245,250],252,253,255],"options":{"composite":true,"esModuleInterop":true,"jsx":1,"module":99,"noImplicitAny":false,"noImplicitReturns":true,"noUnusedLocals":true,"noUnusedParameters":true,"skipLibCheck":true,"sourceMap":false,"strict":true,"target":99},"referencedMap":[[235,1],[230,2],[228,3],[254,4],[237,4],[233,5],[229,2],[231,6],[232,2],[195,3],[138,7],[139,7],[140,8],[92,9],[141,10],[142,11],[143,12],[87,3],[90,13],[88,3],[89,3],[144,14],[145,15],[146,16],[147,17],[148,18],[149,19],[150,19],[151,20],[152,21],[153,22],[154,23],[93,3],[91,3],[155,24],[156,25],[157,26],[191,27],[158,28],[159,3],[160,29],[161,30],[162,31],[163,32],[164,33],[165,34],[166,35],[167,36],[168,37],[169,37],[170,38],[171,3],[172,39],[173,40],[175,41],[174,42],[176,43],[177,44],[178,45],[179,46],[180,47],[181,48],[182,49],[183,50],[184,51],[185,52],[186,53],[187,54],[188,55],[94,3],[95,3],[96,3],[135,56],[136,3],[137,3],[189,57],[190,58],[234,59],[97,3],[227,60],[256,61],[236,62],[251,63],[243,64],[240,3],[241,64],[242,65],[244,66],[218,67],[216,68],[217,69],[205,70],[206,68],[213,71],[204,72],[209,73],[219,3],[210,74],[215,75],[221,76],[220,77],[203,78],[211,79],[212,80],[207,81],[214,67],[208,82],[197,83],[196,84],[202,3],[84,3],[85,3],[15,3],[13,3],[14,3],[19,3],[18,3],[2,3],[20,3],[21,3],[22,3],[23,3],[24,3],[25,3],[26,3],[27,3],[3,3],[28,3],[29,3],[4,3],[30,3],[34,3],[31,3],[32,3],[33,3],[35,3],[36,3],[37,3],[5,3],[38,3],[39,3],[40,3],[41,3],[6,3],[45,3],[42,3],[43,3],[44,3],[46,3],[7,3],[47,3],[52,3],[53,3],[48,3],[49,3],[50,3],[51,3],[8,3],[57,3],[54,3],[55,3],[56,3],[58,3],[9,3],[59,3],[60,3],[61,3],[63,3],[62,3],[64,3],[65,3],[10,3],[66,3],[67,3],[68,3],[11,3],[69,3],[70,3],[71,3],[72,3],[73,3],[1,3],[74,3],[75,3],[12,3],[79,3],[77,3],[82,3],[81,3],[86,3],[76,3],[80,3],[78,3],[83,3],[17,3],[16,3],[113,85],[123,86],[112,85],[133,87],[104,88],[103,89],[132,90],[126,91],[131,92],[106,93],[120,94],[105,95],[129,96],[101,97],[100,90],[130,98],[102,99],[107,100],[108,3],[111,100],[98,3],[134,101],[124,102],[115,103],[116,104],[118,105],[114,106],[117,107],[127,90],[109,108],[110,109],[119,110],[99,111],[122,102],[121,100],[125,3],[128,112],[193,113],[226,114],[199,115],[200,3],[194,113],[192,3],[198,116],[224,3],[222,3],[223,3],[201,3],[225,117],[238,118],[248,119],[246,120],[250,121],[239,3],[253,122],[247,3],[245,123],[252,3],[249,3],[255,124]],"semanticDiagnosticsPerFile":[[246,[{"start":24,"length":7,"messageText":"'Browser' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":38,"length":14,"messageText":"'BrowserContext' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":59,"length":4,"messageText":"'Page' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":84,"length":41,"messageText":"'ERP_LOCATORS' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":391,"length":17,"messageText":"'ignoreHTTPSErrors' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":962,"length":17,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'ignoreHTTPSErrors' does not exist in type 'LaunchOptions'."},{"start":1436,"length":18,"code":2561,"category":1,"messageText":"Object literal may only specify known properties, but 'acceptAllDownloads' does not exist in type 'BrowserContextOptions'. Did you mean to write 'acceptDownloads'?"},{"start":4403,"length":9,"code":2740,"category":1,"messageText":"Type 'FrameLocator' is missing the following properties from type 'Frame': evaluate, evaluateHandle, $, $$, and 47 more.","canonicalHead":{"code":2322,"messageText":"Type 'FrameLocator' is not assignable to type 'Frame'."}},{"start":4510,"length":6,"code":2322,"category":1,"messageText":{"messageText":"Type 'ErpSession | null' is not assignable to type 'ErpSession'.","category":1,"code":2322,"next":[{"messageText":"Type 'null' is not assignable to type 'ErpSession'.","category":1,"code":2322}]}}]],[250,[{"start":5134,"length":7,"messageText":"'session' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":5251,"length":12,"messageText":"'totalBatches' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true}]],[253,[{"start":130,"length":23,"messageText":"'path' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":2087,"length":9,"messageText":"'rowNumber' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":7526,"length":4,"messageText":"An object literal cannot have multiple properties with the same name.","category":1,"code":1117}]]],"affectedFilesPendingEmit":[235,238,248,246,250,239,253,247,245,252,249,255],"emitSignatures":[235,238,239,245,246,247,248,249,250,252,253,255],"version":"5.9.3"} \ No newline at end of file diff --git a/vitest.config.ts b/vitest.config.ts index db19750..4056cef 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from 'vitest/config'; +import { defineConfig } from 'vitest/config' export default defineConfig({ test: { @@ -9,7 +9,7 @@ export default defineConfig({ setupFiles: ['tests/setup.ts'], coverage: { provider: 'v8', - reporter: ['text', 'json', 'html'], - }, - }, -}); \ No newline at end of file + reporter: ['text', 'json', 'html'] + } + } +})