@phonecheck/phone-number-validator-js 2.0.0-beta.1 → 2.1.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/dist/cli/index.js +44 -44
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.esm.js +102 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -1
- package/dist/serverless/index.cjs.js +123 -111
- package/dist/serverless/index.cjs.js.map +1 -1
- package/dist/serverless/index.d.ts +8 -3
- package/dist/serverless/index.esm.js +112 -112
- package/dist/serverless/index.esm.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -137,6 +137,50 @@ class NodeFsResourceLoader {
|
|
|
137
137
|
}
|
|
138
138
|
}
|
|
139
139
|
|
|
140
|
+
function resolveOptions(options) {
|
|
141
|
+
return {
|
|
142
|
+
defaultCountry: options.defaultCountry,
|
|
143
|
+
locale: options.locale ?? "en",
|
|
144
|
+
carrierLocale: options.carrierLocale ?? "en",
|
|
145
|
+
// Each enrichment toggle defaults to ON when unset — opt-out, not opt-in.
|
|
146
|
+
geocode: options.geocode ?? true,
|
|
147
|
+
carrier: options.carrier ?? true,
|
|
148
|
+
timezones: options.timezones ?? true
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
async function validateOne(input, options) {
|
|
152
|
+
const parsed = libphonenumberJs.parsePhoneNumberFromString(input, options.defaultCountry);
|
|
153
|
+
if (!parsed?.isValid()) {
|
|
154
|
+
return { input, valid: false, error: "Invalid or unparseable phone number" };
|
|
155
|
+
}
|
|
156
|
+
const [geocode, carrier, timezones] = await Promise.all([
|
|
157
|
+
options.geocode ? geocoderAsync(parsed, options.locale) : Promise.resolve(void 0),
|
|
158
|
+
options.carrier ? carrierAsync(parsed, options.carrierLocale) : Promise.resolve(void 0),
|
|
159
|
+
options.timezones ? timezonesAsync(parsed) : Promise.resolve(void 0)
|
|
160
|
+
]);
|
|
161
|
+
const result = {
|
|
162
|
+
input,
|
|
163
|
+
valid: true,
|
|
164
|
+
formatted: {
|
|
165
|
+
e164: parsed.format("E.164"),
|
|
166
|
+
international: parsed.formatInternational(),
|
|
167
|
+
national: parsed.formatNational(),
|
|
168
|
+
rfc3966: parsed.format("RFC3966")
|
|
169
|
+
},
|
|
170
|
+
country: parsed.country,
|
|
171
|
+
countryCallingCode: parsed.countryCallingCode.toString(),
|
|
172
|
+
nationalNumber: parsed.nationalNumber.toString(),
|
|
173
|
+
type: parsed.getType()
|
|
174
|
+
};
|
|
175
|
+
if (geocode !== void 0) result.geocode = geocode;
|
|
176
|
+
if (carrier !== void 0) result.carrier = carrier;
|
|
177
|
+
if (timezones !== void 0) result.timezones = timezones;
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
async function validateSingle(input, options = {}) {
|
|
181
|
+
return validateOne(input, resolveOptions(options));
|
|
182
|
+
}
|
|
183
|
+
|
|
140
184
|
setResourceLoader(new NodeFsResourceLoader());
|
|
141
185
|
|
|
142
186
|
const HELP_TEXT = `phone-validate <phone-number> [options]
|
|
@@ -309,50 +353,6 @@ function helpText() {
|
|
|
309
353
|
return HELP_TEXT;
|
|
310
354
|
}
|
|
311
355
|
|
|
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
356
|
function colorize() {
|
|
357
357
|
const enabled = process.stdout.isTTY && process.env.NO_COLOR !== "1";
|
|
358
358
|
const wrap = (open, close) => (s) => enabled ? `\x1B[${open}m${s}\x1B[${close}m` : s;
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/cache.ts","../../src/core.ts","../../src/node-fs-loader.ts","../../src/index.ts","../../src/cli/parse-args.ts","../../src/serverless/_shared/dispatch.ts","../../src/cli/format.ts","../../src/cli/run.ts","../../src/cli/index.ts"],"sourcesContent":["/**\n * Shared in-memory LRU for deserialized BSON lookup tables.\n *\n * The cache is keyed by the loader path (e.g. `geocodes/en/41.bson`) so the\n * same key is portable across the Node FS loader and any custom loader that\n * uses the same path scheme. Keeping the cache here (instead of inside each\n * loader) means the Node entry and any serverless adapter share the same hit\n * rate when invoked in the same process.\n */\nimport { lru } from 'tiny-lru';\nimport type { CacheStats, LookupTable } from './types';\n\nexport const DEFAULT_CACHE_SIZE = 100;\n\nlet cache = lru<LookupTable>(DEFAULT_CACHE_SIZE);\nlet maxSize = DEFAULT_CACHE_SIZE;\n\n/** Internal — used by `core.ts` for read/write. */\nexport function cacheGet(key: string): LookupTable | undefined {\n return cache.get(key);\n}\n\nexport function cacheSet(key: string, value: LookupTable): void {\n cache.set(key, value);\n}\n\n/** Drop every entry. Useful between tests and for long-running processes. */\nexport function clearCache(): void {\n cache.clear();\n}\n\n/** Live entry count (does not include keys evicted by the LRU). */\nexport function getCacheSize(): number {\n return cache.size;\n}\n\n/** Snapshot — helpful for `/health` endpoints in serverless adapters. */\nexport function getCacheStats(): CacheStats {\n return { size: cache.size, maxSize };\n}\n\n/**\n * Resize the cache. Existing entries are migrated newest-first up to the new\n * ceiling; any overflow is dropped. Calling this with the current size is a\n * no-op (kept for symmetry with `clearCache`).\n */\nexport function setCacheSize(size: number): void {\n if (size <= 0) {\n throw new Error(`Cache size must be > 0 (got ${size})`);\n }\n if (size === maxSize) return;\n\n const previous = cache;\n cache = lru<LookupTable>(size);\n maxSize = size;\n\n // tiny-lru exposes entries() oldest-first; reverse so we keep the most\n // recently used items when shrinking.\n const entries = [...previous.entries()].reverse();\n for (const [key, value] of entries) {\n if (cache.size >= size) break;\n cache.set(key, value as LookupTable);\n }\n}\n","/**\n * Pure resolver — turns a parsed phone number + a `ResourceLoader` into a\n * geocoded location, carrier, or timezone list.\n *\n * Single source of truth for the lookup algorithm: try the requested locale,\n * fall back to `en` if missing, and walk the national-number prefix from\n * longest to shortest looking for a match in the BSON lookup table.\n *\n * The Node entry (`index.ts`) wraps this with a synchronous `node:fs` loader.\n * Serverless adapters wrap it with KV / R2 / S3 / `fetch`-based loaders. The\n * sync variants (`geocoder` / `carrier` / `timezones`) require the loader to\n * implement `loadResourceSync` — they return `null` otherwise.\n */\nimport { deserialize } from 'bson';\nimport { cacheGet, cacheSet } from './cache';\nimport type {\n CarrierLocale,\n GeocoderLocale,\n LookupTable,\n MaybePhoneNumber,\n ResourceKind,\n ResourceLoader,\n} from './types';\n\nconst DEFAULT_LOCALE = 'en';\nconst TIMEZONES_PATH = 'timezones.bson';\n\nlet activeLoader: ResourceLoader | null = null;\n\n/** Replace (or clear, with `null`) the loader used by every lookup function. */\nexport function setResourceLoader(loader: ResourceLoader | null): void {\n activeLoader = loader;\n}\n\nexport function getResourceLoader(): ResourceLoader | null {\n return activeLoader;\n}\n\n/* ── Lookup primitives ─────────────────────────────────────────────────── */\n\n/**\n * Walk the prefix from longest to shortest, returning the first non-empty\n * string match. The BSON tables are keyed on national-number prefixes\n * (e.g. `\"4155\"` for SF) — this matches Google libphonenumber's lookup.\n */\nfunction findByPrefix(table: LookupTable, key: string): string | null {\n for (let prefix = key; prefix.length > 0; prefix = prefix.slice(0, -1)) {\n const value = table[prefix];\n if (typeof value === 'string' && value.length > 0) return value;\n }\n return null;\n}\n\n/** `null` for empty / undecodable input — always callers' guard. */\nfunction decodeBson(bytes: Uint8Array | null): LookupTable | null {\n if (!bytes || bytes.byteLength === 0) return null;\n // bson.deserialize accepts Uint8Array on Node (Buffer is a subclass), but we\n // coerce explicitly so older typings don't complain.\n const buf = Buffer.isBuffer(bytes) ? bytes : Buffer.from(bytes);\n return deserialize(buf) as LookupTable;\n}\n\n/** Quiet in production; loud in dev. Custom loaders can pre-emptively swallow. */\nfunction logLoadError(path: string, err: unknown): void {\n if (process.env.NODE_ENV !== 'production') {\n console.error(`Error loading data from ${path}:`, err);\n }\n}\n\n/**\n * Decode + cache `bytes` under `path`. Centralises the post-fetch path so the\n * sync and async loaders share the same cache-write semantics.\n */\nfunction rememberTable(path: string, bytes: Uint8Array | null): LookupTable | null {\n const table = decodeBson(bytes);\n if (!table) return null;\n cacheSet(path, table);\n return table;\n}\n\n/* ── Loader I/O wrappers ───────────────────────────────────────────────── */\n\nasync function loadTableAsync(path: string): Promise<LookupTable | null> {\n if (!activeLoader) return null;\n const cached = cacheGet(path);\n if (cached) return cached;\n try {\n return rememberTable(path, await activeLoader.loadResource(path));\n } catch (err) {\n logLoadError(path, err);\n return null;\n }\n}\n\nfunction loadTableSync(path: string): LookupTable | null {\n if (!activeLoader?.loadResourceSync) return null;\n const cached = cacheGet(path);\n if (cached) return cached;\n try {\n return rememberTable(path, activeLoader.loadResourceSync(path));\n } catch (err) {\n logLoadError(path, err);\n return null;\n }\n}\n\n/* ── Path + parts helpers ──────────────────────────────────────────────── */\n\nfunction localeResourcePath(kind: ResourceKind, locale: string, countryCode: string): string {\n return `${kind}/${locale}/${countryCode}.bson`;\n}\n\n/**\n * Candidate paths for a kind+cc, ordered most-specific first. The default\n * locale is appended only when the requested locale differs — keeping the\n * single-attempt case truly single-attempt.\n */\nfunction localePaths(kind: ResourceKind, locale: string, cc: string): string[] {\n if (locale === DEFAULT_LOCALE) return [localeResourcePath(kind, DEFAULT_LOCALE, cc)];\n return [localeResourcePath(kind, locale, cc), localeResourcePath(kind, DEFAULT_LOCALE, cc)];\n}\n\n/**\n * Extract `(nationalNumber, countryCallingCode)` if both are present. Returns\n * `null` when either is missing — `libphonenumber-js` populates them only for\n * recognized country codes.\n */\nfunction partsOf(phoneNumber: MaybePhoneNumber): { national: string; cc: string } | null {\n const national = phoneNumber?.nationalNumber?.toString();\n const cc = phoneNumber?.countryCallingCode?.toString();\n if (!national || !cc) return null;\n return { national, cc };\n}\n\n/** E.164 number with leading `+` stripped — the timezone lookup key. */\nfunction timezoneKey(phoneNumber: MaybePhoneNumber): string | null {\n const raw = phoneNumber?.number?.toString();\n if (!raw) return null;\n return raw.startsWith('+') ? raw.slice(1) : raw;\n}\n\nfunction parseTimezones(value: string | null): string[] | null {\n if (!value) return null;\n const zones = value.split('&').filter((z) => z.length > 0);\n return zones.length > 0 ? zones : null;\n}\n\n/* ── Locale-walking lookups ────────────────────────────────────────────── */\n\nasync function localizedAsync(\n kind: ResourceKind,\n phoneNumber: MaybePhoneNumber,\n locale: string\n): Promise<string | null> {\n const parts = partsOf(phoneNumber);\n if (!parts) return null;\n for (const path of localePaths(kind, locale, parts.cc)) {\n const table = await loadTableAsync(path);\n const hit = table ? findByPrefix(table, parts.national) : null;\n if (hit) return hit;\n }\n return null;\n}\n\nfunction localizedSync(kind: ResourceKind, phoneNumber: MaybePhoneNumber, locale: string): string | null {\n const parts = partsOf(phoneNumber);\n if (!parts) return null;\n for (const path of localePaths(kind, locale, parts.cc)) {\n const table = loadTableSync(path);\n const hit = table ? findByPrefix(table, parts.national) : null;\n if (hit) return hit;\n }\n return null;\n}\n\n/* ── Public sync API ───────────────────────────────────────────────────── */\n\n/**\n * Geographical info (city / region) for the given phone number, in the\n * requested locale. Falls back to English when the locale-specific table is\n * missing for that country code. Returns `null` for landline-only,\n * unrecognized, or invalid numbers.\n */\nexport function geocoder(phoneNumber: MaybePhoneNumber, locale: GeocoderLocale = DEFAULT_LOCALE): string | null {\n return localizedSync('geocodes', phoneNumber, locale);\n}\n\n/**\n * Original carrier of the phone number (Google libphonenumber's\n * carrier-mapping table — does **not** reflect ports). Returns `null` for\n * landlines and unmapped ranges.\n */\nexport function carrier(phoneNumber: MaybePhoneNumber, locale: CarrierLocale = DEFAULT_LOCALE): string | null {\n return localizedSync('carrier', phoneNumber, locale);\n}\n\n/** Timezones associated with the number (one or more IANA zone IDs). */\nexport function timezones(phoneNumber: MaybePhoneNumber): string[] | null {\n const key = timezoneKey(phoneNumber);\n if (!key) return null;\n const table = loadTableSync(TIMEZONES_PATH);\n return table ? parseTimezones(findByPrefix(table, key)) : null;\n}\n\n/* ── Public async API ──────────────────────────────────────────────────── */\n\nexport async function geocoderAsync(\n phoneNumber: MaybePhoneNumber,\n locale: GeocoderLocale = DEFAULT_LOCALE\n): Promise<string | null> {\n return localizedAsync('geocodes', phoneNumber, locale);\n}\n\nexport async function carrierAsync(\n phoneNumber: MaybePhoneNumber,\n locale: CarrierLocale = DEFAULT_LOCALE\n): Promise<string | null> {\n return localizedAsync('carrier', phoneNumber, locale);\n}\n\nexport async function timezonesAsync(phoneNumber: MaybePhoneNumber): Promise<string[] | null> {\n const key = timezoneKey(phoneNumber);\n if (!key) return null;\n const table = await loadTableAsync(TIMEZONES_PATH);\n return table ? parseTimezones(findByPrefix(table, key)) : null;\n}\n\n/* ── Convenience: full enrichment in one call ──────────────────────────── */\n\nexport interface EnrichmentResult {\n geocode: string | null;\n carrier: string | null;\n timezones: string[] | null;\n}\n\nexport interface EnrichOptions {\n /** Geocoder locale; falls back to `en` when missing. */\n locale?: GeocoderLocale;\n /** Carrier locale; falls back to `en` when missing. */\n carrierLocale?: CarrierLocale;\n}\n\n/**\n * One-shot lookup: geocode + carrier + timezones in parallel. Convenient when\n * you'd otherwise call all three async functions back-to-back. Sync callers\n * should call the three sync functions directly.\n */\nexport async function enrichPhoneNumber(\n phoneNumber: MaybePhoneNumber,\n options: EnrichOptions = {}\n): Promise<EnrichmentResult> {\n const [geocode, car, tz] = await Promise.all([\n geocoderAsync(phoneNumber, options.locale),\n carrierAsync(phoneNumber, options.carrierLocale),\n timezonesAsync(phoneNumber),\n ]);\n return { geocode, carrier: car, timezones: tz };\n}\n","/**\n * Node.js synchronous resource loader. Reads BSON tables from the bundled\n * `resources/` directory using `node:fs`. Resolves paths relative to the\n * package install location, so consumers don't need to configure anything.\n */\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { ResourceLoader } from './types';\n\n/**\n * Locate the bundled `resources/` directory relative to the compiled output.\n *\n * The published package layout is:\n * dist/index.js ← from src/index.ts\n * dist/cli/index.js ← from src/cli/index.ts (one extra level deep)\n * resources/... ← peer of `dist/`\n *\n * We walk parent directories from the compiled file's location looking for a\n * `resources/timezones.bson` peer. That covers both the main bundle and the\n * CLI bundle without hardcoding the level count.\n */\nfunction defaultResourcesDir(): string {\n // CJS: __dirname is set. ESM: derive from import.meta.url. We support both\n // because the published bundle ships both formats.\n let here: string;\n try {\n here = __dirname;\n } catch {\n here = dirname(fileURLToPath(import.meta.url));\n }\n\n let dir = here;\n for (let i = 0; i < 6; i++) {\n const candidate = resolve(dir, 'resources');\n if (existsSync(resolve(candidate, 'timezones.bson'))) {\n return candidate;\n }\n const parent = resolve(dir, '..');\n if (parent === dir) break;\n dir = parent;\n }\n // Fallback to the immediate parent if the marker file isn't found — keeps\n // the loader from throwing at import time. Lookups will return null until\n // the caller installs a custom loader.\n return resolve(here, '..', 'resources');\n}\n\nexport interface NodeFsResourceLoaderOptions {\n /**\n * Override the directory where `geocodes/`, `carrier/`, and\n * `timezones.bson` live. Defaults to the bundled `resources/` next to the\n * built `dist/` directory.\n */\n resourcesDir?: string;\n}\n\n/**\n * Sync + async loader backed by `node:fs`. Async methods exist for parity\n * with custom loaders and just wrap the sync read.\n */\nexport class NodeFsResourceLoader implements ResourceLoader {\n private readonly baseDir: string;\n\n constructor(options: NodeFsResourceLoaderOptions = {}) {\n this.baseDir = options.resourcesDir ?? defaultResourcesDir();\n }\n\n async loadResource(path: string): Promise<Uint8Array | null> {\n return this.loadResourceSync(path);\n }\n\n loadResourceSync(path: string): Uint8Array | null {\n const fullPath = join(this.baseDir, path);\n if (!existsSync(fullPath)) return null;\n return readFileSync(fullPath);\n }\n}\n","/**\n * Public Node.js entry point.\n *\n * Wires the bundled `resources/` directory into the core resolver via a\n * synchronous `node:fs` loader, then re-exports the full public surface.\n *\n * For serverless / edge runtimes (no `node:fs`), import from\n * `@phonecheck/phone-number-validator-js/serverless` and supply your own\n * `ResourceLoader` (KV / R2 / S3 / fetch) via `setResourceLoader()`.\n */\n\nimport { setResourceLoader } from './core';\nimport { NodeFsResourceLoader } from './node-fs-loader';\n\n// Install the default loader at import time. Consumers can swap it via\n// `setResourceLoader()` if they need to point at a different resources dir\n// (e.g. when bundling resources into a different location).\nsetResourceLoader(new NodeFsResourceLoader());\n\n// Re-export every parser / type from libphonenumber-js so consumers don't\n// need a second import for `parsePhoneNumberFromString`, `PhoneNumber`, etc.\nexport * from 'libphonenumber-js';\nexport {\n clearCache,\n DEFAULT_CACHE_SIZE,\n getCacheSize,\n getCacheStats,\n setCacheSize,\n} from './cache';\nexport {\n carrier,\n carrierAsync,\n type EnrichmentResult,\n type EnrichOptions,\n enrichPhoneNumber,\n geocoder,\n geocoderAsync,\n getResourceLoader,\n setResourceLoader,\n timezones,\n timezonesAsync,\n} from './core';\nexport { NodeFsResourceLoader, type NodeFsResourceLoaderOptions } from './node-fs-loader';\nexport type {\n CacheStats,\n CarrierLocale,\n GeocoderLocale,\n LookupTable,\n MaybePhoneNumber,\n ResourceKind,\n ResourceLoader,\n} from './types';\n","/**\n * Minimal flag parser for the `phone-validate` CLI.\n *\n * Hand-rolled because the surface is small (~12 flags) and pulling in\n * `commander` / `yargs` would balloon the published bundle for every\n * consumer regardless of whether they use the CLI.\n *\n * The parser is table-driven: `BOOLEAN_FLAGS` and `VALUE_FLAGS` map flag\n * names to small applicator functions that mutate the result. New flags get\n * one new map entry — no extra switch cases.\n */\nimport type { CarrierLocale, GeocoderLocale } from '../types';\n\nexport interface ParsedArgs {\n /** Phone number to validate (positional). */\n phoneNumber: string;\n defaultCountry?: string;\n locale: GeocoderLocale;\n carrierLocale: CarrierLocale;\n // Enrichment toggles — let users opt out of BSON loads when they only\n // need format validation (faster + works without `resources/`).\n enrichGeocode: boolean;\n enrichCarrier: boolean;\n enrichTimezones: boolean;\n /** Output format. */\n format: 'text' | 'json' | 'pretty';\n quiet: boolean;\n debug: boolean;\n /** Directory to write the JSON result; null disables file logging. */\n logDir: string | null;\n}\n\nexport interface ParsedHelp {\n kind: 'help';\n}\n\nexport interface ParsedVersion {\n kind: 'version';\n}\n\nexport interface CliArgError {\n kind: 'error';\n messages: string[];\n exitCode: number;\n}\n\nexport type ParseResult = ({ kind: 'args' } & ParsedArgs) | ParsedHelp | ParsedVersion | CliArgError;\n\nconst HELP_TEXT = `phone-validate <phone-number> [options]\n\nParse and enrich an international phone number — geocoding (city / region),\noriginal carrier, timezone(s), formatted variants, and number type. By\ndefault, runs the full enrichment pipeline, prints a colored summary to\nstdout, and writes the JSON result to ./logs/.\n\nOptions:\n --country <CC> Default country (e.g. US, DE) when the input\n lacks a leading +. Pass-through to libphonenumber.\n --locale <code> Geocoder locale: en, de, fr, es, ... (default: en)\n --carrier-locale <code> Carrier locale: en, ar, zh, ... (default: en)\n\n --geocode, --no-geocode Look up city / region (default: on)\n --carrier-info, --no-carrier-info\n Look up original carrier (default: on)\n --timezones, --no-timezones Look up IANA timezone(s) (default: on)\n --enrich, --no-enrich Master toggle for all three above (default: on)\n\n --format <text|json|pretty> Stdout format (default: pretty)\n --log-dir <path> Directory to write the JSON result (default: ./logs)\n --no-log-file Skip writing the result file\n --quiet Print only the final verdict to stdout\n --debug Verbose logging\n\n -h, --help Show this help\n -v, --version Print version\n\nExamples:\n # Parse + enrich an E.164 number\n phone-validate +14155552671\n\n # Parse a national number with a country fallback\n phone-validate \"(415) 555-2671\" --country US\n\n # German locale for the geocoder\n phone-validate +41431234567 --locale de\n\n # Format-only validation (skips BSON loads — fastest)\n phone-validate +14155552671 --no-enrich\n\n # Just timezone, skip geocode + carrier\n phone-validate +14155552671 --no-geocode --no-carrier-info\n\n # Pipe JSON to jq for tooling\n phone-validate +14155552671 --format json --quiet --no-log-file | jq\n\n # Silent verdict for shell scripting (exit code 0=valid, 1=invalid)\n phone-validate \"+14155552671\" --quiet --no-log-file\n if phone-validate \"$NUMBER\" --quiet --no-log-file > /dev/null; then …\n`;\n\ninterface ParseState {\n result: ParsedArgs;\n logFile: boolean;\n}\n\ntype BooleanApplicator = (state: ParseState, on: boolean) => void;\ntype ValueApplicator = (state: ParseState, value: string, errors: string[]) => void;\n\nconst BOOLEAN_FLAGS: Record<string, BooleanApplicator> = {\n enrich: (s, on) => {\n // Master toggle — flips all three at once.\n s.result.enrichGeocode = on;\n s.result.enrichCarrier = on;\n s.result.enrichTimezones = on;\n },\n geocode: (s, on) => {\n s.result.enrichGeocode = on;\n },\n 'carrier-info': (s, on) => {\n s.result.enrichCarrier = on;\n },\n timezones: (s, on) => {\n s.result.enrichTimezones = on;\n },\n 'log-file': (s, on) => {\n s.logFile = on;\n },\n quiet: (s, on) => {\n s.result.quiet = on;\n },\n debug: (s, on) => {\n s.result.debug = on;\n },\n};\n\nconst FORMAT_VALUES = new Set(['text', 'json', 'pretty']);\n\nconst VALUE_FLAGS: Record<string, ValueApplicator> = {\n country: (s, value) => {\n s.result.defaultCountry = value.toUpperCase();\n },\n locale: (s, value) => {\n s.result.locale = value as GeocoderLocale;\n },\n 'carrier-locale': (s, value) => {\n s.result.carrierLocale = value as CarrierLocale;\n },\n format: (s, value, errors) => {\n if (!FORMAT_VALUES.has(value)) {\n errors.push(`--format must be one of text|json|pretty (got \"${value}\")`);\n return;\n }\n s.result.format = value as ParsedArgs['format'];\n },\n 'log-dir': (s, value) => {\n s.result.logDir = value;\n },\n};\n\ninterface FlagToken {\n /** The dashless flag name; `no-` prefix already stripped for boolean lookups. */\n name: string;\n /** True when boolean flag was passed positively, false for `--no-...`. */\n positive: boolean;\n /** Inline `--flag=value` body if present. */\n inlineValue: string | undefined;\n}\n\n/** Strip leading `--` and split on `=`. Returns null for non-flag tokens. */\nfunction tokenize(token: string): FlagToken | null {\n if (!token.startsWith('--')) return null;\n const eqIdx = token.indexOf('=');\n const rawName = eqIdx === -1 ? token.slice(2) : token.slice(2, eqIdx);\n const inlineValue = eqIdx === -1 ? undefined : token.slice(eqIdx + 1);\n if (rawName.startsWith('no-')) return { name: rawName.slice(3), positive: false, inlineValue };\n return { name: rawName, positive: true, inlineValue };\n}\n\nfunction defaultArgs(): ParsedArgs {\n return {\n phoneNumber: '',\n locale: 'en',\n carrierLocale: 'en',\n enrichGeocode: true,\n enrichCarrier: true,\n enrichTimezones: true,\n format: 'pretty',\n quiet: false,\n debug: false,\n logDir: './logs',\n };\n}\n\nexport function parseArgs(argv: readonly string[]): ParseResult {\n const errors: string[] = [];\n const positional: string[] = [];\n const state: ParseState = { result: defaultArgs(), logFile: true };\n\n for (let i = 0; i < argv.length; i++) {\n const token = argv[i];\n if (token === undefined) continue;\n\n // Positional (the phone number).\n if (!token.startsWith('-')) {\n positional.push(token);\n continue;\n }\n\n if (token === '-h' || token === '--help') return { kind: 'help' };\n if (token === '-v' || token === '--version') return { kind: 'version' };\n\n const flag = tokenize(token);\n if (!flag) {\n errors.push(`Unknown short flag: \"${token}\"`);\n continue;\n }\n\n const boolApply = BOOLEAN_FLAGS[flag.name];\n if (boolApply) {\n boolApply(state, flag.positive);\n continue;\n }\n\n // Value flags only accept the positive form (--country, not --no-country).\n const valueApply = VALUE_FLAGS[flag.name];\n if (valueApply && flag.positive) {\n const value = flag.inlineValue ?? argv[++i];\n if (value === undefined) {\n errors.push(`Flag --${flag.name} requires a value`);\n continue;\n }\n valueApply(state, value, errors);\n continue;\n }\n\n errors.push(`Unknown flag: \"${token}\"`);\n }\n\n if (!state.logFile) state.result.logDir = null;\n\n if (positional.length === 0) errors.push('Missing required argument: <phone-number>');\n if (positional.length > 1) {\n errors.push(`Expected one phone number, got ${positional.length}: ${positional.join(', ')}`);\n }\n\n if (errors.length > 0) return { kind: 'error', messages: errors, exitCode: 2 };\n\n const [phoneNumber] = positional;\n if (!phoneNumber) return { kind: 'error', messages: ['Missing required argument: <phone-number>'], exitCode: 2 };\n state.result.phoneNumber = phoneNumber;\n return { kind: 'args', ...state.result };\n}\n\nexport function helpText(): string {\n return HELP_TEXT;\n}\n","/**\n * Turn a classified request into the actual lookup. Single inputs return one\n * result; batches return an array (one entry per input, in order — bad inputs\n * yield a result with `valid: false` rather than aborting the whole batch).\n *\n * Enrichment (geocode / carrier / timezones) runs by default. Callers can\n * skip individual lookups via `BatchOptions` — useful when only format\n * validation is needed (faster + works without the BSON resource tree).\n */\nimport { type CountryCode, parsePhoneNumberFromString } from 'libphonenumber-js';\nimport { carrierAsync, geocoderAsync, timezonesAsync } from '../../core';\nimport type { CarrierLocale, GeocoderLocale } from '../../types';\nimport type { BatchOptions, ValidationDispatch } from './validation';\n\nexport interface PhoneValidationResult {\n input: string;\n valid: boolean;\n error?: string;\n formatted?: {\n e164: string;\n international: string;\n national: string;\n rfc3966: string;\n };\n country?: string;\n countryCallingCode?: string;\n nationalNumber?: string;\n type?: string;\n // Enrichment fields. `undefined` means \"lookup was skipped\"; `null` means\n // \"lookup ran but found nothing\". Callers can disambiguate via\n // `'geocode' in result` if they need to.\n geocode?: string | null;\n carrier?: string | null;\n timezones?: string[] | null;\n}\n\ninterface ValidateOneOptions {\n defaultCountry?: string;\n locale: GeocoderLocale;\n carrierLocale: CarrierLocale;\n geocode: boolean;\n carrier: boolean;\n timezones: boolean;\n}\n\nfunction resolveOptions(options: BatchOptions): ValidateOneOptions {\n return {\n defaultCountry: options.defaultCountry,\n locale: options.locale ?? 'en',\n carrierLocale: options.carrierLocale ?? 'en',\n // Each enrichment toggle defaults to ON when unset — opt-out, not opt-in.\n geocode: options.geocode ?? true,\n carrier: options.carrier ?? true,\n timezones: options.timezones ?? true,\n };\n}\n\nasync function validateOne(input: string, options: ValidateOneOptions): Promise<PhoneValidationResult> {\n const parsed = parsePhoneNumberFromString(input, options.defaultCountry as CountryCode | undefined);\n if (!parsed?.isValid()) {\n return { input, valid: false, error: 'Invalid or unparseable phone number' };\n }\n\n // Run only the enrichments the caller asked for. Skipped lookups are\n // omitted from the result rather than emitting `null` (lets callers tell\n // \"didn't run\" from \"ran but no data\").\n const [geocode, carrier, timezones] = await Promise.all([\n options.geocode ? geocoderAsync(parsed, options.locale) : Promise.resolve(undefined),\n options.carrier ? carrierAsync(parsed, options.carrierLocale) : Promise.resolve(undefined),\n options.timezones ? timezonesAsync(parsed) : Promise.resolve(undefined),\n ]);\n\n const result: PhoneValidationResult = {\n input,\n valid: true,\n formatted: {\n e164: parsed.format('E.164'),\n international: parsed.formatInternational(),\n national: parsed.formatNational(),\n rfc3966: parsed.format('RFC3966'),\n },\n country: parsed.country,\n countryCallingCode: parsed.countryCallingCode.toString(),\n nationalNumber: parsed.nationalNumber.toString(),\n type: parsed.getType(),\n };\n if (geocode !== undefined) result.geocode = geocode;\n if (carrier !== undefined) result.carrier = carrier;\n if (timezones !== undefined) result.timezones = timezones;\n return result;\n}\n\nexport async function executeValidation(\n dispatch: ValidationDispatch\n): Promise<PhoneValidationResult | PhoneValidationResult[]> {\n const opts = resolveOptions(dispatch.options);\n\n if (dispatch.kind === 'single') {\n return validateOne(dispatch.phoneNumber, opts);\n }\n\n return Promise.all(dispatch.phoneNumbers.map((p) => validateOne(p, opts)));\n}\n\nexport async function validateSingle(input: string, options: BatchOptions = {}): Promise<PhoneValidationResult> {\n return validateOne(input, resolveOptions(options));\n}\n\nexport async function validateBatch(inputs: string[], options: BatchOptions = {}): Promise<PhoneValidationResult[]> {\n const opts = resolveOptions(options);\n return Promise.all(inputs.map((p) => validateOne(p, opts)));\n}\n","/**\n * Output formatters for the CLI. The runner picks one based on `--format`.\n *\n * pretty — colored, human-friendly summary (default)\n * text — plain ASCII single-line + KV pairs (for piping)\n * json — full result as a single JSON line (for tooling)\n */\nimport type { PhoneValidationResult } from '../serverless/_shared/dispatch';\n\ninterface ColorFns {\n green: (s: string) => string;\n red: (s: string) => string;\n yellow: (s: string) => string;\n cyan: (s: string) => string;\n dim: (s: string) => string;\n bold: (s: string) => string;\n}\n\nfunction colorize(): ColorFns {\n const enabled = process.stdout.isTTY && process.env.NO_COLOR !== '1';\n const wrap = (open: string, close: string) => (s: string) => (enabled ? `\\x1b[${open}m${s}\\x1b[${close}m` : s);\n return {\n green: wrap('32', '39'),\n red: wrap('31', '39'),\n yellow: wrap('33', '39'),\n cyan: wrap('36', '39'),\n dim: wrap('2', '22'),\n bold: wrap('1', '22'),\n };\n}\n\nexport function verdictLine(result: PhoneValidationResult): string {\n const c = colorize();\n if (!result.valid) return c.red(`✗ INVALID ${result.input}`);\n return c.green(`✓ VALID ${result.formatted?.e164 ?? result.input}`);\n}\n\nexport function formatJson(result: PhoneValidationResult): string {\n return JSON.stringify(result);\n}\n\nexport function formatText(result: PhoneValidationResult): string {\n const lines: string[] = [];\n lines.push(verdictLine(result));\n if (!result.valid) {\n if (result.error) lines.push(` error=${result.error}`);\n return lines.join('\\n');\n }\n lines.push(` country=${result.country ?? '_'} type=${result.type ?? '_'}`);\n lines.push(` e164=${result.formatted?.e164}`);\n lines.push(` national=${result.formatted?.national}`);\n lines.push(` international=${result.formatted?.international}`);\n if (result.geocode) lines.push(` geocode=${result.geocode}`);\n if (result.carrier) lines.push(` carrier=${result.carrier}`);\n if (result.timezones?.length) lines.push(` timezones=${result.timezones.join(', ')}`);\n return lines.join('\\n');\n}\n\nexport function formatPretty(result: PhoneValidationResult): string {\n const c = colorize();\n const lines: string[] = [];\n lines.push(verdictLine(result));\n lines.push('');\n\n if (!result.valid) {\n if (result.error) lines.push(` ${c.dim('error:')} ${c.red(result.error)}`);\n return lines.join('\\n');\n }\n\n lines.push(c.bold('Summary'));\n lines.push(\n ` ${c.dim('country:')} ${c.cyan(result.country ?? '—')} ${c.dim(`(+${result.countryCallingCode})`)}`\n );\n lines.push(` ${c.dim('type:')} ${result.type ?? '—'}`);\n lines.push('');\n lines.push(c.bold('Formatted'));\n lines.push(` ${c.dim('E.164:')} ${result.formatted?.e164}`);\n lines.push(` ${c.dim('national:')} ${result.formatted?.national}`);\n lines.push(` ${c.dim('international:')} ${result.formatted?.international}`);\n lines.push(` ${c.dim('RFC3966:')} ${result.formatted?.rfc3966}`);\n\n if (result.geocode || result.carrier || result.timezones?.length) {\n lines.push('');\n lines.push(c.bold('Enrichment'));\n if (result.geocode) lines.push(` ${c.dim('geocode:')} ${result.geocode}`);\n if (result.carrier) lines.push(` ${c.dim('carrier:')} ${result.carrier}`);\n if (result.timezones?.length) {\n lines.push(` ${c.dim('timezones:')} ${result.timezones.join(', ')}`);\n }\n }\n\n return lines.join('\\n');\n}\n","/**\n * CLI runner — turns ParsedArgs into a `validateSingle` invocation, formats\n * the output, and optionally writes the structured result to a log file.\n *\n * Returns the process exit code:\n * 0 — phone parses + is valid\n * 1 — phone is invalid / unparseable\n * 2 — bad CLI arguments (handled in `index.ts` before reaching here)\n */\nimport { mkdirSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { PhoneValidationResult } from '../serverless/_shared/dispatch';\nimport { validateSingle } from '../serverless/_shared/dispatch';\nimport { formatJson, formatPretty, formatText, verdictLine } from './format';\nimport type { ParsedArgs } from './parse-args';\n\nexport interface CliRunDeps {\n validate?: typeof validateSingle;\n writeFile?: (path: string, contents: string) => void;\n ensureDir?: (path: string) => void;\n stdout?: (line: string) => void;\n stderr?: (line: string) => void;\n now?: () => Date;\n}\n\nconst FORMATTERS: Record<ParsedArgs['format'], (r: PhoneValidationResult) => string> = {\n json: formatJson,\n text: formatText,\n pretty: formatPretty,\n};\n\nfunction pad(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\nexport function logFileNameFor(phoneNumber: string, when: Date): string {\n const safe = phoneNumber.replace(/[^a-zA-Z0-9._+-]+/g, '_');\n const stamp =\n `${when.getUTCFullYear()}-${pad(when.getUTCMonth() + 1)}-${pad(when.getUTCDate())}` +\n `T${pad(when.getUTCHours())}${pad(when.getUTCMinutes())}${pad(when.getUTCSeconds())}Z`;\n return `phone-validate-${stamp}-${safe}.json`;\n}\n\nfunction debugLine(args: ParsedArgs): string {\n return (\n `Validating \"${args.phoneNumber}\" ` +\n `(country=${args.defaultCountry ?? 'auto'}, locale=${args.locale}, ` +\n `carrier=${args.carrierLocale}, geocode=${args.enrichGeocode}, ` +\n `carrier-info=${args.enrichCarrier}, timezones=${args.enrichTimezones})`\n );\n}\n\nfunction renderOutput(args: ParsedArgs, result: PhoneValidationResult): string {\n if (args.quiet) return verdictLine(result);\n return FORMATTERS[args.format](result);\n}\n\ninterface FsDeps {\n writeFile: (path: string, contents: string) => void;\n ensureDir: (path: string) => void;\n now: () => Date;\n}\n\nfunction persistLog(\n logDir: string,\n phoneNumber: string,\n result: PhoneValidationResult,\n deps: FsDeps\n): { ok: true; path: string } | { ok: false; error: string } {\n try {\n const dir = resolve(logDir);\n deps.ensureDir(dir);\n const path = resolve(dir, logFileNameFor(phoneNumber, deps.now()));\n deps.writeFile(path, JSON.stringify(result, null, 2));\n return { ok: true, path };\n } catch (error) {\n return { ok: false, error: error instanceof Error ? error.message : String(error) };\n }\n}\n\nexport async function run(args: ParsedArgs, deps: CliRunDeps = {}): Promise<number> {\n const validate = deps.validate ?? validateSingle;\n const stdout = deps.stdout ?? ((line) => process.stdout.write(`${line}\\n`));\n const stderr = deps.stderr ?? ((line) => process.stderr.write(`${line}\\n`));\n const fsDeps: FsDeps = {\n writeFile: deps.writeFile ?? ((path, contents) => writeFileSync(path, contents, 'utf8')),\n ensureDir: deps.ensureDir ?? ((path) => mkdirSync(path, { recursive: true })),\n now: deps.now ?? (() => new Date()),\n };\n\n if (args.debug) stderr(debugLine(args));\n\n const result = await validate(args.phoneNumber, {\n defaultCountry: args.defaultCountry,\n locale: args.locale,\n carrierLocale: args.carrierLocale,\n geocode: args.enrichGeocode,\n carrier: args.enrichCarrier,\n timezones: args.enrichTimezones,\n });\n\n stdout(renderOutput(args, result));\n\n if (args.logDir) {\n const log = persistLog(args.logDir, args.phoneNumber, result, fsDeps);\n if (!log.ok) stderr(`Warning: failed to write log file: ${log.error}`);\n else if (!args.quiet) stderr(`Log written: ${log.path}`);\n }\n\n return exitCodeFor(result);\n}\n\nexport function exitCodeFor(result: PhoneValidationResult): number {\n return result.valid ? 0 : 1;\n}\n","/**\n * `phone-validate` CLI entry point.\n *\n * Wired into `package.json#bin` so `bun add -g @phonecheck/phone-number-validator-js`\n * (or the npm equivalent) installs a `phone-validate` command.\n */\nimport '../index'; // installs the default Node FS resource loader\nimport { helpText, parseArgs } from './parse-args';\nimport { run } from './run';\n\nexport type { CliArgError, ParsedArgs, ParsedHelp, ParsedVersion, ParseResult } from './parse-args';\nexport { helpText, parseArgs } from './parse-args';\nexport type { CliRunDeps } from './run';\nexport { exitCodeFor, logFileNameFor, run } from './run';\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const parsed = parseArgs(argv);\n\n if (parsed.kind === 'help') {\n process.stdout.write(`${helpText()}\\n`);\n return 0;\n }\n if (parsed.kind === 'version') {\n try {\n const pkg = require('../../package.json') as { version: string };\n process.stdout.write(`${pkg.version}\\n`);\n } catch {\n process.stdout.write('unknown\\n');\n }\n return 0;\n }\n if (parsed.kind === 'error') {\n for (const msg of parsed.messages) process.stderr.write(`${msg}\\n`);\n process.stderr.write(`\\nRun with --help for usage.\\n`);\n return parsed.exitCode;\n }\n\n return run(parsed);\n}\n\nconst isDirectInvocation =\n (typeof import.meta !== 'undefined' && (import.meta as { main?: boolean }).main === true) ||\n (typeof require !== 'undefined' && require.main === module);\n\nif (isDirectInvocation) {\n main()\n .then((code) => process.exit(code))\n .catch((error) => {\n process.stderr.write(\n `Unexpected error: ${error instanceof Error ? (error.stack ?? error.message) : String(error)}\\n`\n );\n process.exit(1);\n });\n}\n"],"names":["lru","deserialize","dirname","fileURLToPath","resolve","existsSync","join","readFileSync","parsePhoneNumberFromString","writeFileSync","mkdirSync"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/cache.ts","../../src/core.ts","../../src/node-fs-loader.ts","../../src/serverless/_shared/dispatch.ts","../../src/index.ts","../../src/cli/parse-args.ts","../../src/cli/format.ts","../../src/cli/run.ts","../../src/cli/index.ts"],"sourcesContent":["/**\n * Shared in-memory LRU for deserialized BSON lookup tables.\n *\n * The cache is keyed by the loader path (e.g. `geocodes/en/41.bson`) so the\n * same key is portable across the Node FS loader and any custom loader that\n * uses the same path scheme. Keeping the cache here (instead of inside each\n * loader) means the Node entry and any serverless adapter share the same hit\n * rate when invoked in the same process.\n */\nimport { lru } from 'tiny-lru';\nimport type { CacheStats, LookupTable } from './types';\n\nexport const DEFAULT_CACHE_SIZE = 100;\n\nlet cache = lru<LookupTable>(DEFAULT_CACHE_SIZE);\nlet maxSize = DEFAULT_CACHE_SIZE;\n\n/** Internal — used by `core.ts` for read/write. */\nexport function cacheGet(key: string): LookupTable | undefined {\n return cache.get(key);\n}\n\nexport function cacheSet(key: string, value: LookupTable): void {\n cache.set(key, value);\n}\n\n/** Drop every entry. Useful between tests and for long-running processes. */\nexport function clearCache(): void {\n cache.clear();\n}\n\n/** Live entry count (does not include keys evicted by the LRU). */\nexport function getCacheSize(): number {\n return cache.size;\n}\n\n/** Snapshot — helpful for `/health` endpoints in serverless adapters. */\nexport function getCacheStats(): CacheStats {\n return { size: cache.size, maxSize };\n}\n\n/**\n * Resize the cache. Existing entries are migrated newest-first up to the new\n * ceiling; any overflow is dropped. Calling this with the current size is a\n * no-op (kept for symmetry with `clearCache`).\n */\nexport function setCacheSize(size: number): void {\n if (size <= 0) {\n throw new Error(`Cache size must be > 0 (got ${size})`);\n }\n if (size === maxSize) return;\n\n const previous = cache;\n cache = lru<LookupTable>(size);\n maxSize = size;\n\n // tiny-lru exposes entries() oldest-first; reverse so we keep the most\n // recently used items when shrinking.\n const entries = [...previous.entries()].reverse();\n for (const [key, value] of entries) {\n if (cache.size >= size) break;\n cache.set(key, value as LookupTable);\n }\n}\n","/**\n * Pure resolver — turns a parsed phone number + a `ResourceLoader` into a\n * geocoded location, carrier, or timezone list.\n *\n * Single source of truth for the lookup algorithm: try the requested locale,\n * fall back to `en` if missing, and walk the national-number prefix from\n * longest to shortest looking for a match in the BSON lookup table.\n *\n * The Node entry (`index.ts`) wraps this with a synchronous `node:fs` loader.\n * Serverless adapters wrap it with KV / R2 / S3 / `fetch`-based loaders. The\n * sync variants (`geocoder` / `carrier` / `timezones`) require the loader to\n * implement `loadResourceSync` — they return `null` otherwise.\n */\nimport { deserialize } from 'bson';\nimport { cacheGet, cacheSet } from './cache';\nimport type {\n CarrierLocale,\n GeocoderLocale,\n LookupTable,\n MaybePhoneNumber,\n ResourceKind,\n ResourceLoader,\n} from './types';\n\nconst DEFAULT_LOCALE = 'en';\nconst TIMEZONES_PATH = 'timezones.bson';\n\nlet activeLoader: ResourceLoader | null = null;\n\n/** Replace (or clear, with `null`) the loader used by every lookup function. */\nexport function setResourceLoader(loader: ResourceLoader | null): void {\n activeLoader = loader;\n}\n\nexport function getResourceLoader(): ResourceLoader | null {\n return activeLoader;\n}\n\n/* ── Lookup primitives ─────────────────────────────────────────────────── */\n\n/**\n * Walk the prefix from longest to shortest, returning the first non-empty\n * string match. The BSON tables are keyed on national-number prefixes\n * (e.g. `\"4155\"` for SF) — this matches Google libphonenumber's lookup.\n */\nfunction findByPrefix(table: LookupTable, key: string): string | null {\n for (let prefix = key; prefix.length > 0; prefix = prefix.slice(0, -1)) {\n const value = table[prefix];\n if (typeof value === 'string' && value.length > 0) return value;\n }\n return null;\n}\n\n/** `null` for empty / undecodable input — always callers' guard. */\nfunction decodeBson(bytes: Uint8Array | null): LookupTable | null {\n if (!bytes || bytes.byteLength === 0) return null;\n // bson.deserialize accepts Uint8Array on Node (Buffer is a subclass), but we\n // coerce explicitly so older typings don't complain.\n const buf = Buffer.isBuffer(bytes) ? bytes : Buffer.from(bytes);\n return deserialize(buf) as LookupTable;\n}\n\n/** Quiet in production; loud in dev. Custom loaders can pre-emptively swallow. */\nfunction logLoadError(path: string, err: unknown): void {\n if (process.env.NODE_ENV !== 'production') {\n console.error(`Error loading data from ${path}:`, err);\n }\n}\n\n/**\n * Decode + cache `bytes` under `path`. Centralises the post-fetch path so the\n * sync and async loaders share the same cache-write semantics.\n */\nfunction rememberTable(path: string, bytes: Uint8Array | null): LookupTable | null {\n const table = decodeBson(bytes);\n if (!table) return null;\n cacheSet(path, table);\n return table;\n}\n\n/* ── Loader I/O wrappers ───────────────────────────────────────────────── */\n\nasync function loadTableAsync(path: string): Promise<LookupTable | null> {\n if (!activeLoader) return null;\n const cached = cacheGet(path);\n if (cached) return cached;\n try {\n return rememberTable(path, await activeLoader.loadResource(path));\n } catch (err) {\n logLoadError(path, err);\n return null;\n }\n}\n\nfunction loadTableSync(path: string): LookupTable | null {\n if (!activeLoader?.loadResourceSync) return null;\n const cached = cacheGet(path);\n if (cached) return cached;\n try {\n return rememberTable(path, activeLoader.loadResourceSync(path));\n } catch (err) {\n logLoadError(path, err);\n return null;\n }\n}\n\n/* ── Path + parts helpers ──────────────────────────────────────────────── */\n\nfunction localeResourcePath(kind: ResourceKind, locale: string, countryCode: string): string {\n return `${kind}/${locale}/${countryCode}.bson`;\n}\n\n/**\n * Candidate paths for a kind+cc, ordered most-specific first. The default\n * locale is appended only when the requested locale differs — keeping the\n * single-attempt case truly single-attempt.\n */\nfunction localePaths(kind: ResourceKind, locale: string, cc: string): string[] {\n if (locale === DEFAULT_LOCALE) return [localeResourcePath(kind, DEFAULT_LOCALE, cc)];\n return [localeResourcePath(kind, locale, cc), localeResourcePath(kind, DEFAULT_LOCALE, cc)];\n}\n\n/**\n * Extract `(nationalNumber, countryCallingCode)` if both are present. Returns\n * `null` when either is missing — `libphonenumber-js` populates them only for\n * recognized country codes.\n */\nfunction partsOf(phoneNumber: MaybePhoneNumber): { national: string; cc: string } | null {\n const national = phoneNumber?.nationalNumber?.toString();\n const cc = phoneNumber?.countryCallingCode?.toString();\n if (!national || !cc) return null;\n return { national, cc };\n}\n\n/** E.164 number with leading `+` stripped — the timezone lookup key. */\nfunction timezoneKey(phoneNumber: MaybePhoneNumber): string | null {\n const raw = phoneNumber?.number?.toString();\n if (!raw) return null;\n return raw.startsWith('+') ? raw.slice(1) : raw;\n}\n\nfunction parseTimezones(value: string | null): string[] | null {\n if (!value) return null;\n const zones = value.split('&').filter((z) => z.length > 0);\n return zones.length > 0 ? zones : null;\n}\n\n/* ── Locale-walking lookups ────────────────────────────────────────────── */\n\nasync function localizedAsync(\n kind: ResourceKind,\n phoneNumber: MaybePhoneNumber,\n locale: string\n): Promise<string | null> {\n const parts = partsOf(phoneNumber);\n if (!parts) return null;\n for (const path of localePaths(kind, locale, parts.cc)) {\n const table = await loadTableAsync(path);\n const hit = table ? findByPrefix(table, parts.national) : null;\n if (hit) return hit;\n }\n return null;\n}\n\nfunction localizedSync(kind: ResourceKind, phoneNumber: MaybePhoneNumber, locale: string): string | null {\n const parts = partsOf(phoneNumber);\n if (!parts) return null;\n for (const path of localePaths(kind, locale, parts.cc)) {\n const table = loadTableSync(path);\n const hit = table ? findByPrefix(table, parts.national) : null;\n if (hit) return hit;\n }\n return null;\n}\n\n/* ── Public sync API ───────────────────────────────────────────────────── */\n\n/**\n * Geographical info (city / region) for the given phone number, in the\n * requested locale. Falls back to English when the locale-specific table is\n * missing for that country code. Returns `null` for landline-only,\n * unrecognized, or invalid numbers.\n */\nexport function geocoder(phoneNumber: MaybePhoneNumber, locale: GeocoderLocale = DEFAULT_LOCALE): string | null {\n return localizedSync('geocodes', phoneNumber, locale);\n}\n\n/**\n * Original carrier of the phone number (Google libphonenumber's\n * carrier-mapping table — does **not** reflect ports). Returns `null` for\n * landlines and unmapped ranges.\n */\nexport function carrier(phoneNumber: MaybePhoneNumber, locale: CarrierLocale = DEFAULT_LOCALE): string | null {\n return localizedSync('carrier', phoneNumber, locale);\n}\n\n/** Timezones associated with the number (one or more IANA zone IDs). */\nexport function timezones(phoneNumber: MaybePhoneNumber): string[] | null {\n const key = timezoneKey(phoneNumber);\n if (!key) return null;\n const table = loadTableSync(TIMEZONES_PATH);\n return table ? parseTimezones(findByPrefix(table, key)) : null;\n}\n\n/* ── Public async API ──────────────────────────────────────────────────── */\n\nexport async function geocoderAsync(\n phoneNumber: MaybePhoneNumber,\n locale: GeocoderLocale = DEFAULT_LOCALE\n): Promise<string | null> {\n return localizedAsync('geocodes', phoneNumber, locale);\n}\n\nexport async function carrierAsync(\n phoneNumber: MaybePhoneNumber,\n locale: CarrierLocale = DEFAULT_LOCALE\n): Promise<string | null> {\n return localizedAsync('carrier', phoneNumber, locale);\n}\n\nexport async function timezonesAsync(phoneNumber: MaybePhoneNumber): Promise<string[] | null> {\n const key = timezoneKey(phoneNumber);\n if (!key) return null;\n const table = await loadTableAsync(TIMEZONES_PATH);\n return table ? parseTimezones(findByPrefix(table, key)) : null;\n}\n\n/* ── Convenience: full enrichment in one call ──────────────────────────── */\n\nexport interface EnrichmentResult {\n geocode: string | null;\n carrier: string | null;\n timezones: string[] | null;\n}\n\nexport interface EnrichOptions {\n /** Geocoder locale; falls back to `en` when missing. */\n locale?: GeocoderLocale;\n /** Carrier locale; falls back to `en` when missing. */\n carrierLocale?: CarrierLocale;\n}\n\n/**\n * One-shot lookup: geocode + carrier + timezones in parallel. Convenient when\n * you'd otherwise call all three async functions back-to-back. Sync callers\n * should call the three sync functions directly.\n */\nexport async function enrichPhoneNumber(\n phoneNumber: MaybePhoneNumber,\n options: EnrichOptions = {}\n): Promise<EnrichmentResult> {\n const [geocode, car, tz] = await Promise.all([\n geocoderAsync(phoneNumber, options.locale),\n carrierAsync(phoneNumber, options.carrierLocale),\n timezonesAsync(phoneNumber),\n ]);\n return { geocode, carrier: car, timezones: tz };\n}\n","/**\n * Node.js synchronous resource loader. Reads BSON tables from the bundled\n * `resources/` directory using `node:fs`. Resolves paths relative to the\n * package install location, so consumers don't need to configure anything.\n */\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { ResourceLoader } from './types';\n\n/**\n * Locate the bundled `resources/` directory relative to the compiled output.\n *\n * The published package layout is:\n * dist/index.js ← from src/index.ts\n * dist/cli/index.js ← from src/cli/index.ts (one extra level deep)\n * resources/... ← peer of `dist/`\n *\n * We walk parent directories from the compiled file's location looking for a\n * `resources/timezones.bson` peer. That covers both the main bundle and the\n * CLI bundle without hardcoding the level count.\n */\nfunction defaultResourcesDir(): string {\n // CJS: __dirname is set. ESM: derive from import.meta.url. We support both\n // because the published bundle ships both formats.\n let here: string;\n try {\n here = __dirname;\n } catch {\n here = dirname(fileURLToPath(import.meta.url));\n }\n\n let dir = here;\n for (let i = 0; i < 6; i++) {\n const candidate = resolve(dir, 'resources');\n if (existsSync(resolve(candidate, 'timezones.bson'))) {\n return candidate;\n }\n const parent = resolve(dir, '..');\n if (parent === dir) break;\n dir = parent;\n }\n // Fallback to the immediate parent if the marker file isn't found — keeps\n // the loader from throwing at import time. Lookups will return null until\n // the caller installs a custom loader.\n return resolve(here, '..', 'resources');\n}\n\nexport interface NodeFsResourceLoaderOptions {\n /**\n * Override the directory where `geocodes/`, `carrier/`, and\n * `timezones.bson` live. Defaults to the bundled `resources/` next to the\n * built `dist/` directory.\n */\n resourcesDir?: string;\n}\n\n/**\n * Sync + async loader backed by `node:fs`. Async methods exist for parity\n * with custom loaders and just wrap the sync read.\n */\nexport class NodeFsResourceLoader implements ResourceLoader {\n private readonly baseDir: string;\n\n constructor(options: NodeFsResourceLoaderOptions = {}) {\n this.baseDir = options.resourcesDir ?? defaultResourcesDir();\n }\n\n async loadResource(path: string): Promise<Uint8Array | null> {\n return this.loadResourceSync(path);\n }\n\n loadResourceSync(path: string): Uint8Array | null {\n const fullPath = join(this.baseDir, path);\n if (!existsSync(fullPath)) return null;\n return readFileSync(fullPath);\n }\n}\n","/**\n * Turn a classified request into the actual lookup. Single inputs return one\n * result; batches return an array (one entry per input, in order — bad inputs\n * yield a result with `valid: false` rather than aborting the whole batch).\n *\n * Enrichment (geocode / carrier / timezones) runs by default. Callers can\n * skip individual lookups via `BatchOptions` — useful when only format\n * validation is needed (faster + works without the BSON resource tree).\n */\nimport { type CountryCode, parsePhoneNumberFromString } from 'libphonenumber-js';\nimport { carrierAsync, geocoderAsync, timezonesAsync } from '../../core';\nimport type { CarrierLocale, GeocoderLocale } from '../../types';\nimport type { BatchOptions, ValidationDispatch } from './validation';\n\nexport interface PhoneValidationResult {\n input: string;\n valid: boolean;\n error?: string;\n formatted?: {\n e164: string;\n international: string;\n national: string;\n rfc3966: string;\n };\n country?: string;\n countryCallingCode?: string;\n nationalNumber?: string;\n type?: string;\n // Enrichment fields. `undefined` means \"lookup was skipped\"; `null` means\n // \"lookup ran but found nothing\". Callers can disambiguate via\n // `'geocode' in result` if they need to.\n geocode?: string | null;\n carrier?: string | null;\n timezones?: string[] | null;\n}\n\ninterface ValidateOneOptions {\n defaultCountry?: string;\n locale: GeocoderLocale;\n carrierLocale: CarrierLocale;\n geocode: boolean;\n carrier: boolean;\n timezones: boolean;\n}\n\nfunction resolveOptions(options: BatchOptions): ValidateOneOptions {\n return {\n defaultCountry: options.defaultCountry,\n locale: options.locale ?? 'en',\n carrierLocale: options.carrierLocale ?? 'en',\n // Each enrichment toggle defaults to ON when unset — opt-out, not opt-in.\n geocode: options.geocode ?? true,\n carrier: options.carrier ?? true,\n timezones: options.timezones ?? true,\n };\n}\n\nasync function validateOne(input: string, options: ValidateOneOptions): Promise<PhoneValidationResult> {\n const parsed = parsePhoneNumberFromString(input, options.defaultCountry as CountryCode | undefined);\n if (!parsed?.isValid()) {\n return { input, valid: false, error: 'Invalid or unparseable phone number' };\n }\n\n // Run only the enrichments the caller asked for. Skipped lookups are\n // omitted from the result rather than emitting `null` (lets callers tell\n // \"didn't run\" from \"ran but no data\").\n const [geocode, carrier, timezones] = await Promise.all([\n options.geocode ? geocoderAsync(parsed, options.locale) : Promise.resolve(undefined),\n options.carrier ? carrierAsync(parsed, options.carrierLocale) : Promise.resolve(undefined),\n options.timezones ? timezonesAsync(parsed) : Promise.resolve(undefined),\n ]);\n\n const result: PhoneValidationResult = {\n input,\n valid: true,\n formatted: {\n e164: parsed.format('E.164'),\n international: parsed.formatInternational(),\n national: parsed.formatNational(),\n rfc3966: parsed.format('RFC3966'),\n },\n country: parsed.country,\n countryCallingCode: parsed.countryCallingCode.toString(),\n nationalNumber: parsed.nationalNumber.toString(),\n type: parsed.getType(),\n };\n if (geocode !== undefined) result.geocode = geocode;\n if (carrier !== undefined) result.carrier = carrier;\n if (timezones !== undefined) result.timezones = timezones;\n return result;\n}\n\nexport async function executeValidation(\n dispatch: ValidationDispatch\n): Promise<PhoneValidationResult | PhoneValidationResult[]> {\n const opts = resolveOptions(dispatch.options);\n\n if (dispatch.kind === 'single') {\n return validateOne(dispatch.phoneNumber, opts);\n }\n\n return Promise.all(dispatch.phoneNumbers.map((p) => validateOne(p, opts)));\n}\n\nexport async function validateSingle(input: string, options: BatchOptions = {}): Promise<PhoneValidationResult> {\n return validateOne(input, resolveOptions(options));\n}\n\nexport async function validateBatch(inputs: string[], options: BatchOptions = {}): Promise<PhoneValidationResult[]> {\n const opts = resolveOptions(options);\n return Promise.all(inputs.map((p) => validateOne(p, opts)));\n}\n","/**\n * Public Node.js entry point.\n *\n * Wires the bundled `resources/` directory into the core resolver via a\n * synchronous `node:fs` loader, then re-exports the full public surface.\n *\n * For serverless / edge runtimes (no `node:fs`), import from\n * `@phonecheck/phone-number-validator-js/serverless` and supply your own\n * `ResourceLoader` (KV / R2 / S3 / fetch) via `setResourceLoader()`.\n */\n\nimport { setResourceLoader } from './core';\nimport { NodeFsResourceLoader } from './node-fs-loader';\n\n// Install the default loader at import time. Consumers can swap it via\n// `setResourceLoader()` if they need to point at a different resources dir\n// (e.g. when bundling resources into a different location).\nsetResourceLoader(new NodeFsResourceLoader());\n\n// Re-export every parser / type from libphonenumber-js so consumers don't\n// need a second import for `parsePhoneNumberFromString`, `PhoneNumber`, etc.\nexport * from 'libphonenumber-js';\n\n// Cache primitives\nexport { clearCache, DEFAULT_CACHE_SIZE, getCacheSize, getCacheStats, setCacheSize } from './cache';\n\n// Core resolver — sync + async + enrichment helper\nexport {\n carrier,\n carrierAsync,\n type EnrichmentResult,\n type EnrichOptions,\n enrichPhoneNumber,\n geocoder,\n geocoderAsync,\n getResourceLoader,\n setResourceLoader,\n timezones,\n timezonesAsync,\n} from './core';\n\n// Default Node FS loader\nexport { NodeFsResourceLoader, type NodeFsResourceLoaderOptions } from './node-fs-loader';\n\n// High-level validator pipeline — convenient when wiring an HTTP server\n// (Express, Fastify, Hono, etc.) without going through libphonenumber-js\n// manually. The same helpers power the serverless adapters.\nexport {\n executeValidation,\n type PhoneValidationResult,\n validateBatch,\n validateSingle,\n} from './serverless/_shared/dispatch';\n\nexport {\n type BatchOptions,\n type BatchValidation,\n classifyRequest,\n extractBatchOptions,\n MAX_BATCH_SIZE,\n type ValidationDispatch,\n type ValidationFailure,\n type ValidationRequestBody,\n validateBatchField,\n} from './serverless/_shared/validation';\n\n// Public type surface\nexport type {\n CacheStats,\n CarrierLocale,\n GeocoderLocale,\n LookupTable,\n MaybePhoneNumber,\n ResourceKind,\n ResourceLoader,\n} from './types';\n","/**\n * Minimal flag parser for the `phone-validate` CLI.\n *\n * Hand-rolled because the surface is small (~12 flags) and pulling in\n * `commander` / `yargs` would balloon the published bundle for every\n * consumer regardless of whether they use the CLI.\n *\n * The parser is table-driven: `BOOLEAN_FLAGS` and `VALUE_FLAGS` map flag\n * names to small applicator functions that mutate the result. New flags get\n * one new map entry — no extra switch cases.\n */\nimport type { CarrierLocale, GeocoderLocale } from '../types';\n\nexport interface ParsedArgs {\n /** Phone number to validate (positional). */\n phoneNumber: string;\n defaultCountry?: string;\n locale: GeocoderLocale;\n carrierLocale: CarrierLocale;\n // Enrichment toggles — let users opt out of BSON loads when they only\n // need format validation (faster + works without `resources/`).\n enrichGeocode: boolean;\n enrichCarrier: boolean;\n enrichTimezones: boolean;\n /** Output format. */\n format: 'text' | 'json' | 'pretty';\n quiet: boolean;\n debug: boolean;\n /** Directory to write the JSON result; null disables file logging. */\n logDir: string | null;\n}\n\nexport interface ParsedHelp {\n kind: 'help';\n}\n\nexport interface ParsedVersion {\n kind: 'version';\n}\n\nexport interface CliArgError {\n kind: 'error';\n messages: string[];\n exitCode: number;\n}\n\nexport type ParseResult = ({ kind: 'args' } & ParsedArgs) | ParsedHelp | ParsedVersion | CliArgError;\n\nconst HELP_TEXT = `phone-validate <phone-number> [options]\n\nParse and enrich an international phone number — geocoding (city / region),\noriginal carrier, timezone(s), formatted variants, and number type. By\ndefault, runs the full enrichment pipeline, prints a colored summary to\nstdout, and writes the JSON result to ./logs/.\n\nOptions:\n --country <CC> Default country (e.g. US, DE) when the input\n lacks a leading +. Pass-through to libphonenumber.\n --locale <code> Geocoder locale: en, de, fr, es, ... (default: en)\n --carrier-locale <code> Carrier locale: en, ar, zh, ... (default: en)\n\n --geocode, --no-geocode Look up city / region (default: on)\n --carrier-info, --no-carrier-info\n Look up original carrier (default: on)\n --timezones, --no-timezones Look up IANA timezone(s) (default: on)\n --enrich, --no-enrich Master toggle for all three above (default: on)\n\n --format <text|json|pretty> Stdout format (default: pretty)\n --log-dir <path> Directory to write the JSON result (default: ./logs)\n --no-log-file Skip writing the result file\n --quiet Print only the final verdict to stdout\n --debug Verbose logging\n\n -h, --help Show this help\n -v, --version Print version\n\nExamples:\n # Parse + enrich an E.164 number\n phone-validate +14155552671\n\n # Parse a national number with a country fallback\n phone-validate \"(415) 555-2671\" --country US\n\n # German locale for the geocoder\n phone-validate +41431234567 --locale de\n\n # Format-only validation (skips BSON loads — fastest)\n phone-validate +14155552671 --no-enrich\n\n # Just timezone, skip geocode + carrier\n phone-validate +14155552671 --no-geocode --no-carrier-info\n\n # Pipe JSON to jq for tooling\n phone-validate +14155552671 --format json --quiet --no-log-file | jq\n\n # Silent verdict for shell scripting (exit code 0=valid, 1=invalid)\n phone-validate \"+14155552671\" --quiet --no-log-file\n if phone-validate \"$NUMBER\" --quiet --no-log-file > /dev/null; then …\n`;\n\ninterface ParseState {\n result: ParsedArgs;\n logFile: boolean;\n}\n\ntype BooleanApplicator = (state: ParseState, on: boolean) => void;\ntype ValueApplicator = (state: ParseState, value: string, errors: string[]) => void;\n\nconst BOOLEAN_FLAGS: Record<string, BooleanApplicator> = {\n enrich: (s, on) => {\n // Master toggle — flips all three at once.\n s.result.enrichGeocode = on;\n s.result.enrichCarrier = on;\n s.result.enrichTimezones = on;\n },\n geocode: (s, on) => {\n s.result.enrichGeocode = on;\n },\n 'carrier-info': (s, on) => {\n s.result.enrichCarrier = on;\n },\n timezones: (s, on) => {\n s.result.enrichTimezones = on;\n },\n 'log-file': (s, on) => {\n s.logFile = on;\n },\n quiet: (s, on) => {\n s.result.quiet = on;\n },\n debug: (s, on) => {\n s.result.debug = on;\n },\n};\n\nconst FORMAT_VALUES = new Set(['text', 'json', 'pretty']);\n\nconst VALUE_FLAGS: Record<string, ValueApplicator> = {\n country: (s, value) => {\n s.result.defaultCountry = value.toUpperCase();\n },\n locale: (s, value) => {\n s.result.locale = value as GeocoderLocale;\n },\n 'carrier-locale': (s, value) => {\n s.result.carrierLocale = value as CarrierLocale;\n },\n format: (s, value, errors) => {\n if (!FORMAT_VALUES.has(value)) {\n errors.push(`--format must be one of text|json|pretty (got \"${value}\")`);\n return;\n }\n s.result.format = value as ParsedArgs['format'];\n },\n 'log-dir': (s, value) => {\n s.result.logDir = value;\n },\n};\n\ninterface FlagToken {\n /** The dashless flag name; `no-` prefix already stripped for boolean lookups. */\n name: string;\n /** True when boolean flag was passed positively, false for `--no-...`. */\n positive: boolean;\n /** Inline `--flag=value` body if present. */\n inlineValue: string | undefined;\n}\n\n/** Strip leading `--` and split on `=`. Returns null for non-flag tokens. */\nfunction tokenize(token: string): FlagToken | null {\n if (!token.startsWith('--')) return null;\n const eqIdx = token.indexOf('=');\n const rawName = eqIdx === -1 ? token.slice(2) : token.slice(2, eqIdx);\n const inlineValue = eqIdx === -1 ? undefined : token.slice(eqIdx + 1);\n if (rawName.startsWith('no-')) return { name: rawName.slice(3), positive: false, inlineValue };\n return { name: rawName, positive: true, inlineValue };\n}\n\nfunction defaultArgs(): ParsedArgs {\n return {\n phoneNumber: '',\n locale: 'en',\n carrierLocale: 'en',\n enrichGeocode: true,\n enrichCarrier: true,\n enrichTimezones: true,\n format: 'pretty',\n quiet: false,\n debug: false,\n logDir: './logs',\n };\n}\n\nexport function parseArgs(argv: readonly string[]): ParseResult {\n const errors: string[] = [];\n const positional: string[] = [];\n const state: ParseState = { result: defaultArgs(), logFile: true };\n\n for (let i = 0; i < argv.length; i++) {\n const token = argv[i];\n if (token === undefined) continue;\n\n // Positional (the phone number).\n if (!token.startsWith('-')) {\n positional.push(token);\n continue;\n }\n\n if (token === '-h' || token === '--help') return { kind: 'help' };\n if (token === '-v' || token === '--version') return { kind: 'version' };\n\n const flag = tokenize(token);\n if (!flag) {\n errors.push(`Unknown short flag: \"${token}\"`);\n continue;\n }\n\n const boolApply = BOOLEAN_FLAGS[flag.name];\n if (boolApply) {\n boolApply(state, flag.positive);\n continue;\n }\n\n // Value flags only accept the positive form (--country, not --no-country).\n const valueApply = VALUE_FLAGS[flag.name];\n if (valueApply && flag.positive) {\n const value = flag.inlineValue ?? argv[++i];\n if (value === undefined) {\n errors.push(`Flag --${flag.name} requires a value`);\n continue;\n }\n valueApply(state, value, errors);\n continue;\n }\n\n errors.push(`Unknown flag: \"${token}\"`);\n }\n\n if (!state.logFile) state.result.logDir = null;\n\n if (positional.length === 0) errors.push('Missing required argument: <phone-number>');\n if (positional.length > 1) {\n errors.push(`Expected one phone number, got ${positional.length}: ${positional.join(', ')}`);\n }\n\n if (errors.length > 0) return { kind: 'error', messages: errors, exitCode: 2 };\n\n const [phoneNumber] = positional;\n if (!phoneNumber) return { kind: 'error', messages: ['Missing required argument: <phone-number>'], exitCode: 2 };\n state.result.phoneNumber = phoneNumber;\n return { kind: 'args', ...state.result };\n}\n\nexport function helpText(): string {\n return HELP_TEXT;\n}\n","/**\n * Output formatters for the CLI. The runner picks one based on `--format`.\n *\n * pretty — colored, human-friendly summary (default)\n * text — plain ASCII single-line + KV pairs (for piping)\n * json — full result as a single JSON line (for tooling)\n */\nimport type { PhoneValidationResult } from '../serverless/_shared/dispatch';\n\ninterface ColorFns {\n green: (s: string) => string;\n red: (s: string) => string;\n yellow: (s: string) => string;\n cyan: (s: string) => string;\n dim: (s: string) => string;\n bold: (s: string) => string;\n}\n\nfunction colorize(): ColorFns {\n const enabled = process.stdout.isTTY && process.env.NO_COLOR !== '1';\n const wrap = (open: string, close: string) => (s: string) => (enabled ? `\\x1b[${open}m${s}\\x1b[${close}m` : s);\n return {\n green: wrap('32', '39'),\n red: wrap('31', '39'),\n yellow: wrap('33', '39'),\n cyan: wrap('36', '39'),\n dim: wrap('2', '22'),\n bold: wrap('1', '22'),\n };\n}\n\nexport function verdictLine(result: PhoneValidationResult): string {\n const c = colorize();\n if (!result.valid) return c.red(`✗ INVALID ${result.input}`);\n return c.green(`✓ VALID ${result.formatted?.e164 ?? result.input}`);\n}\n\nexport function formatJson(result: PhoneValidationResult): string {\n return JSON.stringify(result);\n}\n\nexport function formatText(result: PhoneValidationResult): string {\n const lines: string[] = [];\n lines.push(verdictLine(result));\n if (!result.valid) {\n if (result.error) lines.push(` error=${result.error}`);\n return lines.join('\\n');\n }\n lines.push(` country=${result.country ?? '_'} type=${result.type ?? '_'}`);\n lines.push(` e164=${result.formatted?.e164}`);\n lines.push(` national=${result.formatted?.national}`);\n lines.push(` international=${result.formatted?.international}`);\n if (result.geocode) lines.push(` geocode=${result.geocode}`);\n if (result.carrier) lines.push(` carrier=${result.carrier}`);\n if (result.timezones?.length) lines.push(` timezones=${result.timezones.join(', ')}`);\n return lines.join('\\n');\n}\n\nexport function formatPretty(result: PhoneValidationResult): string {\n const c = colorize();\n const lines: string[] = [];\n lines.push(verdictLine(result));\n lines.push('');\n\n if (!result.valid) {\n if (result.error) lines.push(` ${c.dim('error:')} ${c.red(result.error)}`);\n return lines.join('\\n');\n }\n\n lines.push(c.bold('Summary'));\n lines.push(\n ` ${c.dim('country:')} ${c.cyan(result.country ?? '—')} ${c.dim(`(+${result.countryCallingCode})`)}`\n );\n lines.push(` ${c.dim('type:')} ${result.type ?? '—'}`);\n lines.push('');\n lines.push(c.bold('Formatted'));\n lines.push(` ${c.dim('E.164:')} ${result.formatted?.e164}`);\n lines.push(` ${c.dim('national:')} ${result.formatted?.national}`);\n lines.push(` ${c.dim('international:')} ${result.formatted?.international}`);\n lines.push(` ${c.dim('RFC3966:')} ${result.formatted?.rfc3966}`);\n\n if (result.geocode || result.carrier || result.timezones?.length) {\n lines.push('');\n lines.push(c.bold('Enrichment'));\n if (result.geocode) lines.push(` ${c.dim('geocode:')} ${result.geocode}`);\n if (result.carrier) lines.push(` ${c.dim('carrier:')} ${result.carrier}`);\n if (result.timezones?.length) {\n lines.push(` ${c.dim('timezones:')} ${result.timezones.join(', ')}`);\n }\n }\n\n return lines.join('\\n');\n}\n","/**\n * CLI runner — turns ParsedArgs into a `validateSingle` invocation, formats\n * the output, and optionally writes the structured result to a log file.\n *\n * Returns the process exit code:\n * 0 — phone parses + is valid\n * 1 — phone is invalid / unparseable\n * 2 — bad CLI arguments (handled in `index.ts` before reaching here)\n */\nimport { mkdirSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { PhoneValidationResult } from '../serverless/_shared/dispatch';\nimport { validateSingle } from '../serverless/_shared/dispatch';\nimport { formatJson, formatPretty, formatText, verdictLine } from './format';\nimport type { ParsedArgs } from './parse-args';\n\nexport interface CliRunDeps {\n validate?: typeof validateSingle;\n writeFile?: (path: string, contents: string) => void;\n ensureDir?: (path: string) => void;\n stdout?: (line: string) => void;\n stderr?: (line: string) => void;\n now?: () => Date;\n}\n\nconst FORMATTERS: Record<ParsedArgs['format'], (r: PhoneValidationResult) => string> = {\n json: formatJson,\n text: formatText,\n pretty: formatPretty,\n};\n\nfunction pad(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\nexport function logFileNameFor(phoneNumber: string, when: Date): string {\n const safe = phoneNumber.replace(/[^a-zA-Z0-9._+-]+/g, '_');\n const stamp =\n `${when.getUTCFullYear()}-${pad(when.getUTCMonth() + 1)}-${pad(when.getUTCDate())}` +\n `T${pad(when.getUTCHours())}${pad(when.getUTCMinutes())}${pad(when.getUTCSeconds())}Z`;\n return `phone-validate-${stamp}-${safe}.json`;\n}\n\nfunction debugLine(args: ParsedArgs): string {\n return (\n `Validating \"${args.phoneNumber}\" ` +\n `(country=${args.defaultCountry ?? 'auto'}, locale=${args.locale}, ` +\n `carrier=${args.carrierLocale}, geocode=${args.enrichGeocode}, ` +\n `carrier-info=${args.enrichCarrier}, timezones=${args.enrichTimezones})`\n );\n}\n\nfunction renderOutput(args: ParsedArgs, result: PhoneValidationResult): string {\n if (args.quiet) return verdictLine(result);\n return FORMATTERS[args.format](result);\n}\n\ninterface FsDeps {\n writeFile: (path: string, contents: string) => void;\n ensureDir: (path: string) => void;\n now: () => Date;\n}\n\nfunction persistLog(\n logDir: string,\n phoneNumber: string,\n result: PhoneValidationResult,\n deps: FsDeps\n): { ok: true; path: string } | { ok: false; error: string } {\n try {\n const dir = resolve(logDir);\n deps.ensureDir(dir);\n const path = resolve(dir, logFileNameFor(phoneNumber, deps.now()));\n deps.writeFile(path, JSON.stringify(result, null, 2));\n return { ok: true, path };\n } catch (error) {\n return { ok: false, error: error instanceof Error ? error.message : String(error) };\n }\n}\n\nexport async function run(args: ParsedArgs, deps: CliRunDeps = {}): Promise<number> {\n const validate = deps.validate ?? validateSingle;\n const stdout = deps.stdout ?? ((line) => process.stdout.write(`${line}\\n`));\n const stderr = deps.stderr ?? ((line) => process.stderr.write(`${line}\\n`));\n const fsDeps: FsDeps = {\n writeFile: deps.writeFile ?? ((path, contents) => writeFileSync(path, contents, 'utf8')),\n ensureDir: deps.ensureDir ?? ((path) => mkdirSync(path, { recursive: true })),\n now: deps.now ?? (() => new Date()),\n };\n\n if (args.debug) stderr(debugLine(args));\n\n const result = await validate(args.phoneNumber, {\n defaultCountry: args.defaultCountry,\n locale: args.locale,\n carrierLocale: args.carrierLocale,\n geocode: args.enrichGeocode,\n carrier: args.enrichCarrier,\n timezones: args.enrichTimezones,\n });\n\n stdout(renderOutput(args, result));\n\n if (args.logDir) {\n const log = persistLog(args.logDir, args.phoneNumber, result, fsDeps);\n if (!log.ok) stderr(`Warning: failed to write log file: ${log.error}`);\n else if (!args.quiet) stderr(`Log written: ${log.path}`);\n }\n\n return exitCodeFor(result);\n}\n\nexport function exitCodeFor(result: PhoneValidationResult): number {\n return result.valid ? 0 : 1;\n}\n","/**\n * `phone-validate` CLI entry point.\n *\n * Wired into `package.json#bin` so `bun add -g @phonecheck/phone-number-validator-js`\n * (or the npm equivalent) installs a `phone-validate` command.\n */\nimport '../index'; // installs the default Node FS resource loader\nimport { helpText, parseArgs } from './parse-args';\nimport { run } from './run';\n\nexport type { CliArgError, ParsedArgs, ParsedHelp, ParsedVersion, ParseResult } from './parse-args';\nexport { helpText, parseArgs } from './parse-args';\nexport type { CliRunDeps } from './run';\nexport { exitCodeFor, logFileNameFor, run } from './run';\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const parsed = parseArgs(argv);\n\n if (parsed.kind === 'help') {\n process.stdout.write(`${helpText()}\\n`);\n return 0;\n }\n if (parsed.kind === 'version') {\n try {\n const pkg = require('../../package.json') as { version: string };\n process.stdout.write(`${pkg.version}\\n`);\n } catch {\n process.stdout.write('unknown\\n');\n }\n return 0;\n }\n if (parsed.kind === 'error') {\n for (const msg of parsed.messages) process.stderr.write(`${msg}\\n`);\n process.stderr.write(`\\nRun with --help for usage.\\n`);\n return parsed.exitCode;\n }\n\n return run(parsed);\n}\n\nconst isDirectInvocation =\n (typeof import.meta !== 'undefined' && (import.meta as { main?: boolean }).main === true) ||\n (typeof require !== 'undefined' && require.main === module);\n\nif (isDirectInvocation) {\n main()\n .then((code) => process.exit(code))\n .catch((error) => {\n process.stderr.write(\n `Unexpected error: ${error instanceof Error ? (error.stack ?? error.message) : String(error)}\\n`\n );\n process.exit(1);\n });\n}\n"],"names":["lru","deserialize","dirname","fileURLToPath","resolve","existsSync","join","readFileSync","parsePhoneNumberFromString","writeFileSync","mkdirSync"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,7 +9,9 @@
|
|
|
9
9
|
* `ResourceLoader` (KV / R2 / S3 / fetch) via `setResourceLoader()`.
|
|
10
10
|
*/
|
|
11
11
|
export * from 'libphonenumber-js';
|
|
12
|
-
export { clearCache, DEFAULT_CACHE_SIZE, getCacheSize, getCacheStats, setCacheSize
|
|
12
|
+
export { clearCache, DEFAULT_CACHE_SIZE, getCacheSize, getCacheStats, setCacheSize } from './cache';
|
|
13
13
|
export { carrier, carrierAsync, type EnrichmentResult, type EnrichOptions, enrichPhoneNumber, geocoder, geocoderAsync, getResourceLoader, setResourceLoader, timezones, timezonesAsync, } from './core';
|
|
14
14
|
export { NodeFsResourceLoader, type NodeFsResourceLoaderOptions } from './node-fs-loader';
|
|
15
|
+
export { executeValidation, type PhoneValidationResult, validateBatch, validateSingle, } from './serverless/_shared/dispatch';
|
|
16
|
+
export { type BatchOptions, type BatchValidation, classifyRequest, extractBatchOptions, MAX_BATCH_SIZE, type ValidationDispatch, type ValidationFailure, type ValidationRequestBody, validateBatchField, } from './serverless/_shared/validation';
|
|
15
17
|
export type { CacheStats, CarrierLocale, GeocoderLocale, LookupTable, MaybePhoneNumber, ResourceKind, ResourceLoader, } from './types';
|
package/dist/index.esm.js
CHANGED
|
@@ -3,6 +3,7 @@ import { lru } from 'tiny-lru';
|
|
|
3
3
|
import { existsSync, readFileSync } from 'node:fs';
|
|
4
4
|
import { join, dirname, resolve } from 'node:path';
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { parsePhoneNumberFromString } from 'libphonenumber-js';
|
|
6
7
|
export * from 'libphonenumber-js';
|
|
7
8
|
|
|
8
9
|
const DEFAULT_CACHE_SIZE = 100;
|
|
@@ -225,7 +226,107 @@ class NodeFsResourceLoader {
|
|
|
225
226
|
}
|
|
226
227
|
}
|
|
227
228
|
|
|
229
|
+
function resolveOptions(options) {
|
|
230
|
+
var _a, _b, _c, _d, _e;
|
|
231
|
+
return {
|
|
232
|
+
defaultCountry: options.defaultCountry,
|
|
233
|
+
locale: (_a = options.locale) !== null && _a !== void 0 ? _a : "en",
|
|
234
|
+
carrierLocale: (_b = options.carrierLocale) !== null && _b !== void 0 ? _b : "en",
|
|
235
|
+
// Each enrichment toggle defaults to ON when unset — opt-out, not opt-in.
|
|
236
|
+
geocode: (_c = options.geocode) !== null && _c !== void 0 ? _c : true,
|
|
237
|
+
carrier: (_d = options.carrier) !== null && _d !== void 0 ? _d : true,
|
|
238
|
+
timezones: (_e = options.timezones) !== null && _e !== void 0 ? _e : true
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
async function validateOne(input, options) {
|
|
242
|
+
const parsed = parsePhoneNumberFromString(input, options.defaultCountry);
|
|
243
|
+
if (!(parsed === null || parsed === void 0 ? void 0 : parsed.isValid())) {
|
|
244
|
+
return { input, valid: false, error: "Invalid or unparseable phone number" };
|
|
245
|
+
}
|
|
246
|
+
const [geocode, carrier, timezones] = await Promise.all([
|
|
247
|
+
options.geocode ? geocoderAsync(parsed, options.locale) : Promise.resolve(void 0),
|
|
248
|
+
options.carrier ? carrierAsync(parsed, options.carrierLocale) : Promise.resolve(void 0),
|
|
249
|
+
options.timezones ? timezonesAsync(parsed) : Promise.resolve(void 0)
|
|
250
|
+
]);
|
|
251
|
+
const result = {
|
|
252
|
+
input,
|
|
253
|
+
valid: true,
|
|
254
|
+
formatted: {
|
|
255
|
+
e164: parsed.format("E.164"),
|
|
256
|
+
international: parsed.formatInternational(),
|
|
257
|
+
national: parsed.formatNational(),
|
|
258
|
+
rfc3966: parsed.format("RFC3966")
|
|
259
|
+
},
|
|
260
|
+
country: parsed.country,
|
|
261
|
+
countryCallingCode: parsed.countryCallingCode.toString(),
|
|
262
|
+
nationalNumber: parsed.nationalNumber.toString(),
|
|
263
|
+
type: parsed.getType()
|
|
264
|
+
};
|
|
265
|
+
if (geocode !== void 0)
|
|
266
|
+
result.geocode = geocode;
|
|
267
|
+
if (carrier !== void 0)
|
|
268
|
+
result.carrier = carrier;
|
|
269
|
+
if (timezones !== void 0)
|
|
270
|
+
result.timezones = timezones;
|
|
271
|
+
return result;
|
|
272
|
+
}
|
|
273
|
+
async function executeValidation(dispatch) {
|
|
274
|
+
const opts = resolveOptions(dispatch.options);
|
|
275
|
+
if (dispatch.kind === "single") {
|
|
276
|
+
return validateOne(dispatch.phoneNumber, opts);
|
|
277
|
+
}
|
|
278
|
+
return Promise.all(dispatch.phoneNumbers.map((p) => validateOne(p, opts)));
|
|
279
|
+
}
|
|
280
|
+
async function validateSingle(input, options = {}) {
|
|
281
|
+
return validateOne(input, resolveOptions(options));
|
|
282
|
+
}
|
|
283
|
+
async function validateBatch(inputs, options = {}) {
|
|
284
|
+
const opts = resolveOptions(options);
|
|
285
|
+
return Promise.all(inputs.map((p) => validateOne(p, opts)));
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
const MAX_BATCH_SIZE = 100;
|
|
289
|
+
function extractBatchOptions(body) {
|
|
290
|
+
return {
|
|
291
|
+
defaultCountry: body.defaultCountry,
|
|
292
|
+
locale: body.locale,
|
|
293
|
+
carrierLocale: body.carrierLocale,
|
|
294
|
+
geocode: body.geocode,
|
|
295
|
+
carrier: body.carrier,
|
|
296
|
+
timezones: body.timezones
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
function validateBatchField(phoneNumbers) {
|
|
300
|
+
if (!Array.isArray(phoneNumbers) || phoneNumbers.length === 0) {
|
|
301
|
+
return { ok: false, status: 400, message: "phoneNumbers array is required" };
|
|
302
|
+
}
|
|
303
|
+
if (phoneNumbers.length > MAX_BATCH_SIZE) {
|
|
304
|
+
return { ok: false, status: 400, message: `Maximum ${MAX_BATCH_SIZE} phone numbers per batch` };
|
|
305
|
+
}
|
|
306
|
+
return { ok: true, phoneNumbers };
|
|
307
|
+
}
|
|
308
|
+
const MISSING_INPUT = {
|
|
309
|
+
kind: "invalid",
|
|
310
|
+
status: 400,
|
|
311
|
+
message: "phoneNumber or phoneNumbers array is required"
|
|
312
|
+
};
|
|
313
|
+
function classifyRequest(body) {
|
|
314
|
+
if (!body)
|
|
315
|
+
return MISSING_INPUT;
|
|
316
|
+
const options = extractBatchOptions(body);
|
|
317
|
+
if (body.phoneNumbers !== void 0) {
|
|
318
|
+
const validated = validateBatchField(body.phoneNumbers);
|
|
319
|
+
if (!validated.ok)
|
|
320
|
+
return { kind: "invalid", status: validated.status, message: validated.message };
|
|
321
|
+
return { kind: "batch", phoneNumbers: validated.phoneNumbers, options };
|
|
322
|
+
}
|
|
323
|
+
if (body.phoneNumber) {
|
|
324
|
+
return { kind: "single", phoneNumber: body.phoneNumber, options };
|
|
325
|
+
}
|
|
326
|
+
return MISSING_INPUT;
|
|
327
|
+
}
|
|
328
|
+
|
|
228
329
|
setResourceLoader(new NodeFsResourceLoader());
|
|
229
330
|
|
|
230
|
-
export { DEFAULT_CACHE_SIZE, NodeFsResourceLoader, carrier, carrierAsync, clearCache, enrichPhoneNumber, geocoder, geocoderAsync, getCacheSize, getCacheStats, getResourceLoader, setCacheSize, setResourceLoader, timezones, timezonesAsync };
|
|
331
|
+
export { DEFAULT_CACHE_SIZE, MAX_BATCH_SIZE, NodeFsResourceLoader, carrier, carrierAsync, classifyRequest, clearCache, enrichPhoneNumber, executeValidation, extractBatchOptions, geocoder, geocoderAsync, getCacheSize, getCacheStats, getResourceLoader, setCacheSize, setResourceLoader, timezones, timezonesAsync, validateBatch, validateBatchField, validateSingle };
|
|
231
332
|
//# sourceMappingURL=index.esm.js.map
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/cache.ts","../src/core.ts","../src/node-fs-loader.ts","../src/index.ts"],"sourcesContent":[null,null,null,null],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/cache.ts","../src/core.ts","../src/node-fs-loader.ts","../src/serverless/_shared/dispatch.ts","../src/serverless/_shared/validation.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null],"names":[],"mappings":"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"}
|