From 1b29c09be976135977d5377fe59227c6b1fc974a Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 7 Aug 2023 23:46:33 +0700 Subject: [PATCH 01/88] refactor: Rename src to dist --- {src => dist}/country-by-abbreviation.json | 0 {src => dist}/country-by-alphabet-letters.json | 0 {src => dist}/country-by-avg-male-height.json | 0 {src => dist}/country-by-barcode-prefix.json | 0 {src => dist}/country-by-calling-code.json | 0 {src => dist}/country-by-capital-city.json | 0 {src => dist}/country-by-cities.json | 0 {src => dist}/country-by-continent.json | 0 {src => dist}/country-by-costline.json | 0 {src => dist}/country-by-currency-code.json | 0 {src => dist}/country-by-currency-name.json | 0 {src => dist}/country-by-domain-tld.json | 0 {src => dist}/country-by-elevation.json | 0 {src => dist}/country-by-flag.json | 0 {src => dist}/country-by-geo-coordinates.json | 0 {src => dist}/country-by-government-type.json | 0 {src => dist}/country-by-independence-date.json | 0 {src => dist}/country-by-iso-numeric.json | 0 {src => dist}/country-by-landlocked.json | 0 {src => dist}/country-by-languages.json | 0 {src => dist}/country-by-life-expectancy.json | 0 {src => dist}/country-by-name.json | 0 {src => dist}/country-by-national-dish.json | 0 {src => dist}/country-by-national-symbol.json | 0 {src => dist}/country-by-population-density.json | 0 {src => dist}/country-by-population.json | 0 {src => dist}/country-by-region-in-world.json | 0 {src => dist}/country-by-religion.json | 0 {src => dist}/country-by-surface-area.json | 0 {src => dist}/country-by-yearly-average-temperature.json | 0 30 files changed, 0 insertions(+), 0 deletions(-) rename {src => dist}/country-by-abbreviation.json (100%) rename {src => dist}/country-by-alphabet-letters.json (100%) rename {src => dist}/country-by-avg-male-height.json (100%) rename {src => dist}/country-by-barcode-prefix.json (100%) rename {src => dist}/country-by-calling-code.json (100%) rename {src => dist}/country-by-capital-city.json (100%) rename {src => dist}/country-by-cities.json (100%) rename {src => dist}/country-by-continent.json (100%) rename {src => dist}/country-by-costline.json (100%) rename {src => dist}/country-by-currency-code.json (100%) rename {src => dist}/country-by-currency-name.json (100%) rename {src => dist}/country-by-domain-tld.json (100%) rename {src => dist}/country-by-elevation.json (100%) rename {src => dist}/country-by-flag.json (100%) rename {src => dist}/country-by-geo-coordinates.json (100%) rename {src => dist}/country-by-government-type.json (100%) rename {src => dist}/country-by-independence-date.json (100%) rename {src => dist}/country-by-iso-numeric.json (100%) rename {src => dist}/country-by-landlocked.json (100%) rename {src => dist}/country-by-languages.json (100%) rename {src => dist}/country-by-life-expectancy.json (100%) rename {src => dist}/country-by-name.json (100%) rename {src => dist}/country-by-national-dish.json (100%) rename {src => dist}/country-by-national-symbol.json (100%) rename {src => dist}/country-by-population-density.json (100%) rename {src => dist}/country-by-population.json (100%) rename {src => dist}/country-by-region-in-world.json (100%) rename {src => dist}/country-by-religion.json (100%) rename {src => dist}/country-by-surface-area.json (100%) rename {src => dist}/country-by-yearly-average-temperature.json (100%) diff --git a/src/country-by-abbreviation.json b/dist/country-by-abbreviation.json similarity index 100% rename from src/country-by-abbreviation.json rename to dist/country-by-abbreviation.json diff --git a/src/country-by-alphabet-letters.json b/dist/country-by-alphabet-letters.json similarity index 100% rename from src/country-by-alphabet-letters.json rename to dist/country-by-alphabet-letters.json diff --git a/src/country-by-avg-male-height.json b/dist/country-by-avg-male-height.json similarity index 100% rename from src/country-by-avg-male-height.json rename to dist/country-by-avg-male-height.json diff --git a/src/country-by-barcode-prefix.json b/dist/country-by-barcode-prefix.json similarity index 100% rename from src/country-by-barcode-prefix.json rename to dist/country-by-barcode-prefix.json diff --git a/src/country-by-calling-code.json b/dist/country-by-calling-code.json similarity index 100% rename from src/country-by-calling-code.json rename to dist/country-by-calling-code.json diff --git a/src/country-by-capital-city.json b/dist/country-by-capital-city.json similarity index 100% rename from src/country-by-capital-city.json rename to dist/country-by-capital-city.json diff --git a/src/country-by-cities.json b/dist/country-by-cities.json similarity index 100% rename from src/country-by-cities.json rename to dist/country-by-cities.json diff --git a/src/country-by-continent.json b/dist/country-by-continent.json similarity index 100% rename from src/country-by-continent.json rename to dist/country-by-continent.json diff --git a/src/country-by-costline.json b/dist/country-by-costline.json similarity index 100% rename from src/country-by-costline.json rename to dist/country-by-costline.json diff --git a/src/country-by-currency-code.json b/dist/country-by-currency-code.json similarity index 100% rename from src/country-by-currency-code.json rename to dist/country-by-currency-code.json diff --git a/src/country-by-currency-name.json b/dist/country-by-currency-name.json similarity index 100% rename from src/country-by-currency-name.json rename to dist/country-by-currency-name.json diff --git a/src/country-by-domain-tld.json b/dist/country-by-domain-tld.json similarity index 100% rename from src/country-by-domain-tld.json rename to dist/country-by-domain-tld.json diff --git a/src/country-by-elevation.json b/dist/country-by-elevation.json similarity index 100% rename from src/country-by-elevation.json rename to dist/country-by-elevation.json diff --git a/src/country-by-flag.json b/dist/country-by-flag.json similarity index 100% rename from src/country-by-flag.json rename to dist/country-by-flag.json diff --git a/src/country-by-geo-coordinates.json b/dist/country-by-geo-coordinates.json similarity index 100% rename from src/country-by-geo-coordinates.json rename to dist/country-by-geo-coordinates.json diff --git a/src/country-by-government-type.json b/dist/country-by-government-type.json similarity index 100% rename from src/country-by-government-type.json rename to dist/country-by-government-type.json diff --git a/src/country-by-independence-date.json b/dist/country-by-independence-date.json similarity index 100% rename from src/country-by-independence-date.json rename to dist/country-by-independence-date.json diff --git a/src/country-by-iso-numeric.json b/dist/country-by-iso-numeric.json similarity index 100% rename from src/country-by-iso-numeric.json rename to dist/country-by-iso-numeric.json diff --git a/src/country-by-landlocked.json b/dist/country-by-landlocked.json similarity index 100% rename from src/country-by-landlocked.json rename to dist/country-by-landlocked.json diff --git a/src/country-by-languages.json b/dist/country-by-languages.json similarity index 100% rename from src/country-by-languages.json rename to dist/country-by-languages.json diff --git a/src/country-by-life-expectancy.json b/dist/country-by-life-expectancy.json similarity index 100% rename from src/country-by-life-expectancy.json rename to dist/country-by-life-expectancy.json diff --git a/src/country-by-name.json b/dist/country-by-name.json similarity index 100% rename from src/country-by-name.json rename to dist/country-by-name.json diff --git a/src/country-by-national-dish.json b/dist/country-by-national-dish.json similarity index 100% rename from src/country-by-national-dish.json rename to dist/country-by-national-dish.json diff --git a/src/country-by-national-symbol.json b/dist/country-by-national-symbol.json similarity index 100% rename from src/country-by-national-symbol.json rename to dist/country-by-national-symbol.json diff --git a/src/country-by-population-density.json b/dist/country-by-population-density.json similarity index 100% rename from src/country-by-population-density.json rename to dist/country-by-population-density.json diff --git a/src/country-by-population.json b/dist/country-by-population.json similarity index 100% rename from src/country-by-population.json rename to dist/country-by-population.json diff --git a/src/country-by-region-in-world.json b/dist/country-by-region-in-world.json similarity index 100% rename from src/country-by-region-in-world.json rename to dist/country-by-region-in-world.json diff --git a/src/country-by-religion.json b/dist/country-by-religion.json similarity index 100% rename from src/country-by-religion.json rename to dist/country-by-religion.json diff --git a/src/country-by-surface-area.json b/dist/country-by-surface-area.json similarity index 100% rename from src/country-by-surface-area.json rename to dist/country-by-surface-area.json diff --git a/src/country-by-yearly-average-temperature.json b/dist/country-by-yearly-average-temperature.json similarity index 100% rename from src/country-by-yearly-average-temperature.json rename to dist/country-by-yearly-average-temperature.json From 82c3dc5dddcd9f01e0c76766e9b3df470a0781e6 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 7 Aug 2023 23:48:35 +0700 Subject: [PATCH 02/88] chore: Gitignore --- .gitignore | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 130 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index db4a82cb..6a7d6d8e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,130 @@ -web/* -npm-debug.log* \ No newline at end of file +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* \ No newline at end of file From 0abab51a86acdf9a497d2e121a83432ce61dec06 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 7 Aug 2023 23:55:45 +0700 Subject: [PATCH 03/88] chore: Setup typescript --- .prettierrc | 9 + package-lock.json | 3742 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 58 +- src/index.ts | 1 + tsconfig.json | 12 + 5 files changed, 3795 insertions(+), 27 deletions(-) create mode 100644 .prettierrc create mode 100644 package-lock.json create mode 100644 src/index.ts create mode 100644 tsconfig.json diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..3bb7d966 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "tabWidth": 4, + "singleQuote": true, + "useTabs": true, + "jsxSingleQuote": true, + "semi": false, + "arrowParens": "avoid", + "endOfLine": "lf" +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..1291cbe8 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3742 @@ +{ + "name": "country-json", + "version": "1.1.3", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "country-json", + "version": "1.1.3", + "license": "MIT", + "devDependencies": { + "@types/node": "^20.4.8", + "gulp": "3.9.1", + "gulp-jsonlint": "1.1.2", + "gulp-util": "3.0.8", + "ts-node": "^10.9.1", + "typescript": "^5.1.6" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.4.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.8.tgz", + "integrity": "sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha512-3vqtKL1N45I5dV0RdssXZG7X6pCqQrWPNOlBPZPrd+QkE2HEhR57Z04m0KtpbsZH73j+a3F8UD1TQnn+ExTvIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "dev": true, + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==", + "dev": true + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha512-BRACtc6B1mJe2J2mruHFqHWrtLy0Qppu/7LKdqWH3o/9j1L/1phPUaQV+2S3H8ZDW0k6h+NEOKcHBDRikWLiOA==", + "dev": true, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", + "dev": true, + "dependencies": { + "readable-stream": "~1.1.9" + } + }, + "node_modules/end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha512-go5TQkd0YRXYhX+Lc3UrXkoKU5j+m72jEP5lHWr2Nh82L8wfZtH8toKgcg4T10o23ELIMGXQdwCbl+qAXIPDrw==", + "dev": true, + "dependencies": { + "once": "~1.3.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha512-uJ5vWrfBKMcE6y2Z8834dwEZj9mNGxYa3t3I53OwFeuZ8D9oc2E5zcsrkuhX6h4iYrjhiv0T3szQmxlAV9uxDg==", + "dev": true + }, + "node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha512-ArRi5axuv66gEsyl3UuK80CzW7t56hem73YGNYxNWTGNKFJUadSb9Gu9SHijYEUi8ulQMf1bJomYNwSCPHhtTQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha512-3IWbXGkDDHFX8zIlNdfnmhvlSMhpBO6tDr4InB8fGku6dh/gjFPGNqcdsXJajZg05x9jRzXbL6gCnCnuMap4tw==", + "dev": true, + "dependencies": { + "globule": "~0.1.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha512-I0rTWUKSZKxPSIAIaqhSXTM/DiII6wame+rEC3cFA5Lqmr9YmdL7z6Hj9+bdWtTvoY1Su4/OiMLmb37Y7JzvJQ==", + "dev": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha512-owHtlMMXIAbxLjhUAO0HhW1/TB7kV0AwDduI3BLbYsWCaRzNIcLBu8N0wHZft2Za2SCmUXCEOdpZzC7k/H19eg==", + "dev": true, + "dependencies": { + "glob": "^4.3.1", + "glob2base": "^0.0.12", + "minimatch": "^2.0.1", + "ordered-read-streams": "^0.1.0", + "through2": "^0.6.1", + "unique-stream": "^1.0.0" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/glob-stream/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/glob-stream/node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dev": true, + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha512-lzYWq1BJLBmtb9rzT6+lgbFlEW6Sc7B+Qs3RmsNA9lbdFSqLHhebfypPR3nbEOMeEQyawVXqSDH0aqjtImldow==", + "dev": true, + "dependencies": { + "gaze": "^0.5.1" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha512-ZyqlgowMbfj2NPjxaZZ/EtsXlOch28FRXgMd64vqZWk1bT9+wvSRLYD1om9M7QfQru51zJPAT17qXm4/zd+9QA==", + "dev": true, + "dependencies": { + "find-index": "^0.1.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha512-3eIcA2OjPCm4VvwIwZPzIxCVssA8HSpM2C6c6kK5ufJH4FGwWoyqL3In19uuX4oe+TwH3w2P1nQDmW56iehO4A==", + "dev": true, + "dependencies": { + "glob": "~3.1.21", + "lodash": "~1.0.1", + "minimatch": "~0.2.11" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/globule/node_modules/glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha512-ANhy2V2+tFpRajE3wN4DhkNQ08KDr0Ir1qL12/cUe5+a7STEK8jkW4onUYuY8/06qAFuT5je7mjAqzx0eKI2tQ==", + "dev": true, + "dependencies": { + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globule/node_modules/graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha512-iiTUZ5vZ+2ZV+h71XAgwCSu6+NAizhFU3Yw8aC/hH5SQ3SnISqEqAek40imAFGtDcwJKNhXvSY+hzIolnLwcdQ==", + "deprecated": "please upgrade to graceful-fs 4 for compatibility with current and future versions of Node.js", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/globule/node_modules/inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha512-Al67oatbRSo3RV5hRqIoln6Y5yMVbJSIn4jEJNL7VCImzq/kLr7vvb6sFRJXqr8rpHc/2kJOM+y0sPKN47VdzA==", + "dev": true + }, + "node_modules/globule/node_modules/minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha512-zZ+Jy8lVWlvqqeM8iZB7w7KmQkoJn8djM585z88rywrEbzoqawVa9FR5p2hwD+y74nfuKOjmNvi9gtWJNLqHvA==", + "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", + "dev": true, + "dependencies": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/graceful-fs": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "dev": true, + "dependencies": { + "natives": "^1.1.3" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha512-6FHNdR+VG1LcPz6gZGGqgvimWWGtl4x3FvshAdK/UnAjU7aFOyzft3Fjp35r0Y3ZF4u8vND0S4nGsIB/sxTqzQ==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "chalk": "^1.0.0", + "deprecated": "^0.0.1", + "gulp-util": "^3.0.0", + "interpret": "^1.0.0", + "liftoff": "^2.1.0", + "minimist": "^1.1.0", + "orchestrator": "^0.3.0", + "pretty-hrtime": "^1.0.0", + "semver": "^4.1.0", + "tildify": "^1.0.0", + "v8flags": "^2.0.2", + "vinyl-fs": "^0.3.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/gulp-jsonlint": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gulp-jsonlint/-/gulp-jsonlint-1.1.2.tgz", + "integrity": "sha512-JWxzQMPznJL4ImMi2vbxFsV1l6C7rfNQuMHs1fvRVK+AJ9xueT5m46QQxeTjMomyPbgkDfIzEpWsL1d3uqH0Yg==", + "dev": true, + "dependencies": { + "gulp-util": "3.0.7", + "jsonlint": "1.6.2", + "map-stream": "^0.1.0", + "through2": "2.0.1" + }, + "engines": { + "node": ">=0.8.0", + "npm": ">=1.2.10" + } + }, + "node_modules/gulp-jsonlint/node_modules/dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha512-5sFRfAAmbHdIts+eKjR9kYJoF0ViCMVX9yqLu5A7S/v+nd077KgCITOMiirmyCBiZpKLDXbBOkYm6tu7rX/TKg==", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + }, + "bin": { + "dateformat": "bin/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/gulp-jsonlint/node_modules/gulp-util": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz", + "integrity": "sha512-Hw0BEAQGwMCCqflSPbWGNuep+/N6m/wLCwzovnuTJ1P7pvfDvUky5v3UisvLCnWSDzbh25dH81AP0l0YOBzW4g==", + "deprecated": "gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5", + "dev": true, + "dependencies": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^1.0.11", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha512-q5oWPc12lwSFS9h/4VIjG+1NuNDlJ48ywV2JKItY4Ycc/n1fXJeYPVQsfu5ZrhQi7FGSDBalwUCLar/GyHXKGw==", + "deprecated": "gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5", + "dev": true, + "dependencies": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==", + "dev": true, + "dependencies": { + "glogg": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha512-kaNz5OTAYYmt646Hkqw50/qyxP2vFnTVu5AQ1Zmk22Kk5+4Qx6BpO8+u7IKsML5fOsFk0ZT0AcCJNYwcvaLBvw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha512-+F4GzLjwHNNDEAJW2DC1xXfEoPkRDmUdJ7CBYw4MpqtDwOnqdImJl7GWlpqx+Wko6//J8uKTnIe4wZSv7yCqmw==", + "dev": true, + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsonlint": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.2.tgz", + "integrity": "sha512-NZOYIER5KgQFsImdFbIg6K3mMQU1wZ7mfH5W57gOGKMcRlQ5hQmMbp0dyGovJj33+5adwnb/lWdSApkEtCBgLQ==", + "dev": true, + "dependencies": { + "JSV": ">= 4.0.x", + "nomnom": ">= 1.5.x" + }, + "bin": { + "jsonlint": "lib/cli.js" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/JSV": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz", + "integrity": "sha512-ZJ6wx9xaKJ3yFUhq5/sk82PJMuUyLk277I8mQeyDgCTjGdjWJIvPfaU5LIXaMuaN2UO1X3kZH4+lgphublZUHw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/liftoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha512-01zfGFqfORP1CGmZZP2Zn51zsqz4RltDi0RDOhbGoLYdUT5Lw+I2gX6QdwXhPITF6hPOHEOp+At6/L24hIg9WQ==", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "findup-sync": "^2.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha512-0VSEDVec/Me2eATuoiQd8IjyBMMX0fahob8YJ96V1go2RjvCk1m1GxmtfXn8RNSaLaTtop7fsuhhu9oLk3hUgA==", + "dev": true, + "engines": [ + "node", + "rhino" + ] + }, + "node_modules/lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", + "dev": true + }, + "node_modules/lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha512-mTzAr1aNAv/i7W43vOR/uD/aJ4ngbtsRaCubp2BfZhlGU/eORUjg/7F6X0orNMdv33JOrdgGybtvMN/po3EWrA==", + "dev": true + }, + "node_modules/lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha512-H94wl5P13uEqlCg7OcNNhMQ8KvWSIyqXzOPusRgHC9DK3o54P6P3xtbXlVbRABG4q5gSmp7EDdJ0MSuW9HX6Mg==", + "dev": true + }, + "node_modules/lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", + "dev": true + }, + "node_modules/lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", + "dev": true + }, + "node_modules/lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha512-Sjlavm5y+FUVIF3vF3B75GyXrzsfYV8Dlv3L4mEpuB9leg8N6yf/7rU06iLPx9fY0Mv3khVp9p7Dx0mGV6V5OQ==", + "dev": true + }, + "node_modules/lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha512-OrPwdDc65iJiBeUe5n/LIjd7Viy99bKwDdk7Z5ljfZg0uFRFlfQaCy9tZ4YMAag9WAZmlVpe1iZrkIMMSMHD3w==", + "dev": true + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true + }, + "node_modules/lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==", + "dev": true + }, + "node_modules/lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha512-n1PZMXgaaDWZDSvuNZ/8XOcYO2hOKDqZel5adtR30VKQAtoWs/5AOeFA0vPV8moiPzlqe7F4cP2tzpFewQyelQ==", + "dev": true, + "dependencies": { + "lodash._root": "^3.0.0" + } + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true + }, + "node_modules/lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", + "dev": true + }, + "node_modules/lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", + "dev": true, + "dependencies": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "node_modules/lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", + "dev": true + }, + "node_modules/lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha512-0B4Y53I0OgHUJkt+7RmlDFWKjVAI/YUpWNiL9GQz5ORDr4ttgfQGo+phBWKFLJbBdtOwgMuUkdOHOnPg45jKmQ==", + "dev": true, + "dependencies": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha512-TcrlEr31tDYnWkHFWDCV3dHYroKEXpJZ2YJYvJdhN+y4AkWMDZ5I4I8XDtUKqSAyG81N7w+I1mFEJtcED+tGqQ==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "dev": true, + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ==", + "dev": true + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", + "dev": true + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "dev": true, + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==", + "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", + "dev": true, + "dependencies": { + "brace-expansion": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha512-7ZxrUybYv9NonoXgwoOqtStIu18D1c3eFZj27hqgf5kBrBF8Q+tE8V0MW8dKM5QLkQPh1JhhbKgHLY9kifov4Q==", + "dev": true, + "dependencies": { + "duplexer2": "0.0.2" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "deprecated": "This module relies on Node.js's internals and will break at some point. Do not use it, and update to graceful-fs@4.x.", + "dev": true + }, + "node_modules/nomnom": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", + "integrity": "sha512-5s0JxqhDx9/rksG2BTMVN1enjWSvPidpoSgViZU4ZXULyTe+7jxcCRLB6f42Z0l1xYJpleCBtSyY6Lwg3uu5CQ==", + "deprecated": "Package no longer supported. Contact support@npmjs.com for more info.", + "dev": true, + "dependencies": { + "chalk": "~0.4.0", + "underscore": "~1.6.0" + } + }, + "node_modules/nomnom/node_modules/ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha512-3iF4FIKdxaVYT3JqQuY3Wat/T2t7TRbbQ94Fu50ZUCbLy4TFbTzr90NOHQodQkNqmeEGCw8WbeP78WNi6SKYUA==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/nomnom/node_modules/chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha512-sQfYDlfv2DGVtjdoQqxS0cEZDroyG8h6TamA6rvxwlrU5BaSLDx9xhatBYl2pxZ7gmpNaPFVwBtdGdu5rQ+tYQ==", + "dev": true, + "dependencies": { + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/nomnom/node_modules/strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha512-behete+3uqxecWlDAm5lmskaSaISA+ThQ4oNNBDTBJt0x2ppR6IPqfZNuj6BLaLJ/Sji4TPZlcRyOis8wXQTLg==", + "dev": true, + "bin": { + "strip-ansi": "cli.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha512-DrQ43ngaJ0e36j2CHyoDoIg1K4zbc78GnTQESebK9vu6hj4W5/pvfSFO/kgM620Yd0YnhseSNYsLK3/SszZ5NQ==", + "dev": true, + "dependencies": { + "end-of-stream": "~0.1.5", + "sequencify": "~0.0.7", + "stream-consume": "~0.1.0" + } + }, + "node_modules/ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha512-PMX5ehiNri4+lgk9fl09xuPeciGmyPyVUSBwwPT4C/3EHGxoVf7UdgKDE3SLBD4pUDmlzrg1L1cK5igrp+Tyuw==", + "dev": true + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type/node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "dev": true, + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha512-YL8BPm0tp6SlXef/VqYpA/ijmTsDP2ZEXzsnqjkaWS7NP7Bfvw18NboL0O8WCIjy67sOCG3MYSK1PB4GC9XdtQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-consume": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", + "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha512-qVAeAIjblKDp/8Cd0tJdxpe3Iq/HooI7En98alEaMbz4Wedlrcj3WI72dDQSrziRW5IQ0zeBo3JXsmS8RcS9jg==", + "dev": true, + "dependencies": { + "first-chunk-stream": "^1.0.0", + "is-utf8": "^0.2.0" + }, + "bin": { + "strip-bom": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/through2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", + "integrity": "sha512-/vp02SIbpmVHapNMjox4hDBzykPdAOmH5y3INcKaxGfpEPSCMqzdWXyGfqPYyxoBLo1JpxBrlh3Z9esv0vWUYw==", + "dev": true, + "dependencies": { + "readable-stream": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha512-TXcFfb63BQe1+ySzsHZI/5v1aJPCShfqvWJ64ayNImXMsN1Cd0YGk/wm8KB7/OeessgPc9QvS9Zou8QTkFzsLw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha512-Y9q1GaV/BO65Z9Yf4NOGMuwt3SGdptkZBnaaKfTQakrDyCLiuO1Kc5wxW4xLdsjzunRtqtOdhekiUFmZbklwYQ==", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha512-z4o1fvKUojIWh9XuaVLUDdf86RQiq13AC1dmHbTpoyuu+bquHms76v16CjycCbec87J7z0k//SiQVk0sMdFmpQ==", + "dev": true + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha512-L8KM6TdpsoBk6TJTXevbmpub3bATS06Znu3BcfVPVQkFtnh1MFeCZ3gFKCQcji7f7YYiigsO5OR99vqhoNT8nQ==", + "dev": true + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha512-aggiKfEEubv3UwRNqTzLInZpAOmKzwdHqEBmW/hBA/mt99eg+b4VrX6i+IRLxU8+WJYfa33rGwRseg4eElUgsQ==", + "dev": true, + "bin": { + "user-home": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha512-SKfhk/LlaXzvtowJabLZwD4K6SGRYeoxA7KJeISlUMAB/NT4CBkZjMq3WceX2Ckm4llwqYVo8TICgsDYCBU2tA==", + "dev": true, + "dependencies": { + "user-home": "^1.1.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha512-P5zdf3WB9uzr7IFoVQ2wZTmUwHL8cMZWJGzLBNCHNZ3NB6HTMsYABtt7z8tAGIINLXyAob9B9a1yzVGMFOYKEA==", + "dev": true, + "dependencies": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha512-9CTKjt8378nhdydwFDTwywKio0n8aqq6xA70g0uypcnTNSCow/gQOwv0L9E2GaKd7EQ3kZl/diBxPSCgcBXESw==", + "dev": true, + "dependencies": { + "defaults": "^1.0.0", + "glob-stream": "^3.1.5", + "glob-watcher": "^0.0.6", + "graceful-fs": "^3.0.0", + "mkdirp": "^0.5.0", + "strip-bom": "^1.0.0", + "through2": "^0.6.1", + "vinyl": "^0.4.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs/node_modules/clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha512-g62n3Kb9cszeZvmvBUqP/dsEJD/+80pDA8u8KqHnAPrVnQ2Je9rVV6opxkhuWCd1kCn2gOibzDKxCtBvD3q5kA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/vinyl-fs/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/vinyl-fs/node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dev": true, + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/vinyl-fs/node_modules/vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha512-pmza4M5VA15HOImIQYWhoXGlGNafCm0QK5BpBUXkzzEwrRxKqBsbAhTfkT2zMcJhUX1G1Gkid0xaV8WjOl7DsA==", + "dev": true, + "dependencies": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + } +} diff --git a/package.json b/package.json index 8217ad7a..a5b7fc88 100644 --- a/package.json +++ b/package.json @@ -1,29 +1,33 @@ { - "name": "country-json", - "devDependencies": { - "gulp": "3.9.1", - "gulp-jsonlint": "1.1.2", - "gulp-util": "3.0.8" - }, - "description": "A simple but useful data of the world (by country) each in JSON format.", - "version": "1.1.3", - "main": "gulpfile.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/samayo/country-json.git" - }, - "keywords": [ - "json", - "country", - "data" - ], - "author": "Samson Daniel", - "license": "MIT", - "bugs": { - "url": "https://github.com/samayo/country-json/issues" - }, - "homepage": "https://github.com/samayo/country-json#readme" + "name": "country-json", + "type": "module", + "description": "A simple but useful data of the world (by country) each in JSON format.", + "version": "1.1.3", + "main": "gulpfile.js", + "repository": { + "type": "git", + "url": "git+https://github.com/samayo/country-json.git" + }, + "keywords": [ + "json", + "country", + "data" + ], + "author": "Samson Daniel", + "license": "MIT", + "bugs": { + "url": "https://github.com/samayo/country-json/issues" + }, + "homepage": "https://github.com/samayo/country-json#readme", + "devDependencies": { + "@types/node": "^20.4.8", + "gulp": "3.9.1", + "gulp-jsonlint": "1.1.2", + "gulp-util": "3.0.8", + "ts-node": "^10.9.1", + "typescript": "^5.1.6" + }, + "scripts": { + "start": "ts-node-esm ./src/index.ts" + } } diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 00000000..7e2c8770 --- /dev/null +++ b/src/index.ts @@ -0,0 +1 @@ +console.log('Hello World!') diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..f7691d23 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "module": "ESNext", + "esModuleInterop": true, + "target": "ESNext", + "moduleResolution": "node", + "sourceMap": true, + "outDir": "dist" + }, + "lib": ["ESNext"], + "include": ["./src/"] +} From d6280d4e75acb4b94786ff54b4c9d630c9eec038 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 00:04:08 +0700 Subject: [PATCH 04/88] docs: Changelog --- CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..70a02a00 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,16 @@ +# Change Log + +All notable changes to this project will be documented in this file. Starting from V2. + +The format is based on [Keep a Changelog](http://keepachangelog.com/) +and this project adheres to [Semantic Versioning](http://semver.org/). + +## [UnreleasedV2] - dd/mm/yyyy + +### Added + +### Fixed + +### Changed + +### Removed From 69b9e316c621bc7b1d6769b9403a8c09b74a100c Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 00:05:41 +0700 Subject: [PATCH 05/88] chore: Install node-html-parser --- package-lock.json | 124 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 3 ++ 2 files changed, 127 insertions(+) diff --git a/package-lock.json b/package-lock.json index 1291cbe8..76973150 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,9 @@ "name": "country-json", "version": "1.1.3", "license": "MIT", + "dependencies": { + "node-html-parser": "^6.1.5" + }, "devDependencies": { "@types/node": "^20.4.8", "gulp": "3.9.1", @@ -303,6 +306,11 @@ "node": ">=0.10.0" } }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -581,6 +589,32 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -681,6 +715,57 @@ "node": ">=0.3.1" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/duplexer2": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", @@ -699,6 +784,17 @@ "once": "~1.3.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -1515,6 +1611,14 @@ "node": ">=0.10.0" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -2226,6 +2330,15 @@ "deprecated": "This module relies on Node.js's internals and will break at some point. Do not use it, and update to graceful-fs@4.x.", "dev": true }, + "node_modules/node-html-parser": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.5.tgz", + "integrity": "sha512-fAaM511feX++/Chnhe475a0NHD8M7AxDInsqQpz6x63GRF7xYNdS8Vo5dKsIVPgsOvG7eioRRTZQnWBrhDHBSg==", + "dependencies": { + "css-select": "^5.1.0", + "he": "1.2.0" + } + }, "node_modules/nomnom": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", @@ -2284,6 +2397,17 @@ "validate-npm-package-license": "^3.0.1" } }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/object-assign": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", diff --git a/package.json b/package.json index a5b7fc88..8869db2a 100644 --- a/package.json +++ b/package.json @@ -29,5 +29,8 @@ }, "scripts": { "start": "ts-node-esm ./src/index.ts" + }, + "dependencies": { + "node-html-parser": "^6.1.5" } } From 2837f94a75c2c4e1c3ebae1674f938fd884aeb2a Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 00:21:10 +0700 Subject: [PATCH 06/88] feat(types): ISO3166 --- src/Types.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/Types.ts diff --git a/src/Types.ts b/src/Types.ts new file mode 100644 index 00000000..b6b8f441 --- /dev/null +++ b/src/Types.ts @@ -0,0 +1,11 @@ +interface IBaseData { + country: string +} + +interface IISO3166Data { + alpha2: string + alpha3: string + numeric: string +} + +type IData> = (IBaseData & T)[] From b678954cf292cf51b2720ac0614ae782623b0d69 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 00:43:15 +0700 Subject: [PATCH 07/88] feat(types): Empty interface --- src/Types.ts | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/Types.ts b/src/Types.ts index b6b8f441..ecc6c6f4 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -8,4 +8,62 @@ interface IISO3166Data { numeric: string } +interface IAverageHeightData {} + +interface ICountriesData {} + +interface ICountriesNameData {} + +interface IGS1CodeData {} + +interface ICallingCodesData {} + +interface ICapitalCityData {} + +interface ICitiesData {} + +interface IContinentData {} + +interface ICoastlineData {} + +interface IAreaData {} + +interface IISO4217Data {} + +interface ICurrencySymbolData {} + +interface ICurrencyNameData {} + +interface IccTLDData {} + +interface IAverageElevationData {} + +interface IFlagData {} + +interface IGeoCoordinateData {} + +interface IIndependenceData {} + +interface ILandlockedData {} + +interface ILanguagesData {} + +interface ILifeExpectancyData {} + +interface INationalDishesData {} + +interface INationalSymbolData {} + +interface IPopulationDensityData {} + +interface IPopulationData {} + +interface IRegionData {} + +interface IReligionData {} + +interface IYearlyAverageTemperatureData {} + +interface INationalSportData {} + type IData> = (IBaseData & T)[] From 088f7852b181010ce228053985c02ae1deb036c4 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 01:12:16 +0700 Subject: [PATCH 08/88] feat(types): Average height --- src/Types.ts | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/Types.ts b/src/Types.ts index ecc6c6f4..bbb7952d 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -8,7 +8,46 @@ interface IISO3166Data { numeric: string } -interface IAverageHeightData {} +enum IAverageHeightDataMethodology { + Measured = 'Measured', + SelfReported = 'SelfReported', +} + +interface IAverageHeightDataBase { + methodology: IAverageHeightDataMethodology +} + +interface IAverageHeightDataMaleNull { + male: null + female: number + maleToFemaleRatio: null +} + +interface IAverageHeightDataFemaleNull { + male: number + female: null + maleToFemaleRatio: null +} + +interface IAverageHeightDataAllNull { + male: null + female: null + maleToFemaleRatio: null +} + +interface IAverageHeightDataAll { + male: number + female: number + maleToFemaleRatio: number +} + +type IAverageHeightData = ( + | IAverageHeightDataMaleNull + | IAverageHeightDataFemaleNull + | IAverageHeightDataAllNull + | IAverageHeightDataAll +) & + IAverageHeightDataBase interface ICountriesData {} From 3f0d9cd6186e58d9739fcf5909addefb08bba387 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 01:26:12 +0700 Subject: [PATCH 09/88] refactor(types): Move to file --- src/Data/AverageHeight.ts | 40 +++++++++++++++ src/Data/ISO3166.ts | 5 ++ src/Types.ts | 103 +++++++++++--------------------------- 3 files changed, 73 insertions(+), 75 deletions(-) create mode 100644 src/Data/AverageHeight.ts create mode 100644 src/Data/ISO3166.ts diff --git a/src/Data/AverageHeight.ts b/src/Data/AverageHeight.ts new file mode 100644 index 00000000..cfafb74d --- /dev/null +++ b/src/Data/AverageHeight.ts @@ -0,0 +1,40 @@ +enum IAverageHeightMethodology { + Measured = 'Measured', + SelfReported = 'SelfReported', +} + +interface IAverageHeightBase { + methodology: IAverageHeightMethodology +} + +interface IAverageHeightMaleNull { + male: null + female: number + maleToFemaleRatio: null +} + +interface IAverageHeightFemaleNull { + male: number + female: null + maleToFemaleRatio: null +} + +interface IAverageHeightAllNull { + male: null + female: null + maleToFemaleRatio: null +} + +interface IAverageHeightAll { + male: number + female: number + maleToFemaleRatio: number +} + +type IAverageHeight = ( + | IAverageHeightMaleNull + | IAverageHeightFemaleNull + | IAverageHeightAllNull + | IAverageHeightAll +) & + IAverageHeightBase diff --git a/src/Data/ISO3166.ts b/src/Data/ISO3166.ts new file mode 100644 index 00000000..d278dd6f --- /dev/null +++ b/src/Data/ISO3166.ts @@ -0,0 +1,5 @@ +export interface IISO3166 { + alpha2: string + alpha3: string + numeric: string +} diff --git a/src/Types.ts b/src/Types.ts index bbb7952d..c7ad11e5 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -2,107 +2,60 @@ interface IBaseData { country: string } -interface IISO3166Data { - alpha2: string - alpha3: string - numeric: string -} - -enum IAverageHeightDataMethodology { - Measured = 'Measured', - SelfReported = 'SelfReported', -} - -interface IAverageHeightDataBase { - methodology: IAverageHeightDataMethodology -} - -interface IAverageHeightDataMaleNull { - male: null - female: number - maleToFemaleRatio: null -} - -interface IAverageHeightDataFemaleNull { - male: number - female: null - maleToFemaleRatio: null -} - -interface IAverageHeightDataAllNull { - male: null - female: null - maleToFemaleRatio: null -} - -interface IAverageHeightDataAll { - male: number - female: number - maleToFemaleRatio: number -} - -type IAverageHeightData = ( - | IAverageHeightDataMaleNull - | IAverageHeightDataFemaleNull - | IAverageHeightDataAllNull - | IAverageHeightDataAll -) & - IAverageHeightDataBase - -interface ICountriesData {} +interface ICountries {} -interface ICountriesNameData {} +interface ICountriesName {} -interface IGS1CodeData {} +interface IGS1Code {} -interface ICallingCodesData {} +interface ICallingCodes {} -interface ICapitalCityData {} +interface ICapitalCity {} -interface ICitiesData {} +interface ICities {} -interface IContinentData {} +interface IContinent {} -interface ICoastlineData {} +interface ICoastline {} -interface IAreaData {} +interface IArea {} -interface IISO4217Data {} +interface IISO4217 {} -interface ICurrencySymbolData {} +interface ICurrencySymbol {} -interface ICurrencyNameData {} +interface ICurrencyName {} -interface IccTLDData {} +interface IccTLD {} -interface IAverageElevationData {} +interface IAverageElevation {} -interface IFlagData {} +interface IFlag {} -interface IGeoCoordinateData {} +interface IGeoCoordinate {} -interface IIndependenceData {} +interface IIndependence {} -interface ILandlockedData {} +interface ILandlocked {} -interface ILanguagesData {} +interface ILanguages {} -interface ILifeExpectancyData {} +interface ILifeExpectancy {} -interface INationalDishesData {} +interface INationalDishes {} -interface INationalSymbolData {} +interface INationalSymbol {} -interface IPopulationDensityData {} +interface IPopulationDensity {} -interface IPopulationData {} +interface IPopulation {} -interface IRegionData {} +interface IRegion {} -interface IReligionData {} +interface IReligion {} -interface IYearlyAverageTemperatureData {} +interface IYearlyAverageTemperature {} -interface INationalSportData {} +interface INationalSport {} type IData> = (IBaseData & T)[] From 362d8979b754291ddfe9b14dd19c843c4d2e8743 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 01:37:28 +0700 Subject: [PATCH 10/88] feat(types): More data files --- src/Data/Area.ts | 1 + src/Data/AverageElevation.ts | 1 + src/Data/CallingCodes.ts | 1 + src/Data/CapitalCity.ts | 1 + src/Data/Cities.ts | 1 + src/Data/Coastline.ts | 1 + src/Data/Continent.ts | 1 + src/Data/Countries.ts | 1 + src/Data/CountriesName.ts | 1 + src/Data/CurrencyName.ts | 1 + src/Data/CurrencySymbol.ts | 1 + src/Data/Flag.ts | 1 + src/Data/GS1Code.ts | 1 + src/Data/GeoCoordinate.ts | 1 + src/Data/ISO4217.ts | 1 + src/Data/Independence.ts | 1 + src/Data/Landlocked.ts | 1 + src/Data/Languages.ts | 1 + src/Data/LifeExpectancy.ts | 1 + src/Data/NationalDishes.ts | 1 + src/Data/NationalSport.ts | 1 + src/Data/NationalSymbol.ts | 1 + src/Data/Population.ts | 1 + src/Data/PopulationDensity.ts | 1 + src/Data/Region.ts | 1 + src/Data/Religion.ts | 1 + src/Data/YearlyAverageTemperature.ts | 1 + src/Data/ccTLD.ts | 1 + src/Types.ts | 60 +--------------------------- 29 files changed, 30 insertions(+), 58 deletions(-) create mode 100644 src/Data/Area.ts create mode 100644 src/Data/AverageElevation.ts create mode 100644 src/Data/CallingCodes.ts create mode 100644 src/Data/CapitalCity.ts create mode 100644 src/Data/Cities.ts create mode 100644 src/Data/Coastline.ts create mode 100644 src/Data/Continent.ts create mode 100644 src/Data/Countries.ts create mode 100644 src/Data/CountriesName.ts create mode 100644 src/Data/CurrencyName.ts create mode 100644 src/Data/CurrencySymbol.ts create mode 100644 src/Data/Flag.ts create mode 100644 src/Data/GS1Code.ts create mode 100644 src/Data/GeoCoordinate.ts create mode 100644 src/Data/ISO4217.ts create mode 100644 src/Data/Independence.ts create mode 100644 src/Data/Landlocked.ts create mode 100644 src/Data/Languages.ts create mode 100644 src/Data/LifeExpectancy.ts create mode 100644 src/Data/NationalDishes.ts create mode 100644 src/Data/NationalSport.ts create mode 100644 src/Data/NationalSymbol.ts create mode 100644 src/Data/Population.ts create mode 100644 src/Data/PopulationDensity.ts create mode 100644 src/Data/Region.ts create mode 100644 src/Data/Religion.ts create mode 100644 src/Data/YearlyAverageTemperature.ts create mode 100644 src/Data/ccTLD.ts diff --git a/src/Data/Area.ts b/src/Data/Area.ts new file mode 100644 index 00000000..80c86e02 --- /dev/null +++ b/src/Data/Area.ts @@ -0,0 +1 @@ +export interface IArea {} diff --git a/src/Data/AverageElevation.ts b/src/Data/AverageElevation.ts new file mode 100644 index 00000000..11c000e0 --- /dev/null +++ b/src/Data/AverageElevation.ts @@ -0,0 +1 @@ +export interface IAverageElevation {} diff --git a/src/Data/CallingCodes.ts b/src/Data/CallingCodes.ts new file mode 100644 index 00000000..321dcc07 --- /dev/null +++ b/src/Data/CallingCodes.ts @@ -0,0 +1 @@ +export interface ICallingCodes {} diff --git a/src/Data/CapitalCity.ts b/src/Data/CapitalCity.ts new file mode 100644 index 00000000..edb54e8d --- /dev/null +++ b/src/Data/CapitalCity.ts @@ -0,0 +1 @@ +export interface ICapitalCity {} diff --git a/src/Data/Cities.ts b/src/Data/Cities.ts new file mode 100644 index 00000000..a37005f5 --- /dev/null +++ b/src/Data/Cities.ts @@ -0,0 +1 @@ +export interface ICities {} diff --git a/src/Data/Coastline.ts b/src/Data/Coastline.ts new file mode 100644 index 00000000..bea05d03 --- /dev/null +++ b/src/Data/Coastline.ts @@ -0,0 +1 @@ +export interface ICoastline {} diff --git a/src/Data/Continent.ts b/src/Data/Continent.ts new file mode 100644 index 00000000..1733e7d6 --- /dev/null +++ b/src/Data/Continent.ts @@ -0,0 +1 @@ +export interface IContinent {} diff --git a/src/Data/Countries.ts b/src/Data/Countries.ts new file mode 100644 index 00000000..686ace3b --- /dev/null +++ b/src/Data/Countries.ts @@ -0,0 +1 @@ +export interface ICountries {} diff --git a/src/Data/CountriesName.ts b/src/Data/CountriesName.ts new file mode 100644 index 00000000..faab716a --- /dev/null +++ b/src/Data/CountriesName.ts @@ -0,0 +1 @@ +export interface ICountriesName {} diff --git a/src/Data/CurrencyName.ts b/src/Data/CurrencyName.ts new file mode 100644 index 00000000..54740b50 --- /dev/null +++ b/src/Data/CurrencyName.ts @@ -0,0 +1 @@ +export interface ICurrencyName {} diff --git a/src/Data/CurrencySymbol.ts b/src/Data/CurrencySymbol.ts new file mode 100644 index 00000000..18a6b85b --- /dev/null +++ b/src/Data/CurrencySymbol.ts @@ -0,0 +1 @@ +export interface ICurrencySymbol {} diff --git a/src/Data/Flag.ts b/src/Data/Flag.ts new file mode 100644 index 00000000..92bd0337 --- /dev/null +++ b/src/Data/Flag.ts @@ -0,0 +1 @@ +export interface IFlag {} diff --git a/src/Data/GS1Code.ts b/src/Data/GS1Code.ts new file mode 100644 index 00000000..443cf7b6 --- /dev/null +++ b/src/Data/GS1Code.ts @@ -0,0 +1 @@ +export interface IGS1Code {} diff --git a/src/Data/GeoCoordinate.ts b/src/Data/GeoCoordinate.ts new file mode 100644 index 00000000..075890b2 --- /dev/null +++ b/src/Data/GeoCoordinate.ts @@ -0,0 +1 @@ +export interface IGeoCoordinate {} diff --git a/src/Data/ISO4217.ts b/src/Data/ISO4217.ts new file mode 100644 index 00000000..ad71716b --- /dev/null +++ b/src/Data/ISO4217.ts @@ -0,0 +1 @@ +export interface IISO4217 {} diff --git a/src/Data/Independence.ts b/src/Data/Independence.ts new file mode 100644 index 00000000..10ff2146 --- /dev/null +++ b/src/Data/Independence.ts @@ -0,0 +1 @@ +export interface IIndependence {} diff --git a/src/Data/Landlocked.ts b/src/Data/Landlocked.ts new file mode 100644 index 00000000..b4a740d5 --- /dev/null +++ b/src/Data/Landlocked.ts @@ -0,0 +1 @@ +export interface ILandlocked {} diff --git a/src/Data/Languages.ts b/src/Data/Languages.ts new file mode 100644 index 00000000..31cbcadf --- /dev/null +++ b/src/Data/Languages.ts @@ -0,0 +1 @@ +export interface ILanguages {} diff --git a/src/Data/LifeExpectancy.ts b/src/Data/LifeExpectancy.ts new file mode 100644 index 00000000..d7eb3b02 --- /dev/null +++ b/src/Data/LifeExpectancy.ts @@ -0,0 +1 @@ +export interface ILifeExpectancy {} diff --git a/src/Data/NationalDishes.ts b/src/Data/NationalDishes.ts new file mode 100644 index 00000000..ff2effe8 --- /dev/null +++ b/src/Data/NationalDishes.ts @@ -0,0 +1 @@ +export interface INationalDishes {} diff --git a/src/Data/NationalSport.ts b/src/Data/NationalSport.ts new file mode 100644 index 00000000..e00b43e5 --- /dev/null +++ b/src/Data/NationalSport.ts @@ -0,0 +1 @@ +export interface INationalSport {} diff --git a/src/Data/NationalSymbol.ts b/src/Data/NationalSymbol.ts new file mode 100644 index 00000000..f0747255 --- /dev/null +++ b/src/Data/NationalSymbol.ts @@ -0,0 +1 @@ +export interface INationalSymbol {} diff --git a/src/Data/Population.ts b/src/Data/Population.ts new file mode 100644 index 00000000..58e06406 --- /dev/null +++ b/src/Data/Population.ts @@ -0,0 +1 @@ +export interface IPopulation {} diff --git a/src/Data/PopulationDensity.ts b/src/Data/PopulationDensity.ts new file mode 100644 index 00000000..ddb7aac7 --- /dev/null +++ b/src/Data/PopulationDensity.ts @@ -0,0 +1 @@ +export interface IPopulationDensity {} diff --git a/src/Data/Region.ts b/src/Data/Region.ts new file mode 100644 index 00000000..bf1a16b7 --- /dev/null +++ b/src/Data/Region.ts @@ -0,0 +1 @@ +export interface IRegion {} diff --git a/src/Data/Religion.ts b/src/Data/Religion.ts new file mode 100644 index 00000000..fdc7d13f --- /dev/null +++ b/src/Data/Religion.ts @@ -0,0 +1 @@ +export interface IReligion {} diff --git a/src/Data/YearlyAverageTemperature.ts b/src/Data/YearlyAverageTemperature.ts new file mode 100644 index 00000000..3e8ac9ac --- /dev/null +++ b/src/Data/YearlyAverageTemperature.ts @@ -0,0 +1 @@ +export interface IYearlyAverageTemperature {} diff --git a/src/Data/ccTLD.ts b/src/Data/ccTLD.ts new file mode 100644 index 00000000..6f5eef79 --- /dev/null +++ b/src/Data/ccTLD.ts @@ -0,0 +1 @@ +export interface IccTLD {} diff --git a/src/Types.ts b/src/Types.ts index c7ad11e5..641714be 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -1,61 +1,5 @@ -interface IBaseData { +export interface IBaseData { country: string } -interface ICountries {} - -interface ICountriesName {} - -interface IGS1Code {} - -interface ICallingCodes {} - -interface ICapitalCity {} - -interface ICities {} - -interface IContinent {} - -interface ICoastline {} - -interface IArea {} - -interface IISO4217 {} - -interface ICurrencySymbol {} - -interface ICurrencyName {} - -interface IccTLD {} - -interface IAverageElevation {} - -interface IFlag {} - -interface IGeoCoordinate {} - -interface IIndependence {} - -interface ILandlocked {} - -interface ILanguages {} - -interface ILifeExpectancy {} - -interface INationalDishes {} - -interface INationalSymbol {} - -interface IPopulationDensity {} - -interface IPopulation {} - -interface IRegion {} - -interface IReligion {} - -interface IYearlyAverageTemperature {} - -interface INationalSport {} - -type IData> = (IBaseData & T)[] +export type IData> = (IBaseData & T)[] From df7a40e9e4836e5c2437ce76ddd0cc5a28d2e03f Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 01:39:08 +0700 Subject: [PATCH 11/88] feat(types): Export average height --- src/Data/AverageHeight.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Data/AverageHeight.ts b/src/Data/AverageHeight.ts index cfafb74d..a19be0b8 100644 --- a/src/Data/AverageHeight.ts +++ b/src/Data/AverageHeight.ts @@ -31,7 +31,7 @@ interface IAverageHeightAll { maleToFemaleRatio: number } -type IAverageHeight = ( +export type IAverageHeight = ( | IAverageHeightMaleNull | IAverageHeightFemaleNull | IAverageHeightAllNull From 357a7f7ceb114e1d3240803422e14e03971261be Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 01:49:27 +0700 Subject: [PATCH 12/88] feat(types): United nations member --- src/Data/Countries.ts | 1 - src/Data/UnitedNationsMember.ts | 8 ++++++++ 2 files changed, 8 insertions(+), 1 deletion(-) delete mode 100644 src/Data/Countries.ts create mode 100644 src/Data/UnitedNationsMember.ts diff --git a/src/Data/Countries.ts b/src/Data/Countries.ts deleted file mode 100644 index 686ace3b..00000000 --- a/src/Data/Countries.ts +++ /dev/null @@ -1 +0,0 @@ -export interface ICountries {} diff --git a/src/Data/UnitedNationsMember.ts b/src/Data/UnitedNationsMember.ts new file mode 100644 index 00000000..9f3369db --- /dev/null +++ b/src/Data/UnitedNationsMember.ts @@ -0,0 +1,8 @@ +export interface IUnitedNationsMember { + isOriginalMember: boolean + + /** + * Expoch unix timestamp + */ + dateOfAdmission: number +} From 26597173f909d9738e4223e1dabc404f02d8ccc9 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 01:53:22 +0700 Subject: [PATCH 13/88] feat(types): GS1 code --- src/Data/GS1Code.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/Data/GS1Code.ts b/src/Data/GS1Code.ts index 443cf7b6..6be6d9c1 100644 --- a/src/Data/GS1Code.ts +++ b/src/Data/GS1Code.ts @@ -1 +1,20 @@ -export interface IGS1Code {} +interface IGS1CodeRange { + isRange: true + + /** + * Inclusive + */ + start: number + + /** + * Inclusive + */ + end: number +} + +interface IGS1CodeSingle { + isRange: false + number: number +} + +export type IGS1Code = IGS1CodeSingle | IGS1CodeRange From d7c48917bbf23f71f0a7542b290ec2b5b20f56e7 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 01:54:52 +0700 Subject: [PATCH 14/88] feat(types): Calling code --- src/Data/CallingCodes.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Data/CallingCodes.ts b/src/Data/CallingCodes.ts index 321dcc07..f3f8483b 100644 --- a/src/Data/CallingCodes.ts +++ b/src/Data/CallingCodes.ts @@ -1 +1,3 @@ -export interface ICallingCodes {} +export interface ICallingCodes { + code: number +} From 7b8195c57d76e917248da93461a8b151df58d213 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 01:58:08 +0700 Subject: [PATCH 15/88] feat(types): Capital city --- src/Data/CapitalCity.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Data/CapitalCity.ts b/src/Data/CapitalCity.ts index edb54e8d..67adaaf5 100644 --- a/src/Data/CapitalCity.ts +++ b/src/Data/CapitalCity.ts @@ -1 +1,3 @@ -export interface ICapitalCity {} +export interface ICapitalCity { + capitalCity: string +} From 8b99fad8d016c171f8741ccf84812285441f7b5c Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:00:53 +0700 Subject: [PATCH 16/88] feat(types): Cities --- src/Data/Cities.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Data/Cities.ts b/src/Data/Cities.ts index a37005f5..a5631f1d 100644 --- a/src/Data/Cities.ts +++ b/src/Data/Cities.ts @@ -1 +1,3 @@ -export interface ICities {} +export interface ICities { + cities: string[] +} From 1773715296fb7a4dba4a9dbdf5c519619482ce98 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:04:31 +0700 Subject: [PATCH 17/88] feat(types): Continent --- src/Data/Continent.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Data/Continent.ts b/src/Data/Continent.ts index 1733e7d6..a44097ab 100644 --- a/src/Data/Continent.ts +++ b/src/Data/Continent.ts @@ -1 +1,3 @@ -export interface IContinent {} +export interface IContinent { + continent: string +} From e823c831f0509ba4815e4d1adfd27a54e624b6b4 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:08:27 +0700 Subject: [PATCH 18/88] feat(types): Coastline --- src/Data/Coastline.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Data/Coastline.ts b/src/Data/Coastline.ts index bea05d03..ac438252 100644 --- a/src/Data/Coastline.ts +++ b/src/Data/Coastline.ts @@ -1 +1,3 @@ -export interface ICoastline {} +export interface ICoastline { + length: number +} From 294ba9cedc20bc54d51594333ce423ea2ba277c0 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:09:10 +0700 Subject: [PATCH 19/88] feat(types): Area --- src/Data/Area.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Data/Area.ts b/src/Data/Area.ts index 80c86e02..929852d7 100644 --- a/src/Data/Area.ts +++ b/src/Data/Area.ts @@ -1 +1,5 @@ -export interface IArea {} +export interface IArea { + total: number + land: number + water: number +} From 1a5ef951491e854e61e7bd6af7430de0ecf9d424 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:10:57 +0700 Subject: [PATCH 20/88] feat(types): ISO4217 --- src/Data/ISO4217.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Data/ISO4217.ts b/src/Data/ISO4217.ts index ad71716b..211a3e57 100644 --- a/src/Data/ISO4217.ts +++ b/src/Data/ISO4217.ts @@ -1 +1,3 @@ -export interface IISO4217 {} +export interface IISO4217 { + codes: string[] +} From 22c54c1d440cb66bc10988bf852e69437731ccd7 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:17:08 +0700 Subject: [PATCH 21/88] feat(types): Currency symbol --- src/Data/CurrencySymbol.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Data/CurrencySymbol.ts b/src/Data/CurrencySymbol.ts index 18a6b85b..95d97749 100644 --- a/src/Data/CurrencySymbol.ts +++ b/src/Data/CurrencySymbol.ts @@ -1 +1,3 @@ -export interface ICurrencySymbol {} +export interface ICurrencySymbol { + symbols: string[] +} From d1ac522d25499b069ef03f68042aa0f1e8020a6e Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:19:13 +0700 Subject: [PATCH 22/88] feat(types): Currency name --- src/Data/CurrencyName.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Data/CurrencyName.ts b/src/Data/CurrencyName.ts index 54740b50..cbfc5358 100644 --- a/src/Data/CurrencyName.ts +++ b/src/Data/CurrencyName.ts @@ -1 +1,3 @@ -export interface ICurrencyName {} +export interface ICurrencyName { + name: string +} From dc3abd57dc9d9a0bf01c02bda6f276ded27aef24 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:22:01 +0700 Subject: [PATCH 23/88] feat(types): ccTLD --- src/Data/ccTLD.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Data/ccTLD.ts b/src/Data/ccTLD.ts index 6f5eef79..5d1bfe6f 100644 --- a/src/Data/ccTLD.ts +++ b/src/Data/ccTLD.ts @@ -1 +1,8 @@ -export interface IccTLD {} +export interface IccTLD { + tld: string + registry: string + IDN: boolean + DNSSEC: boolean + SLD: boolean + IPv6: boolean +} From 4db6671761c495beb799fbd9c43cfbea9d0ffd00 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:23:23 +0700 Subject: [PATCH 24/88] feat(types): Average elevation --- src/Data/AverageElevation.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Data/AverageElevation.ts b/src/Data/AverageElevation.ts index 11c000e0..517819d1 100644 --- a/src/Data/AverageElevation.ts +++ b/src/Data/AverageElevation.ts @@ -1 +1,3 @@ -export interface IAverageElevation {} +export interface IAverageElevation { + elevation: number +} From 40108b82f03198a41b9400aae679d4f45523d74d Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:25:35 +0700 Subject: [PATCH 25/88] feat(types): Flag --- src/Data/Flag.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Data/Flag.ts b/src/Data/Flag.ts index 92bd0337..91277094 100644 --- a/src/Data/Flag.ts +++ b/src/Data/Flag.ts @@ -1 +1,3 @@ -export interface IFlag {} +export interface IFlag { + flag: string +} From da8fe0b189ba2e4ddb98f9eb6c0ea7e0dc495eea Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:30:43 +0700 Subject: [PATCH 26/88] feat(types): Government --- src/Data/Government.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/Data/Government.ts diff --git a/src/Data/Government.ts b/src/Data/Government.ts new file mode 100644 index 00000000..8e9e9acf --- /dev/null +++ b/src/Data/Government.ts @@ -0,0 +1,17 @@ +export enum IGovernmentConstitutionalForm { + Provisional, + Republic, + ConstitutionalMonarchy, + AbsoluteMonarchy, +} + +export enum IGovernmentHeadOfState { + NotApplicable, + Ceremonial, + Executive, +} + +export interface IGovernment { + constitutionalForm: IGovernmentConstitutionalForm + headOfState: IGovernmentHeadOfState +} From 79558e1b5959b7b8e04c95d9bbe7af3bb7323f73 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:32:51 +0700 Subject: [PATCH 27/88] feat(types): Independence --- src/Data/Independence.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Data/Independence.ts b/src/Data/Independence.ts index 10ff2146..47c5c4be 100644 --- a/src/Data/Independence.ts +++ b/src/Data/Independence.ts @@ -1 +1,8 @@ -export interface IIndependence {} +export interface IIndependence { + /** + * Epoch unix timestamp + */ + date: number + + independenceFrom: string +} From ec59be3018ad74c74a7e27135774510c217dad32 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:33:59 +0700 Subject: [PATCH 28/88] feat(types): Landlocked --- src/Data/Landlocked.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Data/Landlocked.ts b/src/Data/Landlocked.ts index b4a740d5..59df6efd 100644 --- a/src/Data/Landlocked.ts +++ b/src/Data/Landlocked.ts @@ -1 +1,3 @@ -export interface ILandlocked {} +export interface ILandlocked { + isLandlocked: boolean +} From e6670bd5d8eade6e40de9c65a130fd7154dacfd5 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:36:51 +0700 Subject: [PATCH 29/88] feat(types): Languages --- src/Data/Languages.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Data/Languages.ts b/src/Data/Languages.ts index 31cbcadf..7bdaba2d 100644 --- a/src/Data/Languages.ts +++ b/src/Data/Languages.ts @@ -1 +1,7 @@ -export interface ILanguages {} +export interface ILanguages { + officialLanguages: string[] + regionalLanguage: string[] + minorityLanguage: string[] + nationalLanguage: string[] + widelySpoken: string[] +} From b3b6776b2339cdc994863386d18ff9a8e686f955 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:37:48 +0700 Subject: [PATCH 30/88] feat(types): Life expectancy --- src/Data/LifeExpectancy.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Data/LifeExpectancy.ts b/src/Data/LifeExpectancy.ts index d7eb3b02..ef757ef8 100644 --- a/src/Data/LifeExpectancy.ts +++ b/src/Data/LifeExpectancy.ts @@ -1 +1,5 @@ -export interface ILifeExpectancy {} +export interface ILifeExpectancy { + male: number + female: number + all: number +} From eca68c1e618303c4be41798392c6cf2cfe5d32a2 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:38:54 +0700 Subject: [PATCH 31/88] feat(types): National dishes --- src/Data/NationalDishes.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Data/NationalDishes.ts b/src/Data/NationalDishes.ts index ff2effe8..6c2674d8 100644 --- a/src/Data/NationalDishes.ts +++ b/src/Data/NationalDishes.ts @@ -1 +1,3 @@ -export interface INationalDishes {} +export interface INationalDishes { + dishes:string[] +} From 7652993c622529c35cbc77d5a95fbcac6dd9a144 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:41:35 +0700 Subject: [PATCH 32/88] feat(types): National symbols --- src/Data/NationalDishes.ts | 2 +- src/Data/NationalSymbol.ts | 1 - src/Data/NationalSymbols.ts | 3 +++ 3 files changed, 4 insertions(+), 2 deletions(-) delete mode 100644 src/Data/NationalSymbol.ts create mode 100644 src/Data/NationalSymbols.ts diff --git a/src/Data/NationalDishes.ts b/src/Data/NationalDishes.ts index 6c2674d8..6c273477 100644 --- a/src/Data/NationalDishes.ts +++ b/src/Data/NationalDishes.ts @@ -1,3 +1,3 @@ export interface INationalDishes { - dishes:string[] + dishes: string[] } diff --git a/src/Data/NationalSymbol.ts b/src/Data/NationalSymbol.ts deleted file mode 100644 index f0747255..00000000 --- a/src/Data/NationalSymbol.ts +++ /dev/null @@ -1 +0,0 @@ -export interface INationalSymbol {} diff --git a/src/Data/NationalSymbols.ts b/src/Data/NationalSymbols.ts new file mode 100644 index 00000000..fb5afa98 --- /dev/null +++ b/src/Data/NationalSymbols.ts @@ -0,0 +1,3 @@ +export interface INationalSymbols { + symbols: string[] +} From c1adf04b9687199444e4fb487e45a43faee7ffd2 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:42:11 +0700 Subject: [PATCH 33/88] feat(types): Population density --- src/Data/PopulationDensity.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Data/PopulationDensity.ts b/src/Data/PopulationDensity.ts index ddb7aac7..a6334596 100644 --- a/src/Data/PopulationDensity.ts +++ b/src/Data/PopulationDensity.ts @@ -1 +1,3 @@ -export interface IPopulationDensity {} +export interface IPopulationDensity { + density: number +} From b1bfc76c94aa18090cce90d3aeffba376ba0ed4a Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:42:45 +0700 Subject: [PATCH 34/88] feat(types): Population --- src/Data/Population.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Data/Population.ts b/src/Data/Population.ts index 58e06406..fd5093db 100644 --- a/src/Data/Population.ts +++ b/src/Data/Population.ts @@ -1 +1,3 @@ -export interface IPopulation {} +export interface IPopulation { + population: number +} From 3ec00bae7a4151d6b1c4087e3321646375e7d39d Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:44:17 +0700 Subject: [PATCH 35/88] feat(types): Regions --- src/Data/Region.ts | 1 - src/Data/Regions.ts | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) delete mode 100644 src/Data/Region.ts create mode 100644 src/Data/Regions.ts diff --git a/src/Data/Region.ts b/src/Data/Region.ts deleted file mode 100644 index bf1a16b7..00000000 --- a/src/Data/Region.ts +++ /dev/null @@ -1 +0,0 @@ -export interface IRegion {} diff --git a/src/Data/Regions.ts b/src/Data/Regions.ts new file mode 100644 index 00000000..90d084b7 --- /dev/null +++ b/src/Data/Regions.ts @@ -0,0 +1,3 @@ +export interface IRegions { + regions: string[] +} From fc6befba6ea748e850bca32ca5a100435b4bba71 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:45:30 +0700 Subject: [PATCH 36/88] feat(types): Religion --- src/Data/Religion.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Data/Religion.ts b/src/Data/Religion.ts index fdc7d13f..6d5babb8 100644 --- a/src/Data/Religion.ts +++ b/src/Data/Religion.ts @@ -1 +1,3 @@ -export interface IReligion {} +export interface IReligion { + religions: Record +} From d9c593a47548d4fd325c55049c75f34a79d55eb7 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:46:28 +0700 Subject: [PATCH 37/88] feat(types): Yearly average temperature --- src/Data/YearlyAverageTemperature.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Data/YearlyAverageTemperature.ts b/src/Data/YearlyAverageTemperature.ts index 3e8ac9ac..57e6805f 100644 --- a/src/Data/YearlyAverageTemperature.ts +++ b/src/Data/YearlyAverageTemperature.ts @@ -1 +1,3 @@ -export interface IYearlyAverageTemperature {} +export interface IYearlyAverageTemperature { + yearlyAverageTemperature: number +} From c6cfe84930219f2ba91305ff80e2d0b01d96fbc8 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:48:49 +0700 Subject: [PATCH 38/88] feat(types): National sports --- src/Data/NationalSport.ts | 1 - src/Data/NationalSports.ts | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) delete mode 100644 src/Data/NationalSport.ts create mode 100644 src/Data/NationalSports.ts diff --git a/src/Data/NationalSport.ts b/src/Data/NationalSport.ts deleted file mode 100644 index e00b43e5..00000000 --- a/src/Data/NationalSport.ts +++ /dev/null @@ -1 +0,0 @@ -export interface INationalSport {} diff --git a/src/Data/NationalSports.ts b/src/Data/NationalSports.ts new file mode 100644 index 00000000..b5eb6d21 --- /dev/null +++ b/src/Data/NationalSports.ts @@ -0,0 +1,14 @@ +export interface INationalSports { + nationalSports: ( + | { + name: string + isOfficial: false + yearDefinedAsNationalSport?: never + } + | { + name: string + isOfficial: true + yearDefinedAsNationalSport: number + } + )[] +} From a83529f57c829e46a54a660f43dbf7b0c1948f3b Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Wed, 9 Aug 2023 00:53:02 +0700 Subject: [PATCH 39/88] feat(data): Scrap iso 3166 --- src/Data/ISO3166.ts | 34 ++++++++++++++++++++++++++++++++++ src/index.ts | 6 +++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/Data/ISO3166.ts b/src/Data/ISO3166.ts index d278dd6f..8a3b493b 100644 --- a/src/Data/ISO3166.ts +++ b/src/Data/ISO3166.ts @@ -1,5 +1,39 @@ +import { parse } from 'node-html-parser' + export interface IISO3166 { alpha2: string alpha3: string numeric: string } + +const ScrapISO3166 = async () => { + const rawHtml = await fetch( + 'https://en.wikipedia.org/wiki/ISO_3166-1' + ).then(response => response.text()) + + const root = parse(rawHtml) + + const dataTableBody = root.querySelector( + '.wikitable.sortable:has(caption) tbody' + ) + + // Remove header tr element + const rows = dataTableBody.querySelectorAll('tr:not(:has(th))') + + for (const row of rows) { + // Get all direct children + const children = row.querySelectorAll('> *') + + const country = children[0].querySelector('a').innerText + const alpha2 = children[1].querySelector('a span').innerText + const alpha3 = children[2].querySelector('span').innerText + const numeric = parseInt( + children[3].querySelector('span').innerText, + 10 + ) + + console.log({ country, alpha2, alpha3, numeric }) + } +} + +export default ScrapISO3166 diff --git a/src/index.ts b/src/index.ts index 7e2c8770..ba6a5546 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,5 @@ -console.log('Hello World!') +import ScrapISO3166 from "./Data/ISO3166.js" + +console.log('Country JSON Scrapper!') + +await ScrapISO3166() \ No newline at end of file From f3610afbd18b6278cea83803e72ad28895826474 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Wed, 9 Aug 2023 11:56:49 +0700 Subject: [PATCH 40/88] refactor: Change comment --- src/Data/ISO3166.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Data/ISO3166.ts b/src/Data/ISO3166.ts index 8a3b493b..e0dd9bb9 100644 --- a/src/Data/ISO3166.ts +++ b/src/Data/ISO3166.ts @@ -17,7 +17,7 @@ const ScrapISO3166 = async () => { '.wikitable.sortable:has(caption) tbody' ) - // Remove header tr element + // Select all rows except header row element const rows = dataTableBody.querySelectorAll('tr:not(:has(th))') for (const row of rows) { From 3684ad3867057f08f16bc1045c51bc7a4bc07f91 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Wed, 9 Aug 2023 12:21:28 +0700 Subject: [PATCH 41/88] refactor: Enum string value --- src/Data/Government.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Data/Government.ts b/src/Data/Government.ts index 8e9e9acf..0f1d3f70 100644 --- a/src/Data/Government.ts +++ b/src/Data/Government.ts @@ -1,14 +1,14 @@ export enum IGovernmentConstitutionalForm { - Provisional, - Republic, - ConstitutionalMonarchy, - AbsoluteMonarchy, + Provisional = 'Provisional', + Republic = 'Republic', + ConstitutionalMonarchy = 'ConstitutionalMonarchy', + AbsoluteMonarchy = 'AbsoluteMonarchy', } export enum IGovernmentHeadOfState { - NotApplicable, - Ceremonial, - Executive, + NotApplicable = 'NotApplicable', + Ceremonial = 'Ceremonial', + Executive = 'Executive', } export interface IGovernment { From d4cacb06ce526b9ccf4cd4570981b1d503d9b058 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Wed, 9 Aug 2023 12:46:14 +0700 Subject: [PATCH 42/88] feat(utils): Month name to index --- src/Utils/MonthNameToIndex.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/Utils/MonthNameToIndex.ts diff --git a/src/Utils/MonthNameToIndex.ts b/src/Utils/MonthNameToIndex.ts new file mode 100644 index 00000000..23dc64ba --- /dev/null +++ b/src/Utils/MonthNameToIndex.ts @@ -0,0 +1,26 @@ +export const MonthNameToIndexMap = { + january: 0, + february: 1, + march: 2, + april: 3, + may: 4, + june: 5, + july: 6, + august: 7, + september: 8, + october: 9, + november: 10, + december: 11, +} as const satisfies Record + +const MonthNameToIndex = (monthName: string): number | false => { + const lowerCaseMonthName = monthName.toLowerCase() + + const index = MonthNameToIndexMap[lowerCaseMonthName] as number | undefined + + if (!index) return false + + return index +} + +export default MonthNameToIndex From 8a88d48d24c6acd674f237e9f567804bb8b75349 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Wed, 9 Aug 2023 12:55:39 +0700 Subject: [PATCH 43/88] feat(data): Scrap united nations member --- src/Data/UnitedNationsMember.ts | 62 +++++++++++++++++++++++++++++++-- src/index.ts | 6 ++-- 2 files changed, 63 insertions(+), 5 deletions(-) diff --git a/src/Data/UnitedNationsMember.ts b/src/Data/UnitedNationsMember.ts index 9f3369db..de02e181 100644 --- a/src/Data/UnitedNationsMember.ts +++ b/src/Data/UnitedNationsMember.ts @@ -1,8 +1,64 @@ +import { parse } from 'node-html-parser' +import MonthNameToIndex from '../Utils/MonthNameToIndex.js' + export interface IUnitedNationsMember { isOriginalMember: boolean - /** - * Expoch unix timestamp - */ + /** + * Expoch unix timestamp + */ dateOfAdmission: number } + +const ScrapUnitedNationsMember = async () => { + const rawHtml = await fetch( + 'https://en.wikipedia.org/wiki/Member_states_of_the_United_Nations' + ).then(response => response.text()) + + const root = parse(rawHtml) + + const dataTableBody = root.querySelector( + '.wikitable.sortable.plainrowheaders tbody' + ) + + // Select all rows except header row element + const rows = dataTableBody.querySelectorAll('tr:not(:has(th[scope=col]))') + + for (const row of rows) { + // Get all direct children + const children = row.querySelectorAll('> *') + + const country = children[0].querySelector('a').innerText + const dateOfAdmissionString = + children[1].querySelector('span').innerText + const isOriginalMember = + children[2].getAttribute('data-sort-value') === 'Yes' + + const [ + dateOfAdmissionDateString, + dateOfAdmissionMonthNameString, + dateOfAdmissionYearString, + ] = dateOfAdmissionString.split(' ') + + const dateOfAdmissionMilliseconds = Date.UTC( + parseInt(dateOfAdmissionYearString), + MonthNameToIndex(dateOfAdmissionMonthNameString) as number, // Assume wikipedia date is always valid + parseInt(dateOfAdmissionDateString, 10), + 0, + 0, + 0, + 0 + ) + + // Unix epoch + const dateOfAdmission = dateOfAdmissionMilliseconds / 1000 + + console.log({ + country, + dateOfAdmission, + isOriginalMember, + }) + } +} + +export default ScrapUnitedNationsMember diff --git a/src/index.ts b/src/index.ts index ba6a5546..dd660efa 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,7 @@ -import ScrapISO3166 from "./Data/ISO3166.js" +import ScrapISO3166 from './Data/ISO3166.js' +import ScrapUnitedNationsMember from './Data/UnitedNationsMember.js' console.log('Country JSON Scrapper!') -await ScrapISO3166() \ No newline at end of file +// await ScrapISO3166() +await ScrapUnitedNationsMember() From 4372f39973cbb86cc5560a788f4974cedcd1be64 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Wed, 9 Aug 2023 13:13:55 +0700 Subject: [PATCH 44/88] feat(utils): Date string to unix epoch --- src/Utils/DateStringToUnixEpoch.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/Utils/DateStringToUnixEpoch.ts diff --git a/src/Utils/DateStringToUnixEpoch.ts b/src/Utils/DateStringToUnixEpoch.ts new file mode 100644 index 00000000..080ed540 --- /dev/null +++ b/src/Utils/DateStringToUnixEpoch.ts @@ -0,0 +1,25 @@ +import MonthNameToIndex from './MonthNameToIndex.js' + +const DateStringToUnixEpoch = (dateStringRaw: string): number | false => { + const [dateString, monthNameString, yearString] = dateStringRaw.split(' ') + + if (!dateString) return false + if (!monthNameString) return false + if (!yearString) return false + + const monthIndex = MonthNameToIndex(monthNameString) + + if (!monthIndex) return false + + const yearInt = parseInt(yearString, 10) + const dateInt = parseInt(dateString, 10) + + if (dateInt > 31 || dateInt <= 0) return false + + const milliseconds = Date.UTC(yearInt, monthIndex, dateInt, 0, 0, 0, 0) + + // Unix epoch + return milliseconds / 1000 +} + +export default DateStringToUnixEpoch From b3bdc13d38afd2b598e8f8940a0cc90afc6418e5 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Wed, 9 Aug 2023 13:15:08 +0700 Subject: [PATCH 45/88] feat(data): Use date string to unix epoch util --- src/Data/UnitedNationsMember.ts | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/src/Data/UnitedNationsMember.ts b/src/Data/UnitedNationsMember.ts index de02e181..89bbf25f 100644 --- a/src/Data/UnitedNationsMember.ts +++ b/src/Data/UnitedNationsMember.ts @@ -1,5 +1,5 @@ import { parse } from 'node-html-parser' -import MonthNameToIndex from '../Utils/MonthNameToIndex.js' +import DateStringToUnixEpoch from '../Utils/DateStringToUnixEpoch.js' export interface IUnitedNationsMember { isOriginalMember: boolean @@ -34,24 +34,10 @@ const ScrapUnitedNationsMember = async () => { const isOriginalMember = children[2].getAttribute('data-sort-value') === 'Yes' - const [ - dateOfAdmissionDateString, - dateOfAdmissionMonthNameString, - dateOfAdmissionYearString, - ] = dateOfAdmissionString.split(' ') - - const dateOfAdmissionMilliseconds = Date.UTC( - parseInt(dateOfAdmissionYearString), - MonthNameToIndex(dateOfAdmissionMonthNameString) as number, // Assume wikipedia date is always valid - parseInt(dateOfAdmissionDateString, 10), - 0, - 0, - 0, - 0 - ) - - // Unix epoch - const dateOfAdmission = dateOfAdmissionMilliseconds / 1000 + // Assume wikipedia date is valid + const dateOfAdmission = DateStringToUnixEpoch( + dateOfAdmissionString + ) as number console.log({ country, From 5841d3c3d198bd8db6c61f7fd8265e858950e906 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Wed, 9 Aug 2023 13:26:25 +0700 Subject: [PATCH 46/88] feat(data): Return data from united nations member --- src/Data/UnitedNationsMember.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Data/UnitedNationsMember.ts b/src/Data/UnitedNationsMember.ts index 89bbf25f..738733d8 100644 --- a/src/Data/UnitedNationsMember.ts +++ b/src/Data/UnitedNationsMember.ts @@ -1,5 +1,6 @@ import { parse } from 'node-html-parser' import DateStringToUnixEpoch from '../Utils/DateStringToUnixEpoch.js' +import { IData } from '../Types.js' export interface IUnitedNationsMember { isOriginalMember: boolean @@ -10,7 +11,9 @@ export interface IUnitedNationsMember { dateOfAdmission: number } -const ScrapUnitedNationsMember = async () => { +const ScrapUnitedNationsMember = async (): Promise< + IData +> => { const rawHtml = await fetch( 'https://en.wikipedia.org/wiki/Member_states_of_the_United_Nations' ).then(response => response.text()) @@ -24,6 +27,8 @@ const ScrapUnitedNationsMember = async () => { // Select all rows except header row element const rows = dataTableBody.querySelectorAll('tr:not(:has(th[scope=col]))') + const data: IData = [] + for (const row of rows) { // Get all direct children const children = row.querySelectorAll('> *') @@ -39,12 +44,14 @@ const ScrapUnitedNationsMember = async () => { dateOfAdmissionString ) as number - console.log({ + data.push({ country, dateOfAdmission, isOriginalMember, }) } + + return data } export default ScrapUnitedNationsMember From b1cfa4062c87d986a6d47ac815c00d39d03988aa Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Wed, 9 Aug 2023 13:33:13 +0700 Subject: [PATCH 47/88] feat(data): ISO3166 aggregate data --- src/Data/ISO3166.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Data/ISO3166.ts b/src/Data/ISO3166.ts index e0dd9bb9..165d08e9 100644 --- a/src/Data/ISO3166.ts +++ b/src/Data/ISO3166.ts @@ -1,9 +1,10 @@ import { parse } from 'node-html-parser' +import { IData } from '../Types' export interface IISO3166 { alpha2: string alpha3: string - numeric: string + numeric: number } const ScrapISO3166 = async () => { @@ -20,6 +21,8 @@ const ScrapISO3166 = async () => { // Select all rows except header row element const rows = dataTableBody.querySelectorAll('tr:not(:has(th))') + const data: IData = [] + for (const row of rows) { // Get all direct children const children = row.querySelectorAll('> *') @@ -32,7 +35,7 @@ const ScrapISO3166 = async () => { 10 ) - console.log({ country, alpha2, alpha3, numeric }) + data.push({ country, alpha2, alpha3, numeric }) } } From 6bb25088b9495440af67d9e280abfdb47ab39339 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Wed, 9 Aug 2023 13:49:02 +0700 Subject: [PATCH 48/88] feat(utils): Parse wikipedia float --- src/Utils/ParseWikipediaFloat.ts | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/Utils/ParseWikipediaFloat.ts diff --git a/src/Utils/ParseWikipediaFloat.ts b/src/Utils/ParseWikipediaFloat.ts new file mode 100644 index 00000000..6bf3ccac --- /dev/null +++ b/src/Utils/ParseWikipediaFloat.ts @@ -0,0 +1,4 @@ +const ParseWikipediaFloat = (raw: string): number => + parseFloat(raw.replace(',', '')) + +export default ParseWikipediaFloat From ea26f850b1e41f921e9f0efd209a30df7383315d Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Wed, 9 Aug 2023 13:57:01 +0700 Subject: [PATCH 49/88] feat(constants): HTML entities --- src/Constants/HTMLEntities.ts | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/Constants/HTMLEntities.ts diff --git a/src/Constants/HTMLEntities.ts b/src/Constants/HTMLEntities.ts new file mode 100644 index 00000000..7ea3829b --- /dev/null +++ b/src/Constants/HTMLEntities.ts @@ -0,0 +1,6 @@ +const HTMLEntities = { + NonBreakingSpace: ' ', +} + + +export default HTMLEntities \ No newline at end of file From 35dc26fe938e6aee3ce07cf40e13e84aab3c6196 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Wed, 9 Aug 2023 13:57:27 +0700 Subject: [PATCH 50/88] feat(data): Scrap average height --- src/Constants/HTMLEntities.ts | 7 ++-- src/Data/AverageHeight.ts | 60 +++++++++++++++++++++++++++++++++++ src/index.ts | 4 ++- 3 files changed, 66 insertions(+), 5 deletions(-) diff --git a/src/Constants/HTMLEntities.ts b/src/Constants/HTMLEntities.ts index 7ea3829b..ac92cac2 100644 --- a/src/Constants/HTMLEntities.ts +++ b/src/Constants/HTMLEntities.ts @@ -1,6 +1,5 @@ -const HTMLEntities = { - NonBreakingSpace: ' ', +enum HTMLEntities { + NonBreakingSpace = ' ', } - -export default HTMLEntities \ No newline at end of file +export default HTMLEntities diff --git a/src/Data/AverageHeight.ts b/src/Data/AverageHeight.ts index a19be0b8..cbeadb0f 100644 --- a/src/Data/AverageHeight.ts +++ b/src/Data/AverageHeight.ts @@ -1,3 +1,8 @@ +import { parse } from 'node-html-parser' +import { IData } from '../Types' +import ParseWikipediaFloat from '../Utils/ParseWikipediaFloat.js' +import HTMLEntities from '../Constants/HtmlEntities.js' + enum IAverageHeightMethodology { Measured = 'Measured', SelfReported = 'SelfReported', @@ -38,3 +43,58 @@ export type IAverageHeight = ( | IAverageHeightAll ) & IAverageHeightBase + +const ScrapAverageHeight = async () => { + const rawHtml = await fetch( + 'https://en.wikipedia.org/wiki/Average_human_height_by_country' + ).then(response => response.text()) + + const root = parse(rawHtml) + + const dataTableBody = root.querySelector('.wikitable.sortable tbody') + + // Select all rows except header row element + const rows = dataTableBody.querySelectorAll('tr:not(:has(th))') + + const data: IData = [] + + for (const row of rows) { + // Get all direct children + const children = row.querySelectorAll('> *') + + const country = children[0].querySelector('a').innerText + const male = ParseWikipediaFloat( + children[1].innerText.split(HTMLEntities.NonBreakingSpace)[0] + ) + const female = ParseWikipediaFloat( + children[2].innerText.split(HTMLEntities.NonBreakingSpace)[0] + ) + const maleToFemaleRatio = ParseWikipediaFloat(children[3].innerText) + const methodologyString = children[6].innerText + + let methodology: IAverageHeightMethodology = null + + if (methodologyString === 'Measured') + methodology = IAverageHeightMethodology.Measured + else if (methodologyString === 'Self-reported') + methodology = IAverageHeightMethodology.SelfReported + + console.log({ + country, + male, + female, + maleToFemaleRatio, + methodology, + }) + + data.push({ + country, + male, + female, + maleToFemaleRatio, + methodology, + }) + } +} + +export default ScrapAverageHeight diff --git a/src/index.ts b/src/index.ts index dd660efa..d981448e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,9 @@ +import ScrapAverageHeight from './Data/AverageHeight.js' import ScrapISO3166 from './Data/ISO3166.js' import ScrapUnitedNationsMember from './Data/UnitedNationsMember.js' console.log('Country JSON Scrapper!') // await ScrapISO3166() -await ScrapUnitedNationsMember() +// await ScrapUnitedNationsMember() +await ScrapAverageHeight() From ee5631586c631485ece74bbc2d83ed110c0a307e Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Wed, 9 Aug 2023 14:05:55 +0700 Subject: [PATCH 51/88] feat(data): Average height null instead of nan --- src/Data/AverageHeight.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Data/AverageHeight.ts b/src/Data/AverageHeight.ts index cbeadb0f..16f28b5f 100644 --- a/src/Data/AverageHeight.ts +++ b/src/Data/AverageHeight.ts @@ -81,17 +81,21 @@ const ScrapAverageHeight = async () => { console.log({ country, - male, - female, - maleToFemaleRatio, + male: Number.isNaN(male) ? null : male, + female: Number.isNaN(female) ? null : female, + maleToFemaleRatio: Number.isNaN(maleToFemaleRatio) + ? null + : maleToFemaleRatio, methodology, }) data.push({ country, - male, - female, - maleToFemaleRatio, + male: Number.isNaN(male) ? null : male, + female: Number.isNaN(female) ? null : female, + maleToFemaleRatio: Number.isNaN(maleToFemaleRatio) + ? null + : maleToFemaleRatio, methodology, }) } From bd5a81fe34989f5f18b051aed2d6f52c1431c44c Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 14 Aug 2023 15:08:32 +0700 Subject: [PATCH 52/88] fix: Ts casing error --- src/Data/AverageHeight.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Data/AverageHeight.ts b/src/Data/AverageHeight.ts index 16f28b5f..e11bea9a 100644 --- a/src/Data/AverageHeight.ts +++ b/src/Data/AverageHeight.ts @@ -1,7 +1,7 @@ import { parse } from 'node-html-parser' import { IData } from '../Types' import ParseWikipediaFloat from '../Utils/ParseWikipediaFloat.js' -import HTMLEntities from '../Constants/HtmlEntities.js' +import HTMLEntities from '../Constants/HTMLEntities.js' enum IAverageHeightMethodology { Measured = 'Measured', From 6b410a489b463ab794f2afb2be73b28f0336893f Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 14 Aug 2023 15:14:58 +0700 Subject: [PATCH 53/88] feat(utils): Countries name from data --- src/Utils/CountriesNameFromData.ts | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/Utils/CountriesNameFromData.ts diff --git a/src/Utils/CountriesNameFromData.ts b/src/Utils/CountriesNameFromData.ts new file mode 100644 index 00000000..dc4314b4 --- /dev/null +++ b/src/Utils/CountriesNameFromData.ts @@ -0,0 +1,8 @@ +import { IData } from '../Types' + +export type ICountriesName = string[] + +const CountriesNameFromData = (unitedNationsMembers: IData) => + unitedNationsMembers.map(data => data.country) + +export default CountriesNameFromData From 4ac2324dbb434a9afa199656e69a0bb762c755ce Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 14 Aug 2023 15:23:20 +0700 Subject: [PATCH 54/88] feat(data): Change data structure --- src/Data/AverageHeight.ts | 14 ++++++++------ src/Data/ISO3166.ts | 2 +- src/Data/UnitedNationsMember.ts | 6 ++++-- src/Types.ts | 4 +++- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/Data/AverageHeight.ts b/src/Data/AverageHeight.ts index e11bea9a..28c7bfda 100644 --- a/src/Data/AverageHeight.ts +++ b/src/Data/AverageHeight.ts @@ -91,12 +91,14 @@ const ScrapAverageHeight = async () => { data.push({ country, - male: Number.isNaN(male) ? null : male, - female: Number.isNaN(female) ? null : female, - maleToFemaleRatio: Number.isNaN(maleToFemaleRatio) - ? null - : maleToFemaleRatio, - methodology, + data: { + male: Number.isNaN(male) ? null : male, + female: Number.isNaN(female) ? null : female, + maleToFemaleRatio: Number.isNaN(maleToFemaleRatio) + ? null + : maleToFemaleRatio, + methodology, + }, }) } } diff --git a/src/Data/ISO3166.ts b/src/Data/ISO3166.ts index 165d08e9..1e795016 100644 --- a/src/Data/ISO3166.ts +++ b/src/Data/ISO3166.ts @@ -35,7 +35,7 @@ const ScrapISO3166 = async () => { 10 ) - data.push({ country, alpha2, alpha3, numeric }) + data.push({ country, data: { alpha2, alpha3, numeric } }) } } diff --git a/src/Data/UnitedNationsMember.ts b/src/Data/UnitedNationsMember.ts index 738733d8..5d13f0e9 100644 --- a/src/Data/UnitedNationsMember.ts +++ b/src/Data/UnitedNationsMember.ts @@ -46,8 +46,10 @@ const ScrapUnitedNationsMember = async (): Promise< data.push({ country, - dateOfAdmission, - isOriginalMember, + data: { + dateOfAdmission, + isOriginalMember, + }, }) } diff --git a/src/Types.ts b/src/Types.ts index 641714be..5503bfd4 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -2,4 +2,6 @@ export interface IBaseData { country: string } -export type IData> = (IBaseData & T)[] +export type IData> = (IBaseData & { + data: T | null +})[] From fc009e1f6ece3e4d9767fe140772b6a116126281 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 14 Aug 2023 15:28:31 +0700 Subject: [PATCH 55/88] feat(utils): Normalize data --- src/Utils/NormalizeData.ts | 27 +++++++++++++++++++++++++++ src/index.ts | 5 ++++- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/Utils/NormalizeData.ts diff --git a/src/Utils/NormalizeData.ts b/src/Utils/NormalizeData.ts new file mode 100644 index 00000000..c473ddd0 --- /dev/null +++ b/src/Utils/NormalizeData.ts @@ -0,0 +1,27 @@ +import { IData } from '../Types' +import { ICountriesName } from './CountriesNameFromData' + +const NormalizeData = (data: IData, countriesName: ICountriesName) => { + const newData: IData = [] + const existCountriesName = [] + + for (const row of data) { + if (!countriesName.includes(row.country)) continue + + newData.push(row) + + existCountriesName.push(row.country) + } + + const unexistCountriesName = countriesName.filter( + name => !existCountriesName.includes(name) + ) + + for (const country of unexistCountriesName) { + newData.push({ country, data: null }) + } + + return newData +} + +export default NormalizeData diff --git a/src/index.ts b/src/index.ts index d981448e..cb6d69ab 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,9 +1,12 @@ import ScrapAverageHeight from './Data/AverageHeight.js' import ScrapISO3166 from './Data/ISO3166.js' import ScrapUnitedNationsMember from './Data/UnitedNationsMember.js' +import CountriesNameFromData from './Utils/CountriesNameFromData.js' console.log('Country JSON Scrapper!') +const unitedNationsMembers = await ScrapUnitedNationsMember() +const validCountriesName = CountriesNameFromData(unitedNationsMembers) + // await ScrapISO3166() -// await ScrapUnitedNationsMember() await ScrapAverageHeight() From fd1cbc8fb1ce376dcea70af9a281968713785f2f Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 14 Aug 2023 15:40:07 +0700 Subject: [PATCH 56/88] feat(data): Return data --- src/Data/AverageHeight.ts | 12 ++---------- src/Data/ISO3166.ts | 2 ++ 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/Data/AverageHeight.ts b/src/Data/AverageHeight.ts index 28c7bfda..32b4eff6 100644 --- a/src/Data/AverageHeight.ts +++ b/src/Data/AverageHeight.ts @@ -79,16 +79,6 @@ const ScrapAverageHeight = async () => { else if (methodologyString === 'Self-reported') methodology = IAverageHeightMethodology.SelfReported - console.log({ - country, - male: Number.isNaN(male) ? null : male, - female: Number.isNaN(female) ? null : female, - maleToFemaleRatio: Number.isNaN(maleToFemaleRatio) - ? null - : maleToFemaleRatio, - methodology, - }) - data.push({ country, data: { @@ -101,6 +91,8 @@ const ScrapAverageHeight = async () => { }, }) } + + return data } export default ScrapAverageHeight diff --git a/src/Data/ISO3166.ts b/src/Data/ISO3166.ts index 1e795016..426ef334 100644 --- a/src/Data/ISO3166.ts +++ b/src/Data/ISO3166.ts @@ -37,6 +37,8 @@ const ScrapISO3166 = async () => { data.push({ country, data: { alpha2, alpha3, numeric } }) } + + return data } export default ScrapISO3166 From f534222e2f484603e1f7cbdf34f0383865f67f42 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 14 Aug 2023 15:40:18 +0700 Subject: [PATCH 57/88] feat(utils): Wait --- src/Utils/Wait.ts | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/Utils/Wait.ts diff --git a/src/Utils/Wait.ts b/src/Utils/Wait.ts new file mode 100644 index 00000000..0ab0de23 --- /dev/null +++ b/src/Utils/Wait.ts @@ -0,0 +1,4 @@ +const Wait = (delay: number) => + new Promise(resolve => setTimeout(resolve, delay)) + +export default Wait From 65c43d0936e34713a66dd85d03ff0d500088c0ec Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 14 Aug 2023 15:41:24 +0700 Subject: [PATCH 58/88] feat: Delay between request --- src/index.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index cb6d69ab..f63657c6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,11 +2,23 @@ import ScrapAverageHeight from './Data/AverageHeight.js' import ScrapISO3166 from './Data/ISO3166.js' import ScrapUnitedNationsMember from './Data/UnitedNationsMember.js' import CountriesNameFromData from './Utils/CountriesNameFromData.js' +import NormalizeData from './Utils/NormalizeData.js' +import Wait from './Utils/Wait.js' + +const delayBetweenRequest = 2000 console.log('Country JSON Scrapper!') const unitedNationsMembers = await ScrapUnitedNationsMember() const validCountriesName = CountriesNameFromData(unitedNationsMembers) -// await ScrapISO3166() -await ScrapAverageHeight() +await Wait(delayBetweenRequest) + +const ISO3166 = NormalizeData(await ScrapISO3166(), validCountriesName) + +await Wait(delayBetweenRequest) + +const averageHeight = NormalizeData( + await ScrapAverageHeight(), + validCountriesName +) From 433fff7a1f754c475a99e2b46d5481baa22a5cac Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 14 Aug 2023 15:49:23 +0700 Subject: [PATCH 59/88] refactor: Rename dist to old --- {dist => old}/country-by-abbreviation.json | 0 {dist => old}/country-by-alphabet-letters.json | 0 {dist => old}/country-by-avg-male-height.json | 0 {dist => old}/country-by-barcode-prefix.json | 0 {dist => old}/country-by-calling-code.json | 0 {dist => old}/country-by-capital-city.json | 0 {dist => old}/country-by-cities.json | 0 {dist => old}/country-by-continent.json | 0 {dist => old}/country-by-costline.json | 0 {dist => old}/country-by-currency-code.json | 0 {dist => old}/country-by-currency-name.json | 0 {dist => old}/country-by-domain-tld.json | 0 {dist => old}/country-by-elevation.json | 0 {dist => old}/country-by-flag.json | 0 {dist => old}/country-by-geo-coordinates.json | 0 {dist => old}/country-by-government-type.json | 0 {dist => old}/country-by-independence-date.json | 0 {dist => old}/country-by-iso-numeric.json | 0 {dist => old}/country-by-landlocked.json | 0 {dist => old}/country-by-languages.json | 0 {dist => old}/country-by-life-expectancy.json | 0 {dist => old}/country-by-name.json | 0 {dist => old}/country-by-national-dish.json | 0 {dist => old}/country-by-national-symbol.json | 0 {dist => old}/country-by-population-density.json | 0 {dist => old}/country-by-population.json | 0 {dist => old}/country-by-region-in-world.json | 0 {dist => old}/country-by-religion.json | 0 {dist => old}/country-by-surface-area.json | 0 {dist => old}/country-by-yearly-average-temperature.json | 0 30 files changed, 0 insertions(+), 0 deletions(-) rename {dist => old}/country-by-abbreviation.json (100%) rename {dist => old}/country-by-alphabet-letters.json (100%) rename {dist => old}/country-by-avg-male-height.json (100%) rename {dist => old}/country-by-barcode-prefix.json (100%) rename {dist => old}/country-by-calling-code.json (100%) rename {dist => old}/country-by-capital-city.json (100%) rename {dist => old}/country-by-cities.json (100%) rename {dist => old}/country-by-continent.json (100%) rename {dist => old}/country-by-costline.json (100%) rename {dist => old}/country-by-currency-code.json (100%) rename {dist => old}/country-by-currency-name.json (100%) rename {dist => old}/country-by-domain-tld.json (100%) rename {dist => old}/country-by-elevation.json (100%) rename {dist => old}/country-by-flag.json (100%) rename {dist => old}/country-by-geo-coordinates.json (100%) rename {dist => old}/country-by-government-type.json (100%) rename {dist => old}/country-by-independence-date.json (100%) rename {dist => old}/country-by-iso-numeric.json (100%) rename {dist => old}/country-by-landlocked.json (100%) rename {dist => old}/country-by-languages.json (100%) rename {dist => old}/country-by-life-expectancy.json (100%) rename {dist => old}/country-by-name.json (100%) rename {dist => old}/country-by-national-dish.json (100%) rename {dist => old}/country-by-national-symbol.json (100%) rename {dist => old}/country-by-population-density.json (100%) rename {dist => old}/country-by-population.json (100%) rename {dist => old}/country-by-region-in-world.json (100%) rename {dist => old}/country-by-religion.json (100%) rename {dist => old}/country-by-surface-area.json (100%) rename {dist => old}/country-by-yearly-average-temperature.json (100%) diff --git a/dist/country-by-abbreviation.json b/old/country-by-abbreviation.json similarity index 100% rename from dist/country-by-abbreviation.json rename to old/country-by-abbreviation.json diff --git a/dist/country-by-alphabet-letters.json b/old/country-by-alphabet-letters.json similarity index 100% rename from dist/country-by-alphabet-letters.json rename to old/country-by-alphabet-letters.json diff --git a/dist/country-by-avg-male-height.json b/old/country-by-avg-male-height.json similarity index 100% rename from dist/country-by-avg-male-height.json rename to old/country-by-avg-male-height.json diff --git a/dist/country-by-barcode-prefix.json b/old/country-by-barcode-prefix.json similarity index 100% rename from dist/country-by-barcode-prefix.json rename to old/country-by-barcode-prefix.json diff --git a/dist/country-by-calling-code.json b/old/country-by-calling-code.json similarity index 100% rename from dist/country-by-calling-code.json rename to old/country-by-calling-code.json diff --git a/dist/country-by-capital-city.json b/old/country-by-capital-city.json similarity index 100% rename from dist/country-by-capital-city.json rename to old/country-by-capital-city.json diff --git a/dist/country-by-cities.json b/old/country-by-cities.json similarity index 100% rename from dist/country-by-cities.json rename to old/country-by-cities.json diff --git a/dist/country-by-continent.json b/old/country-by-continent.json similarity index 100% rename from dist/country-by-continent.json rename to old/country-by-continent.json diff --git a/dist/country-by-costline.json b/old/country-by-costline.json similarity index 100% rename from dist/country-by-costline.json rename to old/country-by-costline.json diff --git a/dist/country-by-currency-code.json b/old/country-by-currency-code.json similarity index 100% rename from dist/country-by-currency-code.json rename to old/country-by-currency-code.json diff --git a/dist/country-by-currency-name.json b/old/country-by-currency-name.json similarity index 100% rename from dist/country-by-currency-name.json rename to old/country-by-currency-name.json diff --git a/dist/country-by-domain-tld.json b/old/country-by-domain-tld.json similarity index 100% rename from dist/country-by-domain-tld.json rename to old/country-by-domain-tld.json diff --git a/dist/country-by-elevation.json b/old/country-by-elevation.json similarity index 100% rename from dist/country-by-elevation.json rename to old/country-by-elevation.json diff --git a/dist/country-by-flag.json b/old/country-by-flag.json similarity index 100% rename from dist/country-by-flag.json rename to old/country-by-flag.json diff --git a/dist/country-by-geo-coordinates.json b/old/country-by-geo-coordinates.json similarity index 100% rename from dist/country-by-geo-coordinates.json rename to old/country-by-geo-coordinates.json diff --git a/dist/country-by-government-type.json b/old/country-by-government-type.json similarity index 100% rename from dist/country-by-government-type.json rename to old/country-by-government-type.json diff --git a/dist/country-by-independence-date.json b/old/country-by-independence-date.json similarity index 100% rename from dist/country-by-independence-date.json rename to old/country-by-independence-date.json diff --git a/dist/country-by-iso-numeric.json b/old/country-by-iso-numeric.json similarity index 100% rename from dist/country-by-iso-numeric.json rename to old/country-by-iso-numeric.json diff --git a/dist/country-by-landlocked.json b/old/country-by-landlocked.json similarity index 100% rename from dist/country-by-landlocked.json rename to old/country-by-landlocked.json diff --git a/dist/country-by-languages.json b/old/country-by-languages.json similarity index 100% rename from dist/country-by-languages.json rename to old/country-by-languages.json diff --git a/dist/country-by-life-expectancy.json b/old/country-by-life-expectancy.json similarity index 100% rename from dist/country-by-life-expectancy.json rename to old/country-by-life-expectancy.json diff --git a/dist/country-by-name.json b/old/country-by-name.json similarity index 100% rename from dist/country-by-name.json rename to old/country-by-name.json diff --git a/dist/country-by-national-dish.json b/old/country-by-national-dish.json similarity index 100% rename from dist/country-by-national-dish.json rename to old/country-by-national-dish.json diff --git a/dist/country-by-national-symbol.json b/old/country-by-national-symbol.json similarity index 100% rename from dist/country-by-national-symbol.json rename to old/country-by-national-symbol.json diff --git a/dist/country-by-population-density.json b/old/country-by-population-density.json similarity index 100% rename from dist/country-by-population-density.json rename to old/country-by-population-density.json diff --git a/dist/country-by-population.json b/old/country-by-population.json similarity index 100% rename from dist/country-by-population.json rename to old/country-by-population.json diff --git a/dist/country-by-region-in-world.json b/old/country-by-region-in-world.json similarity index 100% rename from dist/country-by-region-in-world.json rename to old/country-by-region-in-world.json diff --git a/dist/country-by-religion.json b/old/country-by-religion.json similarity index 100% rename from dist/country-by-religion.json rename to old/country-by-religion.json diff --git a/dist/country-by-surface-area.json b/old/country-by-surface-area.json similarity index 100% rename from dist/country-by-surface-area.json rename to old/country-by-surface-area.json diff --git a/dist/country-by-yearly-average-temperature.json b/old/country-by-yearly-average-temperature.json similarity index 100% rename from dist/country-by-yearly-average-temperature.json rename to old/country-by-yearly-average-temperature.json From 504136ac55da4653f3b963c242fc8e55d1b4b1d0 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 14 Aug 2023 16:01:58 +0700 Subject: [PATCH 60/88] feat(utils): Data writer --- src/Utils/DataWriter.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/Utils/DataWriter.ts diff --git a/src/Utils/DataWriter.ts b/src/Utils/DataWriter.ts new file mode 100644 index 00000000..db8b2bef --- /dev/null +++ b/src/Utils/DataWriter.ts @@ -0,0 +1,18 @@ +import { fileURLToPath } from 'url' +import path from 'path' +import fs from 'fs/promises' + +import { IData } from '../Types' + +const filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(filename) + +const outputDir = '/dist/' + +const DataWriter = async (data: IData, fileName: string) => { + const filePath = path.join(dirname, outputDir, `${fileName}.json`) + + await fs.writeFile(filePath, JSON.stringify(data)) +} + +export default DataWriter From 6fe194ed32518f101f9b34ff62ef811941f49d47 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 14 Aug 2023 17:18:34 +0700 Subject: [PATCH 61/88] feat: Write data --- src/Utils/DataWriter.ts | 14 ++++++-------- src/index.ts | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/Utils/DataWriter.ts b/src/Utils/DataWriter.ts index db8b2bef..ed088a61 100644 --- a/src/Utils/DataWriter.ts +++ b/src/Utils/DataWriter.ts @@ -1,16 +1,14 @@ -import { fileURLToPath } from 'url' import path from 'path' import fs from 'fs/promises' import { IData } from '../Types' -const filename = fileURLToPath(import.meta.url) -const dirname = path.dirname(filename) - -const outputDir = '/dist/' - -const DataWriter = async (data: IData, fileName: string) => { - const filePath = path.join(dirname, outputDir, `${fileName}.json`) +const DataWriter = async ( + outputPath: string, + data: IData, + fileName: string +) => { + const filePath = path.join(outputPath, `${fileName}.json`) await fs.writeFile(filePath, JSON.stringify(data)) } diff --git a/src/index.ts b/src/index.ts index f63657c6..17fc2d8c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,12 +1,34 @@ +import path from 'path' +import { fileURLToPath } from 'url' +import fs from 'fs/promises' + import ScrapAverageHeight from './Data/AverageHeight.js' import ScrapISO3166 from './Data/ISO3166.js' import ScrapUnitedNationsMember from './Data/UnitedNationsMember.js' import CountriesNameFromData from './Utils/CountriesNameFromData.js' +import DataWriter from './Utils/DataWriter.js' import NormalizeData from './Utils/NormalizeData.js' import Wait from './Utils/Wait.js' const delayBetweenRequest = 2000 +const filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(filename) + +const outputDir = '/dist/' + +const outputPath = path.join(dirname, '../', outputDir) + +// Ensure output dir exist +// Remove directory if exist +try { + await fs.access(outputPath, fs.constants.F_OK) + await fs.rm(outputPath, { recursive: true }) +} catch {} + +// Re create +await fs.mkdir(outputPath) + console.log('Country JSON Scrapper!') const unitedNationsMembers = await ScrapUnitedNationsMember() @@ -16,9 +38,13 @@ await Wait(delayBetweenRequest) const ISO3166 = NormalizeData(await ScrapISO3166(), validCountriesName) -await Wait(delayBetweenRequest) +await DataWriter(outputPath, ISO3166, 'ISO3166') + +// await Wait(delayBetweenRequest) + +// const averageHeight = NormalizeData( +// await ScrapAverageHeight(), +// validCountriesName +// ) -const averageHeight = NormalizeData( - await ScrapAverageHeight(), - validCountriesName -) +// await DataWriter(outputPath, averageHeight, 'averageHeight') From 3bee70b9f6bdda204c403673c885ae7218ec1811 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 15 Aug 2023 17:08:22 +0700 Subject: [PATCH 62/88] feat: Resolve wikipedia redirect issue Wikipedia redirect caching --- .gitignore | 4 +- src/Cache/WikipediaRedirectCache.ts | 25 ++++++++++++ src/Data/AverageHeight.ts | 12 +++++- src/Data/ISO3166.ts | 17 ++++++-- src/Data/UnitedNationsMember.ts | 14 +++++-- src/Types.ts | 8 ++++ src/Utils/DataReader.ts | 12 ++++++ src/Utils/DataWriter.ts | 13 +++++-- src/Utils/GetWikipediaFinalRedirect.ts | 21 ++++++++++ src/Utils/GetWikipediaRedirect.ts | 39 +++++++++++++++++++ src/Utils/NormalizeData.ts | 36 +++++++++++------ src/Utils/RawDataToData.ts | 9 +++++ src/Utils/WikipediaURLToTitle.ts | 4 ++ src/index.ts | 54 +++++++++++++++++++++----- 14 files changed, 235 insertions(+), 33 deletions(-) create mode 100644 src/Cache/WikipediaRedirectCache.ts create mode 100644 src/Utils/DataReader.ts create mode 100644 src/Utils/GetWikipediaFinalRedirect.ts create mode 100644 src/Utils/GetWikipediaRedirect.ts create mode 100644 src/Utils/RawDataToData.ts create mode 100644 src/Utils/WikipediaURLToTitle.ts diff --git a/.gitignore b/.gitignore index 6a7d6d8e..1255997a 100644 --- a/.gitignore +++ b/.gitignore @@ -127,4 +127,6 @@ dist .yarn/unplugged .yarn/build-state.yml .yarn/install-state.gz -.pnp.* \ No newline at end of file +.pnp.* + +temp \ No newline at end of file diff --git a/src/Cache/WikipediaRedirectCache.ts b/src/Cache/WikipediaRedirectCache.ts new file mode 100644 index 00000000..52247c90 --- /dev/null +++ b/src/Cache/WikipediaRedirectCache.ts @@ -0,0 +1,25 @@ +class WikipediaRedirectCache { + private static cache: Record = {} + + public static GetCache(title: string) { + return this.cache[title] + } + + public static IsCached(title: string) { + return title in this.cache + } + + public static SetCache(title: string, target: string | false) { + this.cache[title] = target + } + + public static Load(cacheJSON: string) { + this.cache = JSON.parse(cacheJSON) + } + + public static ToJSON() { + return JSON.stringify(this.cache) + } +} + +export default WikipediaRedirectCache diff --git a/src/Data/AverageHeight.ts b/src/Data/AverageHeight.ts index 32b4eff6..814f73da 100644 --- a/src/Data/AverageHeight.ts +++ b/src/Data/AverageHeight.ts @@ -1,7 +1,9 @@ import { parse } from 'node-html-parser' -import { IData } from '../Types' +import { IRawData } from '../Types' import ParseWikipediaFloat from '../Utils/ParseWikipediaFloat.js' import HTMLEntities from '../Constants/HTMLEntities.js' +import WikipediaURLToTitle from '../Utils/WikipediaURLToTitle.js' +import GetWikipediaFinalRedirect from '../Utils/GetWikipediaFinalRedirect.js' enum IAverageHeightMethodology { Measured = 'Measured', @@ -56,13 +58,18 @@ const ScrapAverageHeight = async () => { // Select all rows except header row element const rows = dataTableBody.querySelectorAll('tr:not(:has(th))') - const data: IData = [] + const data: IRawData = [] for (const row of rows) { // Get all direct children const children = row.querySelectorAll('> *') const country = children[0].querySelector('a').innerText + const wikipediaTitle = await GetWikipediaFinalRedirect( + WikipediaURLToTitle( + children[0].querySelector('a').getAttribute('href') + ) + ) const male = ParseWikipediaFloat( children[1].innerText.split(HTMLEntities.NonBreakingSpace)[0] ) @@ -81,6 +88,7 @@ const ScrapAverageHeight = async () => { data.push({ country, + wikipediaTitle, data: { male: Number.isNaN(male) ? null : male, female: Number.isNaN(female) ? null : female, diff --git a/src/Data/ISO3166.ts b/src/Data/ISO3166.ts index 426ef334..2566e582 100644 --- a/src/Data/ISO3166.ts +++ b/src/Data/ISO3166.ts @@ -1,5 +1,7 @@ import { parse } from 'node-html-parser' -import { IData } from '../Types' +import { IRawData } from '../Types' +import WikipediaURLToTitle from '../Utils/WikipediaURLToTitle.js' +import GetWikipediaFinalRedirect from '../Utils/GetWikipediaFinalRedirect.js' export interface IISO3166 { alpha2: string @@ -21,13 +23,18 @@ const ScrapISO3166 = async () => { // Select all rows except header row element const rows = dataTableBody.querySelectorAll('tr:not(:has(th))') - const data: IData = [] + const data: IRawData = [] for (const row of rows) { // Get all direct children const children = row.querySelectorAll('> *') const country = children[0].querySelector('a').innerText + const wikipediaTitle = await GetWikipediaFinalRedirect( + WikipediaURLToTitle( + children[0].querySelector('a').getAttribute('href') + ) + ) const alpha2 = children[1].querySelector('a span').innerText const alpha3 = children[2].querySelector('span').innerText const numeric = parseInt( @@ -35,7 +42,11 @@ const ScrapISO3166 = async () => { 10 ) - data.push({ country, data: { alpha2, alpha3, numeric } }) + data.push({ + country, + wikipediaTitle, + data: { alpha2, alpha3, numeric }, + }) } return data diff --git a/src/Data/UnitedNationsMember.ts b/src/Data/UnitedNationsMember.ts index 5d13f0e9..d6787572 100644 --- a/src/Data/UnitedNationsMember.ts +++ b/src/Data/UnitedNationsMember.ts @@ -1,6 +1,8 @@ import { parse } from 'node-html-parser' import DateStringToUnixEpoch from '../Utils/DateStringToUnixEpoch.js' -import { IData } from '../Types.js' +import { IRawData } from '../Types.js' +import WikipediaURLToTitle from '../Utils/WikipediaURLToTitle.js' +import GetWikipediaFinalRedirect from '../Utils/GetWikipediaFinalRedirect.js' export interface IUnitedNationsMember { isOriginalMember: boolean @@ -12,7 +14,7 @@ export interface IUnitedNationsMember { } const ScrapUnitedNationsMember = async (): Promise< - IData + IRawData > => { const rawHtml = await fetch( 'https://en.wikipedia.org/wiki/Member_states_of_the_United_Nations' @@ -27,13 +29,18 @@ const ScrapUnitedNationsMember = async (): Promise< // Select all rows except header row element const rows = dataTableBody.querySelectorAll('tr:not(:has(th[scope=col]))') - const data: IData = [] + const data: IRawData = [] for (const row of rows) { // Get all direct children const children = row.querySelectorAll('> *') const country = children[0].querySelector('a').innerText + const wikipediaTitle = await GetWikipediaFinalRedirect( + WikipediaURLToTitle( + children[0].querySelector('a').getAttribute('href') + ) + ) const dateOfAdmissionString = children[1].querySelector('span').innerText const isOriginalMember = @@ -46,6 +53,7 @@ const ScrapUnitedNationsMember = async (): Promise< data.push({ country, + wikipediaTitle, data: { dateOfAdmission, isOriginalMember, diff --git a/src/Types.ts b/src/Types.ts index 5503bfd4..b9219719 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -2,6 +2,14 @@ export interface IBaseData { country: string } +export interface IRawBaseData extends IBaseData { + wikipediaTitle: string | null +} + export type IData> = (IBaseData & { data: T | null })[] + +export type IRawData> = (IRawBaseData & { + data: T | null +})[] diff --git a/src/Utils/DataReader.ts b/src/Utils/DataReader.ts new file mode 100644 index 00000000..90950de4 --- /dev/null +++ b/src/Utils/DataReader.ts @@ -0,0 +1,12 @@ +import path from 'path' +import fs from 'fs/promises' + +const DataReader = async (inputPath: string, fileName: string) => { + const filePath = path.join(inputPath, `${fileName}.json`) + + const file = await fs.readFile(filePath) + + return file.toString() +} + +export default DataReader diff --git a/src/Utils/DataWriter.ts b/src/Utils/DataWriter.ts index ed088a61..b7d68c0a 100644 --- a/src/Utils/DataWriter.ts +++ b/src/Utils/DataWriter.ts @@ -1,16 +1,21 @@ import path from 'path' import fs from 'fs/promises' -import { IData } from '../Types' +import { IRawData } from '../Types' +import RawDataToData from './RawDataToData.js' const DataWriter = async ( outputPath: string, - data: IData, - fileName: string + rawData: IRawData, + fileName: string, + debug: boolean = false ) => { const filePath = path.join(outputPath, `${fileName}.json`) - await fs.writeFile(filePath, JSON.stringify(data)) + await fs.writeFile( + filePath, + JSON.stringify(debug ? rawData : RawDataToData(rawData)) + ) } export default DataWriter diff --git a/src/Utils/GetWikipediaFinalRedirect.ts b/src/Utils/GetWikipediaFinalRedirect.ts new file mode 100644 index 00000000..31644131 --- /dev/null +++ b/src/Utils/GetWikipediaFinalRedirect.ts @@ -0,0 +1,21 @@ +import GetWikipediaRedirect from './GetWikipediaRedirect.js' + +/** + * @param title + * @returns Final target title. if there is no redirect it will return the same title + */ +const GetWikipediaFinalRedirect = async (title: string) => { + let lastTitle = title + + while (true) { + const [isCached, result] = await GetWikipediaRedirect(lastTitle) + + console.log({ isCached, lastTitle, result }) + + if (result === false) return lastTitle + + lastTitle = result + } +} + +export default GetWikipediaFinalRedirect diff --git a/src/Utils/GetWikipediaRedirect.ts b/src/Utils/GetWikipediaRedirect.ts new file mode 100644 index 00000000..4c847401 --- /dev/null +++ b/src/Utils/GetWikipediaRedirect.ts @@ -0,0 +1,39 @@ +import WikipediaRedirectCache from '../Cache/WikipediaRedirectCache.js' + +/** + * @param title + * @returns [isCached, Target title or false if there is no redirect] + */ +const GetWikipediaRedirect = async ( + title: string +): Promise<[boolean, string | false]> => { + if (WikipediaRedirectCache.IsCached(title)) + return [true, WikipediaRedirectCache.GetCache(title)] + + const data = await fetch( + `https://en.wikipedia.org/w/api.php?action=query&titles=${title}&redirects&format=json` + ).then(request => request.json()) + + if (data.query.redirects) { + WikipediaRedirectCache.SetCache( + title, + data.query.redirects[0].to as string + ) + + return [false, data.query.redirects[0].to as string] + } + if (data.query.normalized) { + WikipediaRedirectCache.SetCache( + title, + data.query.normalized[0].to as string + ) + + return [false, data.query.normalized[0].to as string] + } + + WikipediaRedirectCache.SetCache(title, false) + + return [false, false] +} + +export default GetWikipediaRedirect diff --git a/src/Utils/NormalizeData.ts b/src/Utils/NormalizeData.ts index c473ddd0..d929c0e5 100644 --- a/src/Utils/NormalizeData.ts +++ b/src/Utils/NormalizeData.ts @@ -1,24 +1,38 @@ -import { IData } from '../Types' -import { ICountriesName } from './CountriesNameFromData' +import { IRawBaseData, IRawData } from '../Types' + +const NormalizeData = ( + data: IRawData, + validCountries: IRawBaseData[] +) => { + const validCountriesWikipediaTitle = validCountries.map( + row => row.wikipediaTitle + ) + const wikipediaTitleToNameMap = validCountries.reduce((acc, row) => { + acc[row.wikipediaTitle] = row.country + return acc + }, {}) -const NormalizeData = (data: IData, countriesName: ICountriesName) => { - const newData: IData = [] - const existCountriesName = [] + const newData: IRawData = [] + const existWikipediaTitle = [] for (const row of data) { - if (!countriesName.includes(row.country)) continue + if (!validCountriesWikipediaTitle.includes(row.wikipediaTitle)) continue newData.push(row) - existCountriesName.push(row.country) + existWikipediaTitle.push(row.wikipediaTitle) } - const unexistCountriesName = countriesName.filter( - name => !existCountriesName.includes(name) + const unexistWikipediaTitle = validCountriesWikipediaTitle.filter( + url => !existWikipediaTitle.includes(url) ) - for (const country of unexistCountriesName) { - newData.push({ country, data: null }) + for (const wikipediaTitle of unexistWikipediaTitle) { + newData.push({ + country: wikipediaTitleToNameMap[wikipediaTitle], + wikipediaTitle, + data: null, + }) } return newData diff --git a/src/Utils/RawDataToData.ts b/src/Utils/RawDataToData.ts new file mode 100644 index 00000000..4ae57d2a --- /dev/null +++ b/src/Utils/RawDataToData.ts @@ -0,0 +1,9 @@ +import { IData, IRawData } from '../Types' + +const RawDataToData = (rawData: IRawData): IData => + rawData.map(row => ({ + country: row.country, + data: structuredClone(row.data), + })) + +export default RawDataToData diff --git a/src/Utils/WikipediaURLToTitle.ts b/src/Utils/WikipediaURLToTitle.ts new file mode 100644 index 00000000..c512d95a --- /dev/null +++ b/src/Utils/WikipediaURLToTitle.ts @@ -0,0 +1,4 @@ +const WikipediaURLToTitle = (url: string) => + decodeURI(url.split('/wiki/').at(-1)) + +export default WikipediaURLToTitle diff --git a/src/index.ts b/src/index.ts index 17fc2d8c..b1ab119f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,10 +5,11 @@ import fs from 'fs/promises' import ScrapAverageHeight from './Data/AverageHeight.js' import ScrapISO3166 from './Data/ISO3166.js' import ScrapUnitedNationsMember from './Data/UnitedNationsMember.js' -import CountriesNameFromData from './Utils/CountriesNameFromData.js' import DataWriter from './Utils/DataWriter.js' import NormalizeData from './Utils/NormalizeData.js' import Wait from './Utils/Wait.js' +import WikipediaRedirectCache from './Cache/WikipediaRedirectCache.js' +import DataReader from './Utils/DataReader.js' const delayBetweenRequest = 2000 @@ -16,8 +17,10 @@ const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) const outputDir = '/dist/' +const tempDir = '/temp/' const outputPath = path.join(dirname, '../', outputDir) +const tempPath = path.join(dirname, '../', tempDir) // Ensure output dir exist // Remove directory if exist @@ -29,22 +32,55 @@ try { // Re create await fs.mkdir(outputPath) +// Ensure temp dir exist +try { + await fs.access(tempPath, fs.constants.F_OK) +} catch { + await fs.mkdir(tempPath) +} + +const wikipediaRedirectCacheFileName = 'WikipediaRedirectCache' + console.log('Country JSON Scrapper!') +try { + await fs.access( + path.join(tempPath, `${wikipediaRedirectCacheFileName}.json`), + fs.constants.F_OK + ) + + const wikipediaRedirectCache = await DataReader( + tempPath, + wikipediaRedirectCacheFileName + ) + + console.log('Using wikipedia redirect cache') + + WikipediaRedirectCache.Load(wikipediaRedirectCache) +} catch (e) {} + const unitedNationsMembers = await ScrapUnitedNationsMember() -const validCountriesName = CountriesNameFromData(unitedNationsMembers) +const validCountries = unitedNationsMembers.map(row => ({ + wikipediaTitle: row.wikipediaTitle, + country: row.country, +})) + +await DataWriter(outputPath, unitedNationsMembers, 'unitedNationsMembers') await Wait(delayBetweenRequest) -const ISO3166 = NormalizeData(await ScrapISO3166(), validCountriesName) +const ISO3166 = NormalizeData(await ScrapISO3166(), validCountries) await DataWriter(outputPath, ISO3166, 'ISO3166') -// await Wait(delayBetweenRequest) +await Wait(delayBetweenRequest) + +const averageHeight = NormalizeData(await ScrapAverageHeight(), validCountries) -// const averageHeight = NormalizeData( -// await ScrapAverageHeight(), -// validCountriesName -// ) +await DataWriter(outputPath, averageHeight, 'averageHeight') -// await DataWriter(outputPath, averageHeight, 'averageHeight') +// Write wikipedia redirect cache +await fs.writeFile( + path.join(tempPath, `${wikipediaRedirectCacheFileName}.json`), + WikipediaRedirectCache.ToJSON() +) From 69d32eee67fb5690d14056b7f2d94081d80f255d Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 15 Aug 2023 17:25:16 +0700 Subject: [PATCH 63/88] feat: Flag to enable or disable wikipedia redirect cache --- src/index.ts | 61 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/src/index.ts b/src/index.ts index b1ab119f..4e2c1c1c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,6 +12,8 @@ import WikipediaRedirectCache from './Cache/WikipediaRedirectCache.js' import DataReader from './Utils/DataReader.js' const delayBetweenRequest = 2000 +const useWikipediaRedirectCache = true +const writeWikipediaRedirectCache = true const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) @@ -32,32 +34,39 @@ try { // Re create await fs.mkdir(outputPath) -// Ensure temp dir exist -try { - await fs.access(tempPath, fs.constants.F_OK) -} catch { - await fs.mkdir(tempPath) +if (useWikipediaRedirectCache || writeWikipediaRedirectCache) { + // Ensure temp dir exist + try { + await fs.access(tempPath, fs.constants.F_OK) + } catch { + await fs.mkdir(tempPath) + } } const wikipediaRedirectCacheFileName = 'WikipediaRedirectCache' console.log('Country JSON Scrapper!') -try { - await fs.access( - path.join(tempPath, `${wikipediaRedirectCacheFileName}.json`), - fs.constants.F_OK - ) - - const wikipediaRedirectCache = await DataReader( - tempPath, - wikipediaRedirectCacheFileName - ) - - console.log('Using wikipedia redirect cache') - - WikipediaRedirectCache.Load(wikipediaRedirectCache) -} catch (e) {} +if (useWikipediaRedirectCache) { + try { + await fs.access( + path.join(tempPath, `${wikipediaRedirectCacheFileName}.json`), + fs.constants.F_OK + ) + + const wikipediaRedirectCache = await DataReader( + tempPath, + wikipediaRedirectCacheFileName + ) + + console.log('Using wikipedia redirect cache') + + WikipediaRedirectCache.Load(wikipediaRedirectCache) + } catch (e) { + console.error('Use wikipedia redirect cache error',e) + console.log('Fallback without wikipedia redirect cache') + } +} const unitedNationsMembers = await ScrapUnitedNationsMember() const validCountries = unitedNationsMembers.map(row => ({ @@ -79,8 +88,10 @@ const averageHeight = NormalizeData(await ScrapAverageHeight(), validCountries) await DataWriter(outputPath, averageHeight, 'averageHeight') -// Write wikipedia redirect cache -await fs.writeFile( - path.join(tempPath, `${wikipediaRedirectCacheFileName}.json`), - WikipediaRedirectCache.ToJSON() -) +if (writeWikipediaRedirectCache) { + // Write wikipedia redirect cache + await fs.writeFile( + path.join(tempPath, `${wikipediaRedirectCacheFileName}.json`), + WikipediaRedirectCache.ToJSON() + ) +} From de05993ea275da0efae497e0556f22eba9089907 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 15 Aug 2023 17:27:07 +0700 Subject: [PATCH 64/88] feat(utils): Ensure directory exist --- src/Utils/EnsureDirectoryExist.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/Utils/EnsureDirectoryExist.ts diff --git a/src/Utils/EnsureDirectoryExist.ts b/src/Utils/EnsureDirectoryExist.ts new file mode 100644 index 00000000..a32f780c --- /dev/null +++ b/src/Utils/EnsureDirectoryExist.ts @@ -0,0 +1,11 @@ +import fs from 'fs/promises' + +const EnsureDirectoryExist = async (path: string) => { + try { + await fs.access(path, fs.constants.F_OK) + } catch { + await fs.mkdir(path) + } +} + +export default EnsureDirectoryExist From dba7a1ad0fa6d33673d687fafa481669878c4d82 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 15 Aug 2023 17:32:37 +0700 Subject: [PATCH 65/88] feat(utils): Ensure directory exist and empty --- src/Utils/EnsureDirectoryExist.ts | 4 ++++ src/Utils/EnsureDirectoryExistAndEmpty.ts | 14 ++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 src/Utils/EnsureDirectoryExistAndEmpty.ts diff --git a/src/Utils/EnsureDirectoryExist.ts b/src/Utils/EnsureDirectoryExist.ts index a32f780c..498614ed 100644 --- a/src/Utils/EnsureDirectoryExist.ts +++ b/src/Utils/EnsureDirectoryExist.ts @@ -3,8 +3,12 @@ import fs from 'fs/promises' const EnsureDirectoryExist = async (path: string) => { try { await fs.access(path, fs.constants.F_OK) + + return true } catch { await fs.mkdir(path) + + return false } } diff --git a/src/Utils/EnsureDirectoryExistAndEmpty.ts b/src/Utils/EnsureDirectoryExistAndEmpty.ts new file mode 100644 index 00000000..970e4c00 --- /dev/null +++ b/src/Utils/EnsureDirectoryExistAndEmpty.ts @@ -0,0 +1,14 @@ +import fs from 'fs/promises' +import EnsureDirectoryExist from './EnsureDirectoryExist.js' + +const EnsureDirectoryExistAndEmpty = async (path: string) => { + const isExist = await EnsureDirectoryExist(path) + + if (isExist) { + await fs.rm(path, { recursive: true }) + + await fs.mkdir(path) + } +} + +export default EnsureDirectoryExistAndEmpty From 0fc95c45966e08724514056876d460e5be1cab6f Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 15 Aug 2023 17:32:50 +0700 Subject: [PATCH 66/88] refactor: Use ensure dir utils --- src/index.ts | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/index.ts b/src/index.ts index 4e2c1c1c..3d06e187 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,6 +10,8 @@ import NormalizeData from './Utils/NormalizeData.js' import Wait from './Utils/Wait.js' import WikipediaRedirectCache from './Cache/WikipediaRedirectCache.js' import DataReader from './Utils/DataReader.js' +import EnsureDirectoryExist from './Utils/EnsureDirectoryExist.js' +import EnsureDirectoryExistAndEmpty from './Utils/EnsureDirectoryExistAndEmpty.js' const delayBetweenRequest = 2000 const useWikipediaRedirectCache = true @@ -24,23 +26,10 @@ const tempDir = '/temp/' const outputPath = path.join(dirname, '../', outputDir) const tempPath = path.join(dirname, '../', tempDir) -// Ensure output dir exist -// Remove directory if exist -try { - await fs.access(outputPath, fs.constants.F_OK) - await fs.rm(outputPath, { recursive: true }) -} catch {} - -// Re create -await fs.mkdir(outputPath) +await EnsureDirectoryExistAndEmpty(outputPath) if (useWikipediaRedirectCache || writeWikipediaRedirectCache) { - // Ensure temp dir exist - try { - await fs.access(tempPath, fs.constants.F_OK) - } catch { - await fs.mkdir(tempPath) - } + await EnsureDirectoryExist(tempPath) } const wikipediaRedirectCacheFileName = 'WikipediaRedirectCache' @@ -63,7 +52,7 @@ if (useWikipediaRedirectCache) { WikipediaRedirectCache.Load(wikipediaRedirectCache) } catch (e) { - console.error('Use wikipedia redirect cache error',e) + console.error('Use wikipedia redirect cache error', e) console.log('Fallback without wikipedia redirect cache') } } From 5527aec926ed0ed910eebde08e0272582a64034e Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 15 Aug 2023 17:56:55 +0700 Subject: [PATCH 67/88] refactor: Process data util --- src/Utils/ProcessData.ts | 39 +++++++++++++++++++++++++++++++++++++++ src/index.ts | 30 +++++++++++------------------- 2 files changed, 50 insertions(+), 19 deletions(-) create mode 100644 src/Utils/ProcessData.ts diff --git a/src/Utils/ProcessData.ts b/src/Utils/ProcessData.ts new file mode 100644 index 00000000..1f9b24c3 --- /dev/null +++ b/src/Utils/ProcessData.ts @@ -0,0 +1,39 @@ +import { IRawData } from '../Types' + +import DataWriter from './DataWriter.js' + +import ScrapUnitedNationsMember from '../Data/UnitedNationsMember.js' +import Wait from './Wait.js' +import NormalizeData from './NormalizeData.js' + +type IProcessData = ( + outputPath: string, + data: Record Promise>>, + options: { delayBetweenRequest: number } +) => Promise + +const ProcessData: IProcessData = async ( + outputPath: string, + data, + { delayBetweenRequest = 2000 } +) => { + const unitedNationsMembers = await ScrapUnitedNationsMember() + const validCountries = unitedNationsMembers.map(row => ({ + wikipediaTitle: row.wikipediaTitle, + country: row.country, + })) + + await DataWriter(outputPath, unitedNationsMembers, 'UnitedNationsMembers') + + for (const [name, runner] of Object.entries(data)) { + await Wait(delayBetweenRequest) + + const result = NormalizeData(await runner(), validCountries) + + const normalizedResult = NormalizeData(result, validCountries) + + await DataWriter(outputPath, normalizedResult, name) + } +} + +export default ProcessData diff --git a/src/index.ts b/src/index.ts index 3d06e187..ea385f07 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,6 +12,7 @@ import WikipediaRedirectCache from './Cache/WikipediaRedirectCache.js' import DataReader from './Utils/DataReader.js' import EnsureDirectoryExist from './Utils/EnsureDirectoryExist.js' import EnsureDirectoryExistAndEmpty from './Utils/EnsureDirectoryExistAndEmpty.js' +import ProcessData from './Utils/ProcessData.js' const delayBetweenRequest = 2000 const useWikipediaRedirectCache = true @@ -57,25 +58,16 @@ if (useWikipediaRedirectCache) { } } -const unitedNationsMembers = await ScrapUnitedNationsMember() -const validCountries = unitedNationsMembers.map(row => ({ - wikipediaTitle: row.wikipediaTitle, - country: row.country, -})) - -await DataWriter(outputPath, unitedNationsMembers, 'unitedNationsMembers') - -await Wait(delayBetweenRequest) - -const ISO3166 = NormalizeData(await ScrapISO3166(), validCountries) - -await DataWriter(outputPath, ISO3166, 'ISO3166') - -await Wait(delayBetweenRequest) - -const averageHeight = NormalizeData(await ScrapAverageHeight(), validCountries) - -await DataWriter(outputPath, averageHeight, 'averageHeight') +await ProcessData( + outputPath, + { + ISO3166: async () => await ScrapISO3166(), + AverageHeight: async () => await ScrapAverageHeight(), + }, + { + delayBetweenRequest, + } +) if (writeWikipediaRedirectCache) { // Write wikipedia redirect cache From 0f8e3db51f7a0b6be9829953dc2ac6005adb483d Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 15 Aug 2023 18:12:04 +0700 Subject: [PATCH 68/88] refactor: Remove wikipedia final redirect console log --- src/Utils/GetWikipediaFinalRedirect.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Utils/GetWikipediaFinalRedirect.ts b/src/Utils/GetWikipediaFinalRedirect.ts index 31644131..be1699ab 100644 --- a/src/Utils/GetWikipediaFinalRedirect.ts +++ b/src/Utils/GetWikipediaFinalRedirect.ts @@ -10,8 +10,6 @@ const GetWikipediaFinalRedirect = async (title: string) => { while (true) { const [isCached, result] = await GetWikipediaRedirect(lastTitle) - console.log({ isCached, lastTitle, result }) - if (result === false) return lastTitle lastTitle = result From 77f297e50df4be4f0b7f0476759197ac2bd45c8d Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 15 Aug 2023 18:44:35 +0700 Subject: [PATCH 69/88] feat(data): Countries name --- src/Data/CountriesName.ts | 16 +++++++++++++++- src/Utils/ProcessData.ts | 17 ++++++++++++++--- src/index.ts | 3 +++ 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/Data/CountriesName.ts b/src/Data/CountriesName.ts index faab716a..2d5a4c1c 100644 --- a/src/Data/CountriesName.ts +++ b/src/Data/CountriesName.ts @@ -1 +1,15 @@ -export interface ICountriesName {} +import { IRawData } from '../Types' +import { IUnitedNationsMember } from './UnitedNationsMember' + +export type ICountriesName = null + +const ScrapCountriesName = async ( + unitedNationsMembers: IRawData +): Promise> => + unitedNationsMembers.map(row => ({ + country: row.country, + wikipediaTitle: row.wikipediaTitle, + data: null, + })) + +export default ScrapCountriesName diff --git a/src/Utils/ProcessData.ts b/src/Utils/ProcessData.ts index 1f9b24c3..cf6e5c7f 100644 --- a/src/Utils/ProcessData.ts +++ b/src/Utils/ProcessData.ts @@ -2,13 +2,21 @@ import { IRawData } from '../Types' import DataWriter from './DataWriter.js' -import ScrapUnitedNationsMember from '../Data/UnitedNationsMember.js' +import ScrapUnitedNationsMember, { + IUnitedNationsMember, +} from '../Data/UnitedNationsMember.js' import Wait from './Wait.js' import NormalizeData from './NormalizeData.js' type IProcessData = ( outputPath: string, - data: Record Promise>>, + data: Record< + string, + | (() => Promise>) + | (( + unitedNationsMembers: IRawData + ) => Promise>) + >, options: { delayBetweenRequest: number } ) => Promise @@ -28,7 +36,10 @@ const ProcessData: IProcessData = async ( for (const [name, runner] of Object.entries(data)) { await Wait(delayBetweenRequest) - const result = NormalizeData(await runner(), validCountries) + const result = NormalizeData( + await runner(unitedNationsMembers), + validCountries + ) const normalizedResult = NormalizeData(result, validCountries) diff --git a/src/index.ts b/src/index.ts index ea385f07..c978408d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,6 +13,7 @@ import DataReader from './Utils/DataReader.js' import EnsureDirectoryExist from './Utils/EnsureDirectoryExist.js' import EnsureDirectoryExistAndEmpty from './Utils/EnsureDirectoryExistAndEmpty.js' import ProcessData from './Utils/ProcessData.js' +import ScrapCountriesName from './Data/CountriesName.js' const delayBetweenRequest = 2000 const useWikipediaRedirectCache = true @@ -63,6 +64,8 @@ await ProcessData( { ISO3166: async () => await ScrapISO3166(), AverageHeight: async () => await ScrapAverageHeight(), + CountriesName: async unitedNationsMembers => + await ScrapCountriesName(unitedNationsMembers), }, { delayBetweenRequest, From 513b1d6631305db2850326b4fe24b40ccbd0b9be Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 15 Aug 2023 18:49:07 +0700 Subject: [PATCH 70/88] refactor: Add scrap return type --- src/Data/AverageHeight.ts | 2 +- src/Data/ISO3166.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Data/AverageHeight.ts b/src/Data/AverageHeight.ts index 814f73da..1eee5d1b 100644 --- a/src/Data/AverageHeight.ts +++ b/src/Data/AverageHeight.ts @@ -46,7 +46,7 @@ export type IAverageHeight = ( ) & IAverageHeightBase -const ScrapAverageHeight = async () => { +const ScrapAverageHeight = async (): Promise> => { const rawHtml = await fetch( 'https://en.wikipedia.org/wiki/Average_human_height_by_country' ).then(response => response.text()) diff --git a/src/Data/ISO3166.ts b/src/Data/ISO3166.ts index 2566e582..b290fc41 100644 --- a/src/Data/ISO3166.ts +++ b/src/Data/ISO3166.ts @@ -9,7 +9,7 @@ export interface IISO3166 { numeric: number } -const ScrapISO3166 = async () => { +const ScrapISO3166 = async (): Promise> => { const rawHtml = await fetch( 'https://en.wikipedia.org/wiki/ISO_3166-1' ).then(response => response.text()) From f34df90a2944cc22defd1f70959fa439640d6e51 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 15 Aug 2023 19:22:52 +0700 Subject: [PATCH 71/88] feat(types): GS1 code can have multiple ranges --- src/Data/GS1Code.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Data/GS1Code.ts b/src/Data/GS1Code.ts index 6be6d9c1..b476cd22 100644 --- a/src/Data/GS1Code.ts +++ b/src/Data/GS1Code.ts @@ -17,4 +17,4 @@ interface IGS1CodeSingle { number: number } -export type IGS1Code = IGS1CodeSingle | IGS1CodeRange +export type IGS1Code = (IGS1CodeSingle | IGS1CodeRange)[] From e503672660a05bb80ddf9a427b5007348d1e6d74 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Thu, 17 Aug 2023 13:33:15 +0700 Subject: [PATCH 72/88] feat(constants): Wikipedia special unicode --- src/Constants/WikipediaSpecialUnicode.ts | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/Constants/WikipediaSpecialUnicode.ts diff --git a/src/Constants/WikipediaSpecialUnicode.ts b/src/Constants/WikipediaSpecialUnicode.ts new file mode 100644 index 00000000..20e5c057 --- /dev/null +++ b/src/Constants/WikipediaSpecialUnicode.ts @@ -0,0 +1,5 @@ +enum WikipediaSpecialUnicode { + EnDash = '–', +} + +export default WikipediaSpecialUnicode From 815120aab8a0f1ed613edc207065238dedb8a131 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Thu, 17 Aug 2023 17:16:08 +0700 Subject: [PATCH 73/88] feat(utils): Is node wikipedia flag icon --- src/Utils/IsNodeWikipediaFlagIcon.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/Utils/IsNodeWikipediaFlagIcon.ts diff --git a/src/Utils/IsNodeWikipediaFlagIcon.ts b/src/Utils/IsNodeWikipediaFlagIcon.ts new file mode 100644 index 00000000..c21c8b04 --- /dev/null +++ b/src/Utils/IsNodeWikipediaFlagIcon.ts @@ -0,0 +1,9 @@ +import { HTMLElement, Node, NodeType } from 'node-html-parser' + +const IsNodeWikipediaFlagIcon = (node: Node) => + node && + node.nodeType == NodeType.ELEMENT_NODE && + (node as HTMLElement).classList.contains('flagicon') && + (node as HTMLElement).rawTagName === 'span' + +export default IsNodeWikipediaFlagIcon From dae8967218d6f9970104bbe6f8c161660a6ace73 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Thu, 17 Aug 2023 17:17:09 +0700 Subject: [PATCH 74/88] feat(data): GS1 code --- src/Data/GS1Code.ts | 99 +++++++++++++++++++++++++++++++++++++++++++++ src/Types.ts | 12 ++++-- src/index.ts | 2 + 3 files changed, 109 insertions(+), 4 deletions(-) diff --git a/src/Data/GS1Code.ts b/src/Data/GS1Code.ts index b476cd22..15b99dec 100644 --- a/src/Data/GS1Code.ts +++ b/src/Data/GS1Code.ts @@ -1,3 +1,10 @@ +import { HTMLElement, NodeType, TextNode, parse } from 'node-html-parser' +import { IRawData, IRawDataSingle } from '../Types' +import GetWikipediaFinalRedirect from '../Utils/GetWikipediaFinalRedirect.js' +import WikipediaURLToTitle from '../Utils/WikipediaURLToTitle.js' +import WikipediaSpecialUnicode from '../Constants/WikipediaSpecialUnicode.js' +import IsNodeWikipediaFlagIcon from '../Utils/IsNodeWikipediaFlagIcon.js' + interface IGS1CodeRange { isRange: true @@ -18,3 +25,95 @@ interface IGS1CodeSingle { } export type IGS1Code = (IGS1CodeSingle | IGS1CodeRange)[] + +const ScrapGS1Code = async (): Promise> => { + const rawHtml = await fetch( + 'https://en.wikipedia.org/wiki/List_of_GS1_country_codes' + ).then(response => response.text()) + + const root = parse(rawHtml) + + const dataTableBody = root.querySelector('.wikitable.sortable tbody') + + // Select all rows except header row element + const rows = dataTableBody.querySelectorAll('tr:not(:has(th))') + + const data: Record> = {} + + for (const row of rows) { + // Get all direct children + const children = row.querySelectorAll('> *') + + const rawCodes = children[0].innerText + + const codeRange = rawCodes + .split(WikipediaSpecialUnicode.EnDash) + .map(code => parseInt(code, 10)) + const isRange = codeRange.length === 2 + + const rawCountyNodes = children[1].childNodes + + // If the first element is not flagicon continue + if (!IsNodeWikipediaFlagIcon(rawCountyNodes[0])) continue + + let nextIsCountryAnchor = false + const countriesAnchor: HTMLElement[] = [] + + for (const rawCountryNode of rawCountyNodes) { + if ( + rawCountryNode.nodeType === NodeType.TEXT_NODE && + (rawCountryNode as TextNode).text.includes('(') + ) + break + + if ( + nextIsCountryAnchor && + rawCountryNode.nodeType === NodeType.ELEMENT_NODE + ) { + countriesAnchor.push(rawCountryNode as HTMLElement) + + nextIsCountryAnchor = false + } + + if (IsNodeWikipediaFlagIcon(rawCountryNode)) + nextIsCountryAnchor = true + } + + for (const countryAnchor of countriesAnchor) { + const country = countryAnchor.innerText + const wikipediaTitle = await GetWikipediaFinalRedirect( + WikipediaURLToTitle(countryAnchor.getAttribute('href')) + ) + + if (Object.keys(data).includes(wikipediaTitle)) { + data[wikipediaTitle].data.push( + isRange + ? { + isRange: true, + start: codeRange[0], + end: codeRange[1], + } + : { isRange: false, number: codeRange[0] } + ) + } else { + data[wikipediaTitle] = { + country, + wikipediaTitle, + data: [ + isRange + ? { + isRange: true, + start: codeRange[0], + end: codeRange[1], + } + : { isRange: false, number: codeRange[0] }, + ], + } + } + } + } + + return Object.values(data) +} + +export default ScrapGS1Code diff --git a/src/Types.ts b/src/Types.ts index b9219719..0ae47878 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -6,10 +6,14 @@ export interface IRawBaseData extends IBaseData { wikipediaTitle: string | null } -export type IData> = (IBaseData & { +export type IDataSingle> = IBaseData & { data: T | null -})[] +} + +export type IData> = IDataSingle[] -export type IRawData> = (IRawBaseData & { +export type IRawDataSingle> = IRawBaseData & { data: T | null -})[] +} + +export type IRawData> = IRawDataSingle[] diff --git a/src/index.ts b/src/index.ts index c978408d..ed93c3a5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -14,6 +14,7 @@ import EnsureDirectoryExist from './Utils/EnsureDirectoryExist.js' import EnsureDirectoryExistAndEmpty from './Utils/EnsureDirectoryExistAndEmpty.js' import ProcessData from './Utils/ProcessData.js' import ScrapCountriesName from './Data/CountriesName.js' +import ScrapGS1Code from './Data/GS1Code.js' const delayBetweenRequest = 2000 const useWikipediaRedirectCache = true @@ -66,6 +67,7 @@ await ProcessData( AverageHeight: async () => await ScrapAverageHeight(), CountriesName: async unitedNationsMembers => await ScrapCountriesName(unitedNationsMembers), + ScrapGS1Code: async () => await ScrapGS1Code(), }, { delayBetweenRequest, From c876558bbd53a6f46e4078c828daa1ba082fc051 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Thu, 17 Aug 2023 18:56:10 +0700 Subject: [PATCH 75/88] fix: Inconsistent country name Remove raw data, wikipedia title before normalization --- src/Data/AverageHeight.ts | 10 ++++------ src/Data/CountriesName.ts | 7 +++---- src/Data/GS1Code.ts | 16 +++++++--------- src/Data/ISO3166.ts | 10 ++++------ src/Data/UnitedNationsMember.ts | 10 ++++------ src/Types.ts | 10 ---------- src/Utils/DataWriter.ts | 13 ++++--------- src/Utils/NormalizeData.ts | 34 ++++++++++++--------------------- src/Utils/ProcessData.ts | 9 ++++----- src/Utils/RawDataToData.ts | 9 --------- 10 files changed, 42 insertions(+), 86 deletions(-) delete mode 100644 src/Utils/RawDataToData.ts diff --git a/src/Data/AverageHeight.ts b/src/Data/AverageHeight.ts index 1eee5d1b..809185c0 100644 --- a/src/Data/AverageHeight.ts +++ b/src/Data/AverageHeight.ts @@ -1,5 +1,5 @@ import { parse } from 'node-html-parser' -import { IRawData } from '../Types' +import { IData } from '../Types' import ParseWikipediaFloat from '../Utils/ParseWikipediaFloat.js' import HTMLEntities from '../Constants/HTMLEntities.js' import WikipediaURLToTitle from '../Utils/WikipediaURLToTitle.js' @@ -46,7 +46,7 @@ export type IAverageHeight = ( ) & IAverageHeightBase -const ScrapAverageHeight = async (): Promise> => { +const ScrapAverageHeight = async (): Promise> => { const rawHtml = await fetch( 'https://en.wikipedia.org/wiki/Average_human_height_by_country' ).then(response => response.text()) @@ -58,14 +58,13 @@ const ScrapAverageHeight = async (): Promise> => { // Select all rows except header row element const rows = dataTableBody.querySelectorAll('tr:not(:has(th))') - const data: IRawData = [] + const data: IData = [] for (const row of rows) { // Get all direct children const children = row.querySelectorAll('> *') - const country = children[0].querySelector('a').innerText - const wikipediaTitle = await GetWikipediaFinalRedirect( + const country = await GetWikipediaFinalRedirect( WikipediaURLToTitle( children[0].querySelector('a').getAttribute('href') ) @@ -88,7 +87,6 @@ const ScrapAverageHeight = async (): Promise> => { data.push({ country, - wikipediaTitle, data: { male: Number.isNaN(male) ? null : male, female: Number.isNaN(female) ? null : female, diff --git a/src/Data/CountriesName.ts b/src/Data/CountriesName.ts index 2d5a4c1c..7cd64f38 100644 --- a/src/Data/CountriesName.ts +++ b/src/Data/CountriesName.ts @@ -1,14 +1,13 @@ -import { IRawData } from '../Types' +import { IData } from '../Types' import { IUnitedNationsMember } from './UnitedNationsMember' export type ICountriesName = null const ScrapCountriesName = async ( - unitedNationsMembers: IRawData -): Promise> => + unitedNationsMembers: IData +): Promise> => unitedNationsMembers.map(row => ({ country: row.country, - wikipediaTitle: row.wikipediaTitle, data: null, })) diff --git a/src/Data/GS1Code.ts b/src/Data/GS1Code.ts index 15b99dec..e503604d 100644 --- a/src/Data/GS1Code.ts +++ b/src/Data/GS1Code.ts @@ -1,5 +1,5 @@ import { HTMLElement, NodeType, TextNode, parse } from 'node-html-parser' -import { IRawData, IRawDataSingle } from '../Types' +import { IData, IDataSingle } from '../Types' import GetWikipediaFinalRedirect from '../Utils/GetWikipediaFinalRedirect.js' import WikipediaURLToTitle from '../Utils/WikipediaURLToTitle.js' import WikipediaSpecialUnicode from '../Constants/WikipediaSpecialUnicode.js' @@ -26,7 +26,7 @@ interface IGS1CodeSingle { export type IGS1Code = (IGS1CodeSingle | IGS1CodeRange)[] -const ScrapGS1Code = async (): Promise> => { +const ScrapGS1Code = async (): Promise> => { const rawHtml = await fetch( 'https://en.wikipedia.org/wiki/List_of_GS1_country_codes' ).then(response => response.text()) @@ -38,7 +38,7 @@ const ScrapGS1Code = async (): Promise> => { // Select all rows except header row element const rows = dataTableBody.querySelectorAll('tr:not(:has(th))') - const data: Record> = {} + const data: Record> = {} for (const row of rows) { // Get all direct children @@ -80,13 +80,12 @@ const ScrapGS1Code = async (): Promise> => { } for (const countryAnchor of countriesAnchor) { - const country = countryAnchor.innerText - const wikipediaTitle = await GetWikipediaFinalRedirect( + const country = await GetWikipediaFinalRedirect( WikipediaURLToTitle(countryAnchor.getAttribute('href')) ) - if (Object.keys(data).includes(wikipediaTitle)) { - data[wikipediaTitle].data.push( + if (Object.keys(data).includes(country)) { + data[country].data.push( isRange ? { isRange: true, @@ -96,9 +95,8 @@ const ScrapGS1Code = async (): Promise> => { : { isRange: false, number: codeRange[0] } ) } else { - data[wikipediaTitle] = { + data[country] = { country, - wikipediaTitle, data: [ isRange ? { diff --git a/src/Data/ISO3166.ts b/src/Data/ISO3166.ts index b290fc41..d24616f1 100644 --- a/src/Data/ISO3166.ts +++ b/src/Data/ISO3166.ts @@ -1,5 +1,5 @@ import { parse } from 'node-html-parser' -import { IRawData } from '../Types' +import { IData } from '../Types' import WikipediaURLToTitle from '../Utils/WikipediaURLToTitle.js' import GetWikipediaFinalRedirect from '../Utils/GetWikipediaFinalRedirect.js' @@ -9,7 +9,7 @@ export interface IISO3166 { numeric: number } -const ScrapISO3166 = async (): Promise> => { +const ScrapISO3166 = async (): Promise> => { const rawHtml = await fetch( 'https://en.wikipedia.org/wiki/ISO_3166-1' ).then(response => response.text()) @@ -23,14 +23,13 @@ const ScrapISO3166 = async (): Promise> => { // Select all rows except header row element const rows = dataTableBody.querySelectorAll('tr:not(:has(th))') - const data: IRawData = [] + const data: IData = [] for (const row of rows) { // Get all direct children const children = row.querySelectorAll('> *') - const country = children[0].querySelector('a').innerText - const wikipediaTitle = await GetWikipediaFinalRedirect( + const country = await GetWikipediaFinalRedirect( WikipediaURLToTitle( children[0].querySelector('a').getAttribute('href') ) @@ -44,7 +43,6 @@ const ScrapISO3166 = async (): Promise> => { data.push({ country, - wikipediaTitle, data: { alpha2, alpha3, numeric }, }) } diff --git a/src/Data/UnitedNationsMember.ts b/src/Data/UnitedNationsMember.ts index d6787572..eeff8caa 100644 --- a/src/Data/UnitedNationsMember.ts +++ b/src/Data/UnitedNationsMember.ts @@ -1,6 +1,6 @@ import { parse } from 'node-html-parser' import DateStringToUnixEpoch from '../Utils/DateStringToUnixEpoch.js' -import { IRawData } from '../Types.js' +import { IData } from '../Types.js' import WikipediaURLToTitle from '../Utils/WikipediaURLToTitle.js' import GetWikipediaFinalRedirect from '../Utils/GetWikipediaFinalRedirect.js' @@ -14,7 +14,7 @@ export interface IUnitedNationsMember { } const ScrapUnitedNationsMember = async (): Promise< - IRawData + IData > => { const rawHtml = await fetch( 'https://en.wikipedia.org/wiki/Member_states_of_the_United_Nations' @@ -29,14 +29,13 @@ const ScrapUnitedNationsMember = async (): Promise< // Select all rows except header row element const rows = dataTableBody.querySelectorAll('tr:not(:has(th[scope=col]))') - const data: IRawData = [] + const data: IData = [] for (const row of rows) { // Get all direct children const children = row.querySelectorAll('> *') - const country = children[0].querySelector('a').innerText - const wikipediaTitle = await GetWikipediaFinalRedirect( + const country = await GetWikipediaFinalRedirect( WikipediaURLToTitle( children[0].querySelector('a').getAttribute('href') ) @@ -53,7 +52,6 @@ const ScrapUnitedNationsMember = async (): Promise< data.push({ country, - wikipediaTitle, data: { dateOfAdmission, isOriginalMember, diff --git a/src/Types.ts b/src/Types.ts index 0ae47878..a64dc591 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -2,18 +2,8 @@ export interface IBaseData { country: string } -export interface IRawBaseData extends IBaseData { - wikipediaTitle: string | null -} - export type IDataSingle> = IBaseData & { data: T | null } export type IData> = IDataSingle[] - -export type IRawDataSingle> = IRawBaseData & { - data: T | null -} - -export type IRawData> = IRawDataSingle[] diff --git a/src/Utils/DataWriter.ts b/src/Utils/DataWriter.ts index b7d68c0a..ed088a61 100644 --- a/src/Utils/DataWriter.ts +++ b/src/Utils/DataWriter.ts @@ -1,21 +1,16 @@ import path from 'path' import fs from 'fs/promises' -import { IRawData } from '../Types' -import RawDataToData from './RawDataToData.js' +import { IData } from '../Types' const DataWriter = async ( outputPath: string, - rawData: IRawData, - fileName: string, - debug: boolean = false + data: IData, + fileName: string ) => { const filePath = path.join(outputPath, `${fileName}.json`) - await fs.writeFile( - filePath, - JSON.stringify(debug ? rawData : RawDataToData(rawData)) - ) + await fs.writeFile(filePath, JSON.stringify(data)) } export default DataWriter diff --git a/src/Utils/NormalizeData.ts b/src/Utils/NormalizeData.ts index d929c0e5..07ff3479 100644 --- a/src/Utils/NormalizeData.ts +++ b/src/Utils/NormalizeData.ts @@ -1,36 +1,26 @@ -import { IRawBaseData, IRawData } from '../Types' - -const NormalizeData = ( - data: IRawData, - validCountries: IRawBaseData[] -) => { - const validCountriesWikipediaTitle = validCountries.map( - row => row.wikipediaTitle - ) - const wikipediaTitleToNameMap = validCountries.reduce((acc, row) => { - acc[row.wikipediaTitle] = row.country - return acc - }, {}) +import { IBaseData, IData } from '../Types' + +const NormalizeData = (data: IData, validCountries: IBaseData[]) => { + const validCountriesName = validCountries.map(row => row.country) - const newData: IRawData = [] - const existWikipediaTitle = [] + const newData: IData = [] + const existCountries: string[] = [] for (const row of data) { - if (!validCountriesWikipediaTitle.includes(row.wikipediaTitle)) continue + if (!validCountriesName.includes(row.country)) continue newData.push(row) - existWikipediaTitle.push(row.wikipediaTitle) + existCountries.push(row.country) } - const unexistWikipediaTitle = validCountriesWikipediaTitle.filter( - url => !existWikipediaTitle.includes(url) + const unexistCountries = validCountriesName.filter( + name => !existCountries.includes(name) ) - for (const wikipediaTitle of unexistWikipediaTitle) { + for (const unexistCountry of unexistCountries) { newData.push({ - country: wikipediaTitleToNameMap[wikipediaTitle], - wikipediaTitle, + country: unexistCountry, data: null, }) } diff --git a/src/Utils/ProcessData.ts b/src/Utils/ProcessData.ts index cf6e5c7f..42f91950 100644 --- a/src/Utils/ProcessData.ts +++ b/src/Utils/ProcessData.ts @@ -1,4 +1,4 @@ -import { IRawData } from '../Types' +import { IData } from '../Types' import DataWriter from './DataWriter.js' @@ -12,10 +12,10 @@ type IProcessData = ( outputPath: string, data: Record< string, - | (() => Promise>) + | (() => Promise>) | (( - unitedNationsMembers: IRawData - ) => Promise>) + unitedNationsMembers: IData + ) => Promise>) >, options: { delayBetweenRequest: number } ) => Promise @@ -27,7 +27,6 @@ const ProcessData: IProcessData = async ( ) => { const unitedNationsMembers = await ScrapUnitedNationsMember() const validCountries = unitedNationsMembers.map(row => ({ - wikipediaTitle: row.wikipediaTitle, country: row.country, })) diff --git a/src/Utils/RawDataToData.ts b/src/Utils/RawDataToData.ts deleted file mode 100644 index 4ae57d2a..00000000 --- a/src/Utils/RawDataToData.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IData, IRawData } from '../Types' - -const RawDataToData = (rawData: IRawData): IData => - rawData.map(row => ({ - country: row.country, - data: structuredClone(row.data), - })) - -export default RawDataToData From 1f7a34ae5098ff190577199fe05f6332d6d529ac Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Tue, 22 Aug 2023 13:42:46 +0700 Subject: [PATCH 76/88] feat: Partial calling codes --- src/Data/CallingCodes.ts | 47 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/Data/CallingCodes.ts b/src/Data/CallingCodes.ts index f3f8483b..bcf22258 100644 --- a/src/Data/CallingCodes.ts +++ b/src/Data/CallingCodes.ts @@ -1,3 +1,50 @@ +import { parse } from 'node-html-parser' +import { IData } from '../Types' +import ParseWikipediaFloat from '../Utils/ParseWikipediaFloat.js' +import HTMLEntities from '../Constants/HTMLEntities.js' +import WikipediaURLToTitle from '../Utils/WikipediaURLToTitle.js' +import GetWikipediaFinalRedirect from '../Utils/GetWikipediaFinalRedirect.js' + export interface ICallingCodes { code: number } + +const ScrapCallingCodes = async (): Promise> => { + const rawHtml = await fetch( + 'https://en.wikipedia.org/wiki/List_of_country_calling_codes' + ).then(response => response.text()) + + const root = parse(rawHtml) + + const dataTableBody = root.querySelector('.wikitable.sortable tbody') + + // Select all rows except header row element + const rows = dataTableBody.querySelectorAll('tr:not(:has(th))') + + const data: IData = [] + + for (const row of rows) { + // Get all direct children + const children = row.querySelectorAll('> *') + + const country = await GetWikipediaFinalRedirect( + WikipediaURLToTitle( + children[0].querySelector('a').getAttribute('href') + ) + ) + const male = ParseWikipediaFloat( + children[1].innerText.split(HTMLEntities.NonBreakingSpace)[0] + ) + + data.push({ + country, + data: { + code: 1, + }, + }) + } + + return data +} + +export default ScrapCallingCodes From 27777e06ffd7bee73454a50f2ddde871aeb2ced9 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Wed, 23 Aug 2023 00:31:41 +0700 Subject: [PATCH 77/88] feat(utils): Normalize table --- src/Utils/NormalizeTable.ts | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/Utils/NormalizeTable.ts diff --git a/src/Utils/NormalizeTable.ts b/src/Utils/NormalizeTable.ts new file mode 100644 index 00000000..770487d4 --- /dev/null +++ b/src/Utils/NormalizeTable.ts @@ -0,0 +1,28 @@ +import { HTMLElement } from 'node-html-parser' + +const NormalizeTable = (rows: HTMLElement[]) => { + const result: HTMLElement[][] = [] + + rows.forEach((row, y) => + row.querySelectorAll('td').forEach((cell, x) => { + const rowspan = parseInt(cell.getAttribute('rowspan') ?? '1') + const colspan = parseInt(cell.getAttribute('colspan') ?? '1') + + while (result[y] && result[y][x]) { + x += 1 + } + + for (let y2 = y; y2 < y + rowspan; y2++) { + result[y2] ??= [] + + for (let j = 0; j < colspan; j++) { + result[y2][x + j] = cell + } + } + }) + ) + + return result.filter(row => row.length > 0) +} + +export default NormalizeTable From ccf1f51a696c9d9b5f4e704a4ebe742f08a7de3f Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Wed, 23 Aug 2023 00:32:09 +0700 Subject: [PATCH 78/88] feat(data): Capital cities --- src/Data/CapitalCities.ts | 55 +++++++++++++++++++++++++++++++++++++++ src/Data/CapitalCity.ts | 3 --- src/index.ts | 4 ++- 3 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 src/Data/CapitalCities.ts delete mode 100644 src/Data/CapitalCity.ts diff --git a/src/Data/CapitalCities.ts b/src/Data/CapitalCities.ts new file mode 100644 index 00000000..82fce600 --- /dev/null +++ b/src/Data/CapitalCities.ts @@ -0,0 +1,55 @@ +import { parse } from 'node-html-parser' +import { IData } from '../Types' +import GetWikipediaFinalRedirect from '../Utils/GetWikipediaFinalRedirect.js' +import WikipediaURLToTitle from '../Utils/WikipediaURLToTitle.js' +import NormalizeTable from '../Utils/NormalizeTable.js' + +export type ICapitalCities = { name: string; types: string[] }[] + +const ScrapCapitalCities = async (): Promise> => { + const rawHtml = await fetch( + 'https://en.wikipedia.org/wiki/List_of_national_capitals' + ).then(response => response.text()) + + const root = parse(rawHtml) + + const dataTableBody = root.querySelector('.wikitable.sortable tbody') + + // Select all rows except header row element + const rows = dataTableBody.querySelectorAll('tr:not(:has(th))') + + const rawData: Record = {} + + const normalizedRows = NormalizeTable(rows) + + for (const row of normalizedRows) { + const country = await GetWikipediaFinalRedirect( + WikipediaURLToTitle(row[1].querySelector('a').getAttribute('href')) + ) + + const rawCity = row[0].innerText.trim() + + if (!rawData[country]) rawData[country] = [rawCity] + else rawData[country].push(rawCity) + } + + const cleanedData = Object.entries(rawData).map( + ([country, cities]) => + [ + country, + cities.map(city => ({ + name: city.split('(')[0].trim(), + types: + city + .split('(')[1] + ?.split(')')[0] + ?.split(/(?:and)|,/gi) + ?.map(type => type.trim()) ?? [], + })), + ] as [string, { name: string; types: string[] }[]] + ) + + return cleanedData.map(([country, data]) => ({ country, data })) +} + +export default ScrapCapitalCities diff --git a/src/Data/CapitalCity.ts b/src/Data/CapitalCity.ts deleted file mode 100644 index 67adaaf5..00000000 --- a/src/Data/CapitalCity.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface ICapitalCity { - capitalCity: string -} diff --git a/src/index.ts b/src/index.ts index ed93c3a5..ebab05b5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -15,6 +15,7 @@ import EnsureDirectoryExistAndEmpty from './Utils/EnsureDirectoryExistAndEmpty.j import ProcessData from './Utils/ProcessData.js' import ScrapCountriesName from './Data/CountriesName.js' import ScrapGS1Code from './Data/GS1Code.js' +import ScrapCapitalCities from './Data/CapitalCities.js' const delayBetweenRequest = 2000 const useWikipediaRedirectCache = true @@ -67,7 +68,8 @@ await ProcessData( AverageHeight: async () => await ScrapAverageHeight(), CountriesName: async unitedNationsMembers => await ScrapCountriesName(unitedNationsMembers), - ScrapGS1Code: async () => await ScrapGS1Code(), + GS1Code: async () => await ScrapGS1Code(), + CapitalCities: async () => await ScrapCapitalCities(), }, { delayBetweenRequest, From ae339f717f10486cc7cd0343766a3e1e9df7236b Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Wed, 23 Aug 2023 00:32:27 +0700 Subject: [PATCH 79/88] refactor: Remove unused imports --- src/index.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/index.ts b/src/index.ts index ebab05b5..7978b347 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,10 +4,6 @@ import fs from 'fs/promises' import ScrapAverageHeight from './Data/AverageHeight.js' import ScrapISO3166 from './Data/ISO3166.js' -import ScrapUnitedNationsMember from './Data/UnitedNationsMember.js' -import DataWriter from './Utils/DataWriter.js' -import NormalizeData from './Utils/NormalizeData.js' -import Wait from './Utils/Wait.js' import WikipediaRedirectCache from './Cache/WikipediaRedirectCache.js' import DataReader from './Utils/DataReader.js' import EnsureDirectoryExist from './Utils/EnsureDirectoryExist.js' From de8655c8b0006ba09690ff5e480b2f377cafda3e Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Wed, 23 Aug 2023 00:44:59 +0700 Subject: [PATCH 80/88] feat(types): Country code tld --- src/Data/ccTLD.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Data/ccTLD.ts b/src/Data/ccTLD.ts index 5d1bfe6f..aa09b98b 100644 --- a/src/Data/ccTLD.ts +++ b/src/Data/ccTLD.ts @@ -1,8 +1,8 @@ export interface IccTLD { tld: string registry: string - IDN: boolean - DNSSEC: boolean - SLD: boolean - IPv6: boolean + IDN: boolean | null | string + DNSSEC: boolean | null | 'Partial' + SLD: boolean | null + IPv6: boolean | null } From 70d7e05dd6d95b8550075b545294549464ba981b Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Thu, 31 Aug 2023 15:28:20 +0700 Subject: [PATCH 81/88] feat: Raw calling codes --- src/Data/CallingCodes.ts | 59 +++++++++++++++++++++------------------- src/index.ts | 14 ++++++---- 2 files changed, 39 insertions(+), 34 deletions(-) diff --git a/src/Data/CallingCodes.ts b/src/Data/CallingCodes.ts index bcf22258..d675ecaf 100644 --- a/src/Data/CallingCodes.ts +++ b/src/Data/CallingCodes.ts @@ -1,9 +1,10 @@ -import { parse } from 'node-html-parser' +import { HTMLElement, NodeType, parse } from 'node-html-parser' import { IData } from '../Types' import ParseWikipediaFloat from '../Utils/ParseWikipediaFloat.js' import HTMLEntities from '../Constants/HTMLEntities.js' import WikipediaURLToTitle from '../Utils/WikipediaURLToTitle.js' import GetWikipediaFinalRedirect from '../Utils/GetWikipediaFinalRedirect.js' +import IsNodeWikipediaFlagIcon from '../Utils/IsNodeWikipediaFlagIcon.js' export interface ICallingCodes { code: number @@ -16,35 +17,37 @@ const ScrapCallingCodes = async (): Promise> => { const root = parse(rawHtml) - const dataTableBody = root.querySelector('.wikitable.sortable tbody') - - // Select all rows except header row element - const rows = dataTableBody.querySelectorAll('tr:not(:has(th))') - - const data: IData = [] - - for (const row of rows) { - // Get all direct children - const children = row.querySelectorAll('> *') - - const country = await GetWikipediaFinalRedirect( - WikipediaURLToTitle( - children[0].querySelector('a').getAttribute('href') - ) - ) - const male = ParseWikipediaFloat( - children[1].innerText.split(HTMLEntities.NonBreakingSpace)[0] - ) - - data.push({ - country, - data: { - code: 1, - }, - }) + const rootList = root.querySelectorAll( + 'h3 + p + ul, h3 + ul, h3 + :is(style, link) + div + p + ul' + ) + + for (const list of rootList) { + for (const row of list.querySelectorAll('> *')) { + if ( + row.childNodes?.[2]?.nodeType === NodeType.ELEMENT_NODE && + IsNodeWikipediaFlagIcon(row.childNodes[2] as HTMLElement) + ) { + if ( + row.childNodes?.[3]?.nodeType === NodeType.ELEMENT_NODE && + (row.childNodes[3] as HTMLElement).rawTagName === 'a' + ) { + const country = await GetWikipediaFinalRedirect( + WikipediaURLToTitle( + (row.childNodes[3] as HTMLElement).getAttribute( + 'href' + ) + ) + ) + + const codes = (row.childNodes[0] as HTMLElement).innerText + + console.log({ country, codes }) + } + } + } } - return data + return [] } export default ScrapCallingCodes diff --git a/src/index.ts b/src/index.ts index 7978b347..4f3a60ad 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,6 +12,7 @@ import ProcessData from './Utils/ProcessData.js' import ScrapCountriesName from './Data/CountriesName.js' import ScrapGS1Code from './Data/GS1Code.js' import ScrapCapitalCities from './Data/CapitalCities.js' +import ScrapCallingCodes from './Data/CallingCodes.js' const delayBetweenRequest = 2000 const useWikipediaRedirectCache = true @@ -60,12 +61,13 @@ if (useWikipediaRedirectCache) { await ProcessData( outputPath, { - ISO3166: async () => await ScrapISO3166(), - AverageHeight: async () => await ScrapAverageHeight(), - CountriesName: async unitedNationsMembers => - await ScrapCountriesName(unitedNationsMembers), - GS1Code: async () => await ScrapGS1Code(), - CapitalCities: async () => await ScrapCapitalCities(), + // ISO3166: async () => await ScrapISO3166(), + // AverageHeight: async () => await ScrapAverageHeight(), + // CountriesName: async unitedNationsMembers => + // await ScrapCountriesName(unitedNationsMembers), + // GS1Code: async () => await ScrapGS1Code(), + // CapitalCities: async () => await ScrapCapitalCities(), + CallingCodes: async () => await ScrapCallingCodes(), }, { delayBetweenRequest, From 8d55defc4603b8e54b06925daf83215666276d7d Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 4 Sep 2023 14:06:11 +0700 Subject: [PATCH 82/88] fix: Info message instead of error when wikipedia redirect cache is missing --- src/index.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 4f3a60ad..a46572f3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,6 +13,7 @@ import ScrapCountriesName from './Data/CountriesName.js' import ScrapGS1Code from './Data/GS1Code.js' import ScrapCapitalCities from './Data/CapitalCities.js' import ScrapCallingCodes from './Data/CallingCodes.js' +import ScrapAverageElevation from './Data/AverageElevation.js' const delayBetweenRequest = 2000 const useWikipediaRedirectCache = true @@ -53,7 +54,13 @@ if (useWikipediaRedirectCache) { WikipediaRedirectCache.Load(wikipediaRedirectCache) } catch (e) { - console.error('Use wikipedia redirect cache error', e) + if ( + e instanceof Error && + e.message.startsWith('ENOENT: no such file or directory') + ) + console.error('Wikipedia redirect cache file not found') + else console.error('Use wikipedia redirect cache unknown error', e) + console.log('Fallback without wikipedia redirect cache') } } @@ -67,7 +74,8 @@ await ProcessData( // await ScrapCountriesName(unitedNationsMembers), // GS1Code: async () => await ScrapGS1Code(), // CapitalCities: async () => await ScrapCapitalCities(), - CallingCodes: async () => await ScrapCallingCodes(), + // CallingCodes: async () => await ScrapCallingCodes(), + AverageElevation: async () => await ScrapAverageElevation(), }, { delayBetweenRequest, From 9aecaf59a22811c8333d409d10d724248c446bd9 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 4 Sep 2023 14:09:49 +0700 Subject: [PATCH 83/88] feat(data): Average elevation --- src/Data/AverageElevation.ts | 48 ++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/Data/AverageElevation.ts b/src/Data/AverageElevation.ts index 517819d1..6dcbab0b 100644 --- a/src/Data/AverageElevation.ts +++ b/src/Data/AverageElevation.ts @@ -1,3 +1,51 @@ +import { parse } from 'node-html-parser' +import { IData } from '../Types' +import GetWikipediaFinalRedirect from '../Utils/GetWikipediaFinalRedirect.js' +import WikipediaURLToTitle from '../Utils/WikipediaURLToTitle.js' +import ParseWikipediaFloat from '../Utils/ParseWikipediaFloat.js' +import HTMLEntities from '../Constants/HTMLEntities.js' + export interface IAverageElevation { elevation: number } + +const ScrapAverageElevation = async (): Promise> => { + const rawHtml = await fetch( + 'https://en.wikipedia.org/wiki/List_of_countries_by_average_elevation' + ).then(response => response.text()) + + const root = parse(rawHtml) + + const dataTableBody = root.querySelector('.wikitable.sortable tbody') + + // Select all rows except header row element + const rows = dataTableBody.querySelectorAll('tr:not(:has(th))') + + const data: IData = [] + + for (const row of rows) { + // Get all direct children + const children = row.querySelectorAll('> *') + + // Ignore other than country link + if (children[0].querySelector('a') === null) continue + + const country = await GetWikipediaFinalRedirect( + WikipediaURLToTitle( + children[0].querySelector('a').getAttribute('href') + ) + ) + const elevation = ParseWikipediaFloat( + children[1].innerText.split(HTMLEntities.NonBreakingSpace)[0] + ) + + data.push({ + country, + data: { elevation }, + }) + } + + return data +} + +export default ScrapAverageElevation From 88c7a8503e20739d668c2835905e29d46d674fde Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 4 Sep 2023 14:12:31 +0700 Subject: [PATCH 84/88] refactor(data): Rename yearly average temperature to average yearly temperature --- src/Data/AverageYearlyTemperature.ts | 3 +++ src/Data/YearlyAverageTemperature.ts | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 src/Data/AverageYearlyTemperature.ts delete mode 100644 src/Data/YearlyAverageTemperature.ts diff --git a/src/Data/AverageYearlyTemperature.ts b/src/Data/AverageYearlyTemperature.ts new file mode 100644 index 00000000..a6bd00a3 --- /dev/null +++ b/src/Data/AverageYearlyTemperature.ts @@ -0,0 +1,3 @@ +export interface IAverageYearlyTemperature { + yearlyAverageTemperature: number +} diff --git a/src/Data/YearlyAverageTemperature.ts b/src/Data/YearlyAverageTemperature.ts deleted file mode 100644 index 57e6805f..00000000 --- a/src/Data/YearlyAverageTemperature.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface IYearlyAverageTemperature { - yearlyAverageTemperature: number -} From 69ecfa8a377be04776ad93ad270c4f7a6b9d951a Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 4 Sep 2023 14:18:55 +0700 Subject: [PATCH 85/88] feat: Wikipedia special unicode minus sign --- src/Constants/WikipediaSpecialUnicode.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Constants/WikipediaSpecialUnicode.ts b/src/Constants/WikipediaSpecialUnicode.ts index 20e5c057..2194d42c 100644 --- a/src/Constants/WikipediaSpecialUnicode.ts +++ b/src/Constants/WikipediaSpecialUnicode.ts @@ -1,5 +1,6 @@ enum WikipediaSpecialUnicode { EnDash = '–', + MinusSign = '−', } export default WikipediaSpecialUnicode From ffa5c47c3c082fd2e1f7da00e75b407988de7ed9 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 4 Sep 2023 14:21:47 +0700 Subject: [PATCH 86/88] feat: Wikipedia special unicode minus sign replaced by html entity --- src/Constants/HTMLEntities.ts | 1 + src/Constants/WikipediaSpecialUnicode.ts | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Constants/HTMLEntities.ts b/src/Constants/HTMLEntities.ts index ac92cac2..f64e70c5 100644 --- a/src/Constants/HTMLEntities.ts +++ b/src/Constants/HTMLEntities.ts @@ -1,5 +1,6 @@ enum HTMLEntities { NonBreakingSpace = ' ', + MinusSign = '−', } export default HTMLEntities diff --git a/src/Constants/WikipediaSpecialUnicode.ts b/src/Constants/WikipediaSpecialUnicode.ts index 2194d42c..20e5c057 100644 --- a/src/Constants/WikipediaSpecialUnicode.ts +++ b/src/Constants/WikipediaSpecialUnicode.ts @@ -1,6 +1,5 @@ enum WikipediaSpecialUnicode { EnDash = '–', - MinusSign = '−', } export default WikipediaSpecialUnicode From 3e27050e87bec24730c42477c614b7e22871002b Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 4 Sep 2023 14:29:04 +0700 Subject: [PATCH 87/88] feat(data): Average yearly temperature --- src/Data/AverageYearlyTemperature.ts | 53 +++++++++++++++++++++++++++- src/index.ts | 5 ++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/Data/AverageYearlyTemperature.ts b/src/Data/AverageYearlyTemperature.ts index a6bd00a3..1bf972ae 100644 --- a/src/Data/AverageYearlyTemperature.ts +++ b/src/Data/AverageYearlyTemperature.ts @@ -1,3 +1,54 @@ +import { parse } from 'node-html-parser' +import { IData } from '../Types' +import GetWikipediaFinalRedirect from '../Utils/GetWikipediaFinalRedirect.js' +import WikipediaURLToTitle from '../Utils/WikipediaURLToTitle.js' +import ParseWikipediaFloat from '../Utils/ParseWikipediaFloat.js' +import HTMLEntities from '../Constants/HTMLEntities.js' + export interface IAverageYearlyTemperature { - yearlyAverageTemperature: number + averageYearlyTemperature: number } + +const ScrapAverageYearlyTemperature = async (): Promise< + IData +> => { + const rawHtml = await fetch( + 'https://en.wikipedia.org/wiki/List_of_countries_by_average_yearly_temperature' + ).then(response => response.text()) + + const root = parse(rawHtml) + + const dataTableBody = root.querySelector('.wikitable.sortable tbody') + + // Select all rows except header row element + const rows = dataTableBody.querySelectorAll('tr:not(:has(th))') + + const data: IData = [] + + for (const row of rows) { + // Get all direct children + const children = row.querySelectorAll('> *') + + // Ignore other than country link + if (children[0].querySelector('a') === null) continue + + const country = await GetWikipediaFinalRedirect( + WikipediaURLToTitle( + children[0].querySelector('a').getAttribute('href') + ) + ) + + const averageYearlyTemperature = ParseWikipediaFloat( + children[1].innerText.trim().replaceAll(HTMLEntities.MinusSign, '-') + ) + + data.push({ + country, + data: { averageYearlyTemperature }, + }) + } + + return data +} + +export default ScrapAverageYearlyTemperature diff --git a/src/index.ts b/src/index.ts index a46572f3..47efee18 100644 --- a/src/index.ts +++ b/src/index.ts @@ -14,6 +14,7 @@ import ScrapGS1Code from './Data/GS1Code.js' import ScrapCapitalCities from './Data/CapitalCities.js' import ScrapCallingCodes from './Data/CallingCodes.js' import ScrapAverageElevation from './Data/AverageElevation.js' +import ScrapAverageYearlyTemperature from './Data/AverageYearlyTemperature.js' const delayBetweenRequest = 2000 const useWikipediaRedirectCache = true @@ -75,7 +76,9 @@ await ProcessData( // GS1Code: async () => await ScrapGS1Code(), // CapitalCities: async () => await ScrapCapitalCities(), // CallingCodes: async () => await ScrapCallingCodes(), - AverageElevation: async () => await ScrapAverageElevation(), + // AverageElevation: async () => await ScrapAverageElevation(), + AverageYearlyTemperature: async () => + await ScrapAverageYearlyTemperature(), }, { delayBetweenRequest, From 1c0c5046843581f0a3cd49b82b5771f2b31e3048 Mon Sep 17 00:00:00 2001 From: kennarddh <79390992+kennarddh@users.noreply.github.com> Date: Mon, 4 Sep 2023 17:21:53 +0700 Subject: [PATCH 88/88] feat(data): National sports --- src/Data/NationalSports.ts | 117 +++++++++++++++++++++++++++++++++---- src/index.ts | 6 +- 2 files changed, 109 insertions(+), 14 deletions(-) diff --git a/src/Data/NationalSports.ts b/src/Data/NationalSports.ts index b5eb6d21..81075266 100644 --- a/src/Data/NationalSports.ts +++ b/src/Data/NationalSports.ts @@ -1,14 +1,107 @@ +import { parse } from 'node-html-parser' +import { IData, IDataSingle } from '../Types' +import GetWikipediaFinalRedirect from '../Utils/GetWikipediaFinalRedirect.js' +import WikipediaURLToTitle from '../Utils/WikipediaURLToTitle.js' +import ParseWikipediaFloat from '../Utils/ParseWikipediaFloat.js' + +export interface IOfficialNationalSport { + name: string + isOfficial: true + yearDefinedAsNationalSport: number +} + +export interface IUnofficialNationalSport { + name: string + isOfficial: false + yearDefinedAsNationalSport?: never +} + +export type INationalSport = IOfficialNationalSport | IUnofficialNationalSport + export interface INationalSports { - nationalSports: ( - | { - name: string - isOfficial: false - yearDefinedAsNationalSport?: never - } - | { - name: string - isOfficial: true - yearDefinedAsNationalSport: number - } - )[] + nationalSports: INationalSport[] +} + +const ScrapNationalSports = async (): Promise> => { + const rawHtml = await fetch( + 'https://en.wikipedia.org/wiki/National_sport' + ).then(response => response.text()) + + const root = parse(rawHtml) + + const data: Record> = {} + + const AddData = (country: string, sportData: INationalSport) => { + if (data[country]) data[country].data.nationalSports.push(sportData) + else + data[country] = { + country, + data: { + nationalSports: [sportData], + }, + } + } + + const officialDataTable = root.querySelectorAll('.wikitable.sortable')[0] + const unofficialDataTable = root.querySelectorAll('.wikitable.sortable')[1] + + const officialDataTableBody = officialDataTable.querySelector('tbody') + const unofficialDataTableBody = unofficialDataTable.querySelector('tbody') + + // Select all rows except header row element + const officialRows = officialDataTableBody.querySelectorAll( + 'tr:not(:first-child)' + ) + const unofficialRows = unofficialDataTableBody.querySelectorAll( + 'tr:not(:first-child)' + ) + + for (const row of officialRows) { + // Get all direct children + const children = row.querySelectorAll('> *') + + const country = await GetWikipediaFinalRedirect( + WikipediaURLToTitle( + children[0].querySelector('a').getAttribute('href') + ) + ) + + const yearDefinedAsNationalSport = ParseWikipediaFloat( + children[2].innerText.trim() + ) + + const nationalSports = children[1].querySelectorAll('a') + + for (const nationalSport of nationalSports) { + AddData(country, { + name: nationalSport.innerText, + isOfficial: true, + yearDefinedAsNationalSport, + } as IOfficialNationalSport) + } + } + + for (const row of unofficialRows) { + // Get all direct children + const children = row.querySelectorAll('> *') + + const country = await GetWikipediaFinalRedirect( + WikipediaURLToTitle( + children[0].querySelector('a').getAttribute('href') + ) + ) + + const nationalSports = children[1].querySelectorAll('> a') + + for (const nationalSport of nationalSports) { + AddData(country, { + name: nationalSport.innerText, + isOfficial: false, + } as IUnofficialNationalSport) + } + } + + return Object.values(data) } + +export default ScrapNationalSports diff --git a/src/index.ts b/src/index.ts index 47efee18..4ff4434c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -15,6 +15,7 @@ import ScrapCapitalCities from './Data/CapitalCities.js' import ScrapCallingCodes from './Data/CallingCodes.js' import ScrapAverageElevation from './Data/AverageElevation.js' import ScrapAverageYearlyTemperature from './Data/AverageYearlyTemperature.js' +import ScrapNationalSports from './Data/NationalSports.js' const delayBetweenRequest = 2000 const useWikipediaRedirectCache = true @@ -77,8 +78,9 @@ await ProcessData( // CapitalCities: async () => await ScrapCapitalCities(), // CallingCodes: async () => await ScrapCallingCodes(), // AverageElevation: async () => await ScrapAverageElevation(), - AverageYearlyTemperature: async () => - await ScrapAverageYearlyTemperature(), + // AverageYearlyTemperature: async () => + // await ScrapAverageYearlyTemperature(), + NationalSports: async () => await ScrapNationalSports(), }, { delayBetweenRequest,