├── .eslintignore ├── .eslintrc.json ├── .github ├── FUNDING.yml ├── dependabot.yml └── workflows │ └── node.js.yml ├── .gitignore ├── .lintstagedrc ├── .npmignore ├── .nvmrc ├── .prettierrc ├── .yarnrc ├── CHANGELOG.md ├── LICENSE ├── README.md ├── package.json ├── scripts ├── fix-gitmoji-changelog-node-preset └── fix-gitmoji-preset.patch ├── src ├── aggregations.ts ├── errors.ts ├── helpers.ts ├── index.ts ├── mappers.ts ├── merger.ts ├── parseTable.ts ├── pipelineExecutor.ts ├── settings.ts └── types.ts ├── test ├── assets │ ├── 1.html │ ├── 2.html │ └── large-table.html ├── createServer.ts ├── helpers.test.ts ├── index.test.ts ├── merger.test.ts └── pipelineExecutor.test.ts ├── tsconfig.build.json ├── tsconfig.json ├── tsup.config.ts └── yarn.lock /.eslintignore: -------------------------------------------------------------------------------- 1 | /lib 2 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "parserOptions": { 5 | "project": "./tsconfig.json", 6 | "sourceType": "module" 7 | }, 8 | "plugins": [ 9 | "@typescript-eslint" 10 | ], 11 | "extends": [ 12 | "eslint:recommended", 13 | "plugin:@typescript-eslint/eslint-recommended", 14 | "plugin:@typescript-eslint/recommended", 15 | "prettier" 16 | ], 17 | "rules": { 18 | "@typescript-eslint/no-non-null-assertion": "off", 19 | "@typescript-eslint/interface-name-prefix": "off", 20 | "@typescript-eslint/explicit-function-return-type": "off", 21 | "@typescript-eslint/explicit-module-boundary-types": "off", 22 | "@typescript-eslint/no-explicit-any": "off", 23 | "@typescript-eslint/ban-ts-comment": "off", 24 | "@typescript-eslint/no-empty-function": "off", 25 | "no-prototype-builtins": "off" 26 | }, 27 | "ignorePatterns": ["tsup.config.ts"] 28 | } 29 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [Tomas2D] 4 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "npm" 4 | directory: "/" 5 | schedule: 6 | interval: "daily" 7 | time: "00:00" 8 | -------------------------------------------------------------------------------- /.github/workflows/node.js.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | strategy: 13 | matrix: 14 | node: [16, 18] 15 | name: Node ${{ matrix.node }} 16 | steps: 17 | - uses: actions/checkout@v3 18 | - name: Setup node 19 | uses: actions/setup-node@v3 20 | with: 21 | node-version: ${{ matrix.node }} 22 | - name: 'install:linux:dep' 23 | run: sudo apt-get install -y libgbm-dev 24 | - name: 'yarn:install' 25 | run: yarn install --frozen-lockfile 26 | env: 27 | CI: true 28 | - name: build 29 | run: yarn build 30 | - name: test 31 | run: yarn test 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | node_modules/ 3 | *.log 4 | .idea/ 5 | -------------------------------------------------------------------------------- /.lintstagedrc: -------------------------------------------------------------------------------- 1 | { 2 | "(src|test)/**/*.(ts|tsx)": "yarn lint", 3 | "(src|test)/**/*.(ts|tsx)": "yarn prettier" 4 | } 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /src 2 | /test 3 | /scripts 4 | .idea/ 5 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 16.17.1 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all", 4 | "printWidth": 100, 5 | "quoteProps": "consistent" 6 | } 7 | -------------------------------------------------------------------------------- /.yarnrc: -------------------------------------------------------------------------------- 1 | version-git-message "🔖 Version %s" 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | 4 | ## 2.2.0 (2024-04-05) 5 | 6 | ### Added 7 | 8 | - ✨ Performance, add custom cell selectors support [[80a8836](https://github.com/Tomas2D/puppeteer-table-parser/commit/80a8836f7aae3be2ff5bc02be1a7f5a4fe4087cc)] 9 | - 👷 add type check to do the build script [[681b7b9](https://github.com/Tomas2D/puppeteer-table-parser/commit/681b7b99c1a36463094275c80d1adf4f43fb9422)] 10 | 11 | ### Miscellaneous 12 | 13 | - Merge pull request [#354](https://github.com/Tomas2D/puppeteer-table-parser/issues/354) from Tomas2D/dependabot/npm_and_yarn/express-4.19.2 [[408583b](https://github.com/Tomas2D/puppeteer-table-parser/commit/408583b91f850d4b5acd8560e216f761abb7278e)] 14 | - Bump express from 4.19.1 to 4.19.2 [[43d347b](https://github.com/Tomas2D/puppeteer-table-parser/commit/43d347be35864a380b64a9671192130e66f948cd)] 15 | - Merge pull request [#350](https://github.com/Tomas2D/puppeteer-table-parser/issues/350) from Tomas2D/dependabot/npm_and_yarn/express-4.19.1 [[40d26f6](https://github.com/Tomas2D/puppeteer-table-parser/commit/40d26f6fcc769b4336abafd8f2e273153aa11348)] 16 | - Merge pull request [#351](https://github.com/Tomas2D/puppeteer-table-parser/issues/351) from Tomas2D/dependabot/npm_and_yarn/typescript-5.4.3 [[a646da1](https://github.com/Tomas2D/puppeteer-table-parser/commit/a646da1f2b3d8df9607f838d8c58298e54342147)] 17 | - Bump typescript from 5.4.2 to 5.4.3 [[9e0f87a](https://github.com/Tomas2D/puppeteer-table-parser/commit/9e0f87ae016e57689dcee0b529481ad466055b8a)] 18 | - Bump express from 4.18.3 to 4.19.1 [[3bdbf2d](https://github.com/Tomas2D/puppeteer-table-parser/commit/3bdbf2d890677d39527aea5a62173c2a47eb6bf2)] 19 | 20 | 21 | 22 | ## 2.1.3 (2024-03-08) 23 | 24 | ### Miscellaneous 25 | 26 | - Merge pull request [#347](https://github.com/Tomas2D/puppeteer-table-parser/issues/347) from Tomas2D/dependabot/npm_and_yarn/typescript-5.4.2 [[b48a771](https://github.com/Tomas2D/puppeteer-table-parser/commit/b48a771de44cf091979335c5b22d768ad84022fb)] 27 | - Bump typescript from 5.3.3 to 5.4.2 [[ad259ee](https://github.com/Tomas2D/puppeteer-table-parser/commit/ad259eed4e50d620bc098d9f6045ef174d4fcc42)] 28 | - Merge pull request [#345](https://github.com/Tomas2D/puppeteer-table-parser/issues/345) from Tomas2D/dependabot/npm_and_yarn/express-4.18.3 [[5a92ed9](https://github.com/Tomas2D/puppeteer-table-parser/commit/5a92ed90dcd38ba0ace4b38222e01f65be825993)] 29 | - Bump express from 4.18.2 to 4.18.3 [[30442dc](https://github.com/Tomas2D/puppeteer-table-parser/commit/30442dc5c6718dfdd45cf409c598266896b3136e)] 30 | - Merge pull request [#343](https://github.com/Tomas2D/puppeteer-table-parser/issues/343) from Tomas2D/dependabot/npm_and_yarn/eslint-8.57.0 [[d121ecf](https://github.com/Tomas2D/puppeteer-table-parser/commit/d121ecf98b0dec7a1b4215be7bada4614ce3f40a)] 31 | - Bump eslint from 8.56.0 to 8.57.0 [[04ac646](https://github.com/Tomas2D/puppeteer-table-parser/commit/04ac64623a124033a9f0aa8d219057eff9e5b9bb)] 32 | - Merge pull request [#341](https://github.com/Tomas2D/puppeteer-table-parser/issues/341) from Tomas2D/dependabot/npm_and_yarn/ip-1.1.9 [[8a82818](https://github.com/Tomas2D/puppeteer-table-parser/commit/8a82818fbdc52cbab25dff8ac0a21d5a1268bea0)] 33 | - Bump ip from 1.1.8 to 1.1.9 [[339c98a](https://github.com/Tomas2D/puppeteer-table-parser/commit/339c98ac89e248ec7442c6150a54d4a289fa05b7)] 34 | - Merge pull request [#335](https://github.com/Tomas2D/puppeteer-table-parser/issues/335) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.11.0 [[82bc0d9](https://github.com/Tomas2D/puppeteer-table-parser/commit/82bc0d92f71690896717ddd549b5007c8e67e9cd)] 35 | - Merge pull request [#336](https://github.com/Tomas2D/puppeteer-table-parser/issues/336) from Tomas2D/dependabot/npm_and_yarn/prettier-3.2.5 [[d285acc](https://github.com/Tomas2D/puppeteer-table-parser/commit/d285accd24ed9ee4dc6ed1e1b296b0bdcb67c197)] 36 | - Bump prettier from 3.2.4 to 3.2.5 [[7c954c8](https://github.com/Tomas2D/puppeteer-table-parser/commit/7c954c8a6ba48df7847933cfe6ce3446373de717)] 37 | - Bump puppeteer from 21.9.0 to 21.11.0 [[f3894eb](https://github.com/Tomas2D/puppeteer-table-parser/commit/f3894ebd6005736c661d302a45daa66df2abe418)] 38 | - Merge pull request [#333](https://github.com/Tomas2D/puppeteer-table-parser/issues/333) from Tomas2D/dependabot/npm_and_yarn/types/jest-29.5.12 [[854d00c](https://github.com/Tomas2D/puppeteer-table-parser/commit/854d00c4e147613db26d321a834d219b6384a972)] 39 | - Bump @types/jest from 29.5.11 to 29.5.12 [[66cd716](https://github.com/Tomas2D/puppeteer-table-parser/commit/66cd7162cb91e501441d7dc92df1a5660bc35b04)] 40 | - Merge pull request [#329](https://github.com/Tomas2D/puppeteer-table-parser/issues/329) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.9.0 [[95e7572](https://github.com/Tomas2D/puppeteer-table-parser/commit/95e75724957dff3059d678f9c39279ed62dedbbb)] 41 | - Bump puppeteer from 21.7.0 to 21.9.0 [[ac8379a](https://github.com/Tomas2D/puppeteer-table-parser/commit/ac8379ade456a81527c614363b247a15aa4e6b18)] 42 | - Merge pull request [#328](https://github.com/Tomas2D/puppeteer-table-parser/issues/328) from Tomas2D/dependabot/npm_and_yarn/ts-jest-29.1.2 [[1eec437](https://github.com/Tomas2D/puppeteer-table-parser/commit/1eec4376d92d200e4e5141ecd017772bd224777d)] 43 | - Bump ts-jest from 29.1.1 to 29.1.2 [[94fb37e](https://github.com/Tomas2D/puppeteer-table-parser/commit/94fb37e6cb1c9e908452bef789424fa6838bd5c8)] 44 | - Merge pull request [#327](https://github.com/Tomas2D/puppeteer-table-parser/issues/327) from Tomas2D/dependabot/npm_and_yarn/prettier-3.2.4 [[d5b31c8](https://github.com/Tomas2D/puppeteer-table-parser/commit/d5b31c87ba56fe45cb6ea47154c38aff9e829f01)] 45 | - Bump prettier from 3.2.2 to 3.2.4 [[be677df](https://github.com/Tomas2D/puppeteer-table-parser/commit/be677df8895f294f4db734e3cdcf5a255f89ca61)] 46 | - Merge pull request [#326](https://github.com/Tomas2D/puppeteer-table-parser/issues/326) from Tomas2D/dependabot/npm_and_yarn/prettier-3.2.2 [[1d51b61](https://github.com/Tomas2D/puppeteer-table-parser/commit/1d51b612c4a0810b4d7a6fac7bacaf9c05bb4381)] 47 | - Bump prettier from 3.1.1 to 3.2.2 [[e0b5152](https://github.com/Tomas2D/puppeteer-table-parser/commit/e0b51529838b46d869360456f0a23ff6b0dff9b2)] 48 | - Merge pull request [#325](https://github.com/Tomas2D/puppeteer-table-parser/issues/325) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.7.0 [[ba2cda2](https://github.com/Tomas2D/puppeteer-table-parser/commit/ba2cda2f4b83e048d2620876fe355ce72abffef7)] 49 | - Bump puppeteer from 21.6.1 to 21.7.0 [[c55c3ff](https://github.com/Tomas2D/puppeteer-table-parser/commit/c55c3ff14ea42730e83d49ed9de3089e8b79eefa)] 50 | - Merge pull request [#324](https://github.com/Tomas2D/puppeteer-table-parser/issues/324) from Tomas2D/dependabot/npm_and_yarn/eslint-8.56.0 [[0d059cb](https://github.com/Tomas2D/puppeteer-table-parser/commit/0d059cb2a6cb567ebdcfb03223df276505b1ff48)] 51 | - Bump eslint from 8.55.0 to 8.56.0 [[c0595ce](https://github.com/Tomas2D/puppeteer-table-parser/commit/c0595ce693a4ce68efce41426e1019a9e54b2f40)] 52 | - Merge pull request [#323](https://github.com/Tomas2D/puppeteer-table-parser/issues/323) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.6.1 [[ff1b441](https://github.com/Tomas2D/puppeteer-table-parser/commit/ff1b44138256b1fab43aac889784ff31f68de4d3)] 53 | - Bump puppeteer from 21.6.0 to 21.6.1 [[c315153](https://github.com/Tomas2D/puppeteer-table-parser/commit/c315153bbf49646b69ecf9f9bca3d5e265305e49)] 54 | - Merge pull request [#322](https://github.com/Tomas2D/puppeteer-table-parser/issues/322) from Tomas2D/dependabot/npm_and_yarn/prettier-3.1.1 [[4b68432](https://github.com/Tomas2D/puppeteer-table-parser/commit/4b6843288d4470a779dafe754c5ae9f5839af372)] 55 | - Bump prettier from 3.1.0 to 3.1.1 [[0c7b38e](https://github.com/Tomas2D/puppeteer-table-parser/commit/0c7b38e88ac6abfbaf489611fa20bf8ee1c75c42)] 56 | - Merge pull request [#320](https://github.com/Tomas2D/puppeteer-table-parser/issues/320) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.6.0 [[7545100](https://github.com/Tomas2D/puppeteer-table-parser/commit/7545100b8b29238e977497c4d8acde938c7ff9e1)] 57 | - Merge pull request [#319](https://github.com/Tomas2D/puppeteer-table-parser/issues/319) from Tomas2D/dependabot/npm_and_yarn/typescript-5.3.3 [[0656d98](https://github.com/Tomas2D/puppeteer-table-parser/commit/0656d9885567c89435b2ab2bb72192284017aa34)] 58 | - Merge pull request [#321](https://github.com/Tomas2D/puppeteer-table-parser/issues/321) from Tomas2D/dependabot/npm_and_yarn/types/jest-29.5.11 [[ee59448](https://github.com/Tomas2D/puppeteer-table-parser/commit/ee59448bfe04d1b6683e47c3c36b8a3aa9923a6a)] 59 | - Bump @types/jest from 29.5.10 to 29.5.11 [[cb20be2](https://github.com/Tomas2D/puppeteer-table-parser/commit/cb20be28e788abe14f5c7d053ed579611079a839)] 60 | - Bump puppeteer from 21.5.2 to 21.6.0 [[dafc8e3](https://github.com/Tomas2D/puppeteer-table-parser/commit/dafc8e34f73153f590044ddc9b6d5fd563b846eb)] 61 | - Bump typescript from 5.3.2 to 5.3.3 [[49345ce](https://github.com/Tomas2D/puppeteer-table-parser/commit/49345ce74abb16863d39b1d73d3fe6f7e5b4efd0)] 62 | - Merge pull request [#317](https://github.com/Tomas2D/puppeteer-table-parser/issues/317) from Tomas2D/dependabot/npm_and_yarn/eslint-8.55.0 [[0a9ac45](https://github.com/Tomas2D/puppeteer-table-parser/commit/0a9ac4548b250cbb4496fdd06d90c410168f71b2)] 63 | - Merge pull request [#318](https://github.com/Tomas2D/puppeteer-table-parser/issues/318) from Tomas2D/dependabot/npm_and_yarn/eslint-config-prettier-9.1.0 [[1983eee](https://github.com/Tomas2D/puppeteer-table-parser/commit/1983eee3db6a8757d0d79adbc24e3b64bce00a0f)] 64 | - Bump eslint from 8.54.0 to 8.55.0 [[438d942](https://github.com/Tomas2D/puppeteer-table-parser/commit/438d942ead440df606381e3231db6f4d74ac66be)] 65 | - Bump eslint-config-prettier from 9.0.0 to 9.1.0 [[2f186f2](https://github.com/Tomas2D/puppeteer-table-parser/commit/2f186f2d7d7cfb0d6047ab24a425f768433b557e)] 66 | - Merge pull request [#312](https://github.com/Tomas2D/puppeteer-table-parser/issues/312) from Tomas2D/dependabot/npm_and_yarn/eslint-8.54.0 [[32c2615](https://github.com/Tomas2D/puppeteer-table-parser/commit/32c2615caf97c2482e5e238b5d5a4334c477cce9)] 67 | - Merge pull request [#316](https://github.com/Tomas2D/puppeteer-table-parser/issues/316) from Tomas2D/dependabot/npm_and_yarn/types/jest-29.5.10 [[d311700](https://github.com/Tomas2D/puppeteer-table-parser/commit/d3117002a03ce55ef364dcb8edf662be48eb2f9e)] 68 | - Bump @types/jest from 29.5.9 to 29.5.10 [[5e6f9cb](https://github.com/Tomas2D/puppeteer-table-parser/commit/5e6f9cbeb4d8dae9dbfd3ebcc180094c3975195f)] 69 | - Merge pull request [#315](https://github.com/Tomas2D/puppeteer-table-parser/issues/315) from Tomas2D/dependabot/npm_and_yarn/types/jest-29.5.9 [[0290623](https://github.com/Tomas2D/puppeteer-table-parser/commit/029062371ec5c66ed8f177fee0d228583969c7af)] 70 | - Bump @types/jest from 29.5.8 to 29.5.9 [[92465ad](https://github.com/Tomas2D/puppeteer-table-parser/commit/92465ad197eb0c6decc60183993f5758ee999185)] 71 | - Merge pull request [#313](https://github.com/Tomas2D/puppeteer-table-parser/issues/313) from Tomas2D/dependabot/npm_and_yarn/typescript-5.3.2 [[bac0e92](https://github.com/Tomas2D/puppeteer-table-parser/commit/bac0e924cca02e33b75c173ee8bc2348f1eb9b4e)] 72 | - Bump typescript from 5.2.2 to 5.3.2 [[dda89c8](https://github.com/Tomas2D/puppeteer-table-parser/commit/dda89c859e024006f19e46eff2dfd8f68c4c82e6)] 73 | - Bump eslint from 8.53.0 to 8.54.0 [[cdf0ff0](https://github.com/Tomas2D/puppeteer-table-parser/commit/cdf0ff0aaf6ff460c8d1eab82c95abbc7879e16a)] 74 | - Merge pull request [#308](https://github.com/Tomas2D/puppeteer-table-parser/issues/308) from Tomas2D/dependabot/npm_and_yarn/prettier-3.1.0 [[727e13d](https://github.com/Tomas2D/puppeteer-table-parser/commit/727e13db15b7a58e7ba54281ea30ea4e447fec02)] 75 | - Merge pull request [#309](https://github.com/Tomas2D/puppeteer-table-parser/issues/309) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.5.2 [[48c5b8e](https://github.com/Tomas2D/puppeteer-table-parser/commit/48c5b8ee172c98095938e6c9348e9e5d46a4e3cc)] 76 | - Bump puppeteer from 21.5.1 to 21.5.2 [[0874a66](https://github.com/Tomas2D/puppeteer-table-parser/commit/0874a669c9e132add994eda2f53aec75a81a1477)] 77 | - Bump prettier from 3.0.3 to 3.1.0 [[bf59567](https://github.com/Tomas2D/puppeteer-table-parser/commit/bf595672ec2eaacde0e84e7ed91058f22a52aa89)] 78 | - Merge pull request [#303](https://github.com/Tomas2D/puppeteer-table-parser/issues/303) from Tomas2D/dependabot/npm_and_yarn/types/jest-29.5.8 [[fb0771b](https://github.com/Tomas2D/puppeteer-table-parser/commit/fb0771b6f8c8f335b683cc513b0621ec80323167)] 79 | - Merge pull request [#304](https://github.com/Tomas2D/puppeteer-table-parser/issues/304) from Tomas2D/dependabot/npm_and_yarn/types/express-4.17.21 [[e335387](https://github.com/Tomas2D/puppeteer-table-parser/commit/e335387062235233b8d9688069b44f775ed362cd)] 80 | - Bump @types/express from 4.17.20 to 4.17.21 [[f125a84](https://github.com/Tomas2D/puppeteer-table-parser/commit/f125a84dd1a190e42c51f67b7084e26f4f99e86c)] 81 | - Bump @types/jest from 29.5.7 to 29.5.8 [[8e526bd](https://github.com/Tomas2D/puppeteer-table-parser/commit/8e526bd3346c847336f7a9f3c7bee6676ef4dd7b)] 82 | - Merge pull request [#307](https://github.com/Tomas2D/puppeteer-table-parser/issues/307) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.5.1 [[ec1b992](https://github.com/Tomas2D/puppeteer-table-parser/commit/ec1b992711ef2c3c5112ae87177e9f149f758a66)] 83 | - Bump puppeteer from 21.5.0 to 21.5.1 [[9495e70](https://github.com/Tomas2D/puppeteer-table-parser/commit/9495e7083eb8612a80f459a7cbd5a6f78fa442af)] 84 | - Merge pull request [#305](https://github.com/Tomas2D/puppeteer-table-parser/issues/305) from Tomas2D/revert-298-dependabot/npm_and_yarn/lint-staged-15.0.1 [[2e214fc](https://github.com/Tomas2D/puppeteer-table-parser/commit/2e214fcd3dbbe41f7b7abcfec0d67ce1805cae9a)] 85 | - Revert "Bump lint-staged from 14.0.1 to 15.0.1" [[5953ef4](https://github.com/Tomas2D/puppeteer-table-parser/commit/5953ef4a1cd73d3ebdf6b72ed94813b789fa9372)] 86 | - Merge pull request [#301](https://github.com/Tomas2D/puppeteer-table-parser/issues/301) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.5.0 [[2707e2f](https://github.com/Tomas2D/puppeteer-table-parser/commit/2707e2f0f2f37fce782cce0b317b8ba8aa99e6ac)] 87 | - Merge pull request [#302](https://github.com/Tomas2D/puppeteer-table-parser/issues/302) from Tomas2D/dependabot/npm_and_yarn/eslint-8.53.0 [[bda263c](https://github.com/Tomas2D/puppeteer-table-parser/commit/bda263c75b2605dd8487754ad0b65b5e7658e2b5)] 88 | - Bump eslint from 8.52.0 to 8.53.0 [[3ccd6ef](https://github.com/Tomas2D/puppeteer-table-parser/commit/3ccd6ef82c5dd454328875b9d38ce90bf4a17321)] 89 | - Bump puppeteer from 21.4.1 to 21.5.0 [[b2f6284](https://github.com/Tomas2D/puppeteer-table-parser/commit/b2f62845c51947ea4c3abd82d3994a48fab74b98)] 90 | - Merge pull request [#300](https://github.com/Tomas2D/puppeteer-table-parser/issues/300) from Tomas2D/dependabot/npm_and_yarn/types/jest-29.5.7 [[cce1a34](https://github.com/Tomas2D/puppeteer-table-parser/commit/cce1a341acf0d89d67844e120de8c2ef13e4736e)] 91 | - Bump @types/jest from 29.5.6 to 29.5.7 [[c8f870a](https://github.com/Tomas2D/puppeteer-table-parser/commit/c8f870a4cb30037716797b4b6da04625783fc430)] 92 | - Merge pull request [#298](https://github.com/Tomas2D/puppeteer-table-parser/issues/298) from Tomas2D/dependabot/npm_and_yarn/lint-staged-15.0.1 [[baa6c4c](https://github.com/Tomas2D/puppeteer-table-parser/commit/baa6c4cd72ead6a9d488293c76c56c76aa042e13)] 93 | - Merge pull request [#299](https://github.com/Tomas2D/puppeteer-table-parser/issues/299) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.4.1 [[351041a](https://github.com/Tomas2D/puppeteer-table-parser/commit/351041a53336a5a5e8fda788117bd178743e9030)] 94 | - Bump puppeteer from 21.4.0 to 21.4.1 [[97cc72f](https://github.com/Tomas2D/puppeteer-table-parser/commit/97cc72f76c3624e62c33089f765b5d09c256a812)] 95 | - Bump lint-staged from 14.0.1 to 15.0.1 [[a1a3a93](https://github.com/Tomas2D/puppeteer-table-parser/commit/a1a3a93651ddc2acfaf9d25cd986f2dd05a19817)] 96 | - Merge pull request [#297](https://github.com/Tomas2D/puppeteer-table-parser/issues/297) from Tomas2D/revert-289-dependabot/npm_and_yarn/lint-staged-15.0.1 [[d976be9](https://github.com/Tomas2D/puppeteer-table-parser/commit/d976be9fe15cfa30a557f54ad4d399ead96fffa3)] 97 | - Revert "Bump lint-staged from 14.0.1 to 15.0.1" [[82ae0ae](https://github.com/Tomas2D/puppeteer-table-parser/commit/82ae0ae58f872c874277bf38f610fac73066002a)] 98 | - Merge pull request [#296](https://github.com/Tomas2D/puppeteer-table-parser/issues/296) from Tomas2D/revert-293-dependabot/npm_and_yarn/lint-staged-15.0.2 [[109a337](https://github.com/Tomas2D/puppeteer-table-parser/commit/109a33794a41872dd08703c4a5d4dea28307857c)] 99 | - Revert "Bump lint-staged from 15.0.1 to 15.0.2" [[8122af3](https://github.com/Tomas2D/puppeteer-table-parser/commit/8122af3e4127c57cf46265710775bb36dd1eb8c5)] 100 | - Merge pull request [#294](https://github.com/Tomas2D/puppeteer-table-parser/issues/294) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.4.0 [[09767d0](https://github.com/Tomas2D/puppeteer-table-parser/commit/09767d0c98c4af8ff9e24dfa237947e8bc33e961)] 101 | - Merge pull request [#295](https://github.com/Tomas2D/puppeteer-table-parser/issues/295) from Tomas2D/dependabot/npm_and_yarn/eslint-8.52.0 [[114dea4](https://github.com/Tomas2D/puppeteer-table-parser/commit/114dea4f566ee38eb80c7b18f34d9c0b186c9d37)] 102 | - Bump eslint from 8.51.0 to 8.52.0 [[cd0fe7a](https://github.com/Tomas2D/puppeteer-table-parser/commit/cd0fe7a945d7b118e6e31c34fdcf1238fdba3a5b)] 103 | - Bump puppeteer from 21.3.8 to 21.4.0 [[a7d61a3](https://github.com/Tomas2D/puppeteer-table-parser/commit/a7d61a39eff202f0add387ecbe39126c439e9104)] 104 | - Merge pull request [#293](https://github.com/Tomas2D/puppeteer-table-parser/issues/293) from Tomas2D/dependabot/npm_and_yarn/lint-staged-15.0.2 [[aeab4de](https://github.com/Tomas2D/puppeteer-table-parser/commit/aeab4de7581a9e023d87f5a32e2c6bcffb4ef2e7)] 105 | - Bump lint-staged from 15.0.1 to 15.0.2 [[7f87938](https://github.com/Tomas2D/puppeteer-table-parser/commit/7f879384a14868a41d7806bdeffe37c0f419b61c)] 106 | - Merge pull request [#290](https://github.com/Tomas2D/puppeteer-table-parser/issues/290) from Tomas2D/dependabot/npm_and_yarn/types/jest-29.5.6 [[4012ea3](https://github.com/Tomas2D/puppeteer-table-parser/commit/4012ea3749d2593736a9a034e448052e233c170a)] 107 | - Merge pull request [#292](https://github.com/Tomas2D/puppeteer-table-parser/issues/292) from Tomas2D/dependabot/npm_and_yarn/babel/traverse-7.23.2 [[93b4015](https://github.com/Tomas2D/puppeteer-table-parser/commit/93b40154c381f1bf3915a6c38c57d515cf0e163b)] 108 | - Merge pull request [#291](https://github.com/Tomas2D/puppeteer-table-parser/issues/291) from Tomas2D/dependabot/npm_and_yarn/types/express-4.17.20 [[87aaba9](https://github.com/Tomas2D/puppeteer-table-parser/commit/87aaba9bc6f0fa6870c1d7651ffc3f85a8acc586)] 109 | - Bump @babel/traverse from 7.22.4 to 7.23.2 [[b8c5ab7](https://github.com/Tomas2D/puppeteer-table-parser/commit/b8c5ab743a69ee88a943cdd4d8679b71ec09a8a2)] 110 | - Bump @types/express from 4.17.19 to 4.17.20 [[441a4de](https://github.com/Tomas2D/puppeteer-table-parser/commit/441a4de8d0a5bc2cbf41c16aed49868e40d7250c)] 111 | - Bump @types/jest from 29.5.5 to 29.5.6 [[9e81ce0](https://github.com/Tomas2D/puppeteer-table-parser/commit/9e81ce0237ef33680e06b2a7dcc596ea0179c9e6)] 112 | - Merge pull request [#289](https://github.com/Tomas2D/puppeteer-table-parser/issues/289) from Tomas2D/dependabot/npm_and_yarn/lint-staged-15.0.1 [[89c2dc2](https://github.com/Tomas2D/puppeteer-table-parser/commit/89c2dc2649d0bf95440be1c71b98d5e054756df7)] 113 | - Bump lint-staged from 14.0.1 to 15.0.1 [[13414b3](https://github.com/Tomas2D/puppeteer-table-parser/commit/13414b32ba9d72fe015072dfad40fca4b91d9b4b)] 114 | - Merge pull request [#288](https://github.com/Tomas2D/puppeteer-table-parser/issues/288) from Tomas2D/dependabot/npm_and_yarn/types/express-4.17.19 [[f431676](https://github.com/Tomas2D/puppeteer-table-parser/commit/f43167681c0162a4cbaabdbecf707532b0eb892d)] 115 | - Bump @types/express from 4.17.18 to 4.17.19 [[45943b3](https://github.com/Tomas2D/puppeteer-table-parser/commit/45943b3152e8fababba2756f0c35d5158f11c97c)] 116 | - Merge pull request [#286](https://github.com/Tomas2D/puppeteer-table-parser/issues/286) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.3.8 [[a719f7a](https://github.com/Tomas2D/puppeteer-table-parser/commit/a719f7a03332303d4e85bc3af520e59dd835f615)] 117 | - Merge pull request [#287](https://github.com/Tomas2D/puppeteer-table-parser/issues/287) from Tomas2D/dependabot/npm_and_yarn/eslint-8.51.0 [[e0497ad](https://github.com/Tomas2D/puppeteer-table-parser/commit/e0497adddd643f849ee14118cc76749ad31997ff)] 118 | - Bump eslint from 8.50.0 to 8.51.0 [[dd58c93](https://github.com/Tomas2D/puppeteer-table-parser/commit/dd58c937f77c3a63f14393f892c3a6306a634f14)] 119 | - Bump puppeteer from 21.3.7 to 21.3.8 [[2660cdb](https://github.com/Tomas2D/puppeteer-table-parser/commit/2660cdb70e1cf9cfa30a0ca6879a3534552326c2)] 120 | - Merge pull request [#285](https://github.com/Tomas2D/puppeteer-table-parser/issues/285) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.3.7 [[d5c8c66](https://github.com/Tomas2D/puppeteer-table-parser/commit/d5c8c662524b32fee3fd1ae2a2260f05861def78)] 121 | - Bump puppeteer from 21.3.6 to 21.3.7 [[c2daee1](https://github.com/Tomas2D/puppeteer-table-parser/commit/c2daee13b2584234d81e99ae2f2340c40b3d2662)] 122 | - Merge pull request [#284](https://github.com/Tomas2D/puppeteer-table-parser/issues/284) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.3.6 [[40c927c](https://github.com/Tomas2D/puppeteer-table-parser/commit/40c927ced7c2f5b8164c01e57c01953c5160b5ec)] 123 | - Bump puppeteer from 21.3.5 to 21.3.6 [[a5a930e](https://github.com/Tomas2D/puppeteer-table-parser/commit/a5a930e65fd5b6b6f65e5ed31cb666dc76dfd710)] 124 | - Merge pull request [#283](https://github.com/Tomas2D/puppeteer-table-parser/issues/283) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.3.5 [[6a535ba](https://github.com/Tomas2D/puppeteer-table-parser/commit/6a535bad7cc9a2050e27139adbc424b4599389c0)] 125 | - Bump puppeteer from 21.3.4 to 21.3.5 [[9c0c15d](https://github.com/Tomas2D/puppeteer-table-parser/commit/9c0c15d4400943788d09371c00d4d00664fe80e6)] 126 | - Merge pull request [#281](https://github.com/Tomas2D/puppeteer-table-parser/issues/281) from Tomas2D/dependabot/npm_and_yarn/types/express-4.17.18 [[7ac2a7a](https://github.com/Tomas2D/puppeteer-table-parser/commit/7ac2a7ad4bdc9bde3880070b72ae74749b180499)] 127 | - Merge pull request [#280](https://github.com/Tomas2D/puppeteer-table-parser/issues/280) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.3.4 [[f0f8563](https://github.com/Tomas2D/puppeteer-table-parser/commit/f0f8563d5d3789ebea24f2cd1ccb147f04e6b9ff)] 128 | - Merge pull request [#282](https://github.com/Tomas2D/puppeteer-table-parser/issues/282) from Tomas2D/dependabot/npm_and_yarn/eslint-8.50.0 [[d06cca7](https://github.com/Tomas2D/puppeteer-table-parser/commit/d06cca759d4a2f8865e1f3e739704ace1cea3682)] 129 | - Bump eslint from 8.49.0 to 8.50.0 [[d0b3a0d](https://github.com/Tomas2D/puppeteer-table-parser/commit/d0b3a0d88b6045e8a6976b33e45e62d6c07cf93f)] 130 | - Bump @types/express from 4.17.17 to 4.17.18 [[bcda7ec](https://github.com/Tomas2D/puppeteer-table-parser/commit/bcda7ec88ae6bcb18f20f8d2cd3b6cdab180db55)] 131 | - Bump puppeteer from 21.3.1 to 21.3.4 [[cd51a68](https://github.com/Tomas2D/puppeteer-table-parser/commit/cd51a68a23008eac43e4edd1ae418d6e39748f1a)] 132 | - 📝 Create FUNDING.yml [[bc820ef](https://github.com/Tomas2D/puppeteer-table-parser/commit/bc820ef2271b0d811cf7c8f29e31d2f878675b67)] 133 | 134 | 135 | 136 | ## 2.1.2 (2023-09-23) 137 | 138 | ### Added 139 | 140 | - ✨ Improve types [[eb4f4b0](https://github.com/Tomas2D/puppeteer-table-parser/commit/eb4f4b09e84e57c9433e3154be1d504e45db43d8)] 141 | - ✅ Close browser before server [[931d270](https://github.com/Tomas2D/puppeteer-table-parser/commit/931d270e2bc3d0af1e803ffb9ee81a80dd2f1055)] 142 | 143 | ### Fixed 144 | 145 | - 💚 Remove Node 14.x from workflow [[2d97f30](https://github.com/Tomas2D/puppeteer-table-parser/commit/2d97f30b7d2f7e7f7576630899d4f775b1bc4efc)] 146 | 147 | ### Miscellaneous 148 | 149 | - Merge pull request [#278](https://github.com/Tomas2D/puppeteer-table-parser/issues/278) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.3.1 [[58baa8f](https://github.com/Tomas2D/puppeteer-table-parser/commit/58baa8f8a22bb048c1648cd5c554b9837bbdecdc)] 150 | - Bump puppeteer from 21.2.1 to 21.3.1 [[645477f](https://github.com/Tomas2D/puppeteer-table-parser/commit/645477fbb1841d5ff71524312eeb9aced134712c)] 151 | - Merge pull request [#277](https://github.com/Tomas2D/puppeteer-table-parser/issues/277) from Tomas2D/dependabot/npm_and_yarn/types/jest-29.5.5 [[ed06688](https://github.com/Tomas2D/puppeteer-table-parser/commit/ed066888ce02df6fb6612259b6c65b5d920132a9)] 152 | - Bump @types/jest from 29.5.4 to 29.5.5 [[e09aff0](https://github.com/Tomas2D/puppeteer-table-parser/commit/e09aff002038baa510bdc7b811bdff2e4b4f04e6)] 153 | - Merge pull request [#275](https://github.com/Tomas2D/puppeteer-table-parser/issues/275) from Tomas2D/dependabot/npm_and_yarn/jest-29.7.0 [[05fe777](https://github.com/Tomas2D/puppeteer-table-parser/commit/05fe7778549daae77f9e86be7e6334af18f51072)] 154 | - Merge pull request [#276](https://github.com/Tomas2D/puppeteer-table-parser/issues/276) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.2.1 [[307dfcc](https://github.com/Tomas2D/puppeteer-table-parser/commit/307dfcc22b594ededf9a2654fa31cf51c29ed178)] 155 | - Bump puppeteer from 21.1.1 to 21.2.1 [[2fd7ff0](https://github.com/Tomas2D/puppeteer-table-parser/commit/2fd7ff0a63c478c611535413bdca97d475b895ee)] 156 | - Bump jest from 29.6.4 to 29.7.0 [[e70dd94](https://github.com/Tomas2D/puppeteer-table-parser/commit/e70dd9423d0d948c765cc776ad980baf06cb17fa)] 157 | - Merge pull request [#273](https://github.com/Tomas2D/puppeteer-table-parser/issues/273) from Tomas2D/dependabot/npm_and_yarn/eslint-8.49.0 [[91455e5](https://github.com/Tomas2D/puppeteer-table-parser/commit/91455e59fb403b9a1d14548abb0565318992a771)] 158 | - Bump eslint from 8.48.0 to 8.49.0 [[2becc87](https://github.com/Tomas2D/puppeteer-table-parser/commit/2becc87835d3a59cee78b8a79a130ff9246e22be)] 159 | - Merge pull request [#272](https://github.com/Tomas2D/puppeteer-table-parser/issues/272) from Tomas2D/dependabot/npm_and_yarn/prettier-3.0.3 [[f9e2e0b](https://github.com/Tomas2D/puppeteer-table-parser/commit/f9e2e0b995e3837c71857cac9d10777dada3982f)] 160 | - Bump prettier from 3.0.2 to 3.0.3 [[ae8c6e7](https://github.com/Tomas2D/puppeteer-table-parser/commit/ae8c6e7b2f44427e9db02a5d15aa212b653ca5a9)] 161 | - Merge pull request [#271](https://github.com/Tomas2D/puppeteer-table-parser/issues/271) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.1.1 [[a7c6ad3](https://github.com/Tomas2D/puppeteer-table-parser/commit/a7c6ad3c3841b7a01342d273c66e79e692b2ef54)] 162 | - Bump puppeteer from 21.1.0 to 21.1.1 [[5e44710](https://github.com/Tomas2D/puppeteer-table-parser/commit/5e447104dd12a362cf1e5eefc5e67c32b9c0e437)] 163 | - Merge pull request [#270](https://github.com/Tomas2D/puppeteer-table-parser/issues/270) from Tomas2D/dependabot/npm_and_yarn/eslint-8.48.0 [[c12ddce](https://github.com/Tomas2D/puppeteer-table-parser/commit/c12ddce1a69b133d185e135f4503821a2d2727c6)] 164 | - Bump eslint from 8.47.0 to 8.48.0 [[7d4b99a](https://github.com/Tomas2D/puppeteer-table-parser/commit/7d4b99ab6e398f6297b0992e66cd024021a9d22d)] 165 | - Merge pull request [#268](https://github.com/Tomas2D/puppeteer-table-parser/issues/268) from Tomas2D/dependabot/npm_and_yarn/typescript-5.2.2 [[bcd7959](https://github.com/Tomas2D/puppeteer-table-parser/commit/bcd795977f634e4a067087679c558f00c287a466)] 166 | - Merge pull request [#269](https://github.com/Tomas2D/puppeteer-table-parser/issues/269) from Tomas2D/dependabot/npm_and_yarn/jest-29.6.4 [[f762b22](https://github.com/Tomas2D/puppeteer-table-parser/commit/f762b2255fb76f92098b5ad71109b93029878177)] 167 | - Bump typescript from 5.1.6 to 5.2.2 [[cf1122d](https://github.com/Tomas2D/puppeteer-table-parser/commit/cf1122d9289b0ce62a0b3548d44716366bcd51cd)] 168 | - Bump jest from 29.6.3 to 29.6.4 [[1611331](https://github.com/Tomas2D/puppeteer-table-parser/commit/16113313c9551b005f7c0f580a9b211a9368d0bb)] 169 | - Merge pull request [#267](https://github.com/Tomas2D/puppeteer-table-parser/issues/267) from Tomas2D/dependabot/npm_and_yarn/types/jest-29.5.4 [[edb1388](https://github.com/Tomas2D/puppeteer-table-parser/commit/edb1388c6b11bea1a84b51755d690c35d7692912)] 170 | - Bump @types/jest from 29.5.3 to 29.5.4 [[052c1f8](https://github.com/Tomas2D/puppeteer-table-parser/commit/052c1f81df920959ce334ebb5b51363eb949791b)] 171 | - Merge pull request [#265](https://github.com/Tomas2D/puppeteer-table-parser/issues/265) from Tomas2D/dependabot/npm_and_yarn/lint-staged-14.0.1 [[d49e21b](https://github.com/Tomas2D/puppeteer-table-parser/commit/d49e21bc7b09f1f42187d608f525ddc2dd0a7c62)] 172 | - Merge pull request [#266](https://github.com/Tomas2D/puppeteer-table-parser/issues/266) from Tomas2D/dependabot/npm_and_yarn/jest-29.6.3 [[6d93df7](https://github.com/Tomas2D/puppeteer-table-parser/commit/6d93df750c094f480f2b5b0d654b91207ed6796a)] 173 | - Bump jest from 29.6.2 to 29.6.3 [[933a4bf](https://github.com/Tomas2D/puppeteer-table-parser/commit/933a4bf2c7576fd4a2571189ddfe28310900163d)] 174 | - Bump lint-staged from 14.0.0 to 14.0.1 [[eb87e3a](https://github.com/Tomas2D/puppeteer-table-parser/commit/eb87e3af7d53a2fe80506250785b27754cd93181)] 175 | - Merge pull request [#264](https://github.com/Tomas2D/puppeteer-table-parser/issues/264) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.1.0 [[e9938a3](https://github.com/Tomas2D/puppeteer-table-parser/commit/e9938a3f348bb73330a1eda49a961c3d0b7a12f4)] 176 | - Bump puppeteer from 21.0.3 to 21.1.0 [[054ea0e](https://github.com/Tomas2D/puppeteer-table-parser/commit/054ea0eafdf674401e8391de003accf93730acec)] 177 | - Merge pull request [#263](https://github.com/Tomas2D/puppeteer-table-parser/issues/263) from Tomas2D/dependabot/npm_and_yarn/prettier-3.0.2 [[2e40f04](https://github.com/Tomas2D/puppeteer-table-parser/commit/2e40f04d5ebf56c494928e349921588f7fd699c0)] 178 | - Bump prettier from 3.0.1 to 3.0.2 [[fb1aa31](https://github.com/Tomas2D/puppeteer-table-parser/commit/fb1aa31e7c69753282097f42b440daca910a6f86)] 179 | - Merge pull request [#260](https://github.com/Tomas2D/puppeteer-table-parser/issues/260) from Tomas2D/dependabot/npm_and_yarn/lint-staged-14.0.0 [[1ba5349](https://github.com/Tomas2D/puppeteer-table-parser/commit/1ba5349d9e4b016a4701f372193743bd3aa7edfe)] 180 | - Merge pull request [#261](https://github.com/Tomas2D/puppeteer-table-parser/issues/261) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.0.3 [[dc68c14](https://github.com/Tomas2D/puppeteer-table-parser/commit/dc68c14f0eb73d5bd54c6b9e690065c2fe7d9f37)] 181 | - Merge pull request [#262](https://github.com/Tomas2D/puppeteer-table-parser/issues/262) from Tomas2D/dependabot/npm_and_yarn/eslint-8.47.0 [[57af47c](https://github.com/Tomas2D/puppeteer-table-parser/commit/57af47c60f7fccb9118a2e51a23d0326d9a2b24b)] 182 | - Bump eslint from 8.46.0 to 8.47.0 [[dd16ff8](https://github.com/Tomas2D/puppeteer-table-parser/commit/dd16ff8d2d8bd56ba9282370f7572dd57e78f3af)] 183 | - Bump puppeteer from 21.0.2 to 21.0.3 [[e45f21f](https://github.com/Tomas2D/puppeteer-table-parser/commit/e45f21f3bc2d6e28e05bba28d94421f7cda7481d)] 184 | - Bump lint-staged from 13.2.3 to 14.0.0 [[b5a3285](https://github.com/Tomas2D/puppeteer-table-parser/commit/b5a3285e9e4c645d5a36863a6487479e70fa409e)] 185 | - Merge pull request [#254](https://github.com/Tomas2D/puppeteer-table-parser/issues/254) from Tomas2D/dependabot/npm_and_yarn/tsup-7.2.0 [[fde0a2c](https://github.com/Tomas2D/puppeteer-table-parser/commit/fde0a2c02cbbe7ab1f25481db7102352b762f553)] 186 | - Merge pull request [#259](https://github.com/Tomas2D/puppeteer-table-parser/issues/259) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.0.2 [[ff6aab7](https://github.com/Tomas2D/puppeteer-table-parser/commit/ff6aab7cf60f27178fe0ebdf49eaa205b66593d3)] 187 | - Bump puppeteer from 21.0.1 to 21.0.2 [[8c2927d](https://github.com/Tomas2D/puppeteer-table-parser/commit/8c2927d5fe9f2e4bc1b193b4ef154185d9848418)] 188 | - Merge pull request [#256](https://github.com/Tomas2D/puppeteer-table-parser/issues/256) from Tomas2D/dependabot/npm_and_yarn/puppeteer-21.0.1 [[9ede9e8](https://github.com/Tomas2D/puppeteer-table-parser/commit/9ede9e8208940ec62b9da7b7d4a7884d64e7f42d)] 189 | - Bump tsup from 7.1.0 to 7.2.0 [[c755c46](https://github.com/Tomas2D/puppeteer-table-parser/commit/c755c468c82d7eaf5b9003296f47268211061f39)] 190 | - Merge pull request [#257](https://github.com/Tomas2D/puppeteer-table-parser/issues/257) from Tomas2D/dependabot/npm_and_yarn/prettier-3.0.1 [[b5b51d1](https://github.com/Tomas2D/puppeteer-table-parser/commit/b5b51d12da28fa218646058d15cf31f597799a67)] 191 | - Merge pull request [#258](https://github.com/Tomas2D/puppeteer-table-parser/issues/258) from Tomas2D/dependabot/npm_and_yarn/eslint-config-prettier-9.0.0 [[57633ff](https://github.com/Tomas2D/puppeteer-table-parser/commit/57633ff1a79f2ec5982d8df97a8d0daf0b2d613f)] 192 | - Bump puppeteer from 20.9.0 to 21.0.1 [[abe374e](https://github.com/Tomas2D/puppeteer-table-parser/commit/abe374e536fd27542a22324eddbd6572f7c40408)] 193 | - Bump prettier from 2.8.8 to 3.0.1 [[d2e34a2](https://github.com/Tomas2D/puppeteer-table-parser/commit/d2e34a25546e8d495c3ae9579d7d10166ee248bc)] 194 | - Bump eslint-config-prettier from 8.9.0 to 9.0.0 [[fdd554e](https://github.com/Tomas2D/puppeteer-table-parser/commit/fdd554eec927527116abc3bc62323268afa5d05f)] 195 | - Merge pull request [#252](https://github.com/Tomas2D/puppeteer-table-parser/issues/252) from Tomas2D/dependabot/npm_and_yarn/eslint-8.46.0 [[21dd72f](https://github.com/Tomas2D/puppeteer-table-parser/commit/21dd72f6f459593f296aac3ab1489bc23f56bff5)] 196 | - Bump eslint from 8.45.0 to 8.46.0 [[b845394](https://github.com/Tomas2D/puppeteer-table-parser/commit/b845394bfcf033432202b60a61953d62261dfdad)] 197 | - Merge pull request [#250](https://github.com/Tomas2D/puppeteer-table-parser/issues/250) from Tomas2D/dependabot/npm_and_yarn/jest-29.6.2 [[0a628b5](https://github.com/Tomas2D/puppeteer-table-parser/commit/0a628b5956f0d822c49635635ecdb5a99a1baa10)] 198 | - Merge pull request [#251](https://github.com/Tomas2D/puppeteer-table-parser/issues/251) from Tomas2D/dependabot/npm_and_yarn/eslint-config-prettier-8.9.0 [[d460c91](https://github.com/Tomas2D/puppeteer-table-parser/commit/d460c917fa00acf676975fba528067c62c114115)] 199 | - Bump eslint-config-prettier from 8.8.0 to 8.9.0 [[5e28693](https://github.com/Tomas2D/puppeteer-table-parser/commit/5e28693bbdb1890e20ca8a57acc6fb88ac35ef79)] 200 | - Bump jest from 29.6.1 to 29.6.2 [[e3bdc76](https://github.com/Tomas2D/puppeteer-table-parser/commit/e3bdc76bcd6466225bc76763c34a319848935605)] 201 | - Merge pull request [#249](https://github.com/Tomas2D/puppeteer-table-parser/issues/249) from Tomas2D/dependabot/npm_and_yarn/puppeteer-20.9.0 [[998e1d1](https://github.com/Tomas2D/puppeteer-table-parser/commit/998e1d1070575610e50f959d72c6206ef20ca153)] 202 | - Bump puppeteer from 20.8.3 to 20.9.0 [[6e94113](https://github.com/Tomas2D/puppeteer-table-parser/commit/6e94113010dca863915b65b116b909bccd3ef23a)] 203 | - Merge pull request [#248](https://github.com/Tomas2D/puppeteer-table-parser/issues/248) from Tomas2D/dependabot/npm_and_yarn/puppeteer-20.8.3 [[b0a6774](https://github.com/Tomas2D/puppeteer-table-parser/commit/b0a67742fc273f02e5c4fb9236c29642a5bd4b4f)] 204 | - Bump puppeteer from 20.8.2 to 20.8.3 [[fcc0319](https://github.com/Tomas2D/puppeteer-table-parser/commit/fcc0319478f7e3c6428e6c98caf8ab20b01bc17a)] 205 | - Merge pull request [#247](https://github.com/Tomas2D/puppeteer-table-parser/issues/247) from Tomas2D/dependabot/npm_and_yarn/eslint-8.45.0 [[3746540](https://github.com/Tomas2D/puppeteer-table-parser/commit/3746540d69b2f3e0f25a86b900604c29d671e2d5)] 206 | - Bump eslint from 8.44.0 to 8.45.0 [[e339988](https://github.com/Tomas2D/puppeteer-table-parser/commit/e339988837ca2d671036e993a1f475f1b23d2f48)] 207 | - Merge pull request [#246](https://github.com/Tomas2D/puppeteer-table-parser/issues/246) from Tomas2D/dependabot/npm_and_yarn/puppeteer-20.8.2 [[f3960c7](https://github.com/Tomas2D/puppeteer-table-parser/commit/f3960c74678fceb0977c5715b252a9053cafb76a)] 208 | - Bump puppeteer from 20.8.1 to 20.8.2 [[8c8206e](https://github.com/Tomas2D/puppeteer-table-parser/commit/8c8206ea85a4775a0e34d944a40d5a9dd1e1214d)] 209 | - Merge pull request [#242](https://github.com/Tomas2D/puppeteer-table-parser/issues/242) from Tomas2D/dependabot/npm_and_yarn/types/jest-29.5.3 [[95adebf](https://github.com/Tomas2D/puppeteer-table-parser/commit/95adebf99e7ae647db7b9b8a03ea59c94a985d28)] 210 | - Merge pull request [#241](https://github.com/Tomas2D/puppeteer-table-parser/issues/241) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.62.0 [[0236316](https://github.com/Tomas2D/puppeteer-table-parser/commit/02363166b502ef8dcaaa31baec74dd0fe0a0050f)] 211 | - Merge pull request [#245](https://github.com/Tomas2D/puppeteer-table-parser/issues/245) from Tomas2D/dependabot/npm_and_yarn/puppeteer-20.8.1 [[775fcf3](https://github.com/Tomas2D/puppeteer-table-parser/commit/775fcf379e8911aa0bd54a8dc9bb689ae4be29da)] 212 | - Bump puppeteer from 20.8.0 to 20.8.1 [[c158da0](https://github.com/Tomas2D/puppeteer-table-parser/commit/c158da038066a78aa8dc3fcd9f725f8ba479bdce)] 213 | - Merge pull request [#243](https://github.com/Tomas2D/puppeteer-table-parser/issues/243) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.62.0 [[2d7d215](https://github.com/Tomas2D/puppeteer-table-parser/commit/2d7d215af108f01329f2ba569b5055116bfcd0b0)] 214 | - Merge pull request [#244](https://github.com/Tomas2D/puppeteer-table-parser/issues/244) from Tomas2D/dependabot/npm_and_yarn/semver-6.3.1 [[a7e0a18](https://github.com/Tomas2D/puppeteer-table-parser/commit/a7e0a1822c5056d1035b4d04937095d712fd263b)] 215 | - Bump @typescript-eslint/eslint-plugin from 5.61.0 to 5.62.0 [[563920b](https://github.com/Tomas2D/puppeteer-table-parser/commit/563920b1b6b57abc728c0ea45376d6fadead7da5)] 216 | - Bump semver from 6.3.0 to 6.3.1 [[99174da](https://github.com/Tomas2D/puppeteer-table-parser/commit/99174da29024df5e5aef3a616103ddf9f8262a0c)] 217 | - Bump @typescript-eslint/parser from 5.61.0 to 5.62.0 [[cfc2a3e](https://github.com/Tomas2D/puppeteer-table-parser/commit/cfc2a3e844f4ed6856ac159a605be961783e3058)] 218 | - Bump @types/jest from 29.5.2 to 29.5.3 [[1745919](https://github.com/Tomas2D/puppeteer-table-parser/commit/17459196515df84a55beb44b4e911b3178601c28)] 219 | - Merge pull request [#239](https://github.com/Tomas2D/puppeteer-table-parser/issues/239) from Tomas2D/dependabot/npm_and_yarn/puppeteer-20.8.0 [[3a4af69](https://github.com/Tomas2D/puppeteer-table-parser/commit/3a4af69de22cfad82c4e7e077b486976d5c51509)] 220 | - Merge pull request [#235](https://github.com/Tomas2D/puppeteer-table-parser/issues/235) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.61.0 [[4cc2538](https://github.com/Tomas2D/puppeteer-table-parser/commit/4cc253817c09a2fa72a091ce3bdd12e764b2723b)] 221 | - Merge pull request [#240](https://github.com/Tomas2D/puppeteer-table-parser/issues/240) from Tomas2D/dependabot/npm_and_yarn/jest-29.6.1 [[41dafb0](https://github.com/Tomas2D/puppeteer-table-parser/commit/41dafb04032f820a1dde3e2903f6cbcb456682b7)] 222 | - Bump jest from 29.6.0 to 29.6.1 [[addb342](https://github.com/Tomas2D/puppeteer-table-parser/commit/addb34292a955824889aba37e9b0b17db05490f3)] 223 | - Bump puppeteer from 20.7.4 to 20.8.0 [[71bc67f](https://github.com/Tomas2D/puppeteer-table-parser/commit/71bc67fa618ea70a4e51701044851d3d55aaae1d)] 224 | - Merge pull request [#237](https://github.com/Tomas2D/puppeteer-table-parser/issues/237) from Tomas2D/dependabot/npm_and_yarn/jest-29.6.0 [[d9db3ba](https://github.com/Tomas2D/puppeteer-table-parser/commit/d9db3bab75b37d0f76a00c5a56fe749db6f744a2)] 225 | - Bump jest from 29.5.0 to 29.6.0 [[267ea99](https://github.com/Tomas2D/puppeteer-table-parser/commit/267ea997e47a478067e76e136ab485eac65d5a2b)] 226 | - Merge pull request [#236](https://github.com/Tomas2D/puppeteer-table-parser/issues/236) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.61.0 [[ea9940b](https://github.com/Tomas2D/puppeteer-table-parser/commit/ea9940b8d45ca2dbdf5dd5b31eb8873ac4dd8b0d)] 227 | - Bump @typescript-eslint/parser from 5.60.1 to 5.61.0 [[94d724f](https://github.com/Tomas2D/puppeteer-table-parser/commit/94d724f8b2ff09c30b265ec5c2e9d8b0fcfa4b7d)] 228 | - Bump @typescript-eslint/eslint-plugin from 5.60.1 to 5.61.0 [[c95d6df](https://github.com/Tomas2D/puppeteer-table-parser/commit/c95d6dfd8fb1987a5049f4b687eb8f428ca0810e)] 229 | - Merge pull request [#233](https://github.com/Tomas2D/puppeteer-table-parser/issues/233) from Tomas2D/dependabot/npm_and_yarn/ts-jest-29.1.1 [[22464d6](https://github.com/Tomas2D/puppeteer-table-parser/commit/22464d6ccc486843a7d2dfcbbf5591a47bd28991)] 230 | - Merge pull request [#234](https://github.com/Tomas2D/puppeteer-table-parser/issues/234) from Tomas2D/dependabot/npm_and_yarn/eslint-8.44.0 [[9ac81d9](https://github.com/Tomas2D/puppeteer-table-parser/commit/9ac81d9e599026777b7533785f9d35d7a354b4c8)] 231 | - Bump eslint from 8.43.0 to 8.44.0 [[e5b6c45](https://github.com/Tomas2D/puppeteer-table-parser/commit/e5b6c4557ce4eb035c7ad25fd8101b5cae94ed73)] 232 | - Bump ts-jest from 29.1.0 to 29.1.1 [[9f0980e](https://github.com/Tomas2D/puppeteer-table-parser/commit/9f0980e38e36773ff5075526463726be948ea9ef)] 233 | - Merge pull request [#232](https://github.com/Tomas2D/puppeteer-table-parser/issues/232) from Tomas2D/dependabot/npm_and_yarn/puppeteer-20.7.4 [[7362a31](https://github.com/Tomas2D/puppeteer-table-parser/commit/7362a31c2201bcfbb47d04e894abf9d0d12ece20)] 234 | - Bump puppeteer from 20.7.3 to 20.7.4 [[85c6310](https://github.com/Tomas2D/puppeteer-table-parser/commit/85c6310fb3cbb51f1e782c59f3080007ed97882f)] 235 | - Merge pull request [#230](https://github.com/Tomas2D/puppeteer-table-parser/issues/230) from Tomas2D/dependabot/npm_and_yarn/typescript-5.1.6 [[1127700](https://github.com/Tomas2D/puppeteer-table-parser/commit/11277002ed4848f74b2a656dfb438d64f9365240)] 236 | - Merge pull request [#231](https://github.com/Tomas2D/puppeteer-table-parser/issues/231) from Tomas2D/dependabot/npm_and_yarn/lint-staged-13.2.3 [[b868a4a](https://github.com/Tomas2D/puppeteer-table-parser/commit/b868a4a789a9888c7d380605475334f8ab040567)] 237 | - Bump lint-staged from 13.2.2 to 13.2.3 [[fb79ca1](https://github.com/Tomas2D/puppeteer-table-parser/commit/fb79ca1b97dcccd613a6847faba0be95bf172546)] 238 | - Bump typescript from 5.1.5 to 5.1.6 [[a8705bd](https://github.com/Tomas2D/puppeteer-table-parser/commit/a8705bddaa425b8eafdbf5b739885a46640f43d7)] 239 | - Merge pull request [#226](https://github.com/Tomas2D/puppeteer-table-parser/issues/226) from Tomas2D/dependabot/npm_and_yarn/tsup-7.1.0 [[40a8226](https://github.com/Tomas2D/puppeteer-table-parser/commit/40a8226406eb152ebe2f7f1233c55cfa4a57c50b)] 240 | - Merge pull request [#227](https://github.com/Tomas2D/puppeteer-table-parser/issues/227) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.60.1 [[272f533](https://github.com/Tomas2D/puppeteer-table-parser/commit/272f533345d7faa95541b733a71052327f75c0c8)] 241 | - Merge pull request [#228](https://github.com/Tomas2D/puppeteer-table-parser/issues/228) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.60.1 [[750c527](https://github.com/Tomas2D/puppeteer-table-parser/commit/750c5274299f9a8a4d36e28b0ca064e3628e022a)] 242 | - Merge pull request [#229](https://github.com/Tomas2D/puppeteer-table-parser/issues/229) from Tomas2D/dependabot/npm_and_yarn/typescript-5.1.5 [[5a4c7f4](https://github.com/Tomas2D/puppeteer-table-parser/commit/5a4c7f4ad7840ff61d15082f80c6f81330bac923)] 243 | - Bump @typescript-eslint/parser from 5.59.9 to 5.60.1 [[96d8e60](https://github.com/Tomas2D/puppeteer-table-parser/commit/96d8e602e698e63c5ce628721244ecdfd01adc69)] 244 | - Bump typescript from 5.1.3 to 5.1.5 [[b6b7eff](https://github.com/Tomas2D/puppeteer-table-parser/commit/b6b7eff8c6dd7401c2cd39c6f368cb20771508f8)] 245 | - Bump @typescript-eslint/eslint-plugin from 5.59.8 to 5.60.1 [[59da411](https://github.com/Tomas2D/puppeteer-table-parser/commit/59da4116b65e46713326570aafd2d1793535efff)] 246 | - Bump tsup from 6.7.0 to 7.1.0 [[26c4fa6](https://github.com/Tomas2D/puppeteer-table-parser/commit/26c4fa6efa63ede8a4bca38e4186d015d84938e2)] 247 | - Merge pull request [#225](https://github.com/Tomas2D/puppeteer-table-parser/issues/225) from Tomas2D/dependabot/npm_and_yarn/puppeteer-20.7.3 [[375891c](https://github.com/Tomas2D/puppeteer-table-parser/commit/375891c5bdbcb1b352717a45f70e44b23f3560d9)] 248 | - Bump puppeteer from 20.7.2 to 20.7.3 [[b803bf5](https://github.com/Tomas2D/puppeteer-table-parser/commit/b803bf5872ba27cca2041bfeade585ba1a8c58ef)] 249 | - Merge pull request [#221](https://github.com/Tomas2D/puppeteer-table-parser/issues/221) from Tomas2D/dependabot/npm_and_yarn/puppeteer-20.7.2 [[1861e6d](https://github.com/Tomas2D/puppeteer-table-parser/commit/1861e6d32e48ff187c42f160d67ea499edaa87f6)] 250 | - Merge pull request [#222](https://github.com/Tomas2D/puppeteer-table-parser/issues/222) from Tomas2D/dependabot/npm_and_yarn/eslint-8.43.0 [[780d96b](https://github.com/Tomas2D/puppeteer-table-parser/commit/780d96b1e80d56a3b97103c4346573daacde6583)] 251 | - Bump eslint from 8.42.0 to 8.43.0 [[3c6ad76](https://github.com/Tomas2D/puppeteer-table-parser/commit/3c6ad7668fffb58afadac4b827a3a0569a9a397c)] 252 | - Bump puppeteer from 20.5.0 to 20.7.2 [[7d902f4](https://github.com/Tomas2D/puppeteer-table-parser/commit/7d902f4eb2b414ae025a8f1698d1f9ac6fea7e90)] 253 | - Merge pull request [#215](https://github.com/Tomas2D/puppeteer-table-parser/issues/215) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.59.9 [[853d773](https://github.com/Tomas2D/puppeteer-table-parser/commit/853d7730cf82e931afa5fe3caab6553a73c4d80d)] 254 | - Bump @typescript-eslint/parser from 5.59.8 to 5.59.9 [[291d254](https://github.com/Tomas2D/puppeteer-table-parser/commit/291d254827b65540705346037878901d1a123e53)] 255 | 256 | 257 | 258 | ## 2.1.1 (2023-06-04) 259 | 260 | ### Added 261 | 262 | - ✅ Update types in tests [[f5b7068](https://github.com/Tomas2D/puppeteer-table-parser/commit/f5b706893947c5a882eea9b18e953f6186037880)] 263 | - ✅ Returns only header if no rows found [[3f287f8](https://github.com/Tomas2D/puppeteer-table-parser/commit/3f287f8a8000b671436e56c6e9d86182e96bc30f)] 264 | 265 | ### Changed 266 | 267 | - ⬆️ Update dependencies [[f3c6eef](https://github.com/Tomas2D/puppeteer-table-parser/commit/f3c6eefdea5f87c1d88d178916aaae1fd9965a94)] 268 | - ⬆️ Update deps [[afd652a](https://github.com/Tomas2D/puppeteer-table-parser/commit/afd652adec4b68b55228303d94742293b26b44a7)] 269 | 270 | ### Miscellaneous 271 | 272 | - Merge pull request [#188](https://github.com/Tomas2D/puppeteer-table-parser/issues/188) from Tomas2D/dependabot/npm_and_yarn/prettier-2.8.8 [[d33d0f3](https://github.com/Tomas2D/puppeteer-table-parser/commit/d33d0f37170b21403287eccc0288d654505da50e)] 273 | - Merge pull request [#211](https://github.com/Tomas2D/puppeteer-table-parser/issues/211) from Tomas2D/dependabot/npm_and_yarn/puppeteer-20.5.0 [[9b40634](https://github.com/Tomas2D/puppeteer-table-parser/commit/9b4063469c354e2285f8aa8b1665e1eb67a2f212)] 274 | - Merge pull request [#212](https://github.com/Tomas2D/puppeteer-table-parser/issues/212) from Tomas2D/dependabot/npm_and_yarn/types/jest-29.5.2 [[c0f4d0d](https://github.com/Tomas2D/puppeteer-table-parser/commit/c0f4d0d9c7cfbc6b1c39c4e99ebf6e4f7b509175)] 275 | - Bump @types/jest from 29.5.0 to 29.5.2 [[0532e9a](https://github.com/Tomas2D/puppeteer-table-parser/commit/0532e9aebbb482df6dbba5a960004c42247c433a)] 276 | - Bump puppeteer from 19.11.0 to 20.5.0 [[98792e7](https://github.com/Tomas2D/puppeteer-table-parser/commit/98792e7ed5bc00af464005b07e4c60003158c447)] 277 | - Merge pull request [#200](https://github.com/Tomas2D/puppeteer-table-parser/issues/200) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.59.5 [[f0b5956](https://github.com/Tomas2D/puppeteer-table-parser/commit/f0b5956bd69d0767b371ec98001c0daac2bfe9a2)] 278 | - Bump @typescript-eslint/parser from 5.59.0 to 5.59.5 [[425c2de](https://github.com/Tomas2D/puppeteer-table-parser/commit/425c2decbaa3893b3e75ccb2d7215061729d78b1)] 279 | - Merge pull request [#191](https://github.com/Tomas2D/puppeteer-table-parser/issues/191) from Tomas2D/dependabot/npm_and_yarn/puppeteer-19.11.0 [[f5cce86](https://github.com/Tomas2D/puppeteer-table-parser/commit/f5cce86dbc1ee8a28d151540028f85ee0d916582)] 280 | - Merge pull request [#192](https://github.com/Tomas2D/puppeteer-table-parser/issues/192) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.59.1 [[6d96e0a](https://github.com/Tomas2D/puppeteer-table-parser/commit/6d96e0af5185c77a62869074f4a26c87e496f9f6)] 281 | - Bump @typescript-eslint/eslint-plugin from 5.59.0 to 5.59.1 [[25cff75](https://github.com/Tomas2D/puppeteer-table-parser/commit/25cff75ab6ee2fdb34bf1e592d08462017282331)] 282 | - Bump puppeteer from 19.10.0 to 19.11.0 [[bb11ade](https://github.com/Tomas2D/puppeteer-table-parser/commit/bb11adea59e157a4923a881772dd28386243be29)] 283 | - Bump prettier from 2.8.7 to 2.8.8 [[7da1304](https://github.com/Tomas2D/puppeteer-table-parser/commit/7da1304ee0ed0ae28f6d6d0a2c937873e9903049)] 284 | - Merge pull request [#187](https://github.com/Tomas2D/puppeteer-table-parser/issues/187) from Tomas2D/dependabot/npm_and_yarn/puppeteer-19.10.0 [[90dee10](https://github.com/Tomas2D/puppeteer-table-parser/commit/90dee10f48d5ffb7da5228b5b86c21aeba28c64d)] 285 | - Bump puppeteer from 19.9.1 to 19.10.0 [[6e3e4de](https://github.com/Tomas2D/puppeteer-table-parser/commit/6e3e4dec05eae90748af5261a16dc4001193264c)] 286 | - Merge pull request [#184](https://github.com/Tomas2D/puppeteer-table-parser/issues/184) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.59.0 [[64bf4d9](https://github.com/Tomas2D/puppeteer-table-parser/commit/64bf4d98f2bf369dafa6d1c7bf9f6c89d77dba46)] 287 | - Merge pull request [#181](https://github.com/Tomas2D/puppeteer-table-parser/issues/181) from Tomas2D/dependabot/npm_and_yarn/lint-staged-13.2.1 [[aae2b49](https://github.com/Tomas2D/puppeteer-table-parser/commit/aae2b49b61182f7a313eaca22217974144b52618)] 288 | - Merge pull request [#183](https://github.com/Tomas2D/puppeteer-table-parser/issues/183) from Tomas2D/dependabot/npm_and_yarn/puppeteer-19.9.1 [[ba4e22e](https://github.com/Tomas2D/puppeteer-table-parser/commit/ba4e22e38ee9717ede67bba6606a620e97cc4fe5)] 289 | - Merge pull request [#185](https://github.com/Tomas2D/puppeteer-table-parser/issues/185) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.59.0 [[1e01517](https://github.com/Tomas2D/puppeteer-table-parser/commit/1e01517656e0c5da698701ec15df12f4af09211d)] 290 | - Merge pull request [#178](https://github.com/Tomas2D/puppeteer-table-parser/issues/178) from Tomas2D/dependabot/npm_and_yarn/eslint-8.38.0 [[45761ca](https://github.com/Tomas2D/puppeteer-table-parser/commit/45761ca103cc1bdde3dd7d73c48c6941e614aa07)] 291 | - Bump @typescript-eslint/eslint-plugin from 5.57.0 to 5.59.0 [[f0a0977](https://github.com/Tomas2D/puppeteer-table-parser/commit/f0a0977c633d32e35048409494257655535a8fac)] 292 | - Bump @typescript-eslint/parser from 5.58.0 to 5.59.0 [[fba25d6](https://github.com/Tomas2D/puppeteer-table-parser/commit/fba25d6152886f385c4dcf7748725c996aa1ffab)] 293 | - Bump puppeteer from 19.8.5 to 19.9.1 [[54b787a](https://github.com/Tomas2D/puppeteer-table-parser/commit/54b787a9157036816823476a2fb671edf71782e8)] 294 | - Bump lint-staged from 13.2.0 to 13.2.1 [[1a5e2a1](https://github.com/Tomas2D/puppeteer-table-parser/commit/1a5e2a1364a3a02217338b93fb22a1c6f553561c)] 295 | - Bump eslint from 8.36.0 to 8.38.0 [[3321362](https://github.com/Tomas2D/puppeteer-table-parser/commit/3321362f9576b2aec1b06abac140e6274664269b)] 296 | - Merge pull request [#172](https://github.com/Tomas2D/puppeteer-table-parser/issues/172) from Tomas2D/dependabot/npm_and_yarn/ts-jest-29.1.0 [[bf468f1](https://github.com/Tomas2D/puppeteer-table-parser/commit/bf468f1277c1a81936a343cc52b30836f349aeaf)] 297 | - Merge pull request [#176](https://github.com/Tomas2D/puppeteer-table-parser/issues/176) from Tomas2D/dependabot/npm_and_yarn/puppeteer-19.8.5 [[2691c1b](https://github.com/Tomas2D/puppeteer-table-parser/commit/2691c1bf5ac22fcbd5738ad450ed7c288e528f6f)] 298 | - Merge pull request [#177](https://github.com/Tomas2D/puppeteer-table-parser/issues/177) from Tomas2D/dependabot/npm_and_yarn/typescript-5.0.4 [[5ecd311](https://github.com/Tomas2D/puppeteer-table-parser/commit/5ecd311729a63e7440c512911c065c65e2ea29d0)] 299 | - Merge pull request [#179](https://github.com/Tomas2D/puppeteer-table-parser/issues/179) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.58.0 [[ed5ba3b](https://github.com/Tomas2D/puppeteer-table-parser/commit/ed5ba3bed3bc6a096499f04f15ac34d762844602)] 300 | - Bump typescript from 4.9.5 to 5.0.4 [[ea70080](https://github.com/Tomas2D/puppeteer-table-parser/commit/ea70080a07ad9ba87423b33e866acddec4b5b7b2)] 301 | - Bump @typescript-eslint/parser from 5.55.0 to 5.58.0 [[7499d60](https://github.com/Tomas2D/puppeteer-table-parser/commit/7499d60009bffca8affef00c617f968242ad2eaf)] 302 | - Bump puppeteer from 19.7.5 to 19.8.5 [[a8ea830](https://github.com/Tomas2D/puppeteer-table-parser/commit/a8ea8307600a1f3588a70ffca84bca6eed2aabab)] 303 | - Bump ts-jest from 29.0.5 to 29.1.0 [[28e024f](https://github.com/Tomas2D/puppeteer-table-parser/commit/28e024fde9c116d50a9b39da764ff6bc01c1ac42)] 304 | - Merge pull request [#168](https://github.com/Tomas2D/puppeteer-table-parser/issues/168) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.57.0 [[cfbf502](https://github.com/Tomas2D/puppeteer-table-parser/commit/cfbf502d868609b2441ede3d1a5ad2e2ab7b18a2)] 305 | - Merge pull request [#167](https://github.com/Tomas2D/puppeteer-table-parser/issues/167) from Tomas2D/dependabot/npm_and_yarn/prettier-2.8.7 [[dee32d5](https://github.com/Tomas2D/puppeteer-table-parser/commit/dee32d5b5001718042b7879e0ead07ee34b70bc5)] 306 | - Merge pull request [#162](https://github.com/Tomas2D/puppeteer-table-parser/issues/162) from Tomas2D/dependabot/npm_and_yarn/tsup-6.7.0 [[1add941](https://github.com/Tomas2D/puppeteer-table-parser/commit/1add941641d1d38d83fe36af43193b51844711eb)] 307 | - Merge pull request [#165](https://github.com/Tomas2D/puppeteer-table-parser/issues/165) from Tomas2D/dependabot/npm_and_yarn/eslint-config-prettier-8.8.0 [[1fc8dc3](https://github.com/Tomas2D/puppeteer-table-parser/commit/1fc8dc36d8f85d73898698f5b07e34019c4f2810)] 308 | - Bump @typescript-eslint/eslint-plugin from 5.54.1 to 5.57.0 [[e88082c](https://github.com/Tomas2D/puppeteer-table-parser/commit/e88082ca45b3c2ba0be302203ab72f396da7059f)] 309 | - Bump prettier from 2.8.4 to 2.8.7 [[46e2585](https://github.com/Tomas2D/puppeteer-table-parser/commit/46e2585b5d8e64436c659ebd743e339105ad36aa)] 310 | - Bump eslint-config-prettier from 8.7.0 to 8.8.0 [[7ab3c38](https://github.com/Tomas2D/puppeteer-table-parser/commit/7ab3c386210812bd9a24e8c994d914e3c207b167)] 311 | - Bump tsup from 6.6.3 to 6.7.0 [[8646f68](https://github.com/Tomas2D/puppeteer-table-parser/commit/8646f68f10a1a263b0e9e842cf2fb4ec4d7ce40f)] 312 | - Merge pull request [#153](https://github.com/Tomas2D/puppeteer-table-parser/issues/153) from Tomas2D/dependabot/npm_and_yarn/eslint-8.36.0 [[cbe9fbc](https://github.com/Tomas2D/puppeteer-table-parser/commit/cbe9fbc9ba0e79b146ad524b1b5d3067ed239985)] 313 | - Merge pull request [#154](https://github.com/Tomas2D/puppeteer-table-parser/issues/154) from Tomas2D/dependabot/npm_and_yarn/lint-staged-13.2.0 [[e870c75](https://github.com/Tomas2D/puppeteer-table-parser/commit/e870c75b659552f325403a0e2fc6ad0a211f4649)] 314 | - Merge pull request [#158](https://github.com/Tomas2D/puppeteer-table-parser/issues/158) from Tomas2D/dependabot/npm_and_yarn/puppeteer-19.7.5 [[4446626](https://github.com/Tomas2D/puppeteer-table-parser/commit/44466266d9ed9e70c13a8a1f2455f58f66509b92)] 315 | - Merge pull request [#160](https://github.com/Tomas2D/puppeteer-table-parser/issues/160) from Tomas2D/dependabot/npm_and_yarn/types/jest-29.5.0 [[7f53573](https://github.com/Tomas2D/puppeteer-table-parser/commit/7f53573f225118ba949da7b93b746597ab8fb41d)] 316 | - Merge pull request [#152](https://github.com/Tomas2D/puppeteer-table-parser/issues/152) from Tomas2D/dependabot/npm_and_yarn/eslint-config-prettier-8.7.0 [[67059f6](https://github.com/Tomas2D/puppeteer-table-parser/commit/67059f6476ceb38e0d864c662f7d89d882e12ccd)] 317 | - Bump @types/jest from 29.4.0 to 29.5.0 [[d9564bf](https://github.com/Tomas2D/puppeteer-table-parser/commit/d9564bf0164ffde5e84988a6122492ccea65b91d)] 318 | - Bump puppeteer from 19.7.3 to 19.7.5 [[9774e90](https://github.com/Tomas2D/puppeteer-table-parser/commit/9774e906e94927eb8bf3b48f086f78f3f5a0b47e)] 319 | - Merge pull request [#156](https://github.com/Tomas2D/puppeteer-table-parser/issues/156) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.55.0 [[40cc526](https://github.com/Tomas2D/puppeteer-table-parser/commit/40cc526ed95cdd098d0212e8e9a35c5a3fcaa8c2)] 320 | - Bump eslint from 8.35.0 to 8.36.0 [[b15e071](https://github.com/Tomas2D/puppeteer-table-parser/commit/b15e07128b1bf3c091f027e50a1d643947977d15)] 321 | - Bump @typescript-eslint/parser from 5.53.0 to 5.55.0 [[13dd152](https://github.com/Tomas2D/puppeteer-table-parser/commit/13dd152ba123fa21ffbc7147bb40149dd88f3bdc)] 322 | - Bump lint-staged from 13.1.2 to 13.2.0 [[04b9649](https://github.com/Tomas2D/puppeteer-table-parser/commit/04b9649130395414747a36914ed550cbeef29d86)] 323 | - Bump eslint-config-prettier from 8.6.0 to 8.7.0 [[59611e9](https://github.com/Tomas2D/puppeteer-table-parser/commit/59611e9f38115764a31b834282937c8fefcfe68d)] 324 | - Merge pull request [#144](https://github.com/Tomas2D/puppeteer-table-parser/issues/144) from Tomas2D/dependabot/npm_and_yarn/eslint-8.35.0 [[c0a557d](https://github.com/Tomas2D/puppeteer-table-parser/commit/c0a557df2686b7e7386b408f754af896e7237a5d)] 325 | - Merge pull request [#148](https://github.com/Tomas2D/puppeteer-table-parser/issues/148) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.54.1 [[2d6bcd1](https://github.com/Tomas2D/puppeteer-table-parser/commit/2d6bcd1733c138808cef076f78595c355acf3a66)] 326 | - Merge pull request [#149](https://github.com/Tomas2D/puppeteer-table-parser/issues/149) from Tomas2D/dependabot/npm_and_yarn/puppeteer-19.7.3 [[7327e75](https://github.com/Tomas2D/puppeteer-table-parser/commit/7327e75e99bec312db55d49325bcb3159a1d4375)] 327 | - Merge pull request [#150](https://github.com/Tomas2D/puppeteer-table-parser/issues/150) from Tomas2D/dependabot/npm_and_yarn/jest-29.5.0 [[18eb051](https://github.com/Tomas2D/puppeteer-table-parser/commit/18eb051ab90f71df10cb08efa240a73391c53758)] 328 | - Merge pull request [#137](https://github.com/Tomas2D/puppeteer-table-parser/issues/137) from Tomas2D/dependabot/npm_and_yarn/lint-staged-13.1.2 [[f24b1b3](https://github.com/Tomas2D/puppeteer-table-parser/commit/f24b1b33f6b6527806a18d033999c8da4d30eb99)] 329 | - Bump jest from 29.4.1 to 29.5.0 [[4095889](https://github.com/Tomas2D/puppeteer-table-parser/commit/4095889c2feb4a17463ffdb4c9942ed7648c8af5)] 330 | - Bump puppeteer from 19.7.1 to 19.7.3 [[126a914](https://github.com/Tomas2D/puppeteer-table-parser/commit/126a914cd705fe9a406c437f907de74d0dc123b2)] 331 | - Bump @typescript-eslint/eslint-plugin from 5.54.0 to 5.54.1 [[0d57798](https://github.com/Tomas2D/puppeteer-table-parser/commit/0d577989d1e2c4557ec0d05ed090f8f2c339db96)] 332 | - Merge pull request [#147](https://github.com/Tomas2D/puppeteer-table-parser/issues/147) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.54.0 [[7d2b08f](https://github.com/Tomas2D/puppeteer-table-parser/commit/7d2b08f480c7a4a7aea388692840a464d42fe528)] 333 | - Bump eslint from 8.33.0 to 8.35.0 [[984b608](https://github.com/Tomas2D/puppeteer-table-parser/commit/984b60865a2d4903f47148a8b90f170ff8786333)] 334 | - Bump @typescript-eslint/eslint-plugin from 5.51.0 to 5.54.0 [[570d7cf](https://github.com/Tomas2D/puppeteer-table-parser/commit/570d7cf4f0d562ef692c53080897791dbe0c0fe7)] 335 | - Merge pull request [#142](https://github.com/Tomas2D/puppeteer-table-parser/issues/142) from Tomas2D/dependabot/npm_and_yarn/tsup-6.6.3 [[ab9f174](https://github.com/Tomas2D/puppeteer-table-parser/commit/ab9f174c148dae854298ee4e8af47bb9326ea5f3)] 336 | - Merge pull request [#143](https://github.com/Tomas2D/puppeteer-table-parser/issues/143) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.53.0 [[3bbf89f](https://github.com/Tomas2D/puppeteer-table-parser/commit/3bbf89f971188d2314b2b49f72b8300d19f08234)] 337 | - Bump @typescript-eslint/parser from 5.51.0 to 5.53.0 [[6d471da](https://github.com/Tomas2D/puppeteer-table-parser/commit/6d471da44f486cf60527a6f66959a64773270fae)] 338 | - Bump tsup from 6.6.2 to 6.6.3 [[f13cee4](https://github.com/Tomas2D/puppeteer-table-parser/commit/f13cee444ce1622dc183bdab569f11c702eae4aa)] 339 | - Merge pull request [#140](https://github.com/Tomas2D/puppeteer-table-parser/issues/140) from Tomas2D/dependabot/npm_and_yarn/puppeteer-19.7.1 [[aa7b892](https://github.com/Tomas2D/puppeteer-table-parser/commit/aa7b892763365b9628402b088897078143a7839c)] 340 | - Bump puppeteer from 19.6.2 to 19.7.1 [[0d6b446](https://github.com/Tomas2D/puppeteer-table-parser/commit/0d6b446eac7dae38710a5e4b8afb3b67e7667cde)] 341 | - Bump lint-staged from 13.1.0 to 13.1.2 [[7cacb6b](https://github.com/Tomas2D/puppeteer-table-parser/commit/7cacb6bf6183275fa568ca10be14ca5da96e7573)] 342 | - Merge pull request [#135](https://github.com/Tomas2D/puppeteer-table-parser/issues/135) from Tomas2D/dependabot/npm_and_yarn/tsup-6.6.2 [[a86c095](https://github.com/Tomas2D/puppeteer-table-parser/commit/a86c09577c0564a2e838711a566282e118e1e333)] 343 | - Bump tsup from 6.5.0 to 6.6.2 [[781bf71](https://github.com/Tomas2D/puppeteer-table-parser/commit/781bf717a2265cb6d77a48e4c790c8e558974cf8)] 344 | - Merge pull request [#134](https://github.com/Tomas2D/puppeteer-table-parser/issues/134) from Tomas2D/dependabot/npm_and_yarn/prettier-2.8.4 [[fbf8068](https://github.com/Tomas2D/puppeteer-table-parser/commit/fbf806816987c87a790a23f898ab66d52cf277f9)] 345 | - Bump prettier from 2.8.3 to 2.8.4 [[6fdf265](https://github.com/Tomas2D/puppeteer-table-parser/commit/6fdf265d4934e8d3a58aba3b547423cc4a50eea6)] 346 | - Merge pull request [#130](https://github.com/Tomas2D/puppeteer-table-parser/issues/130) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.51.0 [[ce591f0](https://github.com/Tomas2D/puppeteer-table-parser/commit/ce591f0020550e6f244d5ee6e646faedee41a262)] 347 | - Merge pull request [#128](https://github.com/Tomas2D/puppeteer-table-parser/issues/128) from Tomas2D/dependabot/npm_and_yarn/types/express-4.17.17 [[d513122](https://github.com/Tomas2D/puppeteer-table-parser/commit/d513122ba44ac96f7f4c61c7b4eb9dbc4573358d)] 348 | - Merge pull request [#129](https://github.com/Tomas2D/puppeteer-table-parser/issues/129) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.51.0 [[e5d1755](https://github.com/Tomas2D/puppeteer-table-parser/commit/e5d1755223a010745b778dafa99cd679d2a7ba83)] 349 | - Bump @typescript-eslint/eslint-plugin from 5.50.0 to 5.51.0 [[2f6e8cd](https://github.com/Tomas2D/puppeteer-table-parser/commit/2f6e8cd894e7bd6642716dfa6fb2848d25d3fa47)] 350 | - Bump @typescript-eslint/parser from 5.50.0 to 5.51.0 [[42e5a0a](https://github.com/Tomas2D/puppeteer-table-parser/commit/42e5a0a0195c3516dd532d70e8928c143c5d3707)] 351 | - Bump @types/express from 4.17.16 to 4.17.17 [[10fd828](https://github.com/Tomas2D/puppeteer-table-parser/commit/10fd8280d7c0a1354b88dc4975283bce6f5615fc)] 352 | - Merge pull request [#122](https://github.com/Tomas2D/puppeteer-table-parser/issues/122) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.50.0 [[30ec48d](https://github.com/Tomas2D/puppeteer-table-parser/commit/30ec48d32e9b66912cfffcf9272235b71d958666)] 353 | - Merge pull request [#123](https://github.com/Tomas2D/puppeteer-table-parser/issues/123) from Tomas2D/dependabot/npm_and_yarn/jest-29.4.1 [[00404db](https://github.com/Tomas2D/puppeteer-table-parser/commit/00404db123b3d2f6969c141c04212c4ee74b8826)] 354 | - Merge pull request [#124](https://github.com/Tomas2D/puppeteer-table-parser/issues/124) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.50.0 [[1bb6115](https://github.com/Tomas2D/puppeteer-table-parser/commit/1bb6115d6876987be69df601b9efc8a9320080bf)] 355 | - Merge pull request [#126](https://github.com/Tomas2D/puppeteer-table-parser/issues/126) from Tomas2D/dependabot/npm_and_yarn/eslint-8.33.0 [[acfe17a](https://github.com/Tomas2D/puppeteer-table-parser/commit/acfe17a0d51c80f2fd754b33e785551f9974f153)] 356 | - Merge pull request [#125](https://github.com/Tomas2D/puppeteer-table-parser/issues/125) from Tomas2D/dependabot/npm_and_yarn/typescript-4.9.5 [[fc0be27](https://github.com/Tomas2D/puppeteer-table-parser/commit/fc0be2795ed404019bd9bc1a898843ecb94a6fd3)] 357 | - Bump @typescript-eslint/parser from 5.48.2 to 5.50.0 [[eb5e94e](https://github.com/Tomas2D/puppeteer-table-parser/commit/eb5e94e08644c490a9ac025c47659c9477fdc8ac)] 358 | - Bump eslint from 8.32.0 to 8.33.0 [[431cf1f](https://github.com/Tomas2D/puppeteer-table-parser/commit/431cf1fa1c98ca04b4fc83b4c0fc3445a17b30ee)] 359 | - Bump typescript from 4.9.4 to 4.9.5 [[9dae91c](https://github.com/Tomas2D/puppeteer-table-parser/commit/9dae91cfdfdd6a5500cd7efb4d5eca7b235dc26d)] 360 | - Bump @typescript-eslint/eslint-plugin from 5.49.0 to 5.50.0 [[a0ca152](https://github.com/Tomas2D/puppeteer-table-parser/commit/a0ca152d00d47499949944c31f968058b89f9e48)] 361 | - Bump jest from 29.4.0 to 29.4.1 [[ff26082](https://github.com/Tomas2D/puppeteer-table-parser/commit/ff2608262dfdd0db7b3834ad56e33edc02b38750)] 362 | - Merge pull request [#116](https://github.com/Tomas2D/puppeteer-table-parser/issues/116) from Tomas2D/dependabot/npm_and_yarn/types/express-4.17.16 [[59fe49b](https://github.com/Tomas2D/puppeteer-table-parser/commit/59fe49b807b72dfa5747fa17c49730f5a428de5e)] 363 | - Merge pull request [#117](https://github.com/Tomas2D/puppeteer-table-parser/issues/117) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.49.0 [[5d8cc6d](https://github.com/Tomas2D/puppeteer-table-parser/commit/5d8cc6de012b56498f17f8d959cd0d8439ad140e)] 364 | - Merge pull request [#119](https://github.com/Tomas2D/puppeteer-table-parser/issues/119) from Tomas2D/dependabot/npm_and_yarn/types/jest-29.4.0 [[023f078](https://github.com/Tomas2D/puppeteer-table-parser/commit/023f078d488f02b7fa055659de76d3e758764b9a)] 365 | - Merge pull request [#121](https://github.com/Tomas2D/puppeteer-table-parser/issues/121) from Tomas2D/dependabot/npm_and_yarn/puppeteer-19.6.2 [[a84ea0a](https://github.com/Tomas2D/puppeteer-table-parser/commit/a84ea0a09d039c005cac6c630d6c02bdc93fe5ed)] 366 | - Bump puppeteer from 19.5.2 to 19.6.2 [[8d92a52](https://github.com/Tomas2D/puppeteer-table-parser/commit/8d92a5292bc72afa0c247be58a08a02d81a420ba)] 367 | - Bump @types/jest from 29.2.6 to 29.4.0 [[ae4524b](https://github.com/Tomas2D/puppeteer-table-parser/commit/ae4524b878f10c04c149d975230f7a97faff1e8e)] 368 | - Merge pull request [#118](https://github.com/Tomas2D/puppeteer-table-parser/issues/118) from Tomas2D/dependabot/npm_and_yarn/jest-29.4.0 [[878fbcf](https://github.com/Tomas2D/puppeteer-table-parser/commit/878fbcf2f5fcfbfac74a1640280ed0fca40d5545)] 369 | - Bump jest from 29.3.1 to 29.4.0 [[4abdcde](https://github.com/Tomas2D/puppeteer-table-parser/commit/4abdcdef8d24ff2da4804e542a68d1a0ffef80ec)] 370 | - Bump @typescript-eslint/eslint-plugin from 5.48.1 to 5.49.0 [[e434f17](https://github.com/Tomas2D/puppeteer-table-parser/commit/e434f1793cc20a967cdedbcd9ed516e0c1c4923d)] 371 | - Bump @types/express from 4.17.15 to 4.17.16 [[ecc9790](https://github.com/Tomas2D/puppeteer-table-parser/commit/ecc9790ae271ab5aa7628c256b74a35c09db7695)] 372 | - Merge pull request [#107](https://github.com/Tomas2D/puppeteer-table-parser/issues/107) from Tomas2D/dependabot/npm_and_yarn/puppeteer-19.5.2 [[fcfe1f1](https://github.com/Tomas2D/puppeteer-table-parser/commit/fcfe1f1c18920d67162786323d54082671eb91f7)] 373 | - Merge pull request [#108](https://github.com/Tomas2D/puppeteer-table-parser/issues/108) from Tomas2D/dependabot/npm_and_yarn/eslint-8.32.0 [[e599154](https://github.com/Tomas2D/puppeteer-table-parser/commit/e599154846200e23cd5819c0f6fb135e473a65ad)] 374 | - Merge pull request [#109](https://github.com/Tomas2D/puppeteer-table-parser/issues/109) from Tomas2D/dependabot/npm_and_yarn/prettier-2.8.3 [[224181b](https://github.com/Tomas2D/puppeteer-table-parser/commit/224181b6c9c1b68a3e535c5a7e973a93c780b462)] 375 | - Merge pull request [#110](https://github.com/Tomas2D/puppeteer-table-parser/issues/110) from Tomas2D/dependabot/npm_and_yarn/ts-jest-29.0.5 [[3226067](https://github.com/Tomas2D/puppeteer-table-parser/commit/3226067f72caacf5112044c1135e93dbdaae8a0c)] 376 | - Merge pull request [#112](https://github.com/Tomas2D/puppeteer-table-parser/issues/112) from Tomas2D/dependabot/npm_and_yarn/types/jest-29.2.6 [[ac76a25](https://github.com/Tomas2D/puppeteer-table-parser/commit/ac76a2528a466bb33978577b41e2d7fde32bb26d)] 377 | - Bump @types/jest from 29.2.5 to 29.2.6 [[b1a362b](https://github.com/Tomas2D/puppeteer-table-parser/commit/b1a362bfe8416ec490f06f9207d2cafdeec162ce)] 378 | - Merge pull request [#111](https://github.com/Tomas2D/puppeteer-table-parser/issues/111) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.48.2 [[7814755](https://github.com/Tomas2D/puppeteer-table-parser/commit/781475509aa0c3faffe920700b5e7d2b0561b778)] 379 | - Bump eslint from 8.31.0 to 8.32.0 [[79e8217](https://github.com/Tomas2D/puppeteer-table-parser/commit/79e821787f8f3f27271418426eae2f38b3e94f3c)] 380 | - Bump @typescript-eslint/parser from 5.48.1 to 5.48.2 [[60b5d6a](https://github.com/Tomas2D/puppeteer-table-parser/commit/60b5d6a078762516f88031bc8a7814d441779cee)] 381 | - Bump ts-jest from 29.0.3 to 29.0.5 [[ba90990](https://github.com/Tomas2D/puppeteer-table-parser/commit/ba90990d7c526a203cc8359e12d8f133e661c82d)] 382 | - Bump prettier from 2.8.2 to 2.8.3 [[d79a29b](https://github.com/Tomas2D/puppeteer-table-parser/commit/d79a29b954b800a643edbf96f72974339e5513bd)] 383 | - Bump puppeteer from 19.5.0 to 19.5.2 [[5eba3f6](https://github.com/Tomas2D/puppeteer-table-parser/commit/5eba3f6d17cbd633c538860077ffb68e2436a538)] 384 | - Merge pull request [#102](https://github.com/Tomas2D/puppeteer-table-parser/issues/102) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.48.1 [[2e06153](https://github.com/Tomas2D/puppeteer-table-parser/commit/2e0615382f899bead7d40f4aa31f70a1171795d5)] 385 | - Merge pull request [#104](https://github.com/Tomas2D/puppeteer-table-parser/issues/104) from Tomas2D/dependabot/npm_and_yarn/puppeteer-19.5.0 [[894ad4f](https://github.com/Tomas2D/puppeteer-table-parser/commit/894ad4f63468b4f87354f64082040bce843dcded)] 386 | - Merge pull request [#103](https://github.com/Tomas2D/puppeteer-table-parser/issues/103) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.48.1 [[65a8e8d](https://github.com/Tomas2D/puppeteer-table-parser/commit/65a8e8d7e6f46c3ec1bf68dbe1696c11928d1c33)] 387 | - Bump @typescript-eslint/parser from 5.47.1 to 5.48.1 [[4136864](https://github.com/Tomas2D/puppeteer-table-parser/commit/4136864f74111084637d4934a7aee73a4d6a3b72)] 388 | - Bump puppeteer from 19.4.1 to 19.5.0 [[f8b49b7](https://github.com/Tomas2D/puppeteer-table-parser/commit/f8b49b7358ae7bce9bbd5c43d97e086011b2353e)] 389 | - Bump @typescript-eslint/eslint-plugin from 5.48.0 to 5.48.1 [[256fff2](https://github.com/Tomas2D/puppeteer-table-parser/commit/256fff2abd19242669802f2cb962d2c19cb3f77f)] 390 | - Merge pull request [#101](https://github.com/Tomas2D/puppeteer-table-parser/issues/101) from Tomas2D/dependabot/npm_and_yarn/prettier-2.8.2 [[cea8a2b](https://github.com/Tomas2D/puppeteer-table-parser/commit/cea8a2b16990728e26a9666a21ce00b2460b223b)] 391 | - Bump prettier from 2.8.1 to 2.8.2 [[1228ecf](https://github.com/Tomas2D/puppeteer-table-parser/commit/1228ecff290d9e03b44931b117a57c70d616b231)] 392 | - Merge pull request [#98](https://github.com/Tomas2D/puppeteer-table-parser/issues/98) from Tomas2D/dependabot/npm_and_yarn/eslint-config-prettier-8.6.0 [[58240f2](https://github.com/Tomas2D/puppeteer-table-parser/commit/58240f2f1bd546e1c958e3d575442b7daa970e3d)] 393 | - Merge pull request [#97](https://github.com/Tomas2D/puppeteer-table-parser/issues/97) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.48.0 [[d856ba0](https://github.com/Tomas2D/puppeteer-table-parser/commit/d856ba07a6f30a806ff1201d52fc3cea8524c4b7)] 394 | - Merge pull request [#100](https://github.com/Tomas2D/puppeteer-table-parser/issues/100) from Tomas2D/dependabot/npm_and_yarn/husky-8.0.3 [[adaa711](https://github.com/Tomas2D/puppeteer-table-parser/commit/adaa71166cb411b309aa536451a3d1791bba278b)] 395 | - Bump husky from 8.0.2 to 8.0.3 [[22f0b5d](https://github.com/Tomas2D/puppeteer-table-parser/commit/22f0b5dcd3de13dc346629782fc32772d1a41ac5)] 396 | - Bump eslint-config-prettier from 8.5.0 to 8.6.0 [[1f493e8](https://github.com/Tomas2D/puppeteer-table-parser/commit/1f493e8d0dffa80c6c46aad622d2fc9e4cc975ae)] 397 | - Bump @typescript-eslint/eslint-plugin from 5.47.1 to 5.48.0 [[9217e37](https://github.com/Tomas2D/puppeteer-table-parser/commit/9217e37237577393e6c9f65b589a7428a07b07f2)] 398 | - Merge pull request [#96](https://github.com/Tomas2D/puppeteer-table-parser/issues/96) from Tomas2D/dependabot/npm_and_yarn/types/jest-29.2.5 [[b122094](https://github.com/Tomas2D/puppeteer-table-parser/commit/b1220942a7c4121507e6eb0a61ea098b53f5ecb1)] 399 | - Merge pull request [#95](https://github.com/Tomas2D/puppeteer-table-parser/issues/95) from Tomas2D/dependabot/npm_and_yarn/eslint-8.31.0 [[1eb88b4](https://github.com/Tomas2D/puppeteer-table-parser/commit/1eb88b43ade4fec40e35029f27bd6e2e4edb6a95)] 400 | - Bump @types/jest from 29.2.4 to 29.2.5 [[8c7eb48](https://github.com/Tomas2D/puppeteer-table-parser/commit/8c7eb480e652229661cfd7a89f1bbf6af9aacb6e)] 401 | - Bump eslint from 8.30.0 to 8.31.0 [[a51d858](https://github.com/Tomas2D/puppeteer-table-parser/commit/a51d8587a1b2cbeb48cedd8b89913ef92b6a8f5a)] 402 | - Merge pull request [#92](https://github.com/Tomas2D/puppeteer-table-parser/issues/92) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.47.1 [[359452f](https://github.com/Tomas2D/puppeteer-table-parser/commit/359452f4b57041d414d8ff4a10d341053a8810b2)] 403 | - Merge pull request [#94](https://github.com/Tomas2D/puppeteer-table-parser/issues/94) from Tomas2D/dependabot/npm_and_yarn/json5-2.2.3 [[7f9e6dd](https://github.com/Tomas2D/puppeteer-table-parser/commit/7f9e6dd2ed43bb370ea5a22a0a4adc40e567e236)] 404 | - Merge pull request [#93](https://github.com/Tomas2D/puppeteer-table-parser/issues/93) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.47.1 [[811c849](https://github.com/Tomas2D/puppeteer-table-parser/commit/811c849e7f6f40081a555bebc6403ffae64bd958)] 405 | - Bump @typescript-eslint/parser from 5.47.0 to 5.47.1 [[3739c19](https://github.com/Tomas2D/puppeteer-table-parser/commit/3739c19ef3b1205391ee7102f43d7fba4bb89fdf)] 406 | - Bump json5 from 2.2.1 to 2.2.3 [[eb2c2f1](https://github.com/Tomas2D/puppeteer-table-parser/commit/eb2c2f10ca8ee85fcb0c8741c67eae33df4d4a82)] 407 | - Bump @typescript-eslint/eslint-plugin from 5.46.1 to 5.47.1 [[cf6d238](https://github.com/Tomas2D/puppeteer-table-parser/commit/cf6d2385da2efa342be847e75f17dd17edbe8e8d)] 408 | - Merge pull request [#80](https://github.com/Tomas2D/puppeteer-table-parser/issues/80) from Tomas2D/dependabot/npm_and_yarn/prettier-2.8.1 [[92b7fe4](https://github.com/Tomas2D/puppeteer-table-parser/commit/92b7fe455bb036a1060a9fcdaeae3a929d7af6f8)] 409 | - Merge pull request [#88](https://github.com/Tomas2D/puppeteer-table-parser/issues/88) from Tomas2D/dependabot/npm_and_yarn/eslint-8.30.0 [[e598496](https://github.com/Tomas2D/puppeteer-table-parser/commit/e598496f4dfedc2d138f36ebabcc1e798a02b498)] 410 | - Merge pull request [#89](https://github.com/Tomas2D/puppeteer-table-parser/issues/89) from Tomas2D/dependabot/npm_and_yarn/puppeteer-19.4.1 [[7feefda](https://github.com/Tomas2D/puppeteer-table-parser/commit/7feefda68c940ef44227829fb1231f57a2eb1acf)] 411 | - Merge pull request [#90](https://github.com/Tomas2D/puppeteer-table-parser/issues/90) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.47.0 [[10c7c47](https://github.com/Tomas2D/puppeteer-table-parser/commit/10c7c47e794e2c72d80f19517ae48a7d6a95dc0a)] 412 | - Merge pull request [#78](https://github.com/Tomas2D/puppeteer-table-parser/issues/78) from Tomas2D/dependabot/npm_and_yarn/types/jest-29.2.4 [[53c3fd1](https://github.com/Tomas2D/puppeteer-table-parser/commit/53c3fd100c882fdae9c124bf8413a65c5bb72a04)] 413 | - Bump @typescript-eslint/parser from 5.46.1 to 5.47.0 [[b7b82e8](https://github.com/Tomas2D/puppeteer-table-parser/commit/b7b82e8ba7be3e40d40a02b433cb78dccf9679c5)] 414 | - Bump puppeteer from 19.3.0 to 19.4.1 [[4c1c9ec](https://github.com/Tomas2D/puppeteer-table-parser/commit/4c1c9ec1e2f90d658697ab8cd1e4bfd4d87ed89b)] 415 | - Bump eslint from 8.29.0 to 8.30.0 [[c07d36d](https://github.com/Tomas2D/puppeteer-table-parser/commit/c07d36d3eda7909c193da460e34f1590c948bada)] 416 | - Merge pull request [#86](https://github.com/Tomas2D/puppeteer-table-parser/issues/86) from Tomas2D/dependabot/npm_and_yarn/types/express-4.17.15 [[6269676](https://github.com/Tomas2D/puppeteer-table-parser/commit/6269676b1a4f72506c17a2840608f6ca8c227b05)] 417 | - Merge pull request [#87](https://github.com/Tomas2D/puppeteer-table-parser/issues/87) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.46.1 [[ce919b0](https://github.com/Tomas2D/puppeteer-table-parser/commit/ce919b07f7d182ae837d7a4ce709b5cd7c027d8a)] 418 | - Bump @typescript-eslint/eslint-plugin from 5.46.0 to 5.46.1 [[873b568](https://github.com/Tomas2D/puppeteer-table-parser/commit/873b568d79448854a6365e45bbf50c28be2fbb98)] 419 | - Bump @types/express from 4.17.14 to 4.17.15 [[65ba673](https://github.com/Tomas2D/puppeteer-table-parser/commit/65ba67357f2e2303e8f738b89e6c764ced6d5168)] 420 | - Merge pull request [#85](https://github.com/Tomas2D/puppeteer-table-parser/issues/85) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.46.1 [[47a4630](https://github.com/Tomas2D/puppeteer-table-parser/commit/47a46302ae2954d1b4b2a431003631128625e22e)] 421 | - Merge pull request [#84](https://github.com/Tomas2D/puppeteer-table-parser/issues/84) from Tomas2D/dependabot/npm_and_yarn/typescript-4.9.4 [[31c26ce](https://github.com/Tomas2D/puppeteer-table-parser/commit/31c26ce00ad8a5fffaac40f10d4cd8ee92172a33)] 422 | - Bump @typescript-eslint/parser from 5.46.0 to 5.46.1 [[c822fd9](https://github.com/Tomas2D/puppeteer-table-parser/commit/c822fd9b976c017da12054cd4fb99783b485a96f)] 423 | - Bump typescript from 4.9.3 to 4.9.4 [[a3cf5a3](https://github.com/Tomas2D/puppeteer-table-parser/commit/a3cf5a34d6a0bc0bd81e1bdf62fdc8b9e6489fc0)] 424 | - Merge pull request [#82](https://github.com/Tomas2D/puppeteer-table-parser/issues/82) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.46.0 [[6e108c2](https://github.com/Tomas2D/puppeteer-table-parser/commit/6e108c2f8c64eda6c6b8085b325a9da26571d715)] 425 | - Merge pull request [#83](https://github.com/Tomas2D/puppeteer-table-parser/issues/83) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.46.0 [[0fc6fd8](https://github.com/Tomas2D/puppeteer-table-parser/commit/0fc6fd8b3c518f067f0597cca905a1593f0b5237)] 426 | - Bump @typescript-eslint/parser from 5.45.0 to 5.46.0 [[d3e9932](https://github.com/Tomas2D/puppeteer-table-parser/commit/d3e9932ff4fe324f98e0d7b5e2649225bf2b39b1)] 427 | - Bump @typescript-eslint/eslint-plugin from 5.45.0 to 5.46.0 [[3222258](https://github.com/Tomas2D/puppeteer-table-parser/commit/32222589243830b8e5b15fc3e21786217dde26d0)] 428 | - Bump prettier from 2.8.0 to 2.8.1 [[10dee08](https://github.com/Tomas2D/puppeteer-table-parser/commit/10dee083318fd15c9643b72eef7e45bc6945afb8)] 429 | - Merge pull request [#75](https://github.com/Tomas2D/puppeteer-table-parser/issues/75) from Tomas2D/dependabot/npm_and_yarn/lint-staged-13.1.0 [[bc3d0d0](https://github.com/Tomas2D/puppeteer-table-parser/commit/bc3d0d090a58c722831129b7067b2e25d2aae773)] 430 | - Merge pull request [#76](https://github.com/Tomas2D/puppeteer-table-parser/issues/76) from Tomas2D/dependabot/npm_and_yarn/eslint-8.29.0 [[c3aab0c](https://github.com/Tomas2D/puppeteer-table-parser/commit/c3aab0c139cb3a7487ae7b8e41f5687a98f08063)] 431 | - Bump @types/jest from 29.2.3 to 29.2.4 [[648d3b4](https://github.com/Tomas2D/puppeteer-table-parser/commit/648d3b40d0a8365691a9cc47c2e9db1b7635b253)] 432 | - Bump eslint from 8.28.0 to 8.29.0 [[74bd30d](https://github.com/Tomas2D/puppeteer-table-parser/commit/74bd30d16d5182aa48d72a047e6fb928d76b0806)] 433 | - Bump lint-staged from 13.0.4 to 13.1.0 [[75a60bd](https://github.com/Tomas2D/puppeteer-table-parser/commit/75a60bda126658771a6fa590570f9cec52d6f6fe)] 434 | - Merge pull request [#73](https://github.com/Tomas2D/puppeteer-table-parser/issues/73) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.45.0 [[52fe60a](https://github.com/Tomas2D/puppeteer-table-parser/commit/52fe60a215aaa0d238a3ee3f46e8d4e0dabc13b1)] 435 | - Merge pull request [#74](https://github.com/Tomas2D/puppeteer-table-parser/issues/74) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.45.0 [[5090bd1](https://github.com/Tomas2D/puppeteer-table-parser/commit/5090bd107db0b034698322b67f66bb8f817e872c)] 436 | - Bump @typescript-eslint/parser from 5.44.0 to 5.45.0 [[505dd1f](https://github.com/Tomas2D/puppeteer-table-parser/commit/505dd1f1c5538821e659517273b11d3730548390)] 437 | - Bump @typescript-eslint/eslint-plugin from 5.44.0 to 5.45.0 [[1af8f3a](https://github.com/Tomas2D/puppeteer-table-parser/commit/1af8f3ae93165aa98a724c2f307fce7900a55253)] 438 | - Merge pull request [#72](https://github.com/Tomas2D/puppeteer-table-parser/issues/72) from Tomas2D/dependabot/npm_and_yarn/puppeteer-19.3.0 [[984b442](https://github.com/Tomas2D/puppeteer-table-parser/commit/984b442806eb2183c226b24c7cdc403648c11ab4)] 439 | - Merge pull request [#71](https://github.com/Tomas2D/puppeteer-table-parser/issues/71) from Tomas2D/dependabot/npm_and_yarn/prettier-2.8.0 [[aace2cd](https://github.com/Tomas2D/puppeteer-table-parser/commit/aace2cd2d6e5fe4a6f24fda399aefcb27f498ec6)] 440 | - Bump puppeteer from 19.2.2 to 19.3.0 [[bc707ac](https://github.com/Tomas2D/puppeteer-table-parser/commit/bc707ac9f8e0c1ac63e3d908ea0ea883e574560c)] 441 | - Bump prettier from 2.7.1 to 2.8.0 [[d8e3697](https://github.com/Tomas2D/puppeteer-table-parser/commit/d8e36974daf019c4e4a1b8daf7d237bb8b7b7255)] 442 | - Merge pull request [#69](https://github.com/Tomas2D/puppeteer-table-parser/issues/69) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.44.0 [[408adc5](https://github.com/Tomas2D/puppeteer-table-parser/commit/408adc5184273aee27a18def01ccf7eecae6e85b)] 443 | - Merge pull request [#70](https://github.com/Tomas2D/puppeteer-table-parser/issues/70) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.44.0 [[7065d06](https://github.com/Tomas2D/puppeteer-table-parser/commit/7065d0679947628bf2d2a4931e3be97a2d27a59d)] 444 | - Bump @typescript-eslint/parser from 5.43.0 to 5.44.0 [[9c3bf9d](https://github.com/Tomas2D/puppeteer-table-parser/commit/9c3bf9dd3e4685f9d4dd2a35763275de2efedba6)] 445 | - Bump @typescript-eslint/eslint-plugin from 5.43.0 to 5.44.0 [[4c6e499](https://github.com/Tomas2D/puppeteer-table-parser/commit/4c6e49946f599e5dec6c51ffa23d3baac7b3b693)] 446 | - Merge pull request [#68](https://github.com/Tomas2D/puppeteer-table-parser/issues/68) from Tomas2D/dependabot/npm_and_yarn/eslint-8.28.0 [[e7c2fe3](https://github.com/Tomas2D/puppeteer-table-parser/commit/e7c2fe3016b7adefcd257918cd84bbeb88ee5a72)] 447 | - Bump eslint from 8.27.0 to 8.28.0 [[f7291d2](https://github.com/Tomas2D/puppeteer-table-parser/commit/f7291d2e2743f68110885bd1b957118ed513ab80)] 448 | - Merge pull request [#64](https://github.com/Tomas2D/puppeteer-table-parser/issues/64) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.43.0 [[1cd7231](https://github.com/Tomas2D/puppeteer-table-parser/commit/1cd723109153d07c4a8b95fdb8090b070089c9fd)] 449 | - Merge pull request [#67](https://github.com/Tomas2D/puppeteer-table-parser/issues/67) from Tomas2D/dependabot/npm_and_yarn/typescript-4.9.3 [[9113a1c](https://github.com/Tomas2D/puppeteer-table-parser/commit/9113a1cad82d4d3936f93056424f061ed9881665)] 450 | - Bump typescript from 4.8.4 to 4.9.3 [[6da5d9a](https://github.com/Tomas2D/puppeteer-table-parser/commit/6da5d9a1e501f0841ae82e0034239ad5dce2eb83)] 451 | - Merge pull request [#63](https://github.com/Tomas2D/puppeteer-table-parser/issues/63) from Tomas2D/dependabot/npm_and_yarn/tsup-6.5.0 [[5a58ad5](https://github.com/Tomas2D/puppeteer-table-parser/commit/5a58ad5d25fdbaae9ed9674a2d9b358608a666d4)] 452 | - Merge pull request [#65](https://github.com/Tomas2D/puppeteer-table-parser/issues/65) from Tomas2D/dependabot/npm_and_yarn/types/jest-29.2.3 [[31cc1e9](https://github.com/Tomas2D/puppeteer-table-parser/commit/31cc1e9d8b6ce2853552b2edf9b5abf14c97f7e5)] 453 | - Merge pull request [#66](https://github.com/Tomas2D/puppeteer-table-parser/issues/66) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.43.0 [[c3b16f2](https://github.com/Tomas2D/puppeteer-table-parser/commit/c3b16f20f80719dc25ca3f886852ce17553ad675)] 454 | - Bump @typescript-eslint/parser from 5.42.1 to 5.43.0 [[30d0479](https://github.com/Tomas2D/puppeteer-table-parser/commit/30d0479e9046ce6f664eb564ed6979f977dd060d)] 455 | - Bump @typescript-eslint/eslint-plugin from 5.42.1 to 5.43.0 [[e33eb48](https://github.com/Tomas2D/puppeteer-table-parser/commit/e33eb48c4fac862b64f05e124d86f64d9ffa1bbd)] 456 | - Bump @types/jest from 29.2.2 to 29.2.3 [[791d600](https://github.com/Tomas2D/puppeteer-table-parser/commit/791d600dbd9a03ea5043225fd5a6d802fc25e3f8)] 457 | - Bump tsup from 6.4.0 to 6.5.0 [[e5a71f8](https://github.com/Tomas2D/puppeteer-table-parser/commit/e5a71f8335e6c65552a9ee5579ce2a3edf282254)] 458 | - Merge pull request [#58](https://github.com/Tomas2D/puppeteer-table-parser/issues/58) from Tomas2D/dependabot/npm_and_yarn/eslint-8.27.0 [[6fbc82d](https://github.com/Tomas2D/puppeteer-table-parser/commit/6fbc82d547646dd7bec7bf270b5d0179918e68ae)] 459 | - Merge pull request [#61](https://github.com/Tomas2D/puppeteer-table-parser/issues/61) from Tomas2D/dependabot/npm_and_yarn/jest-29.3.1 [[1615c39](https://github.com/Tomas2D/puppeteer-table-parser/commit/1615c39d90a58697ff0bd8eb9ff65b55d6de7704)] 460 | - Merge pull request [#59](https://github.com/Tomas2D/puppeteer-table-parser/issues/59) from Tomas2D/dependabot/npm_and_yarn/tsup-6.4.0 [[53aa552](https://github.com/Tomas2D/puppeteer-table-parser/commit/53aa552dcf00f1aad997eb9921090907bd78092c)] 461 | - Merge pull request [#62](https://github.com/Tomas2D/puppeteer-table-parser/issues/62) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.42.1 [[0b51e76](https://github.com/Tomas2D/puppeteer-table-parser/commit/0b51e7608111b236024fb68f78af3d351c50a022)] 462 | - Bump eslint from 8.26.0 to 8.27.0 [[5ecfef5](https://github.com/Tomas2D/puppeteer-table-parser/commit/5ecfef5b7f862b90295115e5a920ef3b2a479621)] 463 | - Merge pull request [#55](https://github.com/Tomas2D/puppeteer-table-parser/issues/55) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.42.1 [[54edc66](https://github.com/Tomas2D/puppeteer-table-parser/commit/54edc66612be8341a4d08f42110925704450293f)] 464 | - Bump @typescript-eslint/eslint-plugin from 5.42.0 to 5.42.1 [[74dbc4e](https://github.com/Tomas2D/puppeteer-table-parser/commit/74dbc4e040fb17b11940e6ce8bb56d3ee2f6198c)] 465 | - Merge pull request [#60](https://github.com/Tomas2D/puppeteer-table-parser/issues/60) from Tomas2D/dependabot/npm_and_yarn/husky-8.0.2 [[df02d85](https://github.com/Tomas2D/puppeteer-table-parser/commit/df02d853eb5f42f95b1c34fca70d764e113f11f1)] 466 | - Bump jest from 29.2.2 to 29.3.1 [[414dde8](https://github.com/Tomas2D/puppeteer-table-parser/commit/414dde8d7513240d8f65c2dd67db904c5b81fa10)] 467 | - Bump husky from 8.0.1 to 8.0.2 [[99e1619](https://github.com/Tomas2D/puppeteer-table-parser/commit/99e16194ac3af6db93e398723d4b907e43167363)] 468 | - Merge pull request [#57](https://github.com/Tomas2D/puppeteer-table-parser/issues/57) from Tomas2D/dependabot/npm_and_yarn/puppeteer-19.2.2 [[0ce7c27](https://github.com/Tomas2D/puppeteer-table-parser/commit/0ce7c2735398154ace00d40051bb79b36d6edd0d)] 469 | - Bump tsup from 6.3.0 to 6.4.0 [[fa2edc8](https://github.com/Tomas2D/puppeteer-table-parser/commit/fa2edc8b185921d18bd87d101ab1c634940816e0)] 470 | - Bump puppeteer from 19.2.1 to 19.2.2 [[8a81495](https://github.com/Tomas2D/puppeteer-table-parser/commit/8a814953ad161d6f7f4a3384992ae8a15a542198)] 471 | - Bump @typescript-eslint/parser from 5.42.0 to 5.42.1 [[f893c52](https://github.com/Tomas2D/puppeteer-table-parser/commit/f893c525f275b4212ac43521844ffca05c0497b7)] 472 | - Merge pull request [#54](https://github.com/Tomas2D/puppeteer-table-parser/issues/54) from Tomas2D/dependabot/npm_and_yarn/puppeteer-19.2.1 [[055768b](https://github.com/Tomas2D/puppeteer-table-parser/commit/055768bb2acfe328a51ac1040b8327b51a4c1f3b)] 473 | - Bump puppeteer from 19.2.0 to 19.2.1 [[15bf343](https://github.com/Tomas2D/puppeteer-table-parser/commit/15bf343c0b4cb56f86b3d7678d56b586f1f34770)] 474 | - Merge pull request [#53](https://github.com/Tomas2D/puppeteer-table-parser/issues/53) from Tomas2D/dependabot/npm_and_yarn/types/jest-29.2.1 [[d50c02e](https://github.com/Tomas2D/puppeteer-table-parser/commit/d50c02e7fe749ec484fac2021caeb0ffb5a835fe)] 475 | - Bump @types/jest from 29.2.0 to 29.2.1 [[7024a57](https://github.com/Tomas2D/puppeteer-table-parser/commit/7024a57402f0eb9fd8a261e92c8aebd22ff596cc)] 476 | - Merge pull request [#51](https://github.com/Tomas2D/puppeteer-table-parser/issues/51) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.42.0 [[b76fe76](https://github.com/Tomas2D/puppeteer-table-parser/commit/b76fe76dda6ad29df4936133b2e7d41569e30dff)] 477 | - Merge pull request [#52](https://github.com/Tomas2D/puppeteer-table-parser/issues/52) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.42.0 [[c1b3ec3](https://github.com/Tomas2D/puppeteer-table-parser/commit/c1b3ec3bd0adb5a032a952845735c36648094756)] 478 | - Bump @typescript-eslint/eslint-plugin from 5.41.0 to 5.42.0 [[eaea731](https://github.com/Tomas2D/puppeteer-table-parser/commit/eaea7312281fda95a167d28cb0d47870509fe087)] 479 | - Bump @typescript-eslint/parser from 5.41.0 to 5.42.0 [[a943646](https://github.com/Tomas2D/puppeteer-table-parser/commit/a9436460115a0f5908308852f9afcd4d0e0cafa4)] 480 | - Merge pull request [#50](https://github.com/Tomas2D/puppeteer-table-parser/issues/50) from Tomas2D/dependabot/npm_and_yarn/puppeteer-19.2.0 [[9ac5caf](https://github.com/Tomas2D/puppeteer-table-parser/commit/9ac5caf481ad2a98f59887c79818948e2b00b4c3)] 481 | - Bump puppeteer from 19.1.2 to 19.2.0 [[88ce736](https://github.com/Tomas2D/puppeteer-table-parser/commit/88ce736a980edd773b2f5634a25de50da2b1a2a6)] 482 | - Merge pull request [#49](https://github.com/Tomas2D/puppeteer-table-parser/issues/49) from Tomas2D/dependabot/npm_and_yarn/puppeteer-19.1.2 [[fb3b9e4](https://github.com/Tomas2D/puppeteer-table-parser/commit/fb3b9e465917245a4af4d2f77c99ae4b5af66d47)] 483 | - Bump puppeteer from 19.1.1 to 19.1.2 [[75da349](https://github.com/Tomas2D/puppeteer-table-parser/commit/75da349aa82b5247a556562400526b87be31c201)] 484 | - Merge pull request [#48](https://github.com/Tomas2D/puppeteer-table-parser/issues/48) from Tomas2D/dependabot/npm_and_yarn/puppeteer-19.1.1 [[a5cdcd1](https://github.com/Tomas2D/puppeteer-table-parser/commit/a5cdcd133e87a7238e991619c553558f594e5eb5)] 485 | - Merge pull request [#47](https://github.com/Tomas2D/puppeteer-table-parser/issues/47) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.41.0 [[7688391](https://github.com/Tomas2D/puppeteer-table-parser/commit/76883917c0926620ef63048b61b3fb19739589ed)] 486 | - Merge pull request [#46](https://github.com/Tomas2D/puppeteer-table-parser/issues/46) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.41.0 [[1fc22de](https://github.com/Tomas2D/puppeteer-table-parser/commit/1fc22de66a23a467834a18e5cb78b43a90c71de1)] 487 | - Merge pull request [#45](https://github.com/Tomas2D/puppeteer-table-parser/issues/45) from Tomas2D/dependabot/npm_and_yarn/jest-29.2.2 [[138cc25](https://github.com/Tomas2D/puppeteer-table-parser/commit/138cc25e416a731cd785d8a983dc006d78f2c617)] 488 | - Bump @typescript-eslint/eslint-plugin from 5.40.1 to 5.41.0 [[173e6ff](https://github.com/Tomas2D/puppeteer-table-parser/commit/173e6ff5896867d219af0dc36bd948c96147d893)] 489 | - Bump puppeteer from 19.1.0 to 19.1.1 [[042480b](https://github.com/Tomas2D/puppeteer-table-parser/commit/042480be077e2dfdc27a8637e85517a6c92b94d2)] 490 | - Bump @typescript-eslint/parser from 5.40.1 to 5.41.0 [[c239972](https://github.com/Tomas2D/puppeteer-table-parser/commit/c23997270ee3cce52029110c70f6b30aeb5f00d8)] 491 | - Bump jest from 29.2.1 to 29.2.2 [[9a2d7c7](https://github.com/Tomas2D/puppeteer-table-parser/commit/9a2d7c7a985d2a425a71bc5e49e5f602b4a0513c)] 492 | - Merge pull request [#43](https://github.com/Tomas2D/puppeteer-table-parser/issues/43) from Tomas2D/dependabot/npm_and_yarn/puppeteer-19.1.0 [[47fdac5](https://github.com/Tomas2D/puppeteer-table-parser/commit/47fdac5412697b1ebb531308bc55e90341a3a36e)] 493 | - Merge pull request [#44](https://github.com/Tomas2D/puppeteer-table-parser/issues/44) from Tomas2D/dependabot/npm_and_yarn/eslint-8.26.0 [[a490da5](https://github.com/Tomas2D/puppeteer-table-parser/commit/a490da517309858893539e9ec19db8edccf47ddf)] 494 | - Bump eslint from 8.25.0 to 8.26.0 [[bc1eea8](https://github.com/Tomas2D/puppeteer-table-parser/commit/bc1eea8bb3fd5a60c8d627a6c71c63628b6c07eb)] 495 | - Bump puppeteer from 19.0.0 to 19.1.0 [[0327c15](https://github.com/Tomas2D/puppeteer-table-parser/commit/0327c15a31495bf3d3e5567d21df5f99ae666366)] 496 | 497 | 498 | 499 | ## 2.1.0 (2022-10-22) 500 | 501 | ### Added 502 | 503 | - ✨ Add an option for returning rows as objects [[9ea0aea](https://github.com/Tomas2D/puppeteer-table-parser/commit/9ea0aea03a607d6b5f66ffceda372a0ebb8bdb3b)] 504 | 505 | ### Miscellaneous 506 | 507 | - Merge pull request [#42](https://github.com/Tomas2D/puppeteer-table-parser/issues/42) from Tomas2D/feat/rows-as-objects [[1197bc2](https://github.com/Tomas2D/puppeteer-table-parser/commit/1197bc20aac79b59f2c012897d99f4c9cf67cb70)] 508 | 509 | 510 | 511 | ## 2.0.0 (2022-10-20) 512 | 513 | ### Breaking change 514 | - no more `default` export, only named one 515 | 516 | ### Added 517 | 518 | - ✅ Add a test case for large HTML table [[565fad3](https://github.com/Tomas2D/puppeteer-table-parser/commit/565fad3a5840763cadb9c5e8fd54c8e2074aa1d8)] 519 | 520 | ### Changed 521 | 522 | - 💬 Update README [[a2494be](https://github.com/Tomas2D/puppeteer-table-parser/commit/a2494be41d163ac83f2bf95ea45644e29a1a488a)] 523 | - 📌 Pin Node version to 16.17.1 [[0553428](https://github.com/Tomas2D/puppeteer-table-parser/commit/05534286423f7d7cb0eb576bebff7f0219522dbc)] 524 | - ⬆️ Jest 29.x, Puppeteer 19.x [[4955aae](https://github.com/Tomas2D/puppeteer-table-parser/commit/4955aae2f7da2d489ab6c3ffd103b1e4f4f62699)] 525 | 526 | ### Miscellaneous 527 | 528 | - Merge pull request [#41](https://github.com/Tomas2D/puppeteer-table-parser/issues/41) from Tomas2D/feat/esm-cjs-bundle [[c8e85f3](https://github.com/Tomas2D/puppeteer-table-parser/commit/c8e85f35711b6d94338daf9c187e8a39e32b43c2)] 529 | - 📦 Support ESM/CJS bundles [[a69e123](https://github.com/Tomas2D/puppeteer-table-parser/commit/a69e123900011fc4f6cdfe0913b53ff6bd9abc4d)] 530 | - 👷 Add Node version matrix to pipeline [[96b4e46](https://github.com/Tomas2D/puppeteer-table-parser/commit/96b4e461d0c5300ebca03f02108a9d29aec7555f)] 531 | - Merge pull request [#40](https://github.com/Tomas2D/puppeteer-table-parser/issues/40) from Tomas2D/dependabot/npm_and_yarn/jest-29.2.1 [[7512abe](https://github.com/Tomas2D/puppeteer-table-parser/commit/7512abed21c06d4362966180554da7293c89bbb3)] 532 | - Bump jest from 29.2.0 to 29.2.1 [[54566c3](https://github.com/Tomas2D/puppeteer-table-parser/commit/54566c322d04f0645623ad664f1f11535530880e)] 533 | - Merge pull request [#39](https://github.com/Tomas2D/puppeteer-table-parser/issues/39) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.40.1 [[3f6a787](https://github.com/Tomas2D/puppeteer-table-parser/commit/3f6a78787ca20591837207c64600be8078b29037)] 534 | - Merge pull request [#38](https://github.com/Tomas2D/puppeteer-table-parser/issues/38) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.40.1 [[37b98f2](https://github.com/Tomas2D/puppeteer-table-parser/commit/37b98f2d665b26db76d43462a6f448e082511b7c)] 535 | - Bump @typescript-eslint/parser from 5.40.0 to 5.40.1 [[1163ccd](https://github.com/Tomas2D/puppeteer-table-parser/commit/1163ccd36978587d01d9f70cf01351c0cd77945c)] 536 | - Bump @typescript-eslint/eslint-plugin from 5.40.0 to 5.40.1 [[8f5378c](https://github.com/Tomas2D/puppeteer-table-parser/commit/8f5378c3cb71046d7ceadba12a425788042fa1dc)] 537 | - Merge pull request [#36](https://github.com/Tomas2D/puppeteer-table-parser/issues/36) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/parser-5.40.0 [[fd45b85](https://github.com/Tomas2D/puppeteer-table-parser/commit/fd45b858fd264cb76ea0c8f83b6ff332b870cc52)] 538 | - Merge pull request [#33](https://github.com/Tomas2D/puppeteer-table-parser/issues/33) from Tomas2D/dependabot/npm_and_yarn/eslint-8.25.0 [[3eabade](https://github.com/Tomas2D/puppeteer-table-parser/commit/3eabade42144fa6dd78f318ade2f94e3163c5360)] 539 | - Merge pull request [#35](https://github.com/Tomas2D/puppeteer-table-parser/issues/35) from Tomas2D/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.40.0 [[7a622fb](https://github.com/Tomas2D/puppeteer-table-parser/commit/7a622fb5b8017a423bea643fbf1b2f24368264cf)] 540 | - Bump eslint from 8.24.0 to 8.25.0 [[7571254](https://github.com/Tomas2D/puppeteer-table-parser/commit/7571254e47e355482f98d52c69ed82b0b565d95b)] 541 | - Bump @typescript-eslint/parser from 5.39.0 to 5.40.0 [[6a3e092](https://github.com/Tomas2D/puppeteer-table-parser/commit/6a3e0921120e0fd1fa1d912460599ac3920f7f56)] 542 | - Bump @typescript-eslint/eslint-plugin from 5.39.0 to 5.40.0 [[97b5593](https://github.com/Tomas2D/puppeteer-table-parser/commit/97b5593934ac265111c13d1c537f6c543351c32d)] 543 | - Merge pull request [#34](https://github.com/Tomas2D/puppeteer-table-parser/issues/34) from Tomas2D/dependabot/npm_and_yarn/express-4.18.2 [[212a49a](https://github.com/Tomas2D/puppeteer-table-parser/commit/212a49a310e4cf476ef60d914dca1caba81741d0)] 544 | - Bump express from 4.18.1 to 4.18.2 [[9a52e81](https://github.com/Tomas2D/puppeteer-table-parser/commit/9a52e81e037c11f21bf20d035d15b522900d092c)] 545 | 546 | 547 | 548 | ## 1.9.0 (2022-10-08) 549 | 550 | ### Added 551 | 552 | - ✨ Add custom aggregations support [[5ff578c](https://github.com/Tomas2D/puppeteer-table-parser/commit/5ff578cf6d4bb02061fe38e54b76f021332c5f9a)] 553 | 554 | ### Changed 555 | 556 | - ⚡ Improve performance by aggregating pipeline transformations [[dd5eb36](https://github.com/Tomas2D/puppeteer-table-parser/commit/dd5eb3624b06c2733a1dd1edcbd16726a3c29885)] 557 | 558 | ### Miscellaneous 559 | 560 | - Merge pull request [#30](https://github.com/Tomas2D/puppeteer-table-parser/issues/30) from Tomas2D/dependabot/npm_and_yarn/typescript-4.8.4 [[b01417b](https://github.com/Tomas2D/puppeteer-table-parser/commit/b01417bbb0936deecf1d88876d140ee00f53d3d7)] 561 | - 📝 Mention rowValidationPolicy in README [[f61c599](https://github.com/Tomas2D/puppeteer-table-parser/commit/f61c599e4e886a1fbe4e3be5c7744b794376bafb)] 562 | - Bump typescript from 4.8.3 to 4.8.4 [[cf8998c](https://github.com/Tomas2D/puppeteer-table-parser/commit/cf8998c84662d177a53a0f9a5d913b1cdb66d1c4)] 563 | 564 | 565 | 566 | ## 1.8.0 (2022-10-05) 567 | 568 | ### Added 569 | 570 | - ✨ Add row structure validator [[2e50f49](https://github.com/Tomas2D/puppeteer-table-parser/commit/2e50f49d4f6b6826b6936186fe0141a62002c917)] 571 | 572 | ### Changed 573 | 574 | - ⬆️ Upgrade ESLint [[25e5a8d](https://github.com/Tomas2D/puppeteer-table-parser/commit/25e5a8dccfd6a65a6597f387cf05e3861bfc587c)] 575 | 576 | ### Fixed 577 | 578 | - 🐛 Handles multiple extra columns with implicit position [[a3960e5](https://github.com/Tomas2D/puppeteer-table-parser/commit/a3960e54b9f0545d5d55c4456cba590f9484fe9c)] 579 | 580 | ### Miscellaneous 581 | 582 | - Merge pull request [#29](https://github.com/Tomas2D/puppeteer-table-parser/issues/29) from Tomas2D/dependabot/npm_and_yarn/puppeteer-18.0.5 [[a35e7c9](https://github.com/Tomas2D/puppeteer-table-parser/commit/a35e7c96b5a9959a132c87a4c9b930384171b331)] 583 | - Bump puppeteer from 18.0.4 to 18.0.5 [[d46ab26](https://github.com/Tomas2D/puppeteer-table-parser/commit/d46ab264b63f5e20aa537023b272d9a6ea97e3d4)] 584 | - Merge pull request [#28](https://github.com/Tomas2D/puppeteer-table-parser/issues/28) from Tomas2D/dependabot/npm_and_yarn/puppeteer-18.0.4 [[9cc757e](https://github.com/Tomas2D/puppeteer-table-parser/commit/9cc757ec3c83a453f3b69d907025e3425c93505c)] 585 | - Bump puppeteer from 18.0.3 to 18.0.4 [[76c09da](https://github.com/Tomas2D/puppeteer-table-parser/commit/76c09da9e7ffae8e77e3514dfd9ea8cafe89a6b3)] 586 | - Merge pull request [#27](https://github.com/Tomas2D/puppeteer-table-parser/issues/27) from Tomas2D/dependabot/npm_and_yarn/puppeteer-18.0.3 [[951905b](https://github.com/Tomas2D/puppeteer-table-parser/commit/951905b0cfd70a7cdf289015b3af6d74b2c93be0)] 587 | - Bump puppeteer from 17.1.3 to 18.0.3 [[7fce5a5](https://github.com/Tomas2D/puppeteer-table-parser/commit/7fce5a5ba0e07c76297defce643e12fe5c857e33)] 588 | - Merge pull request [#26](https://github.com/Tomas2D/puppeteer-table-parser/issues/26) from Tomas2D/dependabot/npm_and_yarn/types/express-4.17.14 [[de4f86b](https://github.com/Tomas2D/puppeteer-table-parser/commit/de4f86b6341a3d2f0b63311fabfbaf2687f6272c)] 589 | - Bump @types/express from 4.17.13 to 4.17.14 [[f552215](https://github.com/Tomas2D/puppeteer-table-parser/commit/f55221557386c1ec37620bb1cd4c911d8db980ee)] 590 | - Merge pull request [#24](https://github.com/Tomas2D/puppeteer-table-parser/issues/24) from Tomas2D/dependabot/npm_and_yarn/typescript-4.8.3 [[1ac6ab9](https://github.com/Tomas2D/puppeteer-table-parser/commit/1ac6ab971ab9809410655cb81cd6f9092049ffff)] 591 | - Merge pull request [#25](https://github.com/Tomas2D/puppeteer-table-parser/issues/25) from Tomas2D/dependabot/npm_and_yarn/puppeteer-17.1.3 [[9f02d0f](https://github.com/Tomas2D/puppeteer-table-parser/commit/9f02d0fde1cd34bf603f1d668e912b71a621d9f0)] 592 | - Bump puppeteer from 17.1.2 to 17.1.3 [[914732e](https://github.com/Tomas2D/puppeteer-table-parser/commit/914732e659bf4f08ff6ac76e2a61f83c3f345f77)] 593 | - Bump typescript from 4.8.2 to 4.8.3 [[4818638](https://github.com/Tomas2D/puppeteer-table-parser/commit/4818638de48ca2e98528cd2e9e005658289497e1)] 594 | 595 | 596 | 597 | ## 1.7.1 (2022-09-08) 598 | 599 | ### Changed 600 | 601 | - 🔧 Use the newest 16.x Node version [[0b4dd57](https://github.com/Tomas2D/puppeteer-table-parser/commit/0b4dd5702e8df5ba77fdb80a513aec9600deb7d5)] 602 | - ⬆️ Upgrade puppeteer [[94aaf0e](https://github.com/Tomas2D/puppeteer-table-parser/commit/94aaf0ea443aa7b324df10ec7a5e0283c64119c5)] 603 | 604 | ### Miscellaneous 605 | 606 | - 👷 Use node version from .nvmrc [[eb83e14](https://github.com/Tomas2D/puppeteer-table-parser/commit/eb83e149ba2b8570d9b48732d21c961825993708)] 607 | - Merge pull request [#23](https://github.com/Tomas2D/puppeteer-table-parser/issues/23) from Tomas2D/dependabot/npm_and_yarn/puppeteer-17.1.2 [[6a67714](https://github.com/Tomas2D/puppeteer-table-parser/commit/6a67714336f9eb10867be996eefcd3416c4f89fd)] 608 | - Bump puppeteer from 17.1.1 to 17.1.2 [[afd8c24](https://github.com/Tomas2D/puppeteer-table-parser/commit/afd8c24f0fba2c9b1e220cfc703ecc839a29577f)] 609 | - Merge pull request [#22](https://github.com/Tomas2D/puppeteer-table-parser/issues/22) from Tomas2D/dependabot/npm_and_yarn/puppeteer-17.1.1 [[d100655](https://github.com/Tomas2D/puppeteer-table-parser/commit/d1006550e75e4efc45298a86f963834c81575e9e)] 610 | - Bump puppeteer from 17.0.0 to 17.1.1 [[cc55696](https://github.com/Tomas2D/puppeteer-table-parser/commit/cc55696ae6831eb7ca656b24a8df28fc13c282d0)] 611 | - Merge pull request [#20](https://github.com/Tomas2D/puppeteer-table-parser/issues/20) from Tomas2D/dependabot/npm_and_yarn/puppeteer-17.0.0 [[6323698](https://github.com/Tomas2D/puppeteer-table-parser/commit/632369861c754fe666cfb3694afc0c82b45cff92)] 612 | - Bump puppeteer from 16.2.0 to 17.0.0 [[178999a](https://github.com/Tomas2D/puppeteer-table-parser/commit/178999ae46e7efc5f2819609e9c42428e4e1fbc4)] 613 | - Merge pull request [#18](https://github.com/Tomas2D/puppeteer-table-parser/issues/18) from Tomas2D/dependabot/npm_and_yarn/puppeteer-16.2.0 [[5b96ccf](https://github.com/Tomas2D/puppeteer-table-parser/commit/5b96ccf8b48155c3529806001e46737f19970de7)] 614 | - Merge pull request [#19](https://github.com/Tomas2D/puppeteer-table-parser/issues/19) from Tomas2D/dependabot/npm_and_yarn/typescript-4.8.2 [[b6f0c8a](https://github.com/Tomas2D/puppeteer-table-parser/commit/b6f0c8a646fb906533d5e6c7ad8930747998a767)] 615 | - Bump puppeteer from 16.1.1 to 16.2.0 [[9f1bdd9](https://github.com/Tomas2D/puppeteer-table-parser/commit/9f1bdd9e0f7e3b73e828ad61af39715816714b78)] 616 | - Bump typescript from 4.7.4 to 4.8.2 [[5c0adba](https://github.com/Tomas2D/puppeteer-table-parser/commit/5c0adbae6987435654de9b4ae658d73d085ed463)] 617 | - Merge pull request [#17](https://github.com/Tomas2D/puppeteer-table-parser/issues/17) from Tomas2D/dependabot/npm_and_yarn/puppeteer-16.1.1 [[244f412](https://github.com/Tomas2D/puppeteer-table-parser/commit/244f412817e640e505fb8e57cb031bc807f62b63)] 618 | - Bump puppeteer from 16.1.0 to 16.1.1 [[3800d40](https://github.com/Tomas2D/puppeteer-table-parser/commit/3800d40049537c1e4c147d499ea230338a09798b)] 619 | - Merge pull request [#16](https://github.com/Tomas2D/puppeteer-table-parser/issues/16) from Tomas2D/dependabot/npm_and_yarn/puppeteer-16.1.0 [[1cc2564](https://github.com/Tomas2D/puppeteer-table-parser/commit/1cc256475f6bc0deee1430fceb9ac4c7e51df605)] 620 | - Bump puppeteer from 16.0.0 to 16.1.0 [[991c6ad](https://github.com/Tomas2D/puppeteer-table-parser/commit/991c6ad811f579140dcb0aad76321767755c162d)] 621 | - Merge pull request [#15](https://github.com/Tomas2D/puppeteer-table-parser/issues/15) from Tomas2D/dependabot/npm_and_yarn/puppeteer-16.0.0 [[45a7645](https://github.com/Tomas2D/puppeteer-table-parser/commit/45a76454f0690e9af0663d4f4e625dc9e7079740)] 622 | - Bump puppeteer from 15.5.0 to 16.0.0 [[c95cdfa](https://github.com/Tomas2D/puppeteer-table-parser/commit/c95cdfa1f5d343320c158d19d488056d8de440ce)] 623 | - Merge pull request [#14](https://github.com/Tomas2D/puppeteer-table-parser/issues/14) from Tomas2D/dependabot/npm_and_yarn/puppeteer-15.5.0 [[ffcd0d6](https://github.com/Tomas2D/puppeteer-table-parser/commit/ffcd0d6207d78db5e603b1788f1d7c9edeb802b2)] 624 | - Bump puppeteer from 15.4.0 to 15.5.0 [[c23c4f9](https://github.com/Tomas2D/puppeteer-table-parser/commit/c23c4f94634eb37db3b90decb3b41b666c65066f)] 625 | - Merge pull request [#13](https://github.com/Tomas2D/puppeteer-table-parser/issues/13) from Tomas2D/dependabot/npm_and_yarn/puppeteer-15.4.0 [[bd75e42](https://github.com/Tomas2D/puppeteer-table-parser/commit/bd75e4217010817f4718fb8926a2cfffced29012)] 626 | - Bump puppeteer from 15.3.2 to 15.4.0 [[92e5410](https://github.com/Tomas2D/puppeteer-table-parser/commit/92e541036723b1212c43191a52736f09689dbd8a)] 627 | 628 | 629 | 630 | ## 1.7.0 (2022-07-13) 631 | 632 | ### Added 633 | 634 | - ✨ Scroll table into view during parsing [[4661c22](https://github.com/Tomas2D/puppeteer-table-parser/commit/4661c22b444911373575b8d29589871531062456)] 635 | 636 | ### Changed 637 | 638 | - 🔧 Setup Dependabot auto updates [[8124a34](https://github.com/Tomas2D/puppeteer-table-parser/commit/8124a3431309f4fb3c2184ec09323fc0234d2bfe)] 639 | 640 | ### Miscellaneous 641 | 642 | - Merge pull request [#10](https://github.com/Tomas2D/puppeteer-table-parser/issues/10) from Tomas2D/dependabot/npm_and_yarn/lint-staged-13.0.3 [[ae23cbf](https://github.com/Tomas2D/puppeteer-table-parser/commit/ae23cbfd95cf4fff15465d86a7bdb424d60aa149)] 643 | - Merge pull request [#11](https://github.com/Tomas2D/puppeteer-table-parser/issues/11) from Tomas2D/dependabot/npm_and_yarn/typescript-4.7.4 [[10b65ae](https://github.com/Tomas2D/puppeteer-table-parser/commit/10b65aea9ba480bd6095bb91644dc895e3fddc2a)] 644 | - Merge pull request [#8](https://github.com/Tomas2D/puppeteer-table-parser/issues/8) from Tomas2D/dependabot/npm_and_yarn/husky-8.0.1 [[0e3b4b3](https://github.com/Tomas2D/puppeteer-table-parser/commit/0e3b4b3554fa08d0980abe5a89ea3e8d03c4b337)] 645 | - Merge pull request [#9](https://github.com/Tomas2D/puppeteer-table-parser/issues/9) from Tomas2D/dependabot/npm_and_yarn/prettier-2.7.1 [[6cd9faf](https://github.com/Tomas2D/puppeteer-table-parser/commit/6cd9faf56f6cc883bfd91816a1e3d15f4674068e)] 646 | - Merge pull request [#12](https://github.com/Tomas2D/puppeteer-table-parser/issues/12) from Tomas2D/dependabot/npm_and_yarn/puppeteer-15.3.2 [[58875f1](https://github.com/Tomas2D/puppeteer-table-parser/commit/58875f102c1db9636159d396b4f83f6d9b2ec2b0)] 647 | - Bump lint-staged from 10.5.4 to 13.0.3 [[67f34b1](https://github.com/Tomas2D/puppeteer-table-parser/commit/67f34b12e4ea09962099cebd79201556f104cefb)] 648 | - Bump puppeteer from 15.3.1 to 15.3.2 [[4b2a77a](https://github.com/Tomas2D/puppeteer-table-parser/commit/4b2a77a7d8b0e44afaae64f56b4f49e586a5a04b)] 649 | - Bump typescript from 4.6.4 to 4.7.4 [[613c538](https://github.com/Tomas2D/puppeteer-table-parser/commit/613c538380b8dcf795ecce45a7747b8b69933ad9)] 650 | - Bump prettier from 2.6.0 to 2.7.1 [[d47a7e9](https://github.com/Tomas2D/puppeteer-table-parser/commit/d47a7e95f6a86353fd460a68e775dcf717591352)] 651 | - Bump husky from 7.0.4 to 8.0.1 [[931e394](https://github.com/Tomas2D/puppeteer-table-parser/commit/931e39456ebf2ba134650740884a9129722ad2ea)] 652 | 653 | 654 | 655 | ## 1.6.0 (2022-07-06) 656 | 657 | ### Added 658 | 659 | - ✨ Add rows and body selector, refactor codebase, migrate to Node 16 [[70256ba](https://github.com/Tomas2D/puppeteer-table-parser/commit/70256ba377f726d424233a7933756f4e1f7b11b2)] 660 | - ✨ Add custom error classes, refactor settings and exports [[ba9c726](https://github.com/Tomas2D/puppeteer-table-parser/commit/ba9c726f61f15893b57633a67cba7fde7830d19d)] 661 | 662 | ### Fixed 663 | 664 | - 🐛 Fix asynchronous filtering of invalid HTMl elements [[473a69e](https://github.com/Tomas2D/puppeteer-table-parser/commit/473a69e74d08476b2cd55f34cae1d6385ef6afab)] 665 | 666 | 667 | 668 | ## 1.5.1 (2022-07-04) 669 | 670 | ### Changed 671 | 672 | - 🔧 Update repository info in package.json [[edd194d](https://github.com/Tomas2D/puppeteer-table-parser/commit/edd194d1828e82b0d46695f1c37836534723b20e)] 673 | 674 | 675 | 676 | ## 1.5.0 (2022-07-02) 677 | 678 | ### Added 679 | 680 | - ✨ Add support for reverse table traversal [[9cfff80](https://github.com/Tomas2D/puppeteer-table-parser/commit/9cfff8052d9344030ad48143b0b48884eb96f2e8)] 681 | 682 | ### Changed 683 | 684 | - 🔧 Remove JS comments from output [[d9e01d0](https://github.com/Tomas2D/puppeteer-table-parser/commit/d9e01d0d132042793929514b74f7ceda83278713)] 685 | 686 | 687 | 688 | ## 1.4.2 (2022-07-02) 689 | 690 | ### Added 691 | 692 | - ✨ Omit properties from settings with `undefined` value [[65237aa](https://github.com/Tomas2D/puppeteer-table-parser/commit/65237aa15c1b5fefd2aef97b369156b51cdfeb4e)] 693 | 694 | ### Changed 695 | 696 | - 💬 Update README [[56b351a](https://github.com/Tomas2D/puppeteer-table-parser/commit/56b351a8885d3b35284a2b813232da4fb0a6b127)] 697 | 698 | ### Miscellaneous 699 | 700 | - Merge pull request [#7](https://github.com/Tomas2D/puppeteer-table-parser/issues/7) from Tomas2D/dependabot/npm_and_yarn/minimist-1.2.6 [[52003c4](https://github.com/Tomas2D/puppeteer-table-parser/commit/52003c457bf0fe63b2fb78c67f9a277e1455a3a5)] 701 | - Bump minimist from 1.2.5 to 1.2.6 [[565cb1c](https://github.com/Tomas2D/puppeteer-table-parser/commit/565cb1c4a88bf3a48696fb99824fde7bb763bbfc)] 702 | 703 | 704 | 705 | ## 1.4.1 (2022-03-19) 706 | 707 | ### Changed 708 | 709 | - ⬆️ Upgrade dependencies to fix security audit [[d98fc13](https://github.com/Tomas2D/puppeteer-table-parser/commit/d98fc133512f58a6ca3e9d49e51942fabed3afd2)] 710 | 711 | 712 | 713 | ## 1.4.0 (2022-01-07) 714 | 715 | ### Added 716 | 717 | - ✨ Add support for optional columns [[ae6ea88](https://github.com/Tomas2D/puppeteer-table-parser/commit/ae6ea8829d2ad7d883056c35a149066712ca1896)] 718 | 719 | ### Changed 720 | 721 | - 💬 Update error message with duplicated column name [[0f16626](https://github.com/Tomas2D/puppeteer-table-parser/commit/0f166268fb3709d7edb2c5fc9da6ef2d3858da51)] 722 | 723 | 724 | 725 | ## 1.3.0 (2021-12-13) 726 | 727 | ### Added 728 | 729 | - ✨ Add support for returning row values as array [[4dbd821](https://github.com/Tomas2D/puppeteer-table-parser/commit/4dbd821bcf1b3f85f74496e5d1cfd7aa16827a84)] 730 | 731 | ### Changed 732 | 733 | - 🔧 Run prettier on lint-staged [[1e9fdfe](https://github.com/Tomas2D/puppeteer-table-parser/commit/1e9fdfeb1a59360bd2a98a1d349574d3f552ecbd)] 734 | 735 | ### Miscellaneous 736 | 737 | - 📝 Update README [[1eeeb98](https://github.com/Tomas2D/puppeteer-table-parser/commit/1eeeb98e19b06027108a5eb2f82fa75527e3b764)] 738 | - 💡 Remove unused comments [[5451be3](https://github.com/Tomas2D/puppeteer-table-parser/commit/5451be3ed63252cfe52f6139ebf8ad1ff3c6dbde)] 739 | 740 | 741 | 742 | ## 1.2.0 (2021-11-04) 743 | 744 | ### Added 745 | 746 | - ✨ Handle duplicated column names [[1dfc2ac](https://github.com/Tomas2D/puppeteer-table-parser/commit/1dfc2ace2f6fda271acb4f24fcbfa4f04fb6c840)] 747 | - ✅ Fix launching Puppeteer in Jest TS needs to be fixed on 4.3.x [[061fe87](https://github.com/Tomas2D/puppeteer-table-parser/commit/061fe871b9146a4544c850a5f27b5665f2c4b962)] 748 | 749 | ### Changed 750 | 751 | - ♻️ Separate logic for mutating row values Add rowTransform function to options [[f380d3d](https://github.com/Tomas2D/puppeteer-table-parser/commit/f380d3daf0f4f90f603dec21b16d1f0964dc90e2)] 752 | - 🔧 Update eslint config [[d08fecf](https://github.com/Tomas2D/puppeteer-table-parser/commit/d08fecf4a7bebb2d4a1b4db9ac50ff586bf2daf2)] 753 | 754 | 755 | 756 | ## 1.1.5 (2021-10-15) 757 | 758 | ### Added 759 | 760 | - ✨ Add getColumnIndex support to colParser [[c4cef1a](https://github.com/Tomas2D/puppeteer-table-parser/commit/c4cef1a98660983fcec2589365b5a29090b4ae70)] 761 | 762 | 763 | 764 | ## 1.1.4 (2021-10-11) 765 | 766 | ### Added 767 | 768 | - ✅ Run test in non-headless mode [[887eb2c](https://github.com/Tomas2D/puppeteer-table-parser/commit/887eb2c7b399a1f87f9dfd70c0d44a10da21c841)] 769 | 770 | ### Changed 771 | 772 | - ⬆️ Upgrade deps to fix audit [[a0486ed](https://github.com/Tomas2D/puppeteer-table-parser/commit/a0486edfb3f06d6bd4436183a6cd01c7e688cc63)] 773 | - ⬆️ Upgrade deps to pass audit [[d6adf53](https://github.com/Tomas2D/puppeteer-table-parser/commit/d6adf53fd22c308692e682b55256e6a7ca4c920e)] 774 | - ⬆️ Upgrade deps [[a73ecbc](https://github.com/Tomas2D/puppeteer-table-parser/commit/a73ecbc43dc430e152a51b083fdf890b650de5f2)] 775 | - ⬆️ Upgrade deps [[8f3bc03](https://github.com/Tomas2D/puppeteer-table-parser/commit/8f3bc032cca092149fed962f1b572271070fdfaf)] 776 | 777 | ### Fixed 778 | 779 | - 💚 Disable running tests in CI [[aa9b073](https://github.com/Tomas2D/puppeteer-table-parser/commit/aa9b073f0d106b5fefe6b2268fbc851857f25793)] 780 | 781 | ### Security 782 | 783 | - 🔒 Fix prototype Pollution in set-value [[a737edf](https://github.com/Tomas2D/puppeteer-table-parser/commit/a737edf63effc21b0f9778f4a1f7d7c5dc780ca1)] 784 | 785 | ### Miscellaneous 786 | 787 | - 👷 Add GitHub workflow [[4b59fb9](https://github.com/Tomas2D/puppeteer-table-parser/commit/4b59fb9ce3a71c4bf85ec997da76a980f13855ac)] 788 | 789 | 790 | 791 | ## 1.1.3 (2021-08-09) 792 | 793 | ### Changed 794 | 795 | - ⬆️ Update dependencies [[3014809](https://github.com/Tomas2D/puppeteer-table-parser/commit/3014809fce5279d5676b067526ffe74b89c04eb7)] 796 | - ⬆️ Bump browserslist from 4.16.3 to 4.16.7 [[77c73fe](https://github.com/Tomas2D/puppeteer-table-parser/commit/77c73fe1d84f08cba6089e567da692e992dadf62)] 797 | - ⬆️ Bump ssri from 6.0.1 to 6.0.2 [[8a1ad0b](https://github.com/Tomas2D/puppeteer-table-parser/commit/8a1ad0be1a019275011a130e485904e3b79ac414)] 798 | - ⬆️ Bump ws from 7.4.4 to 7.5.3 [[89bdfda](https://github.com/Tomas2D/puppeteer-table-parser/commit/89bdfda75bce633c467e8d390a6be61c948e8d52)] 799 | - ⬆️ Bump tar from 4.4.13 to 4.4.15 [[a5faafc](https://github.com/Tomas2D/puppeteer-table-parser/commit/a5faafc8aa860b45dc2fb6b58388a8fffbb39fc0)] 800 | - ⬆️ Bump hosted-git-info from 2.8.8 to 2.8.9 [[4e10107](https://github.com/Tomas2D/puppeteer-table-parser/commit/4e10107cac67b834d612cad7255f29a14a6f6456)] 801 | 802 | 803 | 804 | ## 1.1.2 (2021-07-04) 805 | 806 | ### Changed 807 | 808 | - 🔧 Update peer dependencies [[71f0d8e](https://github.com/Tomas2D/puppeteer-table-parser/commit/71f0d8edb89db3014fe7eb5df633c3957f9163e3)] 809 | 810 | 811 | 812 | ## 1.1.1 (2021-06-11) 813 | 814 | ### Changed 815 | 816 | - 🎨 Add export for mergeParserSettings [[43c40e5](https://github.com/Tomas2D/puppeteer-table-parser/commit/43c40e546b08ca85288107785bd01393fed926b7)] 817 | 818 | 819 | 820 | ## 1.1.0 (2021-03-20) 821 | 822 | ### Added 823 | 824 | - ✅ Add test for merger util [[12126a1](https://github.com/Tomas2D/puppeteer-table-parser/commit/12126a1f35dd695802a2877f3b03987eee68c655)] 825 | - ✨ Add merger parser settings util [[a7c5f5f](https://github.com/Tomas2D/puppeteer-table-parser/commit/a7c5f5f60c1b2c5d67ec1fbb66b4a126e6704daa)] 826 | 827 | ### Changed 828 | 829 | - 💬 Update README [[bb4bf5e](https://github.com/Tomas2D/puppeteer-table-parser/commit/bb4bf5e9af647131b33b17f530b24c3b9e9d621d)] 830 | 831 | 832 | 833 | ## 1.0.3 (2021-03-20) 834 | 835 | ### Fixed 836 | 837 | - 💚 Update package.json to correct publishing [[2aaa3e2](https://github.com/Tomas2D/puppeteer-table-parser/commit/2aaa3e2f5564f902d9a989bb2a3bd49ea2660cf2)] 838 | 839 | 840 | 841 | ## 1.0.2 (2021-03-19) 842 | 843 | ### Changed 844 | 845 | - 🔧 Update package.json scripts [[aa3b6e3](https://github.com/Tomas2D/puppeteer-table-parser/commit/aa3b6e3fd5a80613154d9ad32081f8b1f65fc040)] 846 | - 🔧 Update build script [[7796494](https://github.com/Tomas2D/puppeteer-table-parser/commit/77964940840ddea7683b9ffabb0686c56010116b)] 847 | 848 | 849 | 850 | ## 1.0.0 (2021-03-19) 851 | 852 | ### Added 853 | 854 | - ✅ Update advanced test [[1b99973](https://github.com/Tomas2D/puppeteer-table-parser/commit/1b999736cd29fac491fab3c482995badc99de5f2)] 855 | - ✅ Add tests [[60401c1](https://github.com/Tomas2D/puppeteer-table-parser/commit/60401c147dd061297f623af8a2fc3d0993eb2088)] 856 | - 🎉 Initial commit [[f5b90d3](https://github.com/Tomas2D/puppeteer-table-parser/commit/f5b90d366383e061ad9d149837574ed06a5109ba)] 857 | 858 | ### Changed 859 | 860 | - 💬 Update README [[888acda](https://github.com/Tomas2D/puppeteer-table-parser/commit/888acda89685274df81acbc12f5606f767f60c24)] 861 | - ♻️ Update alg. to work correct with complex queries [[e70299f](https://github.com/Tomas2D/puppeteer-table-parser/commit/e70299fbbd0623e5f3706e869459df83fd2773e3)] 862 | 863 | ### Miscellaneous 864 | 865 | - 📝 Update README.md [[e284d88](https://github.com/Tomas2D/puppeteer-table-parser/commit/e284d88175e3ccf2d585061f8cd19a54a80dc9a8)] 866 | - ✨ Add base code structure [[3c6c0e9](https://github.com/Tomas2D/puppeteer-table-parser/commit/3c6c0e94189b9a40da6c7f1e9029d0905dd3a2dc)] 867 | 868 | 869 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) [year] [fullname] 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🕸 🕷 puppeteer-table-parser 2 | 3 | Library to make parsing website tables much easier! 4 | When you are using `puppeteer` for scrapping websites and web application, you will find out that parsing tables consistently is not that easy. 5 | This library brings you abstraction between `puppeteer` and `page context`. 6 | 7 | ## This library solves the following issues: 8 | 9 | - ✨ Parsing columns by their name. 10 | - ✨ Respect the defined order of columns. 11 | - ✨ Appending custom columns with custom data. 12 | - ✨ Custom sanitization of data in cells. 13 | - ✨ Group and Aggregate data by your own function. 14 | - ✨ Merge data from two independent tables into one structure. 15 | - ✨ Handles invalid HTML structure. 16 | - ✨ Retrieve results as CSV or array of plain JS objects. 17 | - ✨ And much more! 18 | 19 | ## Installation 20 | 21 | ```shell 22 | yarn add puppeteer-table-parser 23 | ``` 24 | ```shell 25 | npm install puppeteer-table-parser 26 | ``` 27 | 28 | ```typescript 29 | // CommonJS 30 | const { tableParser } = require('puppeteer-table-parser') 31 | 32 | // ESM / Typescript 33 | import { tableParser } from 'puppeteer-table-parser' 34 | ``` 35 | 36 | ## API 37 | 38 | ```typescript 39 | interface ParserSettings { 40 | selector: string; // CSS selector 41 | allowedColNames: Record; // key = input name, value = output name) 42 | 43 | headerRowsSelector?: string | null; // (default: 'thead tr', null ignores table's header selection) 44 | headerRowsCellSelector?: string; // (default: 'td,th') 45 | bodyRowsSelector?: string; // (default: 'tbody tr') 46 | bodyRowsCellSelector?: string; // (default: 'td') 47 | reverseTraversal?: boolean // (default: false) 48 | temporaryColNames?: string[]; // (default: []) 49 | extraCols?: ExtraCol[]; // (default: []) 50 | withHeader?: boolean; // (default: true) 51 | csvSeparator?: string; // (default: ';') 52 | newLine?: string; // (default: '\n') 53 | rowValidationPolicy?: RowValidationPolicy; // (default: 'NON_EMPTY') 54 | groupBy?: { 55 | cols: string[]; 56 | handler?: (rows: string[][], getColumnIndex: GetColumnIndexType) => string[]; 57 | } 58 | rowValidator: ( 59 | row: string[], 60 | getColumnIndex: GetColumnIndexType, 61 | rowIndex: number, 62 | rows: Readonly, 63 | ) => boolean; 64 | rowTransform?: (row: string[], getColumnIndex: GetColumnIndexType) => void; 65 | asArray?: boolean; // (default: false) 66 | rowValuesAsArray?: boolean; // (default: false) 67 | rowValuesAsObject?: boolean; // (default: false) 68 | colFilter?: (elText: string[], index: number) => string; // (default: (txt: string) => txt.join(' ')) 69 | colParser?: (value: string, formattedIndex: number, getColumnIndex: GetColumnIndexType) => string; // (default: (txt: string) => txt.trim()) 70 | optionalColNames?: string[]; // (default: []) 71 | }; 72 | ``` 73 | 74 | ## Parsing workflow 75 | 76 | 1. Find table(s) by provided CSS selector. 77 | 2. Find associated columns by applying `colFilter` on their text and verify their count. 78 | 3. Filter rows based on `rowValidationPolicy` 79 | 4. Add extra columns specified in `extraCols` property in settings. 80 | 5. Run `rowValidator` function for every table row. 81 | 6. Run `colParser` for every cell in a row. 82 | 7. Run `rowTransform` function for each row. 83 | 8. Group results into buckets (`groupBy.cols`) property and pick the aggregated rows. 84 | 9. Add processed row to a temp array result. 85 | 10. Add `header` column if `withHeader` property is `true`. 86 | 11. Merge partial results and return them. 87 | 88 | ## Examples 89 | 90 | > All data came from the HTML page, which you can find in `test/assets/1.html`. 91 | 92 | **Basic example** (the simple table where we want to parse three columns without editing) 93 | 94 | ```typescript 95 | import { tableParser } from 'puppeteer-table-parser' 96 | 97 | await tableParser(page, { 98 | selector: 'table', 99 | allowedColNames: { 100 | 'Car Name': 'car', 101 | 'Horse Powers': 'hp', 102 | 'Manufacture Year': 'year', 103 | }, 104 | }); 105 | ``` 106 | 107 | ```csv 108 | car;hp;year 109 | Audi S5;332;2015 110 | Alfa Romeo Giulia;500;2020 111 | BMW X3;215;2017 112 | Skoda Octavia;120;2012 113 | ``` 114 | 115 | **Basic example** with custom column name parsing: 116 | 117 | ```typescript 118 | import { tableParser } from 'puppeteer-table-parser' 119 | 120 | await tableParser(page, { 121 | selector: 'table', 122 | colFilter: (value: string[]) => { 123 | return value.join(' ').replace(' ', '-').toLowerCase(); 124 | }, 125 | colParser: (value: string) => { 126 | return value.trim(); 127 | }, 128 | allowedColNames: { 129 | 'car-name': 'car', 130 | 'horse-powers': 'hp', 131 | 'manufacture-year': 'year', 132 | }, 133 | }) 134 | ``` 135 | 136 | ```csv 137 | car;hp;year 138 | Audi S5;332;2015 139 | Alfa Romeo Giulia;500;2020 140 | BMW X3;215;2017 141 | Skoda Octavia;120;2012 142 | ``` 143 | 144 | **Basic example** with row validation and using temporary column. 145 | 146 | ```typescript 147 | import { tableParser } from 'puppeteer-table-parser' 148 | 149 | await tableParser(page, { 150 | selector: 'table', 151 | allowedColNames: { 152 | 'Car Name': 'car', 153 | 'Manufacture Year': 'year', 154 | 'Horse Powers': 'hp', 155 | }, 156 | temporaryColNames: ['Horse Powers'], 157 | rowValidator: (row: string[], getColumnIndex) => { 158 | const powerIndex = getColumnIndex('hp'); 159 | return Number(row[powerIndex]) < 250; 160 | }, 161 | }); 162 | ``` 163 | 164 | ```csv 165 | car;year 166 | BMW X3;2017 167 | Skoda Octavia;2012 168 | ``` 169 | 170 | **Advanced example:** 171 | 172 | Uses custom temporary column for filtering. It uses an extra column with custom 173 | position to be filled on a fly. 174 | 175 | ```typescript 176 | import { tableParser } from 'puppeteer-table-parser' 177 | 178 | await tableParser(page, { 179 | selector: 'table', 180 | allowedColNames: { 181 | 'Manufacture Year': 'year', 182 | 'Horse Powers': 'hp', 183 | 'Car Name': 'car', 184 | }, 185 | temporaryColNames: ['Horse Powers'], 186 | extraCols: [ 187 | { 188 | colName: 'favorite', 189 | data: '', 190 | position: 0, 191 | }, 192 | ], 193 | rowValidator: (row: string[], getColumnIndex) => { 194 | const horsePowerIndex = getColumnIndex('hp'); 195 | return Number(row[horsePowerIndex]) > 150; 196 | }, 197 | rowTransform: (row: string[], getColumnIndex) => { 198 | const nameIndex = getColumnIndex('car'); 199 | const favoriteIndex = getColumnIndex('favorite'); 200 | 201 | if (row[nameIndex].includes('Alfa Romeo')) { 202 | row[favoriteIndex] = 'YES'; 203 | } else { 204 | row[favoriteIndex] = 'NO'; 205 | } 206 | }, 207 | asArray: false, 208 | rowValuesAsArray: false 209 | }); 210 | ``` 211 | 212 | ```csv 213 | favorite;year;car 214 | NO;2015;Audi S5 215 | YES;2020;Alfa Romeo Giulia 216 | NO;2017;BMW X3 217 | ``` 218 | 219 | **Optional columns** 220 | 221 | Sometimes you can be in a situation where some if 222 | your columns are desired, but they are not available in a table. 223 | You can easily add an exception for them via `optionalColNames` property. 224 | 225 | ```typescript 226 | import { tableParser } from 'puppeteer-table-parser' 227 | 228 | await tableParser(page, { 229 | selector: 'table', 230 | allowedColNames: { 231 | 'Car Name': 'car', 232 | 'Rating': 'rating', 233 | }, 234 | optionalColNames: ['rating'] 235 | }); 236 | ``` 237 | 238 | **Grouping and Aggregating** 239 | ```typescript 240 | import { tableParser } from 'puppeteer-table-parser' 241 | 242 | await tableParser(page, { 243 | selector: '#my-table', 244 | allowedColNames: { 245 | 'Employee Name': 'name', 246 | 'Age': 'age', 247 | }, 248 | groupBy: { 249 | cols: ['name'], 250 | handler: (rows: string[][], getColumnIndex) => { 251 | const ageIndex = getColumnIndex('age'); 252 | 253 | // select one with the minimal age 254 | return rows.reduce((previous, current) => 255 | previous[ageIndex] < current[ageIndex] ? previous : current, 256 | ); 257 | }, 258 | } 259 | }); 260 | ``` 261 | 262 | For more, look at the `test` folder! 🙈 263 | 264 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "puppeteer-table-parser", 3 | "description": "Library to make parsing website tables much easier!", 4 | "keywords": [ 5 | "puppeteer", 6 | "puppeteer table parser", 7 | "parsing html tables" 8 | ], 9 | "version": "2.2.0", 10 | "type": "module", 11 | "main": "./dist/index.cjs", 12 | "module": "./dist/index.js", 13 | "types": "./dist/index.d.ts", 14 | "exports": { 15 | ".": { 16 | "require": "./dist/index.cjs", 17 | "default": "./dist/index.js", 18 | "import": "./dist/index.js" 19 | } 20 | }, 21 | "files": [ 22 | "dist" 23 | ], 24 | "homepage": "https://github.com/Tomas2D/puppeteer-table-parser#readme", 25 | "repository": { 26 | "type": "git", 27 | "url": "git+https://github.com/Tomas2D/puppeteer-table-parser.git" 28 | }, 29 | "bugs": { 30 | "url": "https://github.com/Tomas2D/puppeteer-table-parser/issues" 31 | }, 32 | "author": "Tomáš Dvořák ", 33 | "license": "MIT", 34 | "private": false, 35 | "scripts": { 36 | "build": "rm -Rf dist; tsc --noEmit --project tsconfig.build.json && tsup", 37 | "watch": "yarn build -- --watch src", 38 | "lint": "eslint \"{src,test}/**/*.ts\" --fix", 39 | "format": "prettier --write \"src/**/*.ts\"", 40 | "changelog": "npx gitmoji-changelog", 41 | "release": "yarn version", 42 | "version": "yarn changelog && code --wait CHANGELOG.md && git add README.md CHANGELOG.md", 43 | "prepublishOnly": "yarn build", 44 | "test": "jest" 45 | }, 46 | "peerDependencies": { 47 | "puppeteer": ">=10.0.0" 48 | }, 49 | "devDependencies": { 50 | "@types/express": "^5.0.0", 51 | "@types/jest": "^29.1.2", 52 | "@typescript-eslint/eslint-plugin": "^5.39.0", 53 | "@typescript-eslint/parser": "^5.39.0", 54 | "eslint": "^8.24.0", 55 | "eslint-config-prettier": "^9.0.0", 56 | "express": "^4.18.1", 57 | "husky": "^8.0.1", 58 | "jest": "^29.2.0", 59 | "lint-staged": "^14.0.0", 60 | "prettier": "^3.0.1", 61 | "puppeteer": "^21.0.1", 62 | "ts-jest": "^29.0.3", 63 | "tsup": "^7.1.0", 64 | "typescript": "^5.0.4" 65 | }, 66 | "resolutions": { 67 | "set-value": ">=4.0.1" 68 | }, 69 | "jest": { 70 | "preset": "ts-jest", 71 | "moduleFileExtensions": [ 72 | "js", 73 | "json", 74 | "ts" 75 | ], 76 | "testTimeout": 15000, 77 | "testRegex": ".test.ts$", 78 | "transform": { 79 | "^.+\\.(t|j)s$": "ts-jest" 80 | }, 81 | "testEnvironment": "node" 82 | }, 83 | "husky": { 84 | "hooks": { 85 | "pre-commit": "lint-staged" 86 | } 87 | }, 88 | "lint-staged": { 89 | "*.{js,ts,tsx}": [ 90 | "eslint --fix", 91 | "prettier --write" 92 | ] 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /scripts/fix-gitmoji-changelog-node-preset: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Patching gitmoji-changelog preset is needed from two reasons: 4 | # 1. There is a bug at usage of read-pkg-up (https://github.com/frinyvonnick/gitmoji-changelog/pull/192) 5 | # 2. Tool currently does not support monorepos 6 | patch --forward --silent node_modules/gitmoji-changelog/src/presets/node.js scripts/fix-gitmoji-preset.patch 7 | -------------------------------------------------------------------------------- /scripts/fix-gitmoji-preset.patch: -------------------------------------------------------------------------------- 1 | 5c6,7 2 | < const packageInfo = await readPkgUp() 3 | --- 4 | > const cwd = require('path').resolve(__dirname, '../../../../packages/lokse'); 5 | > const packageInfo = await readPkgUp({cwd }) 6 | 7c9 7 | < if (!packageInfo.pkg) throw Error('Empty package.json') 8 | --- 9 | > if (!packageInfo.packageJson) throw Error('Empty package.json') 10 | 10,12c12,14 11 | < name: packageInfo.pkg.name, 12 | < version: packageInfo.pkg.version, 13 | < description: packageInfo.pkg.description, 14 | --- 15 | > name: packageInfo.packageJson.name, 16 | > version: packageInfo.packageJson.version, 17 | > description: packageInfo.packageJson.description, 18 | -------------------------------------------------------------------------------- /src/aggregations.ts: -------------------------------------------------------------------------------- 1 | import { GetColumnIndexType, GroupByOptions } from './types'; 2 | 3 | const takeFirstHandler = (rows: string[][]) => rows[0]; 4 | 5 | export function groupBy( 6 | rows: string[][], 7 | { cols, handler = takeFirstHandler }: GroupByOptions, 8 | getColumnIndex: GetColumnIndexType, 9 | ): string[][] { 10 | const rowsByKey = new Map(); 11 | 12 | rows.forEach((row) => { 13 | const key = cols.map((col) => row[getColumnIndex(col)]).join('-'); 14 | if (!rowsByKey.has(key)) { 15 | rowsByKey.set(key, []); 16 | } 17 | rowsByKey.get(key)!.push(row); 18 | }); 19 | 20 | return Array.from(rowsByKey.values()).map((rows) => { 21 | if (rows.length > 1) { 22 | return handler(rows, getColumnIndex); 23 | } 24 | return rows[0]; 25 | }); 26 | } 27 | -------------------------------------------------------------------------------- /src/errors.ts: -------------------------------------------------------------------------------- 1 | export class GeneralError extends Error {} 2 | 3 | export class NoTablesFoundError extends GeneralError {} 4 | 5 | export class InvalidSettingsError extends GeneralError {} 6 | 7 | export class MissingRequiredColumnsError extends GeneralError {} 8 | 9 | export class InvalidColumnError extends GeneralError {} 10 | -------------------------------------------------------------------------------- /src/helpers.ts: -------------------------------------------------------------------------------- 1 | import type { ExtraCol, ExtraColsMapper } from './types'; 2 | import type { FullParserSettings } from './types'; 3 | import { ElementHandle } from 'puppeteer'; 4 | import { InvalidColumnError, MissingRequiredColumnsError } from './errors'; 5 | 6 | export const identity = (value: T): T => value; 7 | 8 | export const extraColsMapperFactory = (extraCols: ExtraCol[]): ExtraColsMapper => { 9 | if (extraCols.length === 0) { 10 | return identity; 11 | } 12 | 13 | const withPos = extraCols 14 | .filter((extraCol): extraCol is Required => extraCol.position !== undefined) 15 | .sort((a, b) => { 16 | return a.position! - b.position!; 17 | }); 18 | 19 | // Append columns without a concrete position 20 | const withoutPos = extraCols.filter((extraCol) => extraCol.position === undefined); 21 | 22 | return (row: string[], key: keyof ExtraCol = 'data') => { 23 | const newRow = row.slice(); 24 | 25 | withPos.forEach((extraCol) => { 26 | newRow.splice(extraCol.position, 0, String(extraCol[key])); 27 | }); 28 | 29 | return newRow.concat(withoutPos.map((extraCol) => String(extraCol[key]))); 30 | }; 31 | }; 32 | 33 | export async function getColumnsInfo( 34 | settings: FullParserSettings, 35 | headerRow: ElementHandle, 36 | extraColsMapper: ReturnType, 37 | ) { 38 | const allowedColNamesKeys = Object.keys(settings.allowedColNames); 39 | 40 | // Will be updated during parsing and not found columns will be deleted 41 | const missingColNames = { ...settings.allowedColNames }; 42 | 43 | // Sorted by finding which was first visited 44 | // is index in which we traverse the table, second is final position 45 | const allowedIndexes: Record = ( 46 | await headerRow.$$eval( 47 | settings.headerRowsCellSelector, 48 | (cells: Element[], newLine: string) => { 49 | return cells.map((cell) => (cell as HTMLTableCellElement).innerText.split(newLine)); 50 | }, 51 | settings.newLine, 52 | ) 53 | ).reduce((acc, text: string[], realIndex: number) => { 54 | const colName = String(settings.colFilter(text, realIndex)); 55 | 56 | if (settings.allowedColNames.hasOwnProperty(colName)) { 57 | delete missingColNames[colName]; 58 | 59 | const desiredIndex = allowedColNamesKeys.findIndex((key) => key === colName); 60 | Object.assign(acc, { [realIndex]: desiredIndex }); 61 | } 62 | 63 | return acc; 64 | }, {}); 65 | 66 | const missingRequiredColumns = diffFromSource( 67 | Object.values(missingColNames), 68 | settings.optionalColNames, 69 | ); 70 | if (missingRequiredColumns.length > 0) { 71 | console.warn(`Not matched columns are following entries: `, missingRequiredColumns); 72 | throw new MissingRequiredColumnsError( 73 | 'Number of filtered columns does not match to required columns count!', 74 | ); 75 | } 76 | 77 | const excludedKeyIndexes: number[] = []; 78 | const colKeyToIndexWithExcluded = new Map(); 79 | const colIndexToKeyWithExcluded = new Map(); 80 | extraColsMapper(allowedColNamesKeys, 'colName').forEach((key, index) => { 81 | colKeyToIndexWithExcluded.set(key, index); 82 | colIndexToKeyWithExcluded.set(index, key); 83 | 84 | const value = settings.allowedColNames[key] || key; 85 | colKeyToIndexWithExcluded.set(value, index); 86 | colIndexToKeyWithExcluded.set(index, value); 87 | 88 | if (settings.temporaryColNames.includes(key)) { 89 | excludedKeyIndexes.push(index); 90 | } 91 | }); 92 | 93 | const getColumnIndex = (colName: string): number => { 94 | const index = colKeyToIndexWithExcluded.get(colName); 95 | if (index === undefined) { 96 | throw new InvalidColumnError(`Invalid column name! '${colName}'`); 97 | } 98 | 99 | return index; 100 | }; 101 | 102 | const getColumnName = (colIndex: number) => { 103 | const value = colIndexToKeyWithExcluded.get(colIndex); 104 | if (value === undefined) { 105 | throw new InvalidColumnError(`Column with index '${colIndex}' does not exist!`); 106 | } 107 | 108 | return value; 109 | }; 110 | 111 | return { 112 | indexes: { 113 | allowed: allowedIndexes, 114 | excluded: excludedKeyIndexes, 115 | }, 116 | missingColNames: Object.values(missingColNames), 117 | getColumnIndex, 118 | getColumnName, 119 | }; 120 | } 121 | 122 | export const diffFromSource = (source: T[], target: T[]): T[] => { 123 | return source.filter((x) => !target.includes(x)); 124 | }; 125 | 126 | export const omitUndefined = >(source: T): Exclude => { 127 | const definedPairs = Object.entries(source).filter(([, val]) => val !== undefined); 128 | return Object.fromEntries(definedPairs) as Exclude; 129 | }; 130 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { ElementHandle, Page } from 'puppeteer'; 2 | import { 3 | ParserSettings, 4 | FullParserSettings, 5 | OmitOrFalsy, 6 | ExtraCol, 7 | RowTransformFn, 8 | RowValidatorFn, 9 | } from './types'; 10 | import { parseTableFactory } from './parseTable'; 11 | import { mergeParserSettings } from './merger'; 12 | import { preprocessSettings } from './settings'; 13 | import { NoTablesFoundError } from './errors'; 14 | 15 | async function retrieveTables(page: Page, selector: string) { 16 | await page.waitForSelector(selector); 17 | 18 | const elements: ElementHandle[] = await page.$$(selector); 19 | const elementsTypes: string[] = await Promise.all( 20 | elements.map((elHandle) => elHandle.evaluate((el) => el.tagName)), 21 | ); 22 | 23 | return elements.filter((el, index) => { 24 | const elType: string = elementsTypes[index]; 25 | if (elType !== 'TABLE') { 26 | console.warn('Invalid selector! Element is not a table!'); 27 | return false; 28 | } 29 | return true; 30 | }); 31 | } 32 | 33 | export async function tableParser( 34 | page: Page, 35 | settings: Omit & { 36 | asArray: true; 37 | rowValuesAsArray?: false; 38 | rowValuesAsObject?: false; 39 | }, 40 | ): Promise; 41 | export async function tableParser( 42 | page: Page, 43 | settings: Omit & { 44 | asArray: true; 45 | rowValuesAsArray: true; 46 | rowValuesAsObject?: false; 47 | }, 48 | ): Promise; 49 | export async function tableParser( 50 | page: Page, 51 | settings: Omit< 52 | ParserSettings, 53 | | 'asArray' 54 | | 'rowValuesAsArray' 55 | | 'rowValuesAsObject' 56 | | 'allowedColNames' 57 | | 'extraCols' 58 | | 'rowTransform' 59 | | 'rowValidator' 60 | | 'temporaryColNames' 61 | > & { 62 | asArray: boolean; 63 | rowValuesAsObject: true; 64 | rowValuesAsArray?: false; 65 | allowedColNames: Record; 66 | extraCols?: Array>; 67 | rowTransform?: RowTransformFn; 68 | rowValidator?: RowValidatorFn; 69 | temporaryColNames?: Array; 70 | }, 71 | ): Promise>>; 72 | export async function tableParser( 73 | page: Page, 74 | options: OmitOrFalsy, 75 | ): Promise; 76 | export async function tableParser(page: Page, options: T) { 77 | const settings: FullParserSettings = preprocessSettings(options); 78 | 79 | const tables: ElementHandle[] = await retrieveTables(page, settings.selector); 80 | 81 | if (tables.length === 0) { 82 | throw new NoTablesFoundError('No tables found! Probably wrong table selector!'); 83 | } 84 | 85 | const parseTable = parseTableFactory(settings); 86 | 87 | const tableResults: Array>> = []; 88 | let headerFound = false; 89 | 90 | for (const table of tables) { 91 | const withHeader = settings.withHeader && !settings.rowValuesAsObject && !headerFound; 92 | const data = await parseTable(table, withHeader); 93 | 94 | if (data.length > 0 && withHeader) { 95 | headerFound = true; 96 | } 97 | tableResults.push(data); 98 | } 99 | 100 | const filteredDataTables = tableResults.flat().filter(Boolean); 101 | 102 | if (!settings.asArray) { 103 | return filteredDataTables.join(settings.newLine); 104 | } 105 | 106 | return filteredDataTables; 107 | } 108 | 109 | export { mergeParserSettings }; 110 | export * from './types'; 111 | export * from './errors'; 112 | -------------------------------------------------------------------------------- /src/mappers.ts: -------------------------------------------------------------------------------- 1 | export const asObject = 2 | (getColumnName: (i: number) => T) => 3 | (row: string[]): Record => { 4 | return row.reduce((acc, value, index) => { 5 | const key = getColumnName(index); 6 | acc[key] = value; 7 | return acc; 8 | }, {} as Record); 9 | }; 10 | 11 | export const asCsv = (separator: string) => (row: string[]) => { 12 | return row.join(separator); 13 | }; 14 | 15 | export const asArray = () => (row: string[]) => { 16 | return row; 17 | }; 18 | -------------------------------------------------------------------------------- /src/merger.ts: -------------------------------------------------------------------------------- 1 | import type { MergeParserSettings } from './types'; 2 | 3 | export const mergeParserSettings = ( 4 | to: MergeParserSettings, 5 | from: MergeParserSettings, 6 | ignoredAllowedColumns: string[] = [], 7 | ): MergeParserSettings => { 8 | const newConfig: MergeParserSettings = { 9 | temporaryColNames: to.temporaryColNames.slice(), 10 | extraCols: to.extraCols.slice(), 11 | allowedColNames: Object.assign({}, to.allowedColNames), 12 | }; 13 | 14 | newConfig.extraCols.unshift( 15 | ...from.extraCols.map((extraCol) => { 16 | extraCol.data = extraCol.data || ''; 17 | return extraCol; 18 | }), 19 | ); 20 | from.temporaryColNames 21 | .filter((tempCol) => !newConfig.temporaryColNames.includes(tempCol)) 22 | .forEach((tempCol) => newConfig.temporaryColNames.push(tempCol)); 23 | 24 | // Get columns from general table 25 | const generalColNames = Object.entries(from.allowedColNames); 26 | 27 | // Merge them together 28 | generalColNames.reverse().forEach(([key, val], index) => { 29 | const realPosition = generalColNames.length - index - 1; 30 | 31 | // If column does not exist yet and is not excluded 32 | if (!newConfig.allowedColNames.hasOwnProperty(key) && !ignoredAllowedColumns.includes(key)) { 33 | const searchEntry = newConfig.extraCols.find((col) => col.colName === key); 34 | 35 | // Column already exists, just update position to match 36 | if (searchEntry) { 37 | searchEntry.position = realPosition; 38 | return; 39 | } 40 | 41 | // Insert new column 42 | newConfig.extraCols.unshift({ 43 | colName: val, 44 | data: '', 45 | position: realPosition, 46 | }); 47 | } 48 | }); 49 | 50 | return newConfig; 51 | }; 52 | -------------------------------------------------------------------------------- /src/parseTable.ts: -------------------------------------------------------------------------------- 1 | import { FullParserSettings, RowValidationPolicy } from './types'; 2 | import { extraColsMapperFactory, getColumnsInfo } from './helpers'; 3 | import { ElementHandle } from 'puppeteer'; 4 | import { InvalidSettingsError } from './errors'; 5 | import { PipelineExecutor } from './pipelineExecutor'; 6 | import { groupBy } from './aggregations'; 7 | import * as mappers from './mappers'; 8 | 9 | export function parseTableFactory(settings: FullParserSettings) { 10 | const extraColsMapper = extraColsMapperFactory(settings.extraCols); 11 | 12 | const findHeaderRow = async ( 13 | table: ElementHandle, 14 | ): Promise<{ el: ElementHandle; bodyRowsOffset: number } | null> => { 15 | const headerRow = settings.headerRowsSelector 16 | ? await table.$(settings.headerRowsSelector) 17 | : null; 18 | 19 | if (headerRow) { 20 | return { 21 | bodyRowsOffset: 0, 22 | el: headerRow, 23 | }; 24 | } 25 | 26 | const bodyRow = await table.$(settings.bodyRowsSelector); 27 | if (bodyRow) { 28 | return { 29 | bodyRowsOffset: 1, 30 | el: bodyRow, 31 | }; 32 | } 33 | 34 | return null; 35 | }; 36 | 37 | const getOutputHeaderRow = (missingColNames: string[]) => { 38 | const headerRowRaw = Object.values(settings.allowedColNames); 39 | const sortedHeader = extraColsMapper(headerRowRaw, 'colName'); 40 | 41 | return sortedHeader.filter((key) => !missingColNames.includes(key)); 42 | }; 43 | 44 | const getRowStructureValidator = (allowedIndexes: Record) => { 45 | if (settings.rowValidationPolicy === RowValidationPolicy.NONE) { 46 | return () => true; 47 | } 48 | if (settings.rowValidationPolicy === RowValidationPolicy.NON_EMPTY) { 49 | return (rows: string[]) => rows.length > 0; 50 | } 51 | if (settings.rowValidationPolicy === RowValidationPolicy.EXACT_MATCH) { 52 | return (rows: string[]) => rows.length === Object.keys(allowedIndexes).length; 53 | } 54 | throw new InvalidSettingsError('Unknown mode for the "rowValidationPolicy"'); 55 | }; 56 | 57 | const getRowsData = async ( 58 | table: ElementHandle, 59 | rowsOffset: number, 60 | allowedIndexes: Record, 61 | ): Promise => { 62 | return await table.evaluate( 63 | ( 64 | el, 65 | { reverseTraversal, allowedIndexes, bodyRowsSelector, rowsOffset, bodyRowsCellSelector }, 66 | ) => { 67 | const rows = Array.from(el.querySelectorAll(bodyRowsSelector)); 68 | rows.splice(0, rowsOffset); 69 | if (reverseTraversal) { 70 | rows.reverse(); 71 | } 72 | 73 | const allowedIndexesMap = new Map( 74 | Object.entries(allowedIndexes).map(([k, v]) => [Number(k), v]), 75 | ); 76 | return rows.map((row) => 77 | Array.from(row.querySelectorAll(bodyRowsCellSelector)) 78 | .map((cell, realIndex): [Element, number] => [cell, realIndex]) 79 | .filter((_, realIndex) => allowedIndexesMap.has(realIndex)) 80 | .sort((a, b) => { 81 | const indexA = allowedIndexesMap.get(a[1]); 82 | const indexB = allowedIndexesMap.get(b[1]); 83 | 84 | return indexA - indexB; 85 | }) 86 | .map(([cell]): string => (cell as HTMLElement)?.innerText ?? cell?.textContent), 87 | ); 88 | }, 89 | { 90 | reverseTraversal: settings.reverseTraversal, 91 | bodyRowsSelector: settings.bodyRowsSelector, 92 | bodyRowsCellSelector: settings.bodyRowsCellSelector, 93 | allowedIndexes, 94 | rowsOffset, 95 | }, 96 | ); 97 | }; 98 | 99 | return async (table: ElementHandle, addHeader: boolean) => { 100 | await table.evaluate((el) => el.scrollIntoView()); 101 | 102 | const header = await findHeaderRow(table); 103 | if (!header) { 104 | return []; 105 | } 106 | 107 | const { indexes, getColumnIndex, getColumnName, missingColNames } = await getColumnsInfo( 108 | settings, 109 | header.el, 110 | extraColsMapper, 111 | ); 112 | 113 | let parsedRows = await new PipelineExecutor( 114 | await getRowsData(table, header.bodyRowsOffset, indexes.allowed), 115 | ) 116 | .addFilter(getRowStructureValidator(indexes.allowed)) 117 | .addMap((row) => extraColsMapper(row, 'data')) 118 | .addFilter((row, index, rows) => settings.rowValidator(row, getColumnIndex, index, rows)) 119 | .addMap((row) => row.map((cell, index) => settings.colParser(cell, index, getColumnIndex))) 120 | .addTransform((row) => settings.rowTransform(row, getColumnIndex)) 121 | .execute(); 122 | 123 | if (settings.groupBy) { 124 | parsedRows = groupBy(parsedRows, settings.groupBy, getColumnIndex); 125 | } 126 | 127 | if (addHeader) { 128 | const headerRow = getOutputHeaderRow(missingColNames); 129 | parsedRows.unshift(headerRow); 130 | } 131 | 132 | const rowOutputMapper = settings.rowValuesAsObject 133 | ? mappers.asObject(getColumnName) 134 | : settings.rowValuesAsArray 135 | ? mappers.asArray() 136 | : mappers.asCsv(settings.csvSeparator); 137 | 138 | return new PipelineExecutor[]>(parsedRows) 139 | .addMap((row) => row.filter((_, index) => !indexes.excluded.includes(index))) 140 | .addMap(rowOutputMapper) 141 | .execute(); 142 | }; 143 | } 144 | -------------------------------------------------------------------------------- /src/pipelineExecutor.ts: -------------------------------------------------------------------------------- 1 | enum OperationType { 2 | FILTER, 3 | MAP, 4 | TRANSFORM, 5 | } 6 | 7 | type IFilterOperation = { 8 | type: OperationType.FILTER; 9 | callback: (item: T, index: number, arr: T[]) => boolean; 10 | }; 11 | 12 | type IMapOperation = { 13 | type: OperationType.MAP; 14 | callback: (item: T, index: number, arr: T[]) => any; 15 | }; 16 | 17 | type ITransformOperation = { 18 | type: OperationType.TRANSFORM; 19 | callback: (item: T, index: number, arr: T[]) => void; 20 | }; 21 | 22 | type Unwrapped = T extends Array ? R : T; 23 | 24 | export type IOperation = IFilterOperation | IMapOperation | ITransformOperation; 25 | 26 | export class PipelineExecutor { 27 | private readonly operations: IOperation[] = []; 28 | constructor(private _input?: Promise | T) {} 29 | 30 | public execute(input?: Promise | T) { 31 | this._input = input || this._input || ([] as T); 32 | 33 | function isPromise(p: unknown): p is Promise> { 34 | return p && Object.prototype.toString.call(p) === '[object Promise]'; 35 | } 36 | 37 | if (isPromise(this._input)) { 38 | return this._input.then((x) => this._execute(x)); 39 | } else { 40 | return this._execute(this._input as Awaited); 41 | } 42 | } 43 | 44 | private _execute(input: T): R { 45 | const acc: unknown[] = []; 46 | 47 | for (let index = 0; index < input.length; index++) { 48 | let value = input[index]; 49 | let isValid = true; 50 | 51 | for (const { type, callback } of this.operations) { 52 | if (type === OperationType.FILTER) { 53 | if (!callback(value, index, acc)) { 54 | isValid = false; 55 | break; 56 | } 57 | } else if (type === OperationType.MAP) { 58 | value = callback(value, index, acc); 59 | } else if (type === OperationType.TRANSFORM) { 60 | callback(value, index, acc); 61 | } else { 62 | throw new Error('Unknown executor operation!'); 63 | } 64 | } 65 | 66 | if (isValid) { 67 | acc.push(value); 68 | } 69 | } 70 | 71 | return acc as R; 72 | } 73 | 74 | private addOperation(operation: IOperation) { 75 | this.operations.push(operation); 76 | return this; 77 | } 78 | 79 | public clear() { 80 | this.operations.length = 0; 81 | return this; 82 | } 83 | 84 | public addFilter>(callback: IFilterOperation['callback']) { 85 | return this.addOperation({ 86 | type: OperationType.FILTER, 87 | callback, 88 | }); 89 | } 90 | 91 | public addMap>(callback: IMapOperation['callback']) { 92 | return this.addOperation({ 93 | type: OperationType.MAP, 94 | callback, 95 | }); 96 | } 97 | 98 | public addTransform>(callback: ITransformOperation['callback']) { 99 | return this.addOperation({ 100 | type: OperationType.TRANSFORM, 101 | callback, 102 | }); 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /src/settings.ts: -------------------------------------------------------------------------------- 1 | import { 2 | FullParserSettings, 3 | ParserSettings, 4 | ParserSettingsOptional, 5 | RowValidationPolicy, 6 | } from './types'; 7 | import { InvalidSettingsError } from './errors'; 8 | import { omitUndefined } from './helpers'; 9 | 10 | export const defaultSettings: ParserSettingsOptional = { 11 | extraCols: [], 12 | withHeader: true, 13 | csvSeparator: ';', 14 | newLine: '\n', 15 | rowValidationPolicy: RowValidationPolicy.NON_EMPTY, 16 | groupBy: undefined, 17 | rowValidator: () => true, 18 | rowTransform: () => {}, 19 | asArray: false, 20 | rowValuesAsObject: false, 21 | rowValuesAsArray: false, 22 | temporaryColNames: [], 23 | colFilter: (elText) => elText.join(' '), 24 | colParser: (value) => value.trim(), 25 | optionalColNames: [], 26 | reverseTraversal: false, 27 | headerRowsSelector: 'thead tr', 28 | headerRowsCellSelector: 'td,th', 29 | bodyRowsSelector: 'tbody tr', 30 | bodyRowsCellSelector: 'td', 31 | }; 32 | 33 | export function preprocessSettings(options: ParserSettings): FullParserSettings { 34 | const settings: FullParserSettings = { 35 | ...defaultSettings, 36 | ...omitUndefined(options), 37 | }; 38 | 39 | if (!settings.asArray && (settings.rowValuesAsObject || settings.rowValuesAsArray)) { 40 | settings.asArray = false; 41 | } 42 | 43 | validateSettings(settings); 44 | return settings; 45 | } 46 | 47 | export function validateSettings( 48 | settings: FullParserSettings, 49 | ): asserts settings is FullParserSettings { 50 | const { extraCols, temporaryColNames, allowedColNames } = settings; 51 | 52 | const hasConflict = extraCols 53 | .filter((col) => col.position !== undefined) 54 | .some((a) => extraCols.find((b) => a !== b && a.position === b.position)); 55 | 56 | if (hasConflict) { 57 | throw new InvalidSettingsError('One or more `extraCols` have same position!'); 58 | } 59 | 60 | for (const colName of temporaryColNames) { 61 | if (!Object.prototype.hasOwnProperty.call(allowedColNames, colName)) { 62 | throw new InvalidSettingsError( 63 | `Entry ${colName} in 'temporaryColNames' must exists in 'allowedColNames'!`, 64 | ); 65 | } 66 | } 67 | 68 | const allowedColNamesValues = Object.values(allowedColNames); 69 | for (const { colName } of extraCols) { 70 | if (allowedColNamesValues.includes(colName)) { 71 | throw new InvalidSettingsError( 72 | `'${colName}' in 'extraCols' has same name as column in 'allowedColNames'!`, 73 | ); 74 | } 75 | } 76 | 77 | if (!settings.asArray && settings.rowValuesAsArray) { 78 | throw new InvalidSettingsError( 79 | `'rowValuesAsArray' can be set to true only and only if 'asArray' is also true!`, 80 | ); 81 | } 82 | 83 | if (!Array.isArray(settings.optionalColNames)) { 84 | throw new InvalidSettingsError(`'optionalColNames' must be an "array"`); 85 | } 86 | for (const optionalColName of settings.optionalColNames) { 87 | if (!allowedColNamesValues.includes(optionalColName)) { 88 | throw new InvalidSettingsError( 89 | `'${optionalColName}' in 'optionalColNames' does not exists in 'allowedColNames'!`, 90 | ); 91 | } 92 | } 93 | 94 | if (settings.groupBy) { 95 | if (!Array.isArray(settings.groupBy.cols)) { 96 | throw new InvalidSettingsError(`Columns in "groupBy" field must be typeof array`); 97 | } 98 | if (settings.groupBy.handler && typeof settings.groupBy.handler !== 'function') { 99 | throw new InvalidSettingsError(`Passed handler to the "groupBy" is not a function`); 100 | } 101 | } 102 | 103 | if (settings.rowValuesAsObject && settings.rowValuesAsArray) { 104 | throw new InvalidSettingsError( 105 | `Cannot combine "rowValuesAsObject" with "rowValuesAsArray" options!`, 106 | ); 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export interface ExtraCol { 2 | colName: T; 3 | data: string; 4 | position?: number; 5 | } 6 | 7 | export type GetColumnIndexType = (colName: T) => number; 8 | 9 | export enum RowValidationPolicy { 10 | NONE = 'NONE', 11 | NON_EMPTY = 'NON_EMPTY', 12 | EXACT_MATCH = 'EXACT_MATCH', 13 | } 14 | 15 | export type GroupByOptions = { 16 | cols: string[]; 17 | handler?: (rows: string[][], getColumnIndex: GetColumnIndexType) => string[]; 18 | }; 19 | 20 | export type ColParserFn = ( 21 | value: string, 22 | formattedIndex: number, 23 | getColumnIndex: GetColumnIndexType, 24 | ) => string; 25 | 26 | export type RowTransformFn = ( 27 | row: string[], 28 | getColumnIndex: GetColumnIndexType, 29 | ) => void; 30 | 31 | export type RowValidatorFn = ( 32 | row: string[], 33 | getColumnIndex: GetColumnIndexType, 34 | rowIndex: number, 35 | rows: Readonly, 36 | ) => boolean; 37 | 38 | export type ParserSettingsOptional = { 39 | temporaryColNames: string[]; 40 | extraCols: ExtraCol[]; 41 | withHeader: boolean; 42 | csvSeparator: string; 43 | newLine: string; 44 | rowValidationPolicy: RowValidationPolicy; 45 | groupBy: GroupByOptions; 46 | rowValidator: RowValidatorFn; 47 | rowTransform: RowTransformFn; 48 | asArray: boolean; 49 | rowValuesAsObject: boolean; 50 | rowValuesAsArray: boolean; 51 | colFilter: (elText: string[], index: number) => string; 52 | colParser: ColParserFn; 53 | optionalColNames: string[]; 54 | reverseTraversal: boolean; 55 | headerRowsSelector: string | null; 56 | headerRowsCellSelector: string; 57 | bodyRowsSelector: string; 58 | bodyRowsCellSelector: string; 59 | }; 60 | 61 | export interface ParserSettings extends Partial { 62 | selector: string; 63 | readonly allowedColNames: Record; 64 | } 65 | 66 | export type FullParserSettings = Required; 67 | 68 | export type ExtraColsMapper = (row: string[], key: keyof ExtraCol) => string[]; 69 | 70 | export interface MergeParserSettings { 71 | allowedColNames: FullParserSettings['allowedColNames']; 72 | extraCols: FullParserSettings['extraCols']; 73 | temporaryColNames: FullParserSettings['temporaryColNames']; 74 | } 75 | 76 | export type OmitOrFalsy = Omit & { 77 | [key in K]?: undefined | false; 78 | }; 79 | -------------------------------------------------------------------------------- /test/assets/1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Example #1 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 |
Car NameHorse PowersManufacture Year
Audi S53322015
Alfa Romeo Giulia5002020
BMW X32152017
Skoda Octavia1202012
43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /test/assets/2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Example #2 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | /tr> 36 | 37 | 38 | 39 | 40 | 41 |
Employee NameAge
John M. Bolduc32
Allan Meron40
John M. Bolduc29
Milan Lukeš33
John M. Bolduc34
Allan Meron90
42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /test/assets/large-table.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Large table 6 | 24 | 47 | 48 | 49 | 50 | 51 | 52 | 53 |
54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /test/createServer.ts: -------------------------------------------------------------------------------- 1 | import { Server } from 'http'; 2 | import * as path from 'path'; 3 | import express from 'express'; 4 | 5 | const port = 7588; 6 | 7 | export const getBaseUrl = () => { 8 | return `http://localhost:${port}`; 9 | }; 10 | 11 | export const createServer = async (): Promise => { 12 | const app = express(); 13 | 14 | app.use(express.static(path.join(__dirname, 'assets'))); 15 | 16 | return new Promise((resolve) => { 17 | app.listen(port, function () { 18 | // @ts-ignore 19 | resolve(this); 20 | }); 21 | }); 22 | }; 23 | -------------------------------------------------------------------------------- /test/helpers.test.ts: -------------------------------------------------------------------------------- 1 | import { omitUndefined } from '../src/helpers'; 2 | import type { ParserSettingsOptional } from '../src/types'; 3 | 4 | describe('Helper utils', () => { 5 | it('Removes undefined properties', () => { 6 | const settings: Partial = { 7 | temporaryColNames: [], 8 | asArray: true, 9 | colFilter: undefined, 10 | }; 11 | 12 | expect(omitUndefined(settings)).toMatchInlineSnapshot(` 13 | { 14 | "asArray": true, 15 | "temporaryColNames": [], 16 | } 17 | `); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /test/index.test.ts: -------------------------------------------------------------------------------- 1 | import { Server } from 'http'; 2 | import { promisify } from 'util'; 3 | import { createServer, getBaseUrl } from './createServer'; 4 | import { Browser, launch, Page } from 'puppeteer'; 5 | import { tableParser, RowValidationPolicy } from '../src'; 6 | 7 | jest.setTimeout(60 * 1000 * 1000); 8 | 9 | describe('Basic parsing', () => { 10 | let server: Server; 11 | let browser: Browser; 12 | let page: Page; 13 | 14 | beforeAll(async () => { 15 | server = await createServer(); 16 | browser = await launch({ 17 | headless: 'new', 18 | }); 19 | page = await browser.newPage(); 20 | }); 21 | 22 | afterAll(async () => { 23 | await browser.close(); 24 | await promisify(server.close).bind(server)(); 25 | }); 26 | 27 | it('Parse no filters', async () => { 28 | await page.goto(`${getBaseUrl()}/1.html`); 29 | 30 | const data = await tableParser(page, { 31 | selector: 'table', 32 | allowedColNames: { 33 | 'Car Name': 'car', 34 | 'Horse Powers': 'hp', 35 | 'Manufacture Year': 'year', 36 | }, 37 | }); 38 | 39 | expect(data).toMatchInlineSnapshot(` 40 | "car;hp;year 41 | Audi S5;332;2015 42 | Alfa Romeo Giulia;500;2020 43 | BMW X3;215;2017 44 | Skoda Octavia;120;2012" 45 | `); 46 | }); 47 | 48 | it('Parse in reverse order', async () => { 49 | await page.goto(`${getBaseUrl()}/1.html`); 50 | 51 | const data = await tableParser(page, { 52 | selector: 'table', 53 | reverseTraversal: true, 54 | allowedColNames: { 55 | 'Car Name': 'car', 56 | }, 57 | }); 58 | 59 | expect(data).toMatchInlineSnapshot(` 60 | "car 61 | Skoda Octavia 62 | BMW X3 63 | Alfa Romeo Giulia 64 | Audi S5" 65 | `); 66 | }); 67 | 68 | it('Return data as array with strings inside', async () => { 69 | await page.goto(`${getBaseUrl()}/1.html`); 70 | 71 | const data: string[] = await tableParser(page, { 72 | asArray: true, 73 | selector: 'table', 74 | allowedColNames: { 75 | 'Car Name': 'car', 76 | 'Horse Powers': 'hp', 77 | 'Manufacture Year': 'year', 78 | }, 79 | }); 80 | 81 | expect(data).toMatchInlineSnapshot(` 82 | [ 83 | "car;hp;year", 84 | "Audi S5;332;2015", 85 | "Alfa Romeo Giulia;500;2020", 86 | "BMW X3;215;2017", 87 | "Skoda Octavia;120;2012", 88 | ] 89 | `); 90 | }); 91 | 92 | it('Return data as array with arrays inside', async () => { 93 | await page.goto(`${getBaseUrl()}/1.html`); 94 | 95 | const data: string[][] = await tableParser(page, { 96 | asArray: true, 97 | rowValuesAsArray: true, 98 | selector: 'table', 99 | allowedColNames: { 100 | 'Car Name': 'car', 101 | 'Horse Powers': 'hp', 102 | 'Manufacture Year': 'year', 103 | }, 104 | }); 105 | 106 | expect(data).toMatchInlineSnapshot(` 107 | [ 108 | [ 109 | "car", 110 | "hp", 111 | "year", 112 | ], 113 | [ 114 | "Audi S5", 115 | "332", 116 | "2015", 117 | ], 118 | [ 119 | "Alfa Romeo Giulia", 120 | "500", 121 | "2020", 122 | ], 123 | [ 124 | "BMW X3", 125 | "215", 126 | "2017", 127 | ], 128 | [ 129 | "Skoda Octavia", 130 | "120", 131 | "2012", 132 | ], 133 | [ 134 | "", 135 | ], 136 | ] 137 | `); 138 | }); 139 | 140 | it('Throw error with invalid options', () => { 141 | expect( 142 | tableParser(page, { 143 | selector: 'table', 144 | asArray: false, 145 | // @ts-expect-error intended 146 | rowValuesAsArray: true, 147 | allowedColNames: { 148 | 'car-name': 'car', 149 | }, 150 | }), 151 | ).rejects.toThrowError(); 152 | 153 | expect( 154 | tableParser(page, { 155 | selector: 'table', 156 | // @ts-expect-error intended 157 | rowValuesAsObject: true, 158 | // @ts-expect-error intended 159 | rowValuesAsArray: true, 160 | allowedColNames: { 161 | 'car-name': 'car', 162 | }, 163 | }), 164 | ).rejects.toThrowError(); 165 | 166 | expect( 167 | tableParser(page, { 168 | selector: 'table', 169 | rowValuesAsObject: false, 170 | // @ts-expect-error intended 171 | rowValuesAsArray: true, 172 | allowedColNames: { 173 | 'car-name': 'car', 174 | }, 175 | }), 176 | ).rejects.toThrowError(); 177 | }); 178 | 179 | it('Throw error when specified optional column which does not exists', () => { 180 | expect( 181 | tableParser(page, { 182 | selector: 'table', 183 | allowedColNames: { 184 | 'car-name': 'car', 185 | }, 186 | optionalColNames: ['xcar'], 187 | }), 188 | ).rejects.toThrowError(); 189 | }); 190 | 191 | it('Parse webalize', async () => { 192 | await page.goto(`${getBaseUrl()}/1.html`); 193 | 194 | const data = await tableParser(page, { 195 | selector: 'table', 196 | colFilter: (value: string[]) => { 197 | return value.join(' ').replace(' ', '-').toLowerCase(); 198 | }, 199 | colParser: (value: string) => { 200 | return value.trim(); 201 | }, 202 | allowedColNames: { 203 | 'car-name': 'car', 204 | 'horse-powers': 'hp', 205 | 'manufacture-year': 'year', 206 | }, 207 | }); 208 | 209 | expect(data).toMatchInlineSnapshot(` 210 | "car;hp;year 211 | Audi S5;332;2015 212 | Alfa Romeo Giulia;500;2020 213 | BMW X3;215;2017 214 | Skoda Octavia;120;2012" 215 | `); 216 | }); 217 | 218 | it('Parse and preserver order', async () => { 219 | await page.goto(`${getBaseUrl()}/1.html`); 220 | 221 | const data = await tableParser(page, { 222 | selector: 'table', 223 | allowedColNames: { 224 | 'Manufacture Year': 'year', // is last normally 225 | 'Car Name': 'car', 226 | 'Horse Powers': 'hp', 227 | }, 228 | }); 229 | 230 | expect(data).toMatchInlineSnapshot(` 231 | "year;car;hp 232 | 2015;Audi S5;332 233 | 2020;Alfa Romeo Giulia;500 234 | 2017;BMW X3;215 235 | 2012;Skoda Octavia;120" 236 | `); 237 | }); 238 | 239 | it('Apply filter to rows', async () => { 240 | await page.goto(`${getBaseUrl()}/1.html`); 241 | 242 | const data = await tableParser(page, { 243 | selector: 'table', 244 | allowedColNames: { 245 | 'Car Name': 'car', 246 | 'Horse Powers': 'hp', 247 | 'Manufacture Year': 'year', 248 | }, 249 | rowValidator: (row: string[], getColumnIndex) => { 250 | const indexByVal = getColumnIndex('year'); 251 | const indexByKey = getColumnIndex('Manufacture Year'); 252 | 253 | expect(indexByVal).toStrictEqual(indexByKey); 254 | 255 | return Number(row[indexByVal]) >= 2018; 256 | }, 257 | }); 258 | 259 | expect(data).toMatchInlineSnapshot(` 260 | "car;hp;year 261 | Alfa Romeo Giulia;500;2020" 262 | `); 263 | }); 264 | 265 | it('Use temporary columns', async () => { 266 | await page.goto(`${getBaseUrl()}/1.html`); 267 | 268 | const data = await tableParser(page, { 269 | selector: 'table', 270 | allowedColNames: { 271 | 'Car Name': 'car', 272 | 'Manufacture Year': 'year', 273 | 'Horse Powers': 'hp', 274 | }, 275 | temporaryColNames: ['Horse Powers'], 276 | rowValidator: (row: string[], getColumnIndex) => { 277 | const powerIndex = getColumnIndex('hp'); 278 | 279 | return Number(row[powerIndex]) < 250; 280 | }, 281 | }); 282 | 283 | expect(data).toMatchInlineSnapshot(` 284 | "car;year 285 | BMW X3;2017 286 | Skoda Octavia;2012" 287 | `); 288 | }); 289 | 290 | it('Use extra columns', async () => { 291 | await page.goto(`${getBaseUrl()}/1.html`); 292 | 293 | const data = await tableParser(page, { 294 | selector: 'table', 295 | allowedColNames: { 296 | 'Car Name': 'car', 297 | }, 298 | extraCols: [ 299 | { 300 | colName: 'date', 301 | data: '2021-03-15', 302 | position: 0, 303 | }, 304 | ], 305 | }); 306 | 307 | expect(data).toMatchInlineSnapshot(` 308 | "date;car 309 | 2021-03-15;Audi S5 310 | 2021-03-15;Alfa Romeo Giulia 311 | 2021-03-15;BMW X3 312 | 2021-03-15;Skoda Octavia 313 | 2021-03-15;" 314 | `); 315 | }); 316 | 317 | it('Use dynamic extra columns', async () => { 318 | await page.goto(`${getBaseUrl()}/1.html`); 319 | 320 | const data = await tableParser(page, { 321 | selector: 'table', 322 | allowedColNames: { 323 | 'Manufacture Year': 'year', 324 | 'Horse Powers': 'hp', 325 | 'Car Name': 'car', 326 | }, 327 | temporaryColNames: ['Horse Powers'], 328 | extraCols: [ 329 | { 330 | colName: 'favorite', 331 | data: '', 332 | position: 0, 333 | }, 334 | ], 335 | rowValidator: (row: string[], getColumnIndex) => { 336 | const horsePowerIndex = getColumnIndex('hp'); 337 | return Number(row[horsePowerIndex]) > 150; 338 | }, 339 | rowTransform: (row: string[], getColumnIndex) => { 340 | const nameIndex = getColumnIndex('car'); 341 | const favoriteIndex = getColumnIndex('favorite'); 342 | 343 | if (row[nameIndex].includes('Alfa Romeo')) { 344 | row[favoriteIndex] = 'YES'; 345 | } else { 346 | row[favoriteIndex] = 'NO'; 347 | } 348 | }, 349 | }); 350 | 351 | expect(data).toMatchInlineSnapshot(` 352 | "favorite;year;car 353 | NO;2015;Audi S5 354 | YES;2020;Alfa Romeo Giulia 355 | NO;2017;BMW X3" 356 | `); 357 | }); 358 | 359 | it('Parse if column was not found, but was optional', async () => { 360 | await page.goto(`${getBaseUrl()}/1.html`); 361 | 362 | const data = await tableParser(page, { 363 | selector: 'table', 364 | rowValidationPolicy: RowValidationPolicy.EXACT_MATCH, 365 | allowedColNames: { 366 | 'Car Name': 'car', 367 | 'Some non existing column': 'non-existing', 368 | 'Horse Powers': 'hp', 369 | 'Manufacture Year': 'year', 370 | }, 371 | extraCols: [ 372 | { 373 | colName: 'ex', 374 | data: 'ex', 375 | position: 1, 376 | }, 377 | ], 378 | optionalColNames: ['car', 'non-existing'], 379 | }); 380 | 381 | expect(data).toMatchInlineSnapshot(` 382 | "car;ex;hp;year 383 | Audi S5;ex;332;2015 384 | Alfa Romeo Giulia;ex;500;2020 385 | BMW X3;ex;215;2017 386 | Skoda Octavia;ex;120;2012" 387 | `); 388 | }); 389 | 390 | it('Handles multiple extra columns', async () => { 391 | await page.goto(`${getBaseUrl()}/1.html`); 392 | 393 | const data = await tableParser(page, { 394 | selector: 'table', 395 | allowedColNames: { 396 | 'Car Name': 'car', 397 | 'Horse Powers': 'hp', 398 | }, 399 | extraCols: [ 400 | { 401 | colName: 'ex1', 402 | data: 'ex1', 403 | }, 404 | { 405 | colName: 'ex2', 406 | data: 'ex2', 407 | }, 408 | ], 409 | }); 410 | 411 | expect(data).toMatchInlineSnapshot(` 412 | "car;hp;ex1;ex2 413 | Audi S5;332;ex1;ex2 414 | Alfa Romeo Giulia;500;ex1;ex2 415 | BMW X3;215;ex1;ex2 416 | Skoda Octavia;120;ex1;ex2 417 | ;ex1;ex2" 418 | `); 419 | }); 420 | 421 | it('Handles filtering partial rows', async () => { 422 | await page.goto(`${getBaseUrl()}/1.html`); 423 | 424 | const data = await tableParser(page, { 425 | selector: 'table', 426 | rowValidationPolicy: RowValidationPolicy.EXACT_MATCH, 427 | allowedColNames: { 428 | 'Car Name': 'car', 429 | 'Horse Powers': 'hp', 430 | 'Manufacture Year': 'year', 431 | }, 432 | extraCols: [ 433 | { 434 | colName: 'sellerId', 435 | data: '123', 436 | }, 437 | ], 438 | }); 439 | 440 | expect(data).toMatchInlineSnapshot(` 441 | "car;hp;year;sellerId 442 | Audi S5;332;2015;123 443 | Alfa Romeo Giulia;500;2020;123 444 | BMW X3;215;2017;123 445 | Skoda Octavia;120;2012;123" 446 | `); 447 | }); 448 | 449 | it('Handles aggregation', async () => { 450 | await page.goto(`${getBaseUrl()}/2.html`); 451 | 452 | const data = await tableParser(page, { 453 | selector: '#employee-overview', 454 | asArray: false, 455 | allowedColNames: { 456 | 'Employee Name': 'name', 457 | 'Age': 'age', 458 | }, 459 | groupBy: { 460 | cols: ['name'], 461 | }, 462 | }); 463 | 464 | expect(data).toMatchInlineSnapshot(` 465 | "name;age 466 | John M. Bolduc;32 467 | Allan Meron;40 468 | Milan Lukeš;33" 469 | `); 470 | }); 471 | 472 | it('Handles aggregation with custom handler', async () => { 473 | await page.goto(`${getBaseUrl()}/2.html`); 474 | 475 | const data = await tableParser(page, { 476 | selector: '#employee-overview', 477 | asArray: false, 478 | allowedColNames: { 479 | 'Employee Name': 'name', 480 | 'Age': 'age', 481 | }, 482 | groupBy: { 483 | cols: ['name'], 484 | handler: (rows: string[][], getColumnIndex) => { 485 | const ageIndex = getColumnIndex('age'); 486 | 487 | // select one with the minimal age 488 | return rows.reduce((previous, current) => 489 | previous[ageIndex] < current[ageIndex] ? previous : current, 490 | ); 491 | }, 492 | }, 493 | }); 494 | 495 | expect(data).toMatchInlineSnapshot(` 496 | "name;age 497 | John M. Bolduc;29 498 | Allan Meron;40 499 | Milan Lukeš;33" 500 | `); 501 | }); 502 | 503 | it('Parses a large HTML table', async () => { 504 | await page.goto(`${getBaseUrl()}/large-table.html`); 505 | 506 | const data = await tableParser(page, { 507 | selector: 'table', 508 | asArray: false, 509 | allowedColNames: { 510 | A: 'first', 511 | B: 'second', 512 | }, 513 | }); 514 | 515 | expect(data).toBeTruthy(); 516 | }); 517 | 518 | it('Returns data as a object', async () => { 519 | await page.goto(`${getBaseUrl()}/2.html`); 520 | 521 | const data = await tableParser(page, { 522 | selector: '#employee-overview', 523 | rowValuesAsObject: true, 524 | asArray: true, 525 | allowedColNames: { 526 | 'Employee Name': 'name', 527 | 'Age': 'age', 528 | }, 529 | }); 530 | 531 | expect(data).toBeInstanceOf(Array); 532 | data.forEach((row) => { 533 | expect(row).toHaveProperty('age'); 534 | expect(row).toHaveProperty('name'); 535 | }); 536 | }); 537 | 538 | it('Returns only header because no rows passed filter', async () => { 539 | await page.goto(`${getBaseUrl()}/2.html`); 540 | 541 | const data = await tableParser(page, { 542 | selector: '#employee-overview', 543 | rowValidator: () => false, 544 | asArray: true, 545 | csvSeparator: ',', 546 | allowedColNames: { 547 | 'Employee Name': 'name', 548 | 'Age': 'age', 549 | }, 550 | }); 551 | 552 | expect(data).toBeInstanceOf(Array); 553 | expect(data.length).toBe(1); 554 | expect(data[0]).toBe('name,age'); 555 | }); 556 | }); 557 | -------------------------------------------------------------------------------- /test/merger.test.ts: -------------------------------------------------------------------------------- 1 | import { MergeParserSettings } from '../src/types'; 2 | import { mergeParserSettings } from '../src/merger'; 3 | 4 | describe('Basic parsing', () => { 5 | it('Merge allowedColNames', () => { 6 | const configExample: MergeParserSettings = { 7 | allowedColNames: { 8 | 'car-name': 'car', 9 | 'horse-powers': 'hp', 10 | }, 11 | extraCols: [], 12 | temporaryColNames: [], 13 | }; 14 | 15 | const configPartial: MergeParserSettings = { 16 | allowedColNames: { 17 | 'manufacture-year': 'year', 18 | }, 19 | extraCols: [], 20 | temporaryColNames: [], 21 | }; 22 | 23 | const merged = mergeParserSettings(configPartial, configExample); 24 | expect(merged).toMatchInlineSnapshot(` 25 | { 26 | "allowedColNames": { 27 | "manufacture-year": "year", 28 | }, 29 | "extraCols": [ 30 | { 31 | "colName": "car", 32 | "data": "", 33 | "position": 0, 34 | }, 35 | { 36 | "colName": "hp", 37 | "data": "", 38 | "position": 1, 39 | }, 40 | ], 41 | "temporaryColNames": [], 42 | } 43 | `); 44 | }); 45 | 46 | it('Merge extraCols', () => { 47 | const configExample: MergeParserSettings = { 48 | allowedColNames: { 49 | 'car-name': 'car', 50 | }, 51 | extraCols: [ 52 | { 53 | colName: 'year', 54 | data: '2021', 55 | }, 56 | ], 57 | temporaryColNames: [], 58 | }; 59 | 60 | const configPartial: MergeParserSettings = { 61 | allowedColNames: { 62 | 'car-name': 'car', 63 | }, 64 | extraCols: [], 65 | temporaryColNames: [], 66 | }; 67 | 68 | const merged = mergeParserSettings(configPartial, configExample); 69 | expect(merged).toMatchInlineSnapshot(` 70 | { 71 | "allowedColNames": { 72 | "car-name": "car", 73 | }, 74 | "extraCols": [ 75 | { 76 | "colName": "year", 77 | "data": "2021", 78 | }, 79 | ], 80 | "temporaryColNames": [], 81 | } 82 | `); 83 | }); 84 | 85 | it('ignores appending column if it exists in ignoredAllowedColumns', () => { 86 | const configExample: MergeParserSettings = { 87 | allowedColNames: { 88 | 'car-name': 'car', 89 | 'horse-powers': 'hp', 90 | }, 91 | extraCols: [], 92 | temporaryColNames: [], 93 | }; 94 | 95 | const configPartial: MergeParserSettings = { 96 | allowedColNames: { 97 | 'car-name': 'car', 98 | 'horse-powers-hp': 'hp', 99 | }, 100 | extraCols: [], 101 | temporaryColNames: [], 102 | }; 103 | 104 | const merged = mergeParserSettings(configPartial, configExample, ['horse-powers']); 105 | expect(merged).toMatchInlineSnapshot(` 106 | { 107 | "allowedColNames": { 108 | "car-name": "car", 109 | "horse-powers-hp": "hp", 110 | }, 111 | "extraCols": [], 112 | "temporaryColNames": [], 113 | } 114 | `); 115 | }); 116 | }); 117 | -------------------------------------------------------------------------------- /test/pipelineExecutor.test.ts: -------------------------------------------------------------------------------- 1 | import { PipelineExecutor } from '../src/pipelineExecutor'; 2 | 3 | describe('PipelineExecutor class', () => { 4 | it('Empty case', () => { 5 | const executor = new PipelineExecutor(); 6 | expect(executor.execute([])).toStrictEqual([]); 7 | }); 8 | 9 | it('Clear works', () => { 10 | const executor = new PipelineExecutor().addMap((r) => r + 1); 11 | expect(executor.execute([1])).toStrictEqual([2]); 12 | executor.clear(); 13 | expect(executor.execute([1])).toStrictEqual([1]); 14 | }); 15 | 16 | it('Correctly handle simples map', () => { 17 | const executor = new PipelineExecutor() 18 | .addMap((r) => r + 2) 19 | .addMap((r) => r * 2); 20 | 21 | expect(executor.execute([2, 2, 2])).toStrictEqual([8, 8, 8]); 22 | }); 23 | 24 | it('Correctly handle simple filter operation', () => { 25 | const executor = new PipelineExecutor() 26 | .addFilter((r) => r >= 5) 27 | .addFilter((r) => r >= 10); 28 | 29 | expect(executor.execute([2, 5, 10])).toStrictEqual([10]); 30 | }); 31 | 32 | it('Complex queries', () => { 33 | const input = [ 34 | ['10', 'a', 'b'], 35 | [], 36 | ['11', 'c', 'd'], 37 | ['12', 'e', 'd'], 38 | ['13', 'a', 'c'], 39 | ['14', 'a', 'c'], 40 | ]; 41 | 42 | const executor = new PipelineExecutor(input); 43 | executor.addFilter((row) => row.length > 0); 44 | executor.addMap((row) => row.join(';')); 45 | executor.addFilter((row) => row.includes('a')); 46 | expect(executor.execute()).toMatchInlineSnapshot(` 47 | [ 48 | "10;a;b", 49 | "13;a;c", 50 | "14;a;c", 51 | ] 52 | `); 53 | }); 54 | }); 55 | -------------------------------------------------------------------------------- /tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "exclude": ["test"] 4 | } 5 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "lib": [ 7 | "ES2020", 8 | "dom", 9 | "dom.iterable" 10 | ], 11 | "declaration": true, 12 | "declarationMap": true, 13 | "sourceMap": true, 14 | "outDir": "lib", 15 | "removeComments": true, 16 | "strict": true, 17 | "allowSyntheticDefaultImports": true, 18 | "esModuleInterop": true, 19 | "strictNullChecks": false, 20 | "skipLibCheck": true, 21 | "forceConsistentCasingInFileNames": true 22 | }, 23 | "include": ["src", "test"], 24 | } 25 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'tsup'; 2 | 3 | export default defineConfig({ 4 | entry: ['src/index.ts'], 5 | sourcemap: true, 6 | dts: true, 7 | format: ['esm', 'cjs'], 8 | treeshake: true, 9 | shims: true, 10 | legacyOutput: false, 11 | bundle: true, 12 | splitting: true, 13 | }); 14 | --------------------------------------------------------------------------------