diff --git a/.npmignore b/.npmignore index 1b76d96..43bf88b 100644 --- a/.npmignore +++ b/.npmignore @@ -1 +1,2 @@ /update-dependencies.js +/.run/ diff --git a/README.md b/README.md index 3ffd7ef..50dcb98 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,8 @@ const currency = await googleCurrencyScraper({ // } ``` +_This package is a [pure ESM package](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c)._ + ## API ### googleCurrencyScraper({ from, to }) diff --git a/package-lock.json b/package-lock.json index e904942..deef8cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "google-currency-scraper", - "version": "1.1.0", + "version": "1.1.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "google-currency-scraper", - "version": "1.1.0", + "version": "1.1.1", "license": "MIT", "dependencies": { - "dayjs": "^1.11.4", - "puppeteer": "^16.1.0" + "dayjs": "^1.11.5", + "puppeteer": "^16.2.0" }, "devDependencies": { "@jest/globals": "^28.1.3", @@ -1843,9 +1843,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.4.tgz", - "integrity": "sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.5.tgz", + "integrity": "sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==" }, "node_modules/debug": { "version": "4.3.4", @@ -2466,6 +2466,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -3917,6 +3918,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -4213,6 +4215,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -4227,6 +4230,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -4253,6 +4257,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, "engines": { "node": ">=6" } @@ -4291,6 +4296,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { "node": ">=8" } @@ -4375,6 +4381,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, "dependencies": { "find-up": "^4.0.0" }, @@ -4463,9 +4470,9 @@ } }, "node_modules/puppeteer": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-16.1.0.tgz", - "integrity": "sha512-lhykJLbH2bbBaP3NfYI2Vj0T4ctrdfVdEVf8glZITPnLfqrJ0nfUzAYuIz5YcA79k5lmFKANIhEXex+jQChU3g==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-16.2.0.tgz", + "integrity": "sha512-7Au6iC98rS6WEAD110V4Bxd0iIbqoFtzz9XzkG1BSofidS1VAJ881E1+GFR7Xn2Yea0hbj8n0ErzRyseMp1Ctg==", "hasInstallScript": true, "dependencies": { "cross-fetch": "3.1.5", @@ -4473,7 +4480,6 @@ "devtools-protocol": "0.0.1019158", "extract-zip": "2.0.1", "https-proxy-agent": "5.0.1", - "pkg-dir": "4.2.0", "progress": "2.0.3", "proxy-from-env": "1.1.0", "rimraf": "3.0.2", @@ -6850,9 +6856,9 @@ } }, "dayjs": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.4.tgz", - "integrity": "sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.5.tgz", + "integrity": "sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==" }, "debug": { "version": "4.3.4", @@ -7314,6 +7320,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -8364,6 +8371,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "requires": { "p-locate": "^4.1.0" } @@ -8588,6 +8596,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "requires": { "p-try": "^2.0.0" } @@ -8596,6 +8605,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "requires": { "p-limit": "^2.2.0" } @@ -8612,7 +8622,8 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true }, "parent-module": { "version": "1.0.1", @@ -8638,7 +8649,8 @@ "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -8696,6 +8708,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, "requires": { "find-up": "^4.0.0" } @@ -8762,16 +8775,15 @@ "dev": true }, "puppeteer": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-16.1.0.tgz", - "integrity": "sha512-lhykJLbH2bbBaP3NfYI2Vj0T4ctrdfVdEVf8glZITPnLfqrJ0nfUzAYuIz5YcA79k5lmFKANIhEXex+jQChU3g==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-16.2.0.tgz", + "integrity": "sha512-7Au6iC98rS6WEAD110V4Bxd0iIbqoFtzz9XzkG1BSofidS1VAJ881E1+GFR7Xn2Yea0hbj8n0ErzRyseMp1Ctg==", "requires": { "cross-fetch": "3.1.5", "debug": "4.3.4", "devtools-protocol": "0.0.1019158", "extract-zip": "2.0.1", "https-proxy-agent": "5.0.1", - "pkg-dir": "4.2.0", "progress": "2.0.3", "proxy-from-env": "1.1.0", "rimraf": "3.0.2", diff --git a/package.json b/package.json index 2b40e70..3bdc502 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "google-currency-scraper", - "version": "1.1.0", + "version": "1.1.1", "description": "'google-currency-scraper' goes Google '1 USD to TRY' (for example) search result and scrape exchange rate and last updated date for you by using Puppeteer under the hood.", "license": "MIT", "type": "module", @@ -30,8 +30,8 @@ "currency api" ], "dependencies": { - "dayjs": "^1.11.4", - "puppeteer": "^16.1.0" + "dayjs": "^1.11.5", + "puppeteer": "^16.2.0" }, "devDependencies": { "@jest/globals": "^28.1.3", diff --git a/src/google-currency-scraper.js b/src/google-currency-scraper.js index 4bb1e50..dd53474 100644 --- a/src/google-currency-scraper.js +++ b/src/google-currency-scraper.js @@ -6,9 +6,9 @@ import { getDate, parseAndNormalizeDateInSearchResult } from "./utils/date.js"; /** * @param {object} params - * @param {CurrencyCode|string} params.from - * @param {CurrencyCode|string} params.to - * @returns {Promise<{from: CurrencyCode|string, to: CurrencyCode|string, rate: number, dateUpdated: string}>} + * @param {CurrencyCode | string} params.from + * @param {CurrencyCode | string} params.to + * @returns {Promise<{from: CurrencyCode | string, to: CurrencyCode | string, rate: number, dateUpdated: string}>} */ const googleCurrencyScraper = async ({ from, to }) => { if (!isValidCurrencyCode(from)) { @@ -32,10 +32,13 @@ const googleCurrencyScraper = async ({ from, to }) => { const page = await openNewPage(browser); - // To lighter page and faster load times, I emulate a mobile device + // To lighter page and faster load times, I emulate a mobile device. + // So why iPhone 7? + // It doesn't matter which one as long as it's a mobile device. + // That's why I chose iPhone 7 as I use it in real life :) await emulateDevice(page, "iPhone 7"); - // To lighter page and faster load times, load only document + // To lighter page and faster load times, make sure load only document. await ensurePageLoadOnlyDocument(page); await goToGoogleCurrencySearchResult(page, { from, to }); @@ -55,9 +58,9 @@ const googleCurrencyScraper = async ({ from, to }) => { /** * @param {*} page * @param {object} params - * @param {CurrencyCode|string} params.from - * @param {CurrencyCode|string} params.to - * @returns {Promise<*|null>} + * @param {CurrencyCode | string} params.from + * @param {CurrencyCode | string} params.to + * @returns {Promise<* | null>} */ async function goToGoogleCurrencySearchResult(page, { from, to }) { const qs = objectToQueryString({ diff --git a/src/google-currency-scraper.test.js b/src/google-currency-scraper.test.js index d7eb534..64fc171 100644 --- a/src/google-currency-scraper.test.js +++ b/src/google-currency-scraper.test.js @@ -2,7 +2,7 @@ import googleCurrencyScraper from "./google-currency-scraper.js"; import { jest } from "@jest/globals"; import { getDate } from "./utils/date.js"; -jest.setTimeout(15000); +jest.setTimeout(20_000); describe("google-currency-scraper", () => { const date = Date; diff --git a/src/utils/currency-code.js b/src/utils/currency-code.js index 2440aa7..a4c6124 100644 --- a/src/utils/currency-code.js +++ b/src/utils/currency-code.js @@ -188,7 +188,7 @@ const CurrencyCode = { }; /** - * @param {CurrencyCode|string} code + * @param {CurrencyCode | string} code * @returns {boolean} */ const isValidCurrencyCode = code => code in CurrencyCode; diff --git a/src/utils/object-to-query-string.js b/src/utils/object-to-query-string.js index c1b48b2..5777c3a 100644 --- a/src/utils/object-to-query-string.js +++ b/src/utils/object-to-query-string.js @@ -1,11 +1,20 @@ -import querystring from "querystring"; - /** * @param {object} object * @returns {string} */ const objectToQueryString = object => { - return querystring.stringify(object); + const objectToArray = []; + for (const [name, values] of Object.entries(object)) { + if (Array.isArray(values)) { + values.forEach(value => { + objectToArray.push([name, value]); + }); + } else { + objectToArray.push([name, values]); + } + } + + return new URLSearchParams(objectToArray).toString(); }; export { diff --git a/tsconfig.json b/tsconfig.json index 2a9d5fd..3a217cb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,8 @@ "**/*.js" ], "exclude": [ - "**/*.test.js" + "**/*.test.js", + "update-dependencies.js" ], "compilerOptions": { "declaration": true, diff --git a/update-dependencies.js b/update-dependencies.js index af612f2..ea83a54 100644 --- a/update-dependencies.js +++ b/update-dependencies.js @@ -1,8 +1,8 @@ import { exec } from "child_process"; -import packageJson from "./package.json" assert { type: 'json' }; +import packageJson from "./package.json" assert { type: "json" }; -if(packageJson.dependencies !== undefined) { +if (packageJson.dependencies !== undefined) { const dependencies = Object.keys(packageJson.dependencies); (async () => { @@ -10,7 +10,7 @@ if(packageJson.dependencies !== undefined) { })(); } -if(packageJson.devDependencies !== undefined) { +if (packageJson.devDependencies !== undefined) { const devDependencies = Object.keys(packageJson.devDependencies); (async () => {