Numsy is a light-weight TypeScript library for Indian phone number validation, sanitization, and CSV/Excel file processing. Built with class-based architecture, comprehensive error handling, and extensive logging capabilities.*
npm install numsy
pnpm add numsy
yarn add numsy
import Numsy from 'numsy';
const numsy = new Numsy();
// Validate a phone number
const result = numsy.validate('9876543210');
console.log(result);
// { original: '9876543210', sanitized: '9876543210', isValid: true }
// Check if valid
console.log(numsy.isValid('9876543210')); // true
// Sanitize number
console.log(numsy.sanitize('+91-987-654-3210')); // '9876543210'
// Format with country code
console.log(numsy.format('9876543210', true)); // '+919876543210'
import { Parser } from 'numsy';
// or
import parser from 'numsy/parser';
const parser = new Parser();
// Parse CSV file
const result = await parser.parseFile('./contacts.csv');
console.log(result.data);
console.log(result.totalRows);
import Numsy from 'numsy';
const numsy = new Numsy();
// Process file with validation
const result = await numsy.processFile('./contacts.csv', './output');
console.log(`Processed ${result.totalRecords} records`);
console.log(`Valid: ${result.validRecords}, Invalid: ${result.invalidRecords}`);
Numsy includes a built-in server with a web interface for processing phone numbers without writing code.
After installing the package:
# Using npx (recommended - no installation needed)
npx @numsy/numsy-serve
# Or install globally first
npm install -g @numsy/numsy
numsy-serve
# With custom options
npx @numsy/numsy-serve --port 3000
npx @numsy/numsy-serve --page
npx @numsy/numsy-serve -p 8080 --page
# Display help
npx @numsy/numsy-serve --help
For local development (in this repository):
# Using pnpm scripts
pnpm run serve
# Or using npm scripts
npm run serve
# Or directly with ts-node
npx ts-node src/cli/server.ts
# With options (requires -- separator)
pnpm run serve -- --port 3000
pnpm run serve -- --page
| Option | Alias | Description | Default |
|---|---|---|---|
--port <number> |
-p |
Specify port number (1024-65535) | 3000 |
--page |
-s, --serve |
Serve the HTML utility page | false |
--help |
-h |
Display help message | - |
You can also configure the server using environment variables:
# Set port via environment variable
PORT=3000 npx @numsy/numsy-serve
# Set environment mode
NODE_ENV=production npx @numsy/numsy-serve
/apiOnce the server is running, you can access:
http://localhost:3000/api/healthhttp://localhost:3000/api--page flag): http://localhost:3000โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
Server Started Successfully โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
๐ Server running on: http://localhost:3000
๐ก API endpoint: http://localhost:3000/api
๐ Health check: http://localhost:3000/api/health
๐ Utility page: http://localhost:3000
๐ Environment: development
โก Process ID: 12345
Press Ctrl+C to stop the server
import Numsy from 'numsy';
const numsy = new Numsy();
// Single validation
const result = numsy.validate('9876543210');
// Batch validation
const numbers = ['9876543210', '8123456789', '1234567890'];
const results = numsy.validateBatch(numbers);
// Extract multiple numbers from text
const text = 'Contact me at 9876543210 or 8123456789';
const extracted = numsy.extractMultiple(text);
console.log(extracted.validNumbers); // ['9876543210', '8123456789']
import Numsy from 'numsy';
const numsy = new Numsy();
// Parse file
const parsed = await numsy.parseFile('./data.csv');
// Process with validation
const result = await numsy.processFile('./data.csv', './output');
// Write to CSV
await numsy.writeCsv(data, './output/clean-data.csv');
import { Parser, PhoneValidator, FileProcessor } from 'numsy';
// Use Parser separately
const parser = new Parser({
normalizeColumns: true,
detectPhoneColumn: true,
});
// Use PhoneValidator separately
const validator = new PhoneValidator({
enableLogging: false,
});
// Use FileProcessor separately
const processor = new FileProcessor({
outputDir: './output',
});
import Numsy from 'numsy';
const numsy = new Numsy({
enableLogging: true, // Enable console logging
logLevel: 'debug', // Log level: 'log' | 'error' | 'warn' | 'debug' | 'verbose'
throwOnError: false, // Throw errors vs return error objects
});
// Update options at runtime
numsy.setOptions({ enableLogging: false });
Main class providing unified API:
validate(phone: string): PhoneValidationResult - Validate single phone numbervalidateBatch(phones: string[]): PhoneValidationResult[] - Validate multiple numberssanitize(phone: string): string - Clean phone numberisValid(phone: string): boolean - Quick validation checkformat(phone: string, withCountryCode?: boolean): string - Format phone numberextractMultiple(text: string): MultipleNumbersResult - Extract numbers from textparseFile(filePath: string): Promise<FileParseResult> - Parse CSV/Excel fileprocessFile(filePath: string, outputDir?: string): Promise<ProcessingResult> - Process file with validationwriteCsv(data: ParsedDataRow[], outputPath: string): Promise<void> - Write to CSVdetectPhoneColumn(data: ParsedDataRow[]): string | null - Detect phone columnFile parsing operations:
parseFile(filePath: string): Promise<FileParseResult> - Parse filewriteCsv(data, outputPath): Promise<void> - Write CSVwriteProcessedFiles(validData, invalidData, validPath, invalidPath): Promise<void> - Write multiple filesPhone validation operations:
validate(phone: string): PhoneValidationResult - Validate numbervalidateBatch(phones: string[]): PhoneValidationResult[] - Batch validationsanitize(phone: string): string - Sanitize numberisValid(phone: string): boolean - Check validityextractMultiple(text: string): MultipleNumbersResult - Extract numbersformat(phone: string, withCountryCode?: boolean): string - Format numberPure utility functions:
import {
sanitizePhoneNumber,
validatePhoneNumber,
extractPhoneNumbers,
normalizeDataRows,
detectPhoneColumn,
isNonEmptyString,
isValidNumber,
LoggerHelper,
AppError,
} from 'numsy';
Numsy follows a modern, class-based architecture:
src/
โโโ common/
โ โโโ interfaces/ # TypeScript interfaces
โ โโโ functions/ # Pure utility functions
โ โโโ helpers/ # Helper classes (Logger, Error, File, Validation)
โโโ core/
โ โโโ Numsy.ts # Main class
โ โโโ Parser.ts # File parser
โ โโโ PhoneValidator.ts # Phone validator
โ โโโ FileProcessor.ts # File processor
โโโ index.ts # Package entry point
# Install dependencies
pnpm install
# Build package
pnpm run build
# Run tests
pnpm test
# Development with auto-reload
pnpm run dev
# Start server (for web interface)
pnpm run start:dev
pnpm run build - Build with SWC (fast compilation)pnpm run build:nest - Build with Nest CLIpnpm run dev - Development mode with nodemonpnpm run test - Run testspnpm run test:watch - Watch modepnpm run test:cov - Coverage reportpnpm run lint - Lint codepnpm run format - Format codeNumsy includes comprehensive test coverage:
# Run all tests
pnpm test
# Watch mode
pnpm test:watch
# Coverage report
pnpm test:cov
Numsy provides comprehensive error handling:
import { Numsy, AppError } from 'numsy';
try {
const numsy = new Numsy({ throwOnError: true });
const result = await numsy.processFile('./data.csv');
} catch (error) {
if (error instanceof AppError) {
console.error(`Error [${error.code}]: ${error.message}`);
console.error('Details:', error.details);
}
}
Full TypeScript support with complete type definitions:
import {
Numsy,
NumsyOptions,
PhoneValidationResult,
MultipleNumbersResult,
ProcessingResult,
FileParseResult,
ParsedDataRow,
} from 'numsy';
const options: NumsyOptions = {
enableLogging: true,
logLevel: 'debug',
throwOnError: false,
};
const numsy = new Numsy(options);
const result: PhoneValidationResult = numsy.validate('9876543210');
Contributions are welcome! Please read CONTRIBUTING.md for details.
MIT License - see LICENSE file for details.
If you find this package helpful, please give it a star on GitHub!
Made with โค๏ธ by Shri Kumar Sharma