UNPKG

luhn-generator

Version:

A generator of numbers that passes the validation of Luhn algorithm or Luhn formula, also known as the 'modulus 10' or 'mod 10' algorithm

115 lines (92 loc) 2.7 kB
'use strict'; const execa = require('execa'); const lcid = require('lcid'); const mem = require('mem'); const defaultOptions = {spawn: true}; const defaultLocale = 'en_US'; function getEnvLocale(env = process.env) { return env.LC_ALL || env.LC_MESSAGES || env.LANG || env.LANGUAGE; } function parseLocale(string) { const env = string.split('\n').reduce((env, def) => { const [key, value] = def.split('='); env[key] = value.replace(/^"|"$/g, ''); return env; }, {}); return getEnvLocale(env); } function getLocale(string) { return (string && string.replace(/[.:].*/, '')); } function getLocales() { return execa.stdout('locale', ['-a']); } function getLocalesSync() { return execa.sync('locale', ['-a']).stdout; } function getSupportedLocale(locale, locales = '') { return locales.includes(locale) ? locale : defaultLocale; } function getAppleLocale() { return Promise.all([ execa.stdout('defaults', ['read', '-globalDomain', 'AppleLocale']), getLocales() ]).then(results => getSupportedLocale(results[0], results[1])); } function getAppleLocaleSync() { return getSupportedLocale( execa.sync('defaults', ['read', '-globalDomain', 'AppleLocale']).stdout, getLocalesSync() ); } function getUnixLocale() { if (process.platform === 'darwin') { return getAppleLocale(); } return execa.stdout('locale') .then(stdout => getLocale(parseLocale(stdout))); } function getUnixLocaleSync() { if (process.platform === 'darwin') { return getAppleLocaleSync(); } return getLocale(parseLocale(execa.sync('locale').stdout)); } function getWinLocale() { return execa.stdout('wmic', ['os', 'get', 'locale']) .then(stdout => { const lcidCode = parseInt(stdout.replace('Locale', ''), 16); return lcid.from(lcidCode); }); } function getWinLocaleSync() { const {stdout} = execa.sync('wmic', ['os', 'get', 'locale']); const lcidCode = parseInt(stdout.replace('Locale', ''), 16); return lcid.from(lcidCode); } module.exports = mem((options = defaultOptions) => { const envLocale = getEnvLocale(); let thenable; if (envLocale || options.spawn === false) { thenable = Promise.resolve(getLocale(envLocale)); } else if (process.platform === 'win32') { thenable = getWinLocale(); } else { thenable = getUnixLocale(); } return thenable .then(locale => locale || defaultLocale) .catch(() => defaultLocale); }); module.exports.sync = mem((options = defaultOptions) => { const envLocale = getEnvLocale(); let res; if (envLocale || options.spawn === false) { res = getLocale(envLocale); } else { try { res = process.platform === 'win32' ? getWinLocaleSync() : getUnixLocaleSync(); } catch (_) {} } return res || defaultLocale; });