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

193 lines (162 loc) 6.35 kB
var isCore = require('is-core-module'); var fs = require('fs'); var path = require('path'); var caller = require('./caller'); var nodeModulesPaths = require('./node-modules-paths'); var normalizeOptions = require('./normalize-options'); var realpathFS = fs.realpathSync && typeof fs.realpathSync.native === 'function' ? fs.realpathSync.native : fs.realpathSync; var defaultIsFile = function isFile(file) { try { var stat = fs.statSync(file); } catch (e) { if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; throw e; } return stat.isFile() || stat.isFIFO(); }; var defaultIsDir = function isDirectory(dir) { try { var stat = fs.statSync(dir); } catch (e) { if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; throw e; } return stat.isDirectory(); }; var defaultRealpathSync = function realpathSync(x) { try { return realpathFS(x); } catch (realpathErr) { if (realpathErr.code !== 'ENOENT') { throw realpathErr; } } return x; }; var maybeRealpathSync = function maybeRealpathSync(realpathSync, x, opts) { if (opts && opts.preserveSymlinks === false) { return realpathSync(x); } return x; }; var getPackageCandidates = function getPackageCandidates(x, start, opts) { var dirs = nodeModulesPaths(start, opts, x); for (var i = 0; i < dirs.length; i++) { dirs[i] = path.join(dirs[i], x); } return dirs; }; module.exports = function resolveSync(x, options) { if (typeof x !== 'string') { throw new TypeError('Path must be a string.'); } var opts = normalizeOptions(x, options); var isFile = opts.isFile || defaultIsFile; var readFileSync = opts.readFileSync || fs.readFileSync; var isDirectory = opts.isDirectory || defaultIsDir; var realpathSync = opts.realpathSync || defaultRealpathSync; var packageIterator = opts.packageIterator; var extensions = opts.extensions || ['.js']; var includeCoreModules = opts.includeCoreModules !== false; var basedir = opts.basedir || path.dirname(caller()); var parent = opts.filename || basedir; opts.paths = opts.paths || []; // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory var absoluteStart = maybeRealpathSync(realpathSync, path.resolve(basedir), opts); if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) { var res = path.resolve(absoluteStart, x); if (x === '.' || x === '..' || x.slice(-1) === '/') res += '/'; var m = loadAsFileSync(res) || loadAsDirectorySync(res); if (m) return maybeRealpathSync(realpathSync, m, opts); } else if (includeCoreModules && isCore(x)) { return x; } else { var n = loadNodeModulesSync(x, absoluteStart); if (n) return maybeRealpathSync(realpathSync, n, opts); } var err = new Error("Cannot find module '" + x + "' from '" + parent + "'"); err.code = 'MODULE_NOT_FOUND'; throw err; function loadAsFileSync(x) { var pkg = loadpkg(path.dirname(x)); if (pkg && pkg.dir && pkg.pkg && opts.pathFilter) { var rfile = path.relative(pkg.dir, x); var r = opts.pathFilter(pkg.pkg, x, rfile); if (r) { x = path.resolve(pkg.dir, r); // eslint-disable-line no-param-reassign } } if (isFile(x)) { return x; } for (var i = 0; i < extensions.length; i++) { var file = x + extensions[i]; if (isFile(file)) { return file; } } } function loadpkg(dir) { if (dir === '' || dir === '/') return; if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) { return; } if ((/[/\\]node_modules[/\\]*$/).test(dir)) return; var pkgfile = path.join(maybeRealpathSync(realpathSync, dir, opts), 'package.json'); if (!isFile(pkgfile)) { return loadpkg(path.dirname(dir)); } var body = readFileSync(pkgfile); try { var pkg = JSON.parse(body); } catch (jsonErr) {} if (pkg && opts.packageFilter) { // v2 will pass pkgfile pkg = opts.packageFilter(pkg, /*pkgfile,*/ dir); // eslint-disable-line spaced-comment } return { pkg: pkg, dir: dir }; } function loadAsDirectorySync(x) { var pkgfile = path.join(maybeRealpathSync(realpathSync, x, opts), '/package.json'); if (isFile(pkgfile)) { try { var body = readFileSync(pkgfile, 'UTF8'); var pkg = JSON.parse(body); } catch (e) {} if (pkg && opts.packageFilter) { // v2 will pass pkgfile pkg = opts.packageFilter(pkg, /*pkgfile,*/ x); // eslint-disable-line spaced-comment } if (pkg && pkg.main) { if (typeof pkg.main !== 'string') { var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); mainError.code = 'INVALID_PACKAGE_MAIN'; throw mainError; } if (pkg.main === '.' || pkg.main === './') { pkg.main = 'index'; } try { var m = loadAsFileSync(path.resolve(x, pkg.main)); if (m) return m; var n = loadAsDirectorySync(path.resolve(x, pkg.main)); if (n) return n; } catch (e) {} } } return loadAsFileSync(path.join(x, '/index')); } function loadNodeModulesSync(x, start) { var thunk = function () { return getPackageCandidates(x, start, opts); }; var dirs = packageIterator ? packageIterator(x, start, thunk, opts) : thunk(); for (var i = 0; i < dirs.length; i++) { var dir = dirs[i]; if (isDirectory(path.dirname(dir))) { var m = loadAsFileSync(dir); if (m) return m; var n = loadAsDirectorySync(dir); if (n) return n; } } } };