@phonecheck/phone-number-validator-js 1.7.2 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +322 -328
- package/dist/cache.d.ts +17 -0
- package/dist/cli/format.d.ts +12 -0
- package/dist/cli/index.d.ts +12 -0
- package/dist/cli/index.js +531 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/parse-args.d.ts +44 -0
- package/dist/cli/run.d.ts +14 -0
- package/dist/core.d.ts +39 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.esm.js +231 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +254 -0
- package/dist/index.js.map +1 -0
- package/{lib → dist}/locales.d.ts +0 -1
- package/dist/node-fs-loader.d.ts +19 -0
- package/dist/serverless/_shared/cors.d.ts +6 -0
- package/dist/serverless/_shared/dispatch.d.ts +22 -0
- package/dist/serverless/_shared/lambda-helpers.d.ts +23 -0
- package/dist/serverless/_shared/routes.d.ts +29 -0
- package/dist/serverless/_shared/validation.d.ts +58 -0
- package/dist/serverless/_shared/web-helpers.d.ts +17 -0
- package/dist/serverless/adapters/aws-lambda.cjs.js +7357 -0
- package/dist/serverless/adapters/aws-lambda.cjs.js.map +1 -0
- package/dist/serverless/adapters/aws-lambda.d.ts +50 -0
- package/dist/serverless/adapters/aws-lambda.esm.js +7349 -0
- package/dist/serverless/adapters/aws-lambda.esm.js.map +1 -0
- package/dist/serverless/adapters/azure.cjs.js +7334 -0
- package/dist/serverless/adapters/azure.cjs.js.map +1 -0
- package/dist/serverless/adapters/azure.d.ts +32 -0
- package/dist/serverless/adapters/azure.esm.js +7328 -0
- package/dist/serverless/adapters/azure.esm.js.map +1 -0
- package/dist/serverless/adapters/cloudflare.cjs.js +7854 -0
- package/dist/serverless/adapters/cloudflare.cjs.js.map +1 -0
- package/dist/serverless/adapters/cloudflare.d.ts +68 -0
- package/dist/serverless/adapters/cloudflare.esm.js +7848 -0
- package/dist/serverless/adapters/cloudflare.esm.js.map +1 -0
- package/dist/serverless/adapters/gcp.cjs.js +7338 -0
- package/dist/serverless/adapters/gcp.cjs.js.map +1 -0
- package/dist/serverless/adapters/gcp.d.ts +22 -0
- package/dist/serverless/adapters/gcp.esm.js +7332 -0
- package/dist/serverless/adapters/gcp.esm.js.map +1 -0
- package/dist/serverless/adapters/netlify.cjs.js +7331 -0
- package/dist/serverless/adapters/netlify.cjs.js.map +1 -0
- package/dist/serverless/adapters/netlify.d.ts +29 -0
- package/dist/serverless/adapters/netlify.esm.js +7325 -0
- package/dist/serverless/adapters/netlify.esm.js.map +1 -0
- package/dist/serverless/adapters/vercel.cjs.js +7417 -0
- package/dist/serverless/adapters/vercel.cjs.js.map +1 -0
- package/dist/serverless/adapters/vercel.d.ts +30 -0
- package/dist/serverless/adapters/vercel.esm.js +7409 -0
- package/dist/serverless/adapters/vercel.esm.js.map +1 -0
- package/dist/serverless/index.cjs.js +12759 -0
- package/dist/serverless/index.cjs.js.map +1 -0
- package/dist/serverless/index.d.ts +14 -0
- package/dist/serverless/index.esm.js +12680 -0
- package/dist/serverless/index.esm.js.map +1 -0
- package/dist/serverless/loaders/fetch-loader.d.ts +39 -0
- package/dist/serverless/loaders/kv-loader.d.ts +27 -0
- package/{lib/serverless.cjs.js → dist/serverless/verifier.cjs.js} +4378 -4152
- package/dist/serverless/verifier.cjs.js.map +1 -0
- package/dist/serverless/verifier.d.ts +17 -0
- package/{lib/serverless.esm.js → dist/serverless/verifier.esm.js} +4373 -4153
- package/dist/serverless/verifier.esm.js.map +1 -0
- package/dist/serverless/verifier.min.js +1 -0
- package/dist/types.d.ts +49 -0
- package/package.json +120 -56
- package/lib/index.d.ts +0 -41
- package/lib/index.d.ts.map +0 -1
- package/lib/index.es.js +0 -113
- package/lib/index.js +0 -126
- package/lib/index.serverless.d.ts +0 -18
- package/lib/index.serverless.d.ts.map +0 -1
- package/lib/locales.d.ts.map +0 -1
- package/lib/serverless.esm.min.js +0 -8
- package/lib/serverless.umd.js +0 -11737
- package/lib/serverless.umd.min.js +0 -8
- package/resources/carrier/ar/965.bson +0 -0
- package/resources/carrier/be/375.bson +0 -0
- package/resources/carrier/en/1.bson +0 -0
- package/resources/carrier/en/20.bson +0 -0
- package/resources/carrier/en/211.bson +0 -0
- package/resources/carrier/en/212.bson +0 -0
- package/resources/carrier/en/213.bson +0 -0
- package/resources/carrier/en/216.bson +0 -0
- package/resources/carrier/en/218.bson +0 -0
- package/resources/carrier/en/220.bson +0 -0
- package/resources/carrier/en/221.bson +0 -0
- package/resources/carrier/en/222.bson +0 -0
- package/resources/carrier/en/223.bson +0 -0
- package/resources/carrier/en/224.bson +0 -0
- package/resources/carrier/en/225.bson +0 -0
- package/resources/carrier/en/226.bson +0 -0
- package/resources/carrier/en/227.bson +0 -0
- package/resources/carrier/en/228.bson +0 -0
- package/resources/carrier/en/229.bson +0 -0
- package/resources/carrier/en/230.bson +0 -0
- package/resources/carrier/en/231.bson +0 -0
- package/resources/carrier/en/232.bson +0 -0
- package/resources/carrier/en/233.bson +0 -0
- package/resources/carrier/en/234.bson +0 -0
- package/resources/carrier/en/235.bson +0 -0
- package/resources/carrier/en/236.bson +0 -0
- package/resources/carrier/en/237.bson +0 -0
- package/resources/carrier/en/238.bson +0 -0
- package/resources/carrier/en/239.bson +0 -0
- package/resources/carrier/en/240.bson +0 -0
- package/resources/carrier/en/241.bson +0 -0
- package/resources/carrier/en/242.bson +0 -0
- package/resources/carrier/en/243.bson +0 -0
- package/resources/carrier/en/244.bson +0 -0
- package/resources/carrier/en/245.bson +0 -0
- package/resources/carrier/en/246.bson +0 -0
- package/resources/carrier/en/247.bson +0 -0
- package/resources/carrier/en/248.bson +0 -0
- package/resources/carrier/en/249.bson +0 -0
- package/resources/carrier/en/250.bson +0 -0
- package/resources/carrier/en/251.bson +0 -0
- package/resources/carrier/en/252.bson +0 -0
- package/resources/carrier/en/253.bson +0 -0
- package/resources/carrier/en/254.bson +0 -0
- package/resources/carrier/en/255.bson +0 -0
- package/resources/carrier/en/256.bson +0 -0
- package/resources/carrier/en/257.bson +0 -0
- package/resources/carrier/en/258.bson +0 -0
- package/resources/carrier/en/260.bson +0 -0
- package/resources/carrier/en/261.bson +0 -0
- package/resources/carrier/en/262.bson +0 -0
- package/resources/carrier/en/263.bson +0 -0
- package/resources/carrier/en/264.bson +0 -0
- package/resources/carrier/en/265.bson +0 -0
- package/resources/carrier/en/266.bson +0 -0
- package/resources/carrier/en/267.bson +0 -0
- package/resources/carrier/en/268.bson +0 -0
- package/resources/carrier/en/269.bson +0 -0
- package/resources/carrier/en/27.bson +0 -0
- package/resources/carrier/en/290.bson +0 -0
- package/resources/carrier/en/291.bson +0 -0
- package/resources/carrier/en/297.bson +0 -0
- package/resources/carrier/en/298.bson +0 -0
- package/resources/carrier/en/299.bson +0 -0
- package/resources/carrier/en/30.bson +0 -0
- package/resources/carrier/en/31.bson +0 -0
- package/resources/carrier/en/32.bson +0 -0
- package/resources/carrier/en/33.bson +0 -0
- package/resources/carrier/en/34.bson +0 -0
- package/resources/carrier/en/350.bson +0 -0
- package/resources/carrier/en/351.bson +0 -0
- package/resources/carrier/en/352.bson +0 -0
- package/resources/carrier/en/353.bson +0 -0
- package/resources/carrier/en/354.bson +0 -0
- package/resources/carrier/en/355.bson +0 -0
- package/resources/carrier/en/356.bson +0 -0
- package/resources/carrier/en/357.bson +0 -0
- package/resources/carrier/en/358.bson +0 -0
- package/resources/carrier/en/359.bson +0 -0
- package/resources/carrier/en/36.bson +0 -0
- package/resources/carrier/en/370.bson +0 -0
- package/resources/carrier/en/371.bson +0 -0
- package/resources/carrier/en/372.bson +0 -0
- package/resources/carrier/en/373.bson +0 -0
- package/resources/carrier/en/374.bson +0 -0
- package/resources/carrier/en/375.bson +0 -0
- package/resources/carrier/en/376.bson +0 -0
- package/resources/carrier/en/377.bson +0 -0
- package/resources/carrier/en/378.bson +0 -0
- package/resources/carrier/en/380.bson +0 -0
- package/resources/carrier/en/381.bson +0 -0
- package/resources/carrier/en/382.bson +0 -0
- package/resources/carrier/en/383.bson +0 -0
- package/resources/carrier/en/385.bson +0 -0
- package/resources/carrier/en/386.bson +0 -0
- package/resources/carrier/en/387.bson +0 -0
- package/resources/carrier/en/389.bson +0 -0
- package/resources/carrier/en/39.bson +0 -0
- package/resources/carrier/en/40.bson +0 -0
- package/resources/carrier/en/41.bson +0 -0
- package/resources/carrier/en/420.bson +0 -0
- package/resources/carrier/en/421.bson +0 -0
- package/resources/carrier/en/423.bson +0 -0
- package/resources/carrier/en/43.bson +0 -0
- package/resources/carrier/en/44.bson +0 -0
- package/resources/carrier/en/45.bson +0 -0
- package/resources/carrier/en/46.bson +0 -0
- package/resources/carrier/en/47.bson +0 -0
- package/resources/carrier/en/48.bson +0 -0
- package/resources/carrier/en/49.bson +0 -0
- package/resources/carrier/en/500.bson +0 -0
- package/resources/carrier/en/501.bson +0 -0
- package/resources/carrier/en/502.bson +0 -0
- package/resources/carrier/en/503.bson +0 -0
- package/resources/carrier/en/504.bson +0 -0
- package/resources/carrier/en/505.bson +0 -0
- package/resources/carrier/en/506.bson +0 -0
- package/resources/carrier/en/507.bson +0 -0
- package/resources/carrier/en/508.bson +0 -0
- package/resources/carrier/en/509.bson +0 -0
- package/resources/carrier/en/51.bson +0 -0
- package/resources/carrier/en/53.bson +0 -0
- package/resources/carrier/en/55.bson +0 -0
- package/resources/carrier/en/56.bson +0 -0
- package/resources/carrier/en/57.bson +0 -0
- package/resources/carrier/en/58.bson +0 -0
- package/resources/carrier/en/590.bson +0 -0
- package/resources/carrier/en/591.bson +0 -0
- package/resources/carrier/en/592.bson +0 -0
- package/resources/carrier/en/593.bson +0 -0
- package/resources/carrier/en/594.bson +0 -0
- package/resources/carrier/en/595.bson +0 -0
- package/resources/carrier/en/596.bson +0 -0
- package/resources/carrier/en/597.bson +0 -0
- package/resources/carrier/en/598.bson +0 -0
- package/resources/carrier/en/599.bson +0 -0
- package/resources/carrier/en/60.bson +0 -0
- package/resources/carrier/en/61.bson +0 -0
- package/resources/carrier/en/62.bson +0 -0
- package/resources/carrier/en/63.bson +0 -0
- package/resources/carrier/en/64.bson +0 -0
- package/resources/carrier/en/65.bson +0 -0
- package/resources/carrier/en/66.bson +0 -0
- package/resources/carrier/en/670.bson +0 -0
- package/resources/carrier/en/672.bson +0 -0
- package/resources/carrier/en/673.bson +0 -0
- package/resources/carrier/en/674.bson +0 -0
- package/resources/carrier/en/675.bson +0 -0
- package/resources/carrier/en/676.bson +0 -0
- package/resources/carrier/en/677.bson +0 -0
- package/resources/carrier/en/678.bson +0 -0
- package/resources/carrier/en/679.bson +0 -0
- package/resources/carrier/en/680.bson +0 -0
- package/resources/carrier/en/681.bson +0 -0
- package/resources/carrier/en/682.bson +0 -0
- package/resources/carrier/en/683.bson +0 -0
- package/resources/carrier/en/685.bson +0 -0
- package/resources/carrier/en/686.bson +0 -0
- package/resources/carrier/en/687.bson +0 -0
- package/resources/carrier/en/688.bson +0 -0
- package/resources/carrier/en/689.bson +0 -0
- package/resources/carrier/en/690.bson +0 -0
- package/resources/carrier/en/691.bson +0 -0
- package/resources/carrier/en/692.bson +0 -0
- package/resources/carrier/en/7.bson +0 -0
- package/resources/carrier/en/81.bson +0 -0
- package/resources/carrier/en/82.bson +0 -0
- package/resources/carrier/en/84.bson +0 -0
- package/resources/carrier/en/850.bson +0 -0
- package/resources/carrier/en/852.bson +0 -0
- package/resources/carrier/en/853.bson +0 -0
- package/resources/carrier/en/855.bson +0 -0
- package/resources/carrier/en/856.bson +0 -0
- package/resources/carrier/en/86.bson +0 -0
- package/resources/carrier/en/880.bson +0 -0
- package/resources/carrier/en/881.bson +0 -0
- package/resources/carrier/en/882.bson +0 -0
- package/resources/carrier/en/886.bson +0 -0
- package/resources/carrier/en/90.bson +0 -0
- package/resources/carrier/en/91.bson +0 -0
- package/resources/carrier/en/92.bson +0 -0
- package/resources/carrier/en/93.bson +0 -0
- package/resources/carrier/en/94.bson +0 -0
- package/resources/carrier/en/95.bson +0 -0
- package/resources/carrier/en/960.bson +0 -0
- package/resources/carrier/en/961.bson +0 -0
- package/resources/carrier/en/962.bson +0 -0
- package/resources/carrier/en/963.bson +0 -0
- package/resources/carrier/en/964.bson +0 -0
- package/resources/carrier/en/965.bson +0 -0
- package/resources/carrier/en/966.bson +0 -0
- package/resources/carrier/en/967.bson +0 -0
- package/resources/carrier/en/968.bson +0 -0
- package/resources/carrier/en/970.bson +0 -0
- package/resources/carrier/en/971.bson +0 -0
- package/resources/carrier/en/972.bson +0 -0
- package/resources/carrier/en/973.bson +0 -0
- package/resources/carrier/en/974.bson +0 -0
- package/resources/carrier/en/975.bson +0 -0
- package/resources/carrier/en/976.bson +0 -0
- package/resources/carrier/en/977.bson +0 -0
- package/resources/carrier/en/98.bson +0 -0
- package/resources/carrier/en/992.bson +0 -0
- package/resources/carrier/en/993.bson +0 -0
- package/resources/carrier/en/994.bson +0 -0
- package/resources/carrier/en/995.bson +0 -0
- package/resources/carrier/en/996.bson +0 -0
- package/resources/carrier/en/998.bson +0 -0
- package/resources/carrier/fa/93.bson +0 -0
- package/resources/carrier/fa/98.bson +0 -0
- package/resources/carrier/ko/82.bson +0 -0
- package/resources/carrier/ru/374.bson +0 -0
- package/resources/carrier/ru/375.bson +0 -0
- package/resources/carrier/ru/7.bson +0 -0
- package/resources/carrier/uk/380.bson +0 -0
- package/resources/carrier/zh/852.bson +0 -0
- package/resources/carrier/zh/86.bson +0 -0
- package/resources/carrier/zh_Hant/852.bson +0 -0
- package/resources/carrier/zh_Hant/86.bson +0 -0
- package/resources/geocodes/ar/966.bson +0 -0
- package/resources/geocodes/be/375.bson +0 -0
- package/resources/geocodes/bg/359.bson +0 -0
- package/resources/geocodes/bs/387.bson +0 -0
- package/resources/geocodes/de/32.bson +0 -0
- package/resources/geocodes/de/352.bson +0 -0
- package/resources/geocodes/de/41.bson +0 -0
- package/resources/geocodes/de/43.bson +0 -0
- package/resources/geocodes/de/49.bson +0 -0
- package/resources/geocodes/el/30.bson +0 -0
- package/resources/geocodes/en/1.bson +0 -0
- package/resources/geocodes/en/20.bson +0 -0
- package/resources/geocodes/en/212.bson +0 -0
- package/resources/geocodes/en/213.bson +0 -0
- package/resources/geocodes/en/216.bson +0 -0
- package/resources/geocodes/en/218.bson +0 -0
- package/resources/geocodes/en/220.bson +0 -0
- package/resources/geocodes/en/221.bson +0 -0
- package/resources/geocodes/en/222.bson +0 -0
- package/resources/geocodes/en/223.bson +0 -0
- package/resources/geocodes/en/224.bson +0 -0
- package/resources/geocodes/en/225.bson +0 -0
- package/resources/geocodes/en/226.bson +0 -0
- package/resources/geocodes/en/227.bson +0 -0
- package/resources/geocodes/en/228.bson +0 -0
- package/resources/geocodes/en/229.bson +0 -0
- package/resources/geocodes/en/230.bson +0 -0
- package/resources/geocodes/en/232.bson +0 -0
- package/resources/geocodes/en/233.bson +0 -0
- package/resources/geocodes/en/234.bson +0 -0
- package/resources/geocodes/en/236.bson +0 -0
- package/resources/geocodes/en/237.bson +0 -0
- package/resources/geocodes/en/238.bson +0 -0
- package/resources/geocodes/en/239.bson +0 -0
- package/resources/geocodes/en/240.bson +0 -0
- package/resources/geocodes/en/241.bson +0 -0
- package/resources/geocodes/en/242.bson +0 -0
- package/resources/geocodes/en/243.bson +0 -0
- package/resources/geocodes/en/244.bson +0 -0
- package/resources/geocodes/en/245.bson +0 -0
- package/resources/geocodes/en/247.bson +0 -0
- package/resources/geocodes/en/249.bson +0 -0
- package/resources/geocodes/en/251.bson +0 -0
- package/resources/geocodes/en/252.bson +0 -0
- package/resources/geocodes/en/254.bson +0 -0
- package/resources/geocodes/en/255.bson +0 -0
- package/resources/geocodes/en/256.bson +0 -0
- package/resources/geocodes/en/257.bson +0 -0
- package/resources/geocodes/en/258.bson +0 -0
- package/resources/geocodes/en/260.bson +0 -0
- package/resources/geocodes/en/261.bson +0 -0
- package/resources/geocodes/en/263.bson +0 -0
- package/resources/geocodes/en/264.bson +0 -0
- package/resources/geocodes/en/266.bson +0 -0
- package/resources/geocodes/en/267.bson +0 -0
- package/resources/geocodes/en/268.bson +0 -0
- package/resources/geocodes/en/269.bson +0 -0
- package/resources/geocodes/en/27.bson +0 -0
- package/resources/geocodes/en/290.bson +0 -0
- package/resources/geocodes/en/299.bson +0 -0
- package/resources/geocodes/en/30.bson +0 -0
- package/resources/geocodes/en/31.bson +0 -0
- package/resources/geocodes/en/32.bson +0 -0
- package/resources/geocodes/en/34.bson +0 -0
- package/resources/geocodes/en/351.bson +0 -0
- package/resources/geocodes/en/352.bson +0 -0
- package/resources/geocodes/en/353.bson +0 -0
- package/resources/geocodes/en/354.bson +0 -0
- package/resources/geocodes/en/355.bson +0 -0
- package/resources/geocodes/en/358.bson +0 -0
- package/resources/geocodes/en/359.bson +0 -0
- package/resources/geocodes/en/36.bson +0 -0
- package/resources/geocodes/en/370.bson +0 -0
- package/resources/geocodes/en/373.bson +0 -0
- package/resources/geocodes/en/374.bson +0 -0
- package/resources/geocodes/en/375.bson +0 -0
- package/resources/geocodes/en/380.bson +0 -0
- package/resources/geocodes/en/381.bson +0 -0
- package/resources/geocodes/en/382.bson +0 -0
- package/resources/geocodes/en/383.bson +0 -0
- package/resources/geocodes/en/385.bson +0 -0
- package/resources/geocodes/en/386.bson +0 -0
- package/resources/geocodes/en/387.bson +0 -0
- package/resources/geocodes/en/389.bson +0 -0
- package/resources/geocodes/en/39.bson +0 -0
- package/resources/geocodes/en/40.bson +0 -0
- package/resources/geocodes/en/41.bson +0 -0
- package/resources/geocodes/en/420.bson +0 -0
- package/resources/geocodes/en/421.bson +0 -0
- package/resources/geocodes/en/43.bson +0 -0
- package/resources/geocodes/en/44.bson +0 -0
- package/resources/geocodes/en/46.bson +0 -0
- package/resources/geocodes/en/47.bson +0 -0
- package/resources/geocodes/en/48.bson +0 -0
- package/resources/geocodes/en/49.bson +0 -0
- package/resources/geocodes/en/501.bson +0 -0
- package/resources/geocodes/en/504.bson +0 -0
- package/resources/geocodes/en/51.bson +0 -0
- package/resources/geocodes/en/52.bson +0 -0
- package/resources/geocodes/en/53.bson +0 -0
- package/resources/geocodes/en/54.bson +0 -0
- package/resources/geocodes/en/55.bson +0 -0
- package/resources/geocodes/en/56.bson +0 -0
- package/resources/geocodes/en/57.bson +0 -0
- package/resources/geocodes/en/58.bson +0 -0
- package/resources/geocodes/en/592.bson +0 -0
- package/resources/geocodes/en/593.bson +0 -0
- package/resources/geocodes/en/595.bson +0 -0
- package/resources/geocodes/en/598.bson +0 -0
- package/resources/geocodes/en/599.bson +0 -0
- package/resources/geocodes/en/61.bson +0 -0
- package/resources/geocodes/en/62.bson +0 -0
- package/resources/geocodes/en/63.bson +0 -0
- package/resources/geocodes/en/64.bson +0 -0
- package/resources/geocodes/en/66.bson +0 -0
- package/resources/geocodes/en/670.bson +0 -0
- package/resources/geocodes/en/672.bson +0 -0
- package/resources/geocodes/en/673.bson +0 -0
- package/resources/geocodes/en/675.bson +0 -0
- package/resources/geocodes/en/676.bson +0 -0
- package/resources/geocodes/en/678.bson +0 -0
- package/resources/geocodes/en/679.bson +0 -0
- package/resources/geocodes/en/680.bson +0 -0
- package/resources/geocodes/en/682.bson +0 -0
- package/resources/geocodes/en/685.bson +0 -0
- package/resources/geocodes/en/686.bson +0 -0
- package/resources/geocodes/en/688.bson +0 -0
- package/resources/geocodes/en/689.bson +0 -0
- package/resources/geocodes/en/690.bson +0 -0
- package/resources/geocodes/en/7.bson +0 -0
- package/resources/geocodes/en/81.bson +0 -0
- package/resources/geocodes/en/82.bson +0 -0
- package/resources/geocodes/en/84.bson +0 -0
- package/resources/geocodes/en/850.bson +0 -0
- package/resources/geocodes/en/86.bson +0 -0
- package/resources/geocodes/en/880.bson +0 -0
- package/resources/geocodes/en/886.bson +0 -0
- package/resources/geocodes/en/90.bson +0 -0
- package/resources/geocodes/en/91.bson +0 -0
- package/resources/geocodes/en/92.bson +0 -0
- package/resources/geocodes/en/93.bson +0 -0
- package/resources/geocodes/en/94.bson +0 -0
- package/resources/geocodes/en/95.bson +0 -0
- package/resources/geocodes/en/960.bson +0 -0
- package/resources/geocodes/en/961.bson +0 -0
- package/resources/geocodes/en/962.bson +0 -0
- package/resources/geocodes/en/963.bson +0 -0
- package/resources/geocodes/en/966.bson +0 -0
- package/resources/geocodes/en/967.bson +0 -0
- package/resources/geocodes/en/968.bson +0 -0
- package/resources/geocodes/en/970.bson +0 -0
- package/resources/geocodes/en/971.bson +0 -0
- package/resources/geocodes/en/972.bson +0 -0
- package/resources/geocodes/en/975.bson +0 -0
- package/resources/geocodes/en/976.bson +0 -0
- package/resources/geocodes/en/98.bson +0 -0
- package/resources/geocodes/en/992.bson +0 -0
- package/resources/geocodes/en/993.bson +0 -0
- package/resources/geocodes/en/994.bson +0 -0
- package/resources/geocodes/en/995.bson +0 -0
- package/resources/geocodes/en/996.bson +0 -0
- package/resources/geocodes/es/228.bson +0 -0
- package/resources/geocodes/es/230.bson +0 -0
- package/resources/geocodes/es/34.bson +0 -0
- package/resources/geocodes/es/52.bson +0 -0
- package/resources/geocodes/es/54.bson +0 -0
- package/resources/geocodes/es/56.bson +0 -0
- package/resources/geocodes/es/57.bson +0 -0
- package/resources/geocodes/es/58.bson +0 -0
- package/resources/geocodes/fa/93.bson +0 -0
- package/resources/geocodes/fa/98.bson +0 -0
- package/resources/geocodes/fi/358.bson +0 -0
- package/resources/geocodes/fr/212.bson +0 -0
- package/resources/geocodes/fr/222.bson +0 -0
- package/resources/geocodes/fr/225.bson +0 -0
- package/resources/geocodes/fr/228.bson +0 -0
- package/resources/geocodes/fr/229.bson +0 -0
- package/resources/geocodes/fr/230.bson +0 -0
- package/resources/geocodes/fr/242.bson +0 -0
- package/resources/geocodes/fr/243.bson +0 -0
- package/resources/geocodes/fr/269.bson +0 -0
- package/resources/geocodes/fr/290.bson +0 -0
- package/resources/geocodes/fr/32.bson +0 -0
- package/resources/geocodes/fr/352.bson +0 -0
- package/resources/geocodes/fr/41.bson +0 -0
- package/resources/geocodes/hr/387.bson +0 -0
- package/resources/geocodes/hu/36.bson +0 -0
- package/resources/geocodes/hy/374.bson +0 -0
- package/resources/geocodes/id/62.bson +0 -0
- package/resources/geocodes/it/39.bson +0 -0
- package/resources/geocodes/it/41.bson +0 -0
- package/resources/geocodes/iw/972.bson +0 -0
- package/resources/geocodes/ja/81.bson +0 -0
- package/resources/geocodes/ko/82.bson +0 -0
- package/resources/geocodes/nl/31.bson +0 -0
- package/resources/geocodes/nl/32.bson +0 -0
- package/resources/geocodes/pl/48.bson +0 -0
- package/resources/geocodes/pt/238.bson +0 -0
- package/resources/geocodes/pt/239.bson +0 -0
- package/resources/geocodes/pt/244.bson +0 -0
- package/resources/geocodes/pt/245.bson +0 -0
- package/resources/geocodes/pt/258.bson +0 -0
- package/resources/geocodes/pt/351.bson +0 -0
- package/resources/geocodes/pt/55.bson +0 -0
- package/resources/geocodes/ro/373.bson +0 -0
- package/resources/geocodes/ro/40.bson +0 -0
- package/resources/geocodes/ru/373.bson +0 -0
- package/resources/geocodes/ru/374.bson +0 -0
- package/resources/geocodes/ru/375.bson +0 -0
- package/resources/geocodes/ru/7.bson +0 -0
- package/resources/geocodes/sq/383.bson +0 -0
- package/resources/geocodes/sr/381.bson +0 -0
- package/resources/geocodes/sr/383.bson +0 -0
- package/resources/geocodes/sr/387.bson +0 -0
- package/resources/geocodes/sv/358.bson +0 -0
- package/resources/geocodes/sv/46.bson +0 -0
- package/resources/geocodes/th/66.bson +0 -0
- package/resources/geocodes/tr/90.bson +0 -0
- package/resources/geocodes/uk/380.bson +0 -0
- package/resources/geocodes/vi/84.bson +0 -0
- package/resources/geocodes/zh/86.bson +0 -0
- package/resources/geocodes/zh/886.bson +0 -0
- package/resources/geocodes/zh_Hant/886.bson +0 -0
- package/resources/timezones.bson +0 -0
package/dist/cache.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { CacheStats, LookupTable } from './types';
|
|
2
|
+
export declare const DEFAULT_CACHE_SIZE = 100;
|
|
3
|
+
/** Internal — used by `core.ts` for read/write. */
|
|
4
|
+
export declare function cacheGet(key: string): LookupTable | undefined;
|
|
5
|
+
export declare function cacheSet(key: string, value: LookupTable): void;
|
|
6
|
+
/** Drop every entry. Useful between tests and for long-running processes. */
|
|
7
|
+
export declare function clearCache(): void;
|
|
8
|
+
/** Live entry count (does not include keys evicted by the LRU). */
|
|
9
|
+
export declare function getCacheSize(): number;
|
|
10
|
+
/** Snapshot — helpful for `/health` endpoints in serverless adapters. */
|
|
11
|
+
export declare function getCacheStats(): CacheStats;
|
|
12
|
+
/**
|
|
13
|
+
* Resize the cache. Existing entries are migrated newest-first up to the new
|
|
14
|
+
* ceiling; any overflow is dropped. Calling this with the current size is a
|
|
15
|
+
* no-op (kept for symmetry with `clearCache`).
|
|
16
|
+
*/
|
|
17
|
+
export declare function setCacheSize(size: number): void;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output formatters for the CLI. The runner picks one based on `--format`.
|
|
3
|
+
*
|
|
4
|
+
* pretty — colored, human-friendly summary (default)
|
|
5
|
+
* text — plain ASCII single-line + KV pairs (for piping)
|
|
6
|
+
* json — full result as a single JSON line (for tooling)
|
|
7
|
+
*/
|
|
8
|
+
import type { PhoneValidationResult } from '../serverless/_shared/dispatch';
|
|
9
|
+
export declare function verdictLine(result: PhoneValidationResult): string;
|
|
10
|
+
export declare function formatJson(result: PhoneValidationResult): string;
|
|
11
|
+
export declare function formatText(result: PhoneValidationResult): string;
|
|
12
|
+
export declare function formatPretty(result: PhoneValidationResult): string;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `phone-validate` CLI entry point.
|
|
3
|
+
*
|
|
4
|
+
* Wired into `package.json#bin` so `bun add -g @phonecheck/phone-number-validator-js`
|
|
5
|
+
* (or the npm equivalent) installs a `phone-validate` command.
|
|
6
|
+
*/
|
|
7
|
+
import '../index';
|
|
8
|
+
export type { CliArgError, ParsedArgs, ParsedHelp, ParsedVersion, ParseResult } from './parse-args';
|
|
9
|
+
export { helpText, parseArgs } from './parse-args';
|
|
10
|
+
export type { CliRunDeps } from './run';
|
|
11
|
+
export { exitCodeFor, logFileNameFor, run } from './run';
|
|
12
|
+
export declare function main(argv?: readonly string[]): Promise<number>;
|
|
@@ -0,0 +1,531 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var bson = require('bson');
|
|
5
|
+
var tinyLru = require('tiny-lru');
|
|
6
|
+
var node_fs = require('node:fs');
|
|
7
|
+
var node_path = require('node:path');
|
|
8
|
+
var node_url = require('node:url');
|
|
9
|
+
var libphonenumberJs = require('libphonenumber-js');
|
|
10
|
+
|
|
11
|
+
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
12
|
+
const DEFAULT_CACHE_SIZE = 100;
|
|
13
|
+
let cache = tinyLru.lru(DEFAULT_CACHE_SIZE);
|
|
14
|
+
function cacheGet(key) {
|
|
15
|
+
return cache.get(key);
|
|
16
|
+
}
|
|
17
|
+
function cacheSet(key, value) {
|
|
18
|
+
cache.set(key, value);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const DEFAULT_LOCALE = "en";
|
|
22
|
+
const TIMEZONES_PATH = "timezones.bson";
|
|
23
|
+
let activeLoader = null;
|
|
24
|
+
function setResourceLoader(loader) {
|
|
25
|
+
activeLoader = loader;
|
|
26
|
+
}
|
|
27
|
+
function findByPrefix(table, key) {
|
|
28
|
+
for (let prefix = key; prefix.length > 0; prefix = prefix.slice(0, -1)) {
|
|
29
|
+
const value = table[prefix];
|
|
30
|
+
if (typeof value === "string" && value.length > 0) return value;
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
function decodeBson(bytes) {
|
|
35
|
+
if (!bytes || bytes.byteLength === 0) return null;
|
|
36
|
+
const buf = Buffer.isBuffer(bytes) ? bytes : Buffer.from(bytes);
|
|
37
|
+
return bson.deserialize(buf);
|
|
38
|
+
}
|
|
39
|
+
function logLoadError(path, err) {
|
|
40
|
+
if (process.env.NODE_ENV !== "production") {
|
|
41
|
+
console.error(`Error loading data from ${path}:`, err);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function rememberTable(path, bytes) {
|
|
45
|
+
const table = decodeBson(bytes);
|
|
46
|
+
if (!table) return null;
|
|
47
|
+
cacheSet(path, table);
|
|
48
|
+
return table;
|
|
49
|
+
}
|
|
50
|
+
async function loadTableAsync(path) {
|
|
51
|
+
if (!activeLoader) return null;
|
|
52
|
+
const cached = cacheGet(path);
|
|
53
|
+
if (cached) return cached;
|
|
54
|
+
try {
|
|
55
|
+
return rememberTable(path, await activeLoader.loadResource(path));
|
|
56
|
+
} catch (err) {
|
|
57
|
+
logLoadError(path, err);
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function localeResourcePath(kind, locale, countryCode) {
|
|
62
|
+
return `${kind}/${locale}/${countryCode}.bson`;
|
|
63
|
+
}
|
|
64
|
+
function localePaths(kind, locale, cc) {
|
|
65
|
+
if (locale === DEFAULT_LOCALE) return [localeResourcePath(kind, DEFAULT_LOCALE, cc)];
|
|
66
|
+
return [localeResourcePath(kind, locale, cc), localeResourcePath(kind, DEFAULT_LOCALE, cc)];
|
|
67
|
+
}
|
|
68
|
+
function partsOf(phoneNumber) {
|
|
69
|
+
const national = phoneNumber?.nationalNumber?.toString();
|
|
70
|
+
const cc = phoneNumber?.countryCallingCode?.toString();
|
|
71
|
+
if (!national || !cc) return null;
|
|
72
|
+
return { national, cc };
|
|
73
|
+
}
|
|
74
|
+
function timezoneKey(phoneNumber) {
|
|
75
|
+
const raw = phoneNumber?.number?.toString();
|
|
76
|
+
if (!raw) return null;
|
|
77
|
+
return raw.startsWith("+") ? raw.slice(1) : raw;
|
|
78
|
+
}
|
|
79
|
+
function parseTimezones(value) {
|
|
80
|
+
if (!value) return null;
|
|
81
|
+
const zones = value.split("&").filter((z) => z.length > 0);
|
|
82
|
+
return zones.length > 0 ? zones : null;
|
|
83
|
+
}
|
|
84
|
+
async function localizedAsync(kind, phoneNumber, locale) {
|
|
85
|
+
const parts = partsOf(phoneNumber);
|
|
86
|
+
if (!parts) return null;
|
|
87
|
+
for (const path of localePaths(kind, locale, parts.cc)) {
|
|
88
|
+
const table = await loadTableAsync(path);
|
|
89
|
+
const hit = table ? findByPrefix(table, parts.national) : null;
|
|
90
|
+
if (hit) return hit;
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
async function geocoderAsync(phoneNumber, locale = DEFAULT_LOCALE) {
|
|
95
|
+
return localizedAsync("geocodes", phoneNumber, locale);
|
|
96
|
+
}
|
|
97
|
+
async function carrierAsync(phoneNumber, locale = DEFAULT_LOCALE) {
|
|
98
|
+
return localizedAsync("carrier", phoneNumber, locale);
|
|
99
|
+
}
|
|
100
|
+
async function timezonesAsync(phoneNumber) {
|
|
101
|
+
const key = timezoneKey(phoneNumber);
|
|
102
|
+
if (!key) return null;
|
|
103
|
+
const table = await loadTableAsync(TIMEZONES_PATH);
|
|
104
|
+
return table ? parseTimezones(findByPrefix(table, key)) : null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function defaultResourcesDir() {
|
|
108
|
+
let here;
|
|
109
|
+
try {
|
|
110
|
+
here = __dirname;
|
|
111
|
+
} catch {
|
|
112
|
+
here = node_path.dirname(node_url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.js', document.baseURI).href))));
|
|
113
|
+
}
|
|
114
|
+
let dir = here;
|
|
115
|
+
for (let i = 0; i < 6; i++) {
|
|
116
|
+
const candidate = node_path.resolve(dir, "resources");
|
|
117
|
+
if (node_fs.existsSync(node_path.resolve(candidate, "timezones.bson"))) {
|
|
118
|
+
return candidate;
|
|
119
|
+
}
|
|
120
|
+
const parent = node_path.resolve(dir, "..");
|
|
121
|
+
if (parent === dir) break;
|
|
122
|
+
dir = parent;
|
|
123
|
+
}
|
|
124
|
+
return node_path.resolve(here, "..", "resources");
|
|
125
|
+
}
|
|
126
|
+
class NodeFsResourceLoader {
|
|
127
|
+
constructor(options = {}) {
|
|
128
|
+
this.baseDir = options.resourcesDir ?? defaultResourcesDir();
|
|
129
|
+
}
|
|
130
|
+
async loadResource(path) {
|
|
131
|
+
return this.loadResourceSync(path);
|
|
132
|
+
}
|
|
133
|
+
loadResourceSync(path) {
|
|
134
|
+
const fullPath = node_path.join(this.baseDir, path);
|
|
135
|
+
if (!node_fs.existsSync(fullPath)) return null;
|
|
136
|
+
return node_fs.readFileSync(fullPath);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
setResourceLoader(new NodeFsResourceLoader());
|
|
141
|
+
|
|
142
|
+
const HELP_TEXT = `phone-validate <phone-number> [options]
|
|
143
|
+
|
|
144
|
+
Parse and enrich an international phone number \u2014 geocoding (city / region),
|
|
145
|
+
original carrier, timezone(s), formatted variants, and number type. By
|
|
146
|
+
default, runs the full enrichment pipeline, prints a colored summary to
|
|
147
|
+
stdout, and writes the JSON result to ./logs/.
|
|
148
|
+
|
|
149
|
+
Options:
|
|
150
|
+
--country <CC> Default country (e.g. US, DE) when the input
|
|
151
|
+
lacks a leading +. Pass-through to libphonenumber.
|
|
152
|
+
--locale <code> Geocoder locale: en, de, fr, es, ... (default: en)
|
|
153
|
+
--carrier-locale <code> Carrier locale: en, ar, zh, ... (default: en)
|
|
154
|
+
|
|
155
|
+
--geocode, --no-geocode Look up city / region (default: on)
|
|
156
|
+
--carrier-info, --no-carrier-info
|
|
157
|
+
Look up original carrier (default: on)
|
|
158
|
+
--timezones, --no-timezones Look up IANA timezone(s) (default: on)
|
|
159
|
+
--enrich, --no-enrich Master toggle for all three above (default: on)
|
|
160
|
+
|
|
161
|
+
--format <text|json|pretty> Stdout format (default: pretty)
|
|
162
|
+
--log-dir <path> Directory to write the JSON result (default: ./logs)
|
|
163
|
+
--no-log-file Skip writing the result file
|
|
164
|
+
--quiet Print only the final verdict to stdout
|
|
165
|
+
--debug Verbose logging
|
|
166
|
+
|
|
167
|
+
-h, --help Show this help
|
|
168
|
+
-v, --version Print version
|
|
169
|
+
|
|
170
|
+
Examples:
|
|
171
|
+
# Parse + enrich an E.164 number
|
|
172
|
+
phone-validate +14155552671
|
|
173
|
+
|
|
174
|
+
# Parse a national number with a country fallback
|
|
175
|
+
phone-validate "(415) 555-2671" --country US
|
|
176
|
+
|
|
177
|
+
# German locale for the geocoder
|
|
178
|
+
phone-validate +41431234567 --locale de
|
|
179
|
+
|
|
180
|
+
# Format-only validation (skips BSON loads \u2014 fastest)
|
|
181
|
+
phone-validate +14155552671 --no-enrich
|
|
182
|
+
|
|
183
|
+
# Just timezone, skip geocode + carrier
|
|
184
|
+
phone-validate +14155552671 --no-geocode --no-carrier-info
|
|
185
|
+
|
|
186
|
+
# Pipe JSON to jq for tooling
|
|
187
|
+
phone-validate +14155552671 --format json --quiet --no-log-file | jq
|
|
188
|
+
|
|
189
|
+
# Silent verdict for shell scripting (exit code 0=valid, 1=invalid)
|
|
190
|
+
phone-validate "+14155552671" --quiet --no-log-file
|
|
191
|
+
if phone-validate "$NUMBER" --quiet --no-log-file > /dev/null; then \u2026
|
|
192
|
+
`;
|
|
193
|
+
const BOOLEAN_FLAGS = {
|
|
194
|
+
enrich: (s, on) => {
|
|
195
|
+
s.result.enrichGeocode = on;
|
|
196
|
+
s.result.enrichCarrier = on;
|
|
197
|
+
s.result.enrichTimezones = on;
|
|
198
|
+
},
|
|
199
|
+
geocode: (s, on) => {
|
|
200
|
+
s.result.enrichGeocode = on;
|
|
201
|
+
},
|
|
202
|
+
"carrier-info": (s, on) => {
|
|
203
|
+
s.result.enrichCarrier = on;
|
|
204
|
+
},
|
|
205
|
+
timezones: (s, on) => {
|
|
206
|
+
s.result.enrichTimezones = on;
|
|
207
|
+
},
|
|
208
|
+
"log-file": (s, on) => {
|
|
209
|
+
s.logFile = on;
|
|
210
|
+
},
|
|
211
|
+
quiet: (s, on) => {
|
|
212
|
+
s.result.quiet = on;
|
|
213
|
+
},
|
|
214
|
+
debug: (s, on) => {
|
|
215
|
+
s.result.debug = on;
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
const FORMAT_VALUES = /* @__PURE__ */ new Set(["text", "json", "pretty"]);
|
|
219
|
+
const VALUE_FLAGS = {
|
|
220
|
+
country: (s, value) => {
|
|
221
|
+
s.result.defaultCountry = value.toUpperCase();
|
|
222
|
+
},
|
|
223
|
+
locale: (s, value) => {
|
|
224
|
+
s.result.locale = value;
|
|
225
|
+
},
|
|
226
|
+
"carrier-locale": (s, value) => {
|
|
227
|
+
s.result.carrierLocale = value;
|
|
228
|
+
},
|
|
229
|
+
format: (s, value, errors) => {
|
|
230
|
+
if (!FORMAT_VALUES.has(value)) {
|
|
231
|
+
errors.push(`--format must be one of text|json|pretty (got "${value}")`);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
s.result.format = value;
|
|
235
|
+
},
|
|
236
|
+
"log-dir": (s, value) => {
|
|
237
|
+
s.result.logDir = value;
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
function tokenize(token) {
|
|
241
|
+
if (!token.startsWith("--")) return null;
|
|
242
|
+
const eqIdx = token.indexOf("=");
|
|
243
|
+
const rawName = eqIdx === -1 ? token.slice(2) : token.slice(2, eqIdx);
|
|
244
|
+
const inlineValue = eqIdx === -1 ? void 0 : token.slice(eqIdx + 1);
|
|
245
|
+
if (rawName.startsWith("no-")) return { name: rawName.slice(3), positive: false, inlineValue };
|
|
246
|
+
return { name: rawName, positive: true, inlineValue };
|
|
247
|
+
}
|
|
248
|
+
function defaultArgs() {
|
|
249
|
+
return {
|
|
250
|
+
phoneNumber: "",
|
|
251
|
+
locale: "en",
|
|
252
|
+
carrierLocale: "en",
|
|
253
|
+
enrichGeocode: true,
|
|
254
|
+
enrichCarrier: true,
|
|
255
|
+
enrichTimezones: true,
|
|
256
|
+
format: "pretty",
|
|
257
|
+
quiet: false,
|
|
258
|
+
debug: false,
|
|
259
|
+
logDir: "./logs"
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
function parseArgs(argv) {
|
|
263
|
+
const errors = [];
|
|
264
|
+
const positional = [];
|
|
265
|
+
const state = { result: defaultArgs(), logFile: true };
|
|
266
|
+
for (let i = 0; i < argv.length; i++) {
|
|
267
|
+
const token = argv[i];
|
|
268
|
+
if (token === void 0) continue;
|
|
269
|
+
if (!token.startsWith("-")) {
|
|
270
|
+
positional.push(token);
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
if (token === "-h" || token === "--help") return { kind: "help" };
|
|
274
|
+
if (token === "-v" || token === "--version") return { kind: "version" };
|
|
275
|
+
const flag = tokenize(token);
|
|
276
|
+
if (!flag) {
|
|
277
|
+
errors.push(`Unknown short flag: "${token}"`);
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
const boolApply = BOOLEAN_FLAGS[flag.name];
|
|
281
|
+
if (boolApply) {
|
|
282
|
+
boolApply(state, flag.positive);
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
const valueApply = VALUE_FLAGS[flag.name];
|
|
286
|
+
if (valueApply && flag.positive) {
|
|
287
|
+
const value = flag.inlineValue ?? argv[++i];
|
|
288
|
+
if (value === void 0) {
|
|
289
|
+
errors.push(`Flag --${flag.name} requires a value`);
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
valueApply(state, value, errors);
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
errors.push(`Unknown flag: "${token}"`);
|
|
296
|
+
}
|
|
297
|
+
if (!state.logFile) state.result.logDir = null;
|
|
298
|
+
if (positional.length === 0) errors.push("Missing required argument: <phone-number>");
|
|
299
|
+
if (positional.length > 1) {
|
|
300
|
+
errors.push(`Expected one phone number, got ${positional.length}: ${positional.join(", ")}`);
|
|
301
|
+
}
|
|
302
|
+
if (errors.length > 0) return { kind: "error", messages: errors, exitCode: 2 };
|
|
303
|
+
const [phoneNumber] = positional;
|
|
304
|
+
if (!phoneNumber) return { kind: "error", messages: ["Missing required argument: <phone-number>"], exitCode: 2 };
|
|
305
|
+
state.result.phoneNumber = phoneNumber;
|
|
306
|
+
return { kind: "args", ...state.result };
|
|
307
|
+
}
|
|
308
|
+
function helpText() {
|
|
309
|
+
return HELP_TEXT;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
function resolveOptions(options) {
|
|
313
|
+
return {
|
|
314
|
+
defaultCountry: options.defaultCountry,
|
|
315
|
+
locale: options.locale ?? "en",
|
|
316
|
+
carrierLocale: options.carrierLocale ?? "en",
|
|
317
|
+
// Each enrichment toggle defaults to ON when unset — opt-out, not opt-in.
|
|
318
|
+
geocode: options.geocode ?? true,
|
|
319
|
+
carrier: options.carrier ?? true,
|
|
320
|
+
timezones: options.timezones ?? true
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
async function validateOne(input, options) {
|
|
324
|
+
const parsed = libphonenumberJs.parsePhoneNumberFromString(input, options.defaultCountry);
|
|
325
|
+
if (!parsed?.isValid()) {
|
|
326
|
+
return { input, valid: false, error: "Invalid or unparseable phone number" };
|
|
327
|
+
}
|
|
328
|
+
const [geocode, carrier, timezones] = await Promise.all([
|
|
329
|
+
options.geocode ? geocoderAsync(parsed, options.locale) : Promise.resolve(void 0),
|
|
330
|
+
options.carrier ? carrierAsync(parsed, options.carrierLocale) : Promise.resolve(void 0),
|
|
331
|
+
options.timezones ? timezonesAsync(parsed) : Promise.resolve(void 0)
|
|
332
|
+
]);
|
|
333
|
+
const result = {
|
|
334
|
+
input,
|
|
335
|
+
valid: true,
|
|
336
|
+
formatted: {
|
|
337
|
+
e164: parsed.format("E.164"),
|
|
338
|
+
international: parsed.formatInternational(),
|
|
339
|
+
national: parsed.formatNational(),
|
|
340
|
+
rfc3966: parsed.format("RFC3966")
|
|
341
|
+
},
|
|
342
|
+
country: parsed.country,
|
|
343
|
+
countryCallingCode: parsed.countryCallingCode.toString(),
|
|
344
|
+
nationalNumber: parsed.nationalNumber.toString(),
|
|
345
|
+
type: parsed.getType()
|
|
346
|
+
};
|
|
347
|
+
if (geocode !== void 0) result.geocode = geocode;
|
|
348
|
+
if (carrier !== void 0) result.carrier = carrier;
|
|
349
|
+
if (timezones !== void 0) result.timezones = timezones;
|
|
350
|
+
return result;
|
|
351
|
+
}
|
|
352
|
+
async function validateSingle(input, options = {}) {
|
|
353
|
+
return validateOne(input, resolveOptions(options));
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
function colorize() {
|
|
357
|
+
const enabled = process.stdout.isTTY && process.env.NO_COLOR !== "1";
|
|
358
|
+
const wrap = (open, close) => (s) => enabled ? `\x1B[${open}m${s}\x1B[${close}m` : s;
|
|
359
|
+
return {
|
|
360
|
+
green: wrap("32", "39"),
|
|
361
|
+
red: wrap("31", "39"),
|
|
362
|
+
yellow: wrap("33", "39"),
|
|
363
|
+
cyan: wrap("36", "39"),
|
|
364
|
+
dim: wrap("2", "22"),
|
|
365
|
+
bold: wrap("1", "22")
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
function verdictLine(result) {
|
|
369
|
+
const c = colorize();
|
|
370
|
+
if (!result.valid) return c.red(`\u2717 INVALID ${result.input}`);
|
|
371
|
+
return c.green(`\u2713 VALID ${result.formatted?.e164 ?? result.input}`);
|
|
372
|
+
}
|
|
373
|
+
function formatJson(result) {
|
|
374
|
+
return JSON.stringify(result);
|
|
375
|
+
}
|
|
376
|
+
function formatText(result) {
|
|
377
|
+
const lines = [];
|
|
378
|
+
lines.push(verdictLine(result));
|
|
379
|
+
if (!result.valid) {
|
|
380
|
+
if (result.error) lines.push(` error=${result.error}`);
|
|
381
|
+
return lines.join("\n");
|
|
382
|
+
}
|
|
383
|
+
lines.push(` country=${result.country ?? "_"} type=${result.type ?? "_"}`);
|
|
384
|
+
lines.push(` e164=${result.formatted?.e164}`);
|
|
385
|
+
lines.push(` national=${result.formatted?.national}`);
|
|
386
|
+
lines.push(` international=${result.formatted?.international}`);
|
|
387
|
+
if (result.geocode) lines.push(` geocode=${result.geocode}`);
|
|
388
|
+
if (result.carrier) lines.push(` carrier=${result.carrier}`);
|
|
389
|
+
if (result.timezones?.length) lines.push(` timezones=${result.timezones.join(", ")}`);
|
|
390
|
+
return lines.join("\n");
|
|
391
|
+
}
|
|
392
|
+
function formatPretty(result) {
|
|
393
|
+
const c = colorize();
|
|
394
|
+
const lines = [];
|
|
395
|
+
lines.push(verdictLine(result));
|
|
396
|
+
lines.push("");
|
|
397
|
+
if (!result.valid) {
|
|
398
|
+
if (result.error) lines.push(` ${c.dim("error:")} ${c.red(result.error)}`);
|
|
399
|
+
return lines.join("\n");
|
|
400
|
+
}
|
|
401
|
+
lines.push(c.bold("Summary"));
|
|
402
|
+
lines.push(
|
|
403
|
+
` ${c.dim("country:")} ${c.cyan(result.country ?? "\u2014")} ${c.dim(`(+${result.countryCallingCode})`)}`
|
|
404
|
+
);
|
|
405
|
+
lines.push(` ${c.dim("type:")} ${result.type ?? "\u2014"}`);
|
|
406
|
+
lines.push("");
|
|
407
|
+
lines.push(c.bold("Formatted"));
|
|
408
|
+
lines.push(` ${c.dim("E.164:")} ${result.formatted?.e164}`);
|
|
409
|
+
lines.push(` ${c.dim("national:")} ${result.formatted?.national}`);
|
|
410
|
+
lines.push(` ${c.dim("international:")} ${result.formatted?.international}`);
|
|
411
|
+
lines.push(` ${c.dim("RFC3966:")} ${result.formatted?.rfc3966}`);
|
|
412
|
+
if (result.geocode || result.carrier || result.timezones?.length) {
|
|
413
|
+
lines.push("");
|
|
414
|
+
lines.push(c.bold("Enrichment"));
|
|
415
|
+
if (result.geocode) lines.push(` ${c.dim("geocode:")} ${result.geocode}`);
|
|
416
|
+
if (result.carrier) lines.push(` ${c.dim("carrier:")} ${result.carrier}`);
|
|
417
|
+
if (result.timezones?.length) {
|
|
418
|
+
lines.push(` ${c.dim("timezones:")} ${result.timezones.join(", ")}`);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
return lines.join("\n");
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
const FORMATTERS = {
|
|
425
|
+
json: formatJson,
|
|
426
|
+
text: formatText,
|
|
427
|
+
pretty: formatPretty
|
|
428
|
+
};
|
|
429
|
+
function pad(n) {
|
|
430
|
+
return n < 10 ? `0${n}` : String(n);
|
|
431
|
+
}
|
|
432
|
+
function logFileNameFor(phoneNumber, when) {
|
|
433
|
+
const safe = phoneNumber.replace(/[^a-zA-Z0-9._+-]+/g, "_");
|
|
434
|
+
const stamp = `${when.getUTCFullYear()}-${pad(when.getUTCMonth() + 1)}-${pad(when.getUTCDate())}T${pad(when.getUTCHours())}${pad(when.getUTCMinutes())}${pad(when.getUTCSeconds())}Z`;
|
|
435
|
+
return `phone-validate-${stamp}-${safe}.json`;
|
|
436
|
+
}
|
|
437
|
+
function debugLine(args) {
|
|
438
|
+
return `Validating "${args.phoneNumber}" (country=${args.defaultCountry ?? "auto"}, locale=${args.locale}, carrier=${args.carrierLocale}, geocode=${args.enrichGeocode}, carrier-info=${args.enrichCarrier}, timezones=${args.enrichTimezones})`;
|
|
439
|
+
}
|
|
440
|
+
function renderOutput(args, result) {
|
|
441
|
+
if (args.quiet) return verdictLine(result);
|
|
442
|
+
return FORMATTERS[args.format](result);
|
|
443
|
+
}
|
|
444
|
+
function persistLog(logDir, phoneNumber, result, deps) {
|
|
445
|
+
try {
|
|
446
|
+
const dir = node_path.resolve(logDir);
|
|
447
|
+
deps.ensureDir(dir);
|
|
448
|
+
const path = node_path.resolve(dir, logFileNameFor(phoneNumber, deps.now()));
|
|
449
|
+
deps.writeFile(path, JSON.stringify(result, null, 2));
|
|
450
|
+
return { ok: true, path };
|
|
451
|
+
} catch (error) {
|
|
452
|
+
return { ok: false, error: error instanceof Error ? error.message : String(error) };
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
async function run(args, deps = {}) {
|
|
456
|
+
const validate = deps.validate ?? validateSingle;
|
|
457
|
+
const stdout = deps.stdout ?? ((line) => process.stdout.write(`${line}
|
|
458
|
+
`));
|
|
459
|
+
const stderr = deps.stderr ?? ((line) => process.stderr.write(`${line}
|
|
460
|
+
`));
|
|
461
|
+
const fsDeps = {
|
|
462
|
+
writeFile: deps.writeFile ?? ((path, contents) => node_fs.writeFileSync(path, contents, "utf8")),
|
|
463
|
+
ensureDir: deps.ensureDir ?? ((path) => node_fs.mkdirSync(path, { recursive: true })),
|
|
464
|
+
now: deps.now ?? (() => /* @__PURE__ */ new Date())
|
|
465
|
+
};
|
|
466
|
+
if (args.debug) stderr(debugLine(args));
|
|
467
|
+
const result = await validate(args.phoneNumber, {
|
|
468
|
+
defaultCountry: args.defaultCountry,
|
|
469
|
+
locale: args.locale,
|
|
470
|
+
carrierLocale: args.carrierLocale,
|
|
471
|
+
geocode: args.enrichGeocode,
|
|
472
|
+
carrier: args.enrichCarrier,
|
|
473
|
+
timezones: args.enrichTimezones
|
|
474
|
+
});
|
|
475
|
+
stdout(renderOutput(args, result));
|
|
476
|
+
if (args.logDir) {
|
|
477
|
+
const log = persistLog(args.logDir, args.phoneNumber, result, fsDeps);
|
|
478
|
+
if (!log.ok) stderr(`Warning: failed to write log file: ${log.error}`);
|
|
479
|
+
else if (!args.quiet) stderr(`Log written: ${log.path}`);
|
|
480
|
+
}
|
|
481
|
+
return exitCodeFor(result);
|
|
482
|
+
}
|
|
483
|
+
function exitCodeFor(result) {
|
|
484
|
+
return result.valid ? 0 : 1;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
async function main(argv = process.argv.slice(2)) {
|
|
488
|
+
const parsed = parseArgs(argv);
|
|
489
|
+
if (parsed.kind === "help") {
|
|
490
|
+
process.stdout.write(`${helpText()}
|
|
491
|
+
`);
|
|
492
|
+
return 0;
|
|
493
|
+
}
|
|
494
|
+
if (parsed.kind === "version") {
|
|
495
|
+
try {
|
|
496
|
+
const pkg = require("../../package.json");
|
|
497
|
+
process.stdout.write(`${pkg.version}
|
|
498
|
+
`);
|
|
499
|
+
} catch {
|
|
500
|
+
process.stdout.write("unknown\n");
|
|
501
|
+
}
|
|
502
|
+
return 0;
|
|
503
|
+
}
|
|
504
|
+
if (parsed.kind === "error") {
|
|
505
|
+
for (const msg of parsed.messages) process.stderr.write(`${msg}
|
|
506
|
+
`);
|
|
507
|
+
process.stderr.write(`
|
|
508
|
+
Run with --help for usage.
|
|
509
|
+
`);
|
|
510
|
+
return parsed.exitCode;
|
|
511
|
+
}
|
|
512
|
+
return run(parsed);
|
|
513
|
+
}
|
|
514
|
+
const isDirectInvocation = typeof ({ url: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.js', document.baseURI).href)) }) !== "undefined" && undefined === true || typeof require !== "undefined" && require.main === module;
|
|
515
|
+
if (isDirectInvocation) {
|
|
516
|
+
main().then((code) => process.exit(code)).catch((error) => {
|
|
517
|
+
process.stderr.write(
|
|
518
|
+
`Unexpected error: ${error instanceof Error ? error.stack ?? error.message : String(error)}
|
|
519
|
+
`
|
|
520
|
+
);
|
|
521
|
+
process.exit(1);
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
exports.exitCodeFor = exitCodeFor;
|
|
526
|
+
exports.helpText = helpText;
|
|
527
|
+
exports.logFileNameFor = logFileNameFor;
|
|
528
|
+
exports.main = main;
|
|
529
|
+
exports.parseArgs = parseArgs;
|
|
530
|
+
exports.run = run;
|
|
531
|
+
//# sourceMappingURL=index.js.map
|