@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/README.md
CHANGED
|
@@ -1,426 +1,420 @@
|
|
|
1
|
-
# Phone Number
|
|
1
|
+
# Advanced Phone Number Validator
|
|
2
2
|
|
|
3
3
|
[](https://npm.im/@phonecheck/phone-number-validator-js)
|
|
4
4
|
[](https://github.com/phone-check-app/phone-number-validator-js/actions)
|
|
5
5
|
[](https://www.npmjs.com/package/@phonecheck/phone-number-validator-js)
|
|
6
6
|
[](https://unpkg.com/browse/@phonecheck/phone-number-validator-js@latest/)
|
|
7
|
+
[](https://www.typescriptlang.org/)
|
|
8
|
+
|
|
9
|
+
🚀 **Validate, parse, and enrich international phone numbers** — geocoding,
|
|
10
|
+
carrier lookup, timezone resolution, and number-type detection. Built on
|
|
11
|
+
[Google libphonenumber](https://github.com/google/libphonenumber)'s metadata,
|
|
12
|
+
distributed as compact BSON tables, served from sync (Node) and async (edge /
|
|
13
|
+
serverless) APIs, with first-class adapters for **AWS Lambda, Vercel,
|
|
14
|
+
Cloudflare Workers, GCP Cloud Functions, Netlify, and Azure Functions**.
|
|
15
|
+
|
|
16
|
+
## 📋 Table of Contents
|
|
17
|
+
|
|
18
|
+
- [Features](#features)
|
|
19
|
+
- [Use Cases](#use-cases)
|
|
20
|
+
- [API / Cloud Service](#api--cloud-hosted-service)
|
|
21
|
+
- [Installation](#installation)
|
|
22
|
+
- [Quick Start](#quick-start)
|
|
23
|
+
- [API Reference](#api-reference)
|
|
24
|
+
- [Examples](#examples)
|
|
25
|
+
- [Command-line Tool (`phone-validate`)](#command-line-tool-phone-validate)
|
|
26
|
+
- [Cache Management](#cache-management)
|
|
27
|
+
- [Custom Resource Loaders](#custom-resource-loaders)
|
|
28
|
+
- [Serverless Usage](#serverless-usage)
|
|
29
|
+
- [Performance](#performance)
|
|
30
|
+
- [Testing](#testing)
|
|
31
|
+
- [Architecture](#architecture)
|
|
32
|
+
- [Contributing](#contributing)
|
|
33
|
+
- [Documentation index](#documentation-index)
|
|
7
34
|
|
|
8
|
-
|
|
35
|
+
## Features
|
|
9
36
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
37
|
+
- ✅ **E.164 / national / international parsing** via libphonenumber-js (re-exported)
|
|
38
|
+
- ✅ **Geocoder** — city / region in 30+ locales with English fallback
|
|
39
|
+
- ✅ **Original carrier mapping** — Google's carrier-allocation tables
|
|
40
|
+
- ✅ **Timezone resolution** — IANA zone IDs from the E.164 number
|
|
41
|
+
- ✅ **Number-type detection** — mobile, fixed-line, VoIP, toll-free, premium…
|
|
42
|
+
- ✅ **Sync + async parity** — `geocoder` for Node, `geocoderAsync` for edge / KV
|
|
43
|
+
- ✅ **Pluggable resource loader** — `node:fs`, `fetch`, Cloudflare KV, or your own
|
|
44
|
+
- ✅ **High-performance LRU cache** for deserialized BSON tables
|
|
45
|
+
- ✅ **Six platform adapters** — AWS / Vercel / Cloudflare / GCP / Netlify / Azure
|
|
46
|
+
- ✅ **`phone-validate` CLI** — single-shot validation + JSON logging
|
|
47
|
+
- ✅ **Strict TypeScript** — zero `any` and zero non-null assertions in `src/`
|
|
48
|
+
|
|
49
|
+
## Use Cases
|
|
50
|
+
|
|
51
|
+
- Reduce SMS bounce rate by filtering invalid numbers before send
|
|
52
|
+
- Geo-route inbound calls or messages to the right region / carrier
|
|
53
|
+
- Detect VoIP / toll-free / premium-rate numbers in fraud screens
|
|
54
|
+
- Normalize numbers to E.164 for storage and analytics
|
|
55
|
+
- Protect signup / checkout forms from fake numbers and bots
|
|
56
|
+
- Embed validation in mobile, web, and back-office workflows
|
|
16
57
|
|
|
58
|
+
## API / Cloud Hosted Service
|
|
17
59
|
|
|
18
|
-
|
|
19
|
-
|
|
60
|
+
We offer this — and more advanced features — as a scalable cloud API:
|
|
61
|
+
[**Phone Number Verification**](https://phone-check.app/products/phone).
|
|
20
62
|
|
|
21
|
-
|
|
63
|
+
---
|
|
22
64
|
|
|
23
|
-
|
|
65
|
+
## Installation
|
|
24
66
|
|
|
25
|
-
|
|
67
|
+
```bash
|
|
68
|
+
bun add @phonecheck/phone-number-validator-js
|
|
69
|
+
# or
|
|
70
|
+
npm install @phonecheck/phone-number-validator-js
|
|
71
|
+
# or
|
|
72
|
+
pnpm add @phonecheck/phone-number-validator-js
|
|
73
|
+
```
|
|
26
74
|
|
|
27
|
-
|
|
75
|
+
### Requirements (consumers)
|
|
76
|
+
- Node.js >= 22 (Maintenance LTS) — the published bundle is plain Node.js + ESM/CJS
|
|
77
|
+
- TypeScript >= 4.0 (for TypeScript users)
|
|
28
78
|
|
|
29
|
-
|
|
79
|
+
### Requirements (contributing)
|
|
80
|
+
- Bun >= 1.3 (test runner, package manager, dev tooling)
|
|
81
|
+
- Node.js >= 24 only needed for `semantic-release` during the publish step
|
|
30
82
|
|
|
31
|
-
|
|
83
|
+
### Build System
|
|
84
|
+
- Rollup builds CJS + ESM bundles for the main package and per-platform serverless adapters
|
|
85
|
+
- `bun test` for the unit + isolated suites (no jest, no ts-jest)
|
|
86
|
+
- BSON resource tables (geocodes, carrier mappings, timezones) ship under
|
|
87
|
+
`resources/` next to the published `dist/`
|
|
32
88
|
|
|
33
|
-
|
|
89
|
+
## Quick Start
|
|
34
90
|
|
|
35
|
-
|
|
91
|
+
```typescript
|
|
92
|
+
import {
|
|
93
|
+
carrier,
|
|
94
|
+
geocoder,
|
|
95
|
+
parsePhoneNumberFromString,
|
|
96
|
+
timezones,
|
|
97
|
+
} from '@phonecheck/phone-number-validator-js';
|
|
36
98
|
|
|
37
|
-
|
|
99
|
+
const phone = parsePhoneNumberFromString('+41431234567');
|
|
38
100
|
|
|
101
|
+
geocoder(phone); // → "Zurich"
|
|
102
|
+
geocoder(phone, 'de'); // → "Zürich"
|
|
103
|
+
carrier(parsePhoneNumberFromString('01701234567', 'DE'));
|
|
104
|
+
// → "T-Mobile"
|
|
105
|
+
timezones(parsePhoneNumberFromString('+12124567890'));
|
|
106
|
+
// → ["America/New_York"]
|
|
107
|
+
```
|
|
39
108
|
|
|
40
|
-
|
|
41
|
-
- Increase delivery rate of SMS campaigns by removing invalid phone numbers
|
|
42
|
-
- Increase SMS open rate and your marketing IPs reputation
|
|
43
|
-
- Protect your website from spam, bots and fake phone numbers
|
|
44
|
-
- Protect your product signup form from fake phone numbers
|
|
45
|
-
- Protect your website forms from fake phone numbers
|
|
46
|
-
- Protect your self from fraud orders and accounts using fake phone numbers
|
|
47
|
-
- Integrate phone number verification into your website forms
|
|
48
|
-
- Integrate phone number verification into your backoffice administration and order processing
|
|
49
|
-
- Integrate phone number verification into your mobile apps
|
|
109
|
+
For a one-shot enrichment call:
|
|
50
110
|
|
|
51
|
-
|
|
52
|
-
|
|
111
|
+
```typescript
|
|
112
|
+
import { enrichPhoneNumber, parsePhoneNumberFromString }
|
|
113
|
+
from '@phonecheck/phone-number-validator-js';
|
|
114
|
+
|
|
115
|
+
const phone = parsePhoneNumberFromString('+8619912345678');
|
|
116
|
+
await enrichPhoneNumber(phone, { carrierLocale: 'zh' });
|
|
117
|
+
// {
|
|
118
|
+
// geocode: "Hubei",
|
|
119
|
+
// carrier: "中国电信",
|
|
120
|
+
// timezones: ["Asia/Shanghai", ...]
|
|
121
|
+
// }
|
|
122
|
+
```
|
|
53
123
|
|
|
54
|
-
|
|
124
|
+
## API Reference
|
|
55
125
|
|
|
56
|
-
|
|
126
|
+
### Core Functions
|
|
57
127
|
|
|
58
|
-
|
|
128
|
+
#### `geocoder(phone, locale = 'en'): string | null`
|
|
59
129
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
130
|
+
Resolve a city / region for the given parsed phone number. Returns `null` for
|
|
131
|
+
landline-only ranges, unknown country codes, or invalid input. Falls back to
|
|
132
|
+
English when the locale-specific table is missing.
|
|
63
133
|
|
|
64
|
-
|
|
134
|
+
#### `carrier(phone, locale = 'en'): string | null`
|
|
65
135
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
136
|
+
Resolve the **original** carrier from Google's carrier-allocation tables.
|
|
137
|
+
Note this does **not** reflect ports — see [the upstream FAQ][lpn-carrier].
|
|
138
|
+
Returns `null` for landlines and unmapped ranges.
|
|
69
139
|
|
|
70
|
-
|
|
140
|
+
[lpn-carrier]: https://github.com/google/libphonenumber#mapping-phone-numbers-to-original-carriers
|
|
71
141
|
|
|
72
|
-
|
|
142
|
+
#### `timezones(phone): string[] | null`
|
|
73
143
|
|
|
74
|
-
|
|
75
|
-
- `carrier(phonenumber: PhoneNumber, locale?: CarrierLocale = 'en'): string | null` - Resolves to the carrier or null if non could be found (e.g. for fixed line numbers)
|
|
76
|
-
- `timezones(phonenumber: PhoneNumber): Array<string> | null` - Resolved to an array of timezones or null if non where found.
|
|
144
|
+
Resolve one or more IANA timezone IDs for the given E.164 number.
|
|
77
145
|
|
|
78
|
-
|
|
146
|
+
#### Async variants
|
|
79
147
|
|
|
80
|
-
|
|
81
|
-
- `getCacheSize(): number` - Get current cache size
|
|
82
|
-
- `setCacheSize(size: number): void` - Set maximum cache size (default: 100)
|
|
148
|
+
Same signatures, returning a `Promise`:
|
|
83
149
|
|
|
84
|
-
|
|
150
|
+
- `geocoderAsync(phone, locale?)`
|
|
151
|
+
- `carrierAsync(phone, locale?)`
|
|
152
|
+
- `timezonesAsync(phone)`
|
|
153
|
+
- `enrichPhoneNumber(phone, options?)` — runs all three in parallel
|
|
85
154
|
|
|
86
|
-
|
|
155
|
+
The async variants only require `loader.loadResource`. The sync ones require
|
|
156
|
+
`loader.loadResourceSync`. The bundled `NodeFsResourceLoader` provides both.
|
|
87
157
|
|
|
88
|
-
|
|
89
|
-
import { geocoder, carrier, timezones, parsePhoneNumberFromString } from '@phonecheck/phone-number-validator-js'
|
|
158
|
+
### Cache
|
|
90
159
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
160
|
+
```typescript
|
|
161
|
+
import {
|
|
162
|
+
clearCache,
|
|
163
|
+
DEFAULT_CACHE_SIZE, // 100
|
|
164
|
+
getCacheSize,
|
|
165
|
+
getCacheStats, // { size, maxSize }
|
|
166
|
+
setCacheSize,
|
|
167
|
+
} from '@phonecheck/phone-number-validator-js';
|
|
168
|
+
```
|
|
95
169
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
170
|
+
The cache stores deserialized BSON tables (one per `country-code/locale`
|
|
171
|
+
pair). Resize for memory-tight environments, clear it for tests / long-running
|
|
172
|
+
workers.
|
|
99
173
|
|
|
100
|
-
|
|
101
|
-
const tzones = timezones(fixedLineNumber2) // ['Europe/Berlin']
|
|
102
|
-
```
|
|
174
|
+
### Resource loaders
|
|
103
175
|
|
|
104
|
-
|
|
176
|
+
```typescript
|
|
177
|
+
import { NodeFsResourceLoader, setResourceLoader }
|
|
178
|
+
from '@phonecheck/phone-number-validator-js';
|
|
105
179
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
clearCache,
|
|
109
|
-
getCacheSize,
|
|
110
|
-
setCacheSize,
|
|
111
|
-
geocoder,
|
|
112
|
-
parsePhoneNumberFromString
|
|
113
|
-
} from '@phonecheck/phone-number-validator-js'
|
|
180
|
+
setResourceLoader(new NodeFsResourceLoader({ resourcesDir: '/custom/path' }));
|
|
181
|
+
```
|
|
114
182
|
|
|
115
|
-
|
|
116
|
-
|
|
183
|
+
The Node entry installs a default loader pointing at the bundled `resources/`.
|
|
184
|
+
Swap it for serverless / edge — see [Custom Resource Loaders](#custom-resource-loaders).
|
|
117
185
|
|
|
118
|
-
|
|
119
|
-
console.log(`Cache size: ${getCacheSize()}`)
|
|
186
|
+
### Re-exports
|
|
120
187
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
188
|
+
Everything from `libphonenumber-js` is re-exported under the same name —
|
|
189
|
+
`parsePhoneNumberFromString`, `parsePhoneNumberWithError`, `PhoneNumber`,
|
|
190
|
+
`CountryCode`, formatters, etc. One import covers parsing + enrichment.
|
|
124
191
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
192
|
+
### Locale types
|
|
193
|
+
|
|
194
|
+
`GeocoderLocale` and `CarrierLocale` are union types listing the supported
|
|
195
|
+
locales (auto-generated by `scripts/prepare-metadata.ts`). Use them for
|
|
196
|
+
exhaustive switches:
|
|
129
197
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
clearCache()
|
|
133
|
-
}, 3600000) // Clear every hour
|
|
198
|
+
```typescript
|
|
199
|
+
import type { GeocoderLocale } from '@phonecheck/phone-number-validator-js';
|
|
134
200
|
```
|
|
135
201
|
|
|
136
|
-
|
|
202
|
+
## Examples
|
|
137
203
|
|
|
138
|
-
|
|
139
|
-
import { geocoder, parsePhoneNumberFromString } from '@phonecheck/phone-number-validator-js'
|
|
204
|
+
### Detecting number type
|
|
140
205
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
const result = geocoder(invalid) // null
|
|
206
|
+
```typescript
|
|
207
|
+
import { parsePhoneNumberFromString } from '@phonecheck/phone-number-validator-js';
|
|
144
208
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
const result3 = geocoder(null) // null
|
|
209
|
+
const phone = parsePhoneNumberFromString('+14155552671');
|
|
210
|
+
phone?.getType(); // 'FIXED_LINE_OR_MOBILE'
|
|
148
211
|
```
|
|
149
212
|
|
|
150
|
-
###
|
|
213
|
+
### Validating + formatting in one pass
|
|
151
214
|
|
|
152
215
|
```typescript
|
|
153
|
-
import {
|
|
154
|
-
geocoder,
|
|
155
|
-
carrier,
|
|
156
|
-
timezones,
|
|
157
|
-
parsePhoneNumberFromString,
|
|
158
|
-
PhoneNumber,
|
|
159
|
-
GeocoderLocale,
|
|
160
|
-
CarrierLocale
|
|
161
|
-
} from '@phonecheck/phone-number-validator-js'
|
|
216
|
+
import { parsePhoneNumberFromString } from '@phonecheck/phone-number-validator-js';
|
|
162
217
|
|
|
163
|
-
|
|
164
|
-
const
|
|
165
|
-
|
|
218
|
+
function normalize(input: string): string | null {
|
|
219
|
+
const phone = parsePhoneNumberFromString(input, 'US');
|
|
220
|
+
if (!phone?.isValid()) return null;
|
|
221
|
+
return phone.format('E.164');
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
normalize('(415) 555-2671'); // '+14155552671'
|
|
225
|
+
normalize('not a number'); // null
|
|
226
|
+
```
|
|
166
227
|
|
|
167
|
-
|
|
168
|
-
const carrierInfo: string | null = carrier(phoneNumber)
|
|
169
|
-
const tzs: string[] | null = timezones(phoneNumber)
|
|
228
|
+
### Iterating with locale fallback
|
|
170
229
|
|
|
171
|
-
|
|
172
|
-
import {
|
|
230
|
+
```typescript
|
|
231
|
+
import { geocoder, parsePhoneNumberFromString }
|
|
232
|
+
from '@phonecheck/phone-number-validator-js';
|
|
173
233
|
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
|
|
234
|
+
const numbers = ['+41431234567', '+8619912345678', '+12124567890'];
|
|
235
|
+
for (const n of numbers) {
|
|
236
|
+
console.log(n, '→', geocoder(parsePhoneNumberFromString(n), 'de'));
|
|
237
|
+
}
|
|
238
|
+
// +41431234567 → Zürich (de table)
|
|
239
|
+
// +8619912345678 → Hubei (en fallback — no de carrier table for 86)
|
|
240
|
+
// +12124567890 → New York (en fallback)
|
|
177
241
|
```
|
|
178
242
|
|
|
179
|
-
##
|
|
243
|
+
## Command-line Tool (`phone-validate`)
|
|
180
244
|
|
|
181
|
-
|
|
245
|
+
Installing the package globally exposes a `phone-validate` binary:
|
|
182
246
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
- **Same API** - drop-in replacement for the standard version
|
|
247
|
+
```bash
|
|
248
|
+
$ bun add -g @phonecheck/phone-number-validator-js
|
|
249
|
+
$ phone-validate +14155552671
|
|
250
|
+
```
|
|
188
251
|
|
|
189
|
-
|
|
252
|
+
```text
|
|
253
|
+
✓ VALID +14155552671
|
|
190
254
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
setResourceLoader,
|
|
195
|
-
parsePhoneNumber,
|
|
196
|
-
geocoder,
|
|
197
|
-
carrier,
|
|
198
|
-
timezones
|
|
199
|
-
} from '@phonecheck/phone-number-validator-js/serverless'
|
|
200
|
-
```
|
|
255
|
+
Summary
|
|
256
|
+
country: US (+1)
|
|
257
|
+
type: FIXED_LINE_OR_MOBILE
|
|
201
258
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
// Set up resource loader
|
|
212
|
-
setResourceLoader({
|
|
213
|
-
async loadResource(path) {
|
|
214
|
-
try {
|
|
215
|
-
const command = new GetObjectCommand({
|
|
216
|
-
Bucket: process.env.RESOURCES_BUCKET,
|
|
217
|
-
Key: `phone-validator/${path}`
|
|
218
|
-
})
|
|
219
|
-
const response = await s3.send(command)
|
|
220
|
-
return new Uint8Array(await response.Body.transformToByteArray())
|
|
221
|
-
} catch {
|
|
222
|
-
return null
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
})
|
|
226
|
-
|
|
227
|
-
// Lambda handler
|
|
228
|
-
export async function handler(event) {
|
|
229
|
-
const phoneNumber = parsePhoneNumber(event.phone, event.country)
|
|
230
|
-
const location = await geocoder(phoneNumber)
|
|
231
|
-
|
|
232
|
-
return {
|
|
233
|
-
statusCode: 200,
|
|
234
|
-
body: JSON.stringify({ location })
|
|
235
|
-
}
|
|
236
|
-
}
|
|
259
|
+
Formatted
|
|
260
|
+
E.164: +14155552671
|
|
261
|
+
national: (415) 555-2671
|
|
262
|
+
international: +1 415 555 2671
|
|
263
|
+
RFC3966: tel:+14155552671
|
|
264
|
+
|
|
265
|
+
Enrichment
|
|
266
|
+
geocode: San Francisco
|
|
267
|
+
timezones: America/Los_Angeles
|
|
237
268
|
```
|
|
238
269
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
setResourceLoader({
|
|
245
|
-
async loadResource(path) {
|
|
246
|
-
const object = await env.RESOURCES_BUCKET.get(`phone-validator/${path}`)
|
|
247
|
-
if (!object) return null
|
|
248
|
-
const buffer = await object.arrayBuffer()
|
|
249
|
-
return new Uint8Array(buffer)
|
|
250
|
-
}
|
|
251
|
-
})
|
|
252
|
-
|
|
253
|
-
export default {
|
|
254
|
-
async fetch(request, env) {
|
|
255
|
-
const url = new URL(request.url)
|
|
256
|
-
const phone = url.searchParams.get('phone')
|
|
257
|
-
|
|
258
|
-
const phoneNumber = parsePhoneNumber(phone)
|
|
259
|
-
const carrierInfo = await carrier(phoneNumber)
|
|
260
|
-
|
|
261
|
-
return Response.json({ carrier: carrierInfo })
|
|
262
|
-
}
|
|
263
|
-
}
|
|
270
|
+
Output formats:
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
phone-validate +14155552671 --format json --quiet --no-log-file | jq
|
|
274
|
+
phone-validate "(415) 555-2671" --country US --format text
|
|
264
275
|
```
|
|
265
276
|
|
|
266
|
-
|
|
267
|
-
```js
|
|
268
|
-
import { setResourceLoader, timezones, parsePhoneNumber } from '@phonecheck/phone-number-validator-js/serverless'
|
|
269
|
-
|
|
270
|
-
// Use Vercel Blob storage
|
|
271
|
-
setResourceLoader({
|
|
272
|
-
async loadResource(path) {
|
|
273
|
-
const response = await fetch(`${process.env.BLOB_URL}/phone-validator/${path}`)
|
|
274
|
-
if (!response.ok) return null
|
|
275
|
-
const buffer = await response.arrayBuffer()
|
|
276
|
-
return new Uint8Array(buffer)
|
|
277
|
-
}
|
|
278
|
-
})
|
|
277
|
+
Exit codes: `0` valid, `1` invalid / unparseable, `2` bad CLI args.
|
|
279
278
|
|
|
280
|
-
|
|
279
|
+
Run `phone-validate --help` for the full flag list.
|
|
281
280
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
281
|
+
## Cache Management
|
|
282
|
+
|
|
283
|
+
```typescript
|
|
284
|
+
import {
|
|
285
|
+
clearCache,
|
|
286
|
+
getCacheStats,
|
|
287
|
+
setCacheSize,
|
|
288
|
+
} from '@phonecheck/phone-number-validator-js';
|
|
289
|
+
|
|
290
|
+
setCacheSize(500); // default 100
|
|
291
|
+
getCacheStats(); // { size: 17, maxSize: 500 }
|
|
292
|
+
clearCache(); // drop all entries
|
|
289
293
|
```
|
|
290
294
|
|
|
291
|
-
|
|
295
|
+
The cache is keyed by the loader path (`geocodes/en/41.bson`, …) so a single
|
|
296
|
+
process shares hits across the Node entry and any serverless adapter that
|
|
297
|
+
also runs in it.
|
|
292
298
|
|
|
293
|
-
|
|
299
|
+
## Custom Resource Loaders
|
|
294
300
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
tar -xf phonecheck-phone-number-validator-js-*.tgz
|
|
299
|
-
cp -r package/resources/* your-storage-location/
|
|
300
|
-
```
|
|
301
|
+
Implement `ResourceLoader` to host the BSON tables anywhere — KV, R2, S3, a
|
|
302
|
+
public CDN, an in-memory map. The loader is the only thing that changes
|
|
303
|
+
between runtimes; the resolver is the same.
|
|
301
304
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
loadResourceSync(path) {
|
|
315
|
-
// Synchronous loading implementation
|
|
316
|
-
return loadFromCacheSync(path)
|
|
317
|
-
},
|
|
318
|
-
async loadResource(path) {
|
|
319
|
-
// Async fallback
|
|
320
|
-
return loadFromCacheAsync(path)
|
|
305
|
+
```typescript
|
|
306
|
+
import {
|
|
307
|
+
setResourceLoader,
|
|
308
|
+
type ResourceLoader,
|
|
309
|
+
} from '@phonecheck/phone-number-validator-js/serverless';
|
|
310
|
+
|
|
311
|
+
class S3Loader implements ResourceLoader {
|
|
312
|
+
async loadResource(path: string): Promise<Uint8Array | null> {
|
|
313
|
+
const res = await fetch(`https://my-bucket.s3.amazonaws.com/phone/${path}`);
|
|
314
|
+
if (res.status === 404) return null;
|
|
315
|
+
if (!res.ok) throw new Error(`S3 ${res.status} for ${path}`);
|
|
316
|
+
return new Uint8Array(await res.arrayBuffer());
|
|
321
317
|
}
|
|
322
|
-
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
setResourceLoader(new S3Loader());
|
|
323
321
|
```
|
|
324
322
|
|
|
325
|
-
|
|
323
|
+
Two implementations ship in the package:
|
|
326
324
|
|
|
325
|
+
| Loader | Backed by | Sync? | Use when |
|
|
326
|
+
|-|-|-|-|
|
|
327
|
+
| `NodeFsResourceLoader` | `node:fs` | ✓ | Running on Node.js with the bundled `resources/` |
|
|
328
|
+
| `FetchResourceLoader` | `fetch` | ✗ | Tables hosted on a CDN / R2 / S3 with public reads |
|
|
329
|
+
| `KvResourceLoader` | Workers KV-shape | ✗ | Cloudflare KV or any KV-shaped store |
|
|
327
330
|
|
|
328
|
-
##
|
|
331
|
+
## Serverless Usage
|
|
332
|
+
|
|
333
|
+
For deployment recipes — wrangler.toml, Vercel routes, lambda zips, GCP
|
|
334
|
+
function entries, Netlify redirects, Azure host.json — see
|
|
335
|
+
**[SERVERLESS.md](./SERVERLESS.md)**.
|
|
329
336
|
|
|
330
|
-
|
|
337
|
+
A minimal Cloudflare Worker:
|
|
331
338
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
- **<1ms lookups** after initial data load
|
|
339
|
+
```typescript
|
|
340
|
+
// src/worker.ts
|
|
341
|
+
import worker from '@phonecheck/phone-number-validator-js/serverless/cloudflare';
|
|
336
342
|
|
|
337
|
-
|
|
343
|
+
// Bind PHONE_RESOURCES (KV) in wrangler.toml. The adapter auto-installs a
|
|
344
|
+
// loader from it.
|
|
345
|
+
export default worker;
|
|
346
|
+
```
|
|
338
347
|
|
|
339
|
-
|
|
348
|
+
```toml
|
|
349
|
+
# wrangler.toml
|
|
350
|
+
[[kv_namespaces]]
|
|
351
|
+
binding = "PHONE_RESOURCES"
|
|
352
|
+
id = "..."
|
|
353
|
+
```
|
|
340
354
|
|
|
341
355
|
```bash
|
|
342
|
-
|
|
356
|
+
$ curl -X POST https://my.workers.dev/ \
|
|
357
|
+
-H 'content-type: application/json' \
|
|
358
|
+
-d '{ "phoneNumber": "+14155552671" }'
|
|
359
|
+
{ "success": true, "data": { "valid": true, ... } }
|
|
343
360
|
```
|
|
344
361
|
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
-
|
|
348
|
-
|
|
362
|
+
## Performance
|
|
363
|
+
|
|
364
|
+
- BSON tables are loaded **once per `country-code/locale`** and cached as
|
|
365
|
+
decoded `Document`s.
|
|
366
|
+
- Default cache size is 100 entries — enough for the top ~50 country codes in
|
|
367
|
+
English and a fallback locale at the same time.
|
|
368
|
+
- Per-lookup cost after warm-up is a single object access + a `while` loop
|
|
369
|
+
over the prefix (~2-4 iterations on average).
|
|
370
|
+
- The pure verifier bundle is **~80 KB minified** (libphonenumber-js
|
|
371
|
+
dominates); Workers-only deployments can shrink further by importing
|
|
372
|
+
`/serverless/verifier` directly instead of `/serverless`.
|
|
349
373
|
|
|
350
374
|
## Testing
|
|
351
375
|
|
|
352
376
|
```bash
|
|
353
|
-
|
|
377
|
+
bun install
|
|
378
|
+
bun run typecheck
|
|
379
|
+
bun run lint
|
|
380
|
+
bun run test # unit + isolated, no network, no real fs
|
|
381
|
+
bun run test:integration # opt-in: requires bundled resources/
|
|
354
382
|
```
|
|
355
383
|
|
|
356
|
-
|
|
384
|
+
The unit suite uses an in-memory `MockResourceLoader` so it's fast (under a
|
|
385
|
+
second) and deterministic. The isolated suite exercises the bundled
|
|
386
|
+
`NodeFsResourceLoader` against the real `resources/` directory.
|
|
357
387
|
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
388
|
+
For the full test layout, run commands, BSON-key conventions, and CI matrix,
|
|
389
|
+
see [TESTING.md](./TESTING.md).
|
|
390
|
+
|
|
391
|
+
## Architecture
|
|
392
|
+
|
|
393
|
+
For the module map, request lifecycle, adapter pattern, and how the
|
|
394
|
+
sync/async API parity works, see [ARCHITECTURE.md](./ARCHITECTURE.md).
|
|
361
395
|
|
|
362
396
|
## Contributing
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
| **Development & Prototyping** | | |
|
|
388
|
-
| 💡 Building proof-of-concept applications | ✅ **No** | Create demos and prototypes |
|
|
389
|
-
| 🛠️ Internal tools (not customer-facing) | ✅ **No** | Use for internal development tools |
|
|
390
|
-
| 📚 Open source projects (non-commercial) | ✅ **No** | Contribute to the community |
|
|
391
|
-
| **Commercial & Production Use** | | |
|
|
392
|
-
| 💰 Revenue-generating applications | ❌ **Yes** | Any app that generates income |
|
|
393
|
-
| ☁️ Software as a Service (SaaS) products | ❌ **Yes** | Cloud-based service offerings |
|
|
394
|
-
| 📦 Distributed commercial software | ❌ **Yes** | Software sold to customers |
|
|
395
|
-
| 🏢 Enterprise production systems | ❌ **Yes** | Business-critical applications |
|
|
396
|
-
| 🔄 Forking for commercial purposes | ❌ **Yes** | Creating derivative commercial products |
|
|
397
|
-
| 🏭 Production use in any form | ❌ **Yes** | Live systems serving real users |
|
|
398
|
-
| **Specific Scenarios** | | |
|
|
399
|
-
| 🎓 Student projects and coursework | ✅ **No** | Academic use is encouraged |
|
|
400
|
-
| 🏗️ CI/CD pipelines (for commercial products) | ❌ **Yes** | Part of commercial development |
|
|
401
|
-
| 📱 Phone validation in production APIs | ❌ **Yes** | Production service usage |
|
|
402
|
-
| 🛒 E-commerce checkout validation | ❌ **Yes** | Revenue-related validation |
|
|
403
|
-
| 📱 Mobile apps (free with ads or paid) | ❌ **Yes** | Monetized applications |
|
|
404
|
-
|
|
405
|
-
### 💡 Quick Decision Guide
|
|
406
|
-
|
|
407
|
-
Ask yourself these questions:
|
|
408
|
-
1. **Will real users interact with this in production?** → You need a license
|
|
409
|
-
2. **Will this help generate revenue?** → You need a license
|
|
410
|
-
3. **Is this for learning or testing only?** → No license needed
|
|
411
|
-
4. **Is this an internal prototype or POC?** → No license needed
|
|
412
|
-
|
|
413
|
-
### 🎯 Why Choose Our Commercial License?
|
|
414
|
-
|
|
415
|
-
✨ **Unlimited Usage** - Use in all your production applications
|
|
416
|
-
🚀 **Priority Support** - Direct support from our engineering team
|
|
417
|
-
🔄 **Regular Updates** - Get the latest features and improvements
|
|
418
|
-
🛡️ **Legal Protection** - Full commercial rights and warranty
|
|
419
|
-
🏢 **Enterprise Ready** - Suitable for large-scale deployments
|
|
420
|
-
|
|
421
|
-
### 📄 Get Your Commercial License
|
|
422
|
-
|
|
423
|
-
Ready to use phone-number-validator-js in production?
|
|
424
|
-
|
|
425
|
-
🛍️ **[Purchase a License](https://phone-check.app/license/phone-number-validator)** - Simple pricing, instant activation
|
|
426
|
-
📧 **[Contact Sales](mailto:sales@phone-check.app?subject=Interested%20in%20phone-number-validator-js%20commercial%20license)** - For enterprise or custom needs
|
|
397
|
+
|
|
398
|
+
- Read [AGENTS.md](./AGENTS.md) — code style, branching, commit conventions
|
|
399
|
+
- Branch off `develop`; PRs target `develop`
|
|
400
|
+
- `bun run typecheck && bun run test && bun run build` must be clean
|
|
401
|
+
- Conventional Commits drive the release: `feat:`, `fix:`, `perf:` are
|
|
402
|
+
releasable; `chore:`, `docs:`, `test:` are not
|
|
403
|
+
- Pre-commit hook runs Biome via `lint-staged`; please don't `--no-verify`
|
|
404
|
+
|
|
405
|
+
## Documentation index
|
|
406
|
+
|
|
407
|
+
| Doc | What's in it |
|
|
408
|
+
| - | - |
|
|
409
|
+
| [README.md](./README.md) | Public API, quick start, CLI, examples |
|
|
410
|
+
| [ARCHITECTURE.md](./ARCHITECTURE.md) | Module map, data flow, adapter pattern |
|
|
411
|
+
| [SERVERLESS.md](./SERVERLESS.md) | AWS / Vercel / Cloudflare / GCP / Netlify / Azure deployment |
|
|
412
|
+
| [TESTING.md](./TESTING.md) | Test layout, run commands, BSON-key conventions |
|
|
413
|
+
| [AGENTS.md](./AGENTS.md) | Code-style rules, code-pattern conventions |
|
|
414
|
+
| [examples/README.md](./examples/README.md) | Runnable example index |
|
|
415
|
+
| [CHANGELOG.md](./CHANGELOG.md) | Release history (auto-managed) |
|
|
416
|
+
| [LICENSE.md](./LICENSE.md) | License terms |
|
|
417
|
+
|
|
418
|
+
## License
|
|
419
|
+
|
|
420
|
+
See [LICENSE.md](./LICENSE.md).
|