.gitignore000066400000000000000000000001401516705014400130440ustar00rootroot00000000000000/build /node_modules /*.log /yarn.lock /package-lock.json .idea/workspace.xml .idea/tasks.xml .idea/000077500000000000000000000000001516705014400120415ustar00rootroot00000000000000.idea/corifeus-utils.iml000066400000000000000000000005201516705014400155160ustar00rootroot00000000000000 .idea/misc.xml000066400000000000000000000002561516705014400135210ustar00rootroot00000000000000 .idea/modules.xml000066400000000000000000000004301516705014400142300ustar00rootroot00000000000000 .idea/vcs.xml000066400000000000000000000002471516705014400133610ustar00rootroot00000000000000 .npmignore000066400000000000000000000002221516705014400130540ustar00rootroot00000000000000/.idea /artifacts /build /test /node_modules /*.iml /*.ipr /*.iws /.travis.yml /.scrutinizer.yml /Gruntfile.js /*.lock *.log /corifeus-boot.json .scrutinizer.yml000066400000000000000000000005471516705014400142510ustar00rootroot00000000000000checks: javascript: true filter: excluded_paths: - test/* - node_modules/* - build/* - docs/* build: environment: node: 7.8 dependencies: before: - npm install -g grunt-cli tests: override: - command: 'grunt' coverage: file: 'build/coverage/clover.xml' format: 'clover' .travis.yml000066400000000000000000000001331516705014400131670ustar00rootroot00000000000000language: node_js node_js: - "7" - "node" before_script: - npm install grunt-cli -g Gruntfile.js000066400000000000000000000004201516705014400133520ustar00rootroot00000000000000module.exports = (grunt) => { const builder = require(`corifeus-builder`); const loader = new builder.loader(grunt); loader.js({ replacer: { npmio: true } }); grunt.registerTask('default', builder.config.task.build.js); } LICENSE000066400000000000000000000021401516705014400120630ustar00rootroot00000000000000MIT License Copyright (c) 2017 Patrik Laszlo / patrikx3 / https://patrikx3.tk and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. README.md000066400000000000000000000065571516705014400123550ustar00rootroot00000000000000[//]: #@corifeus-header [![Build Status](https://travis-ci.org/patrikx3/corifeus-utils.svg?branch=master)](https://travis-ci.org/patrikx3/corifeus-utils) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/patrikx3/corifeus-utils/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/patrikx3/corifeus-utils/?branch=master) [![Code Coverage](https://scrutinizer-ci.com/g/patrikx3/corifeus-utils/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/patrikx3/corifeus-utils/?branch=master) [![NPM](https://nodei.co/npm/corifeus-utils.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/corifeus-utils/) --- # Corifeus Utils - Memory ## Issues / Support This is an open source project. Time is a precious thing, so I have rarely time to give support and fix issues for someone else. I fix a bug, when I have an error that I need. If you got an issue, error or bug, I hope someone will have time to do it for you, otherwise, you are on your own. Though, if I know the solution, I will tell you. Besides, core errors will be fixed by me. ***If you want to extend, fix bugs or add in new features, I promptly merge pull requests or you can become a ```patrikx3``` member.*** Besides, when I can support, please note, I cannot support old versions, only the current/latest version. ### Node Version Requirement ``` >=7.8.0 ``` ### Built on Node ``` v8.1.0 ``` The ```async``` and ```await``` keywords are required. Install NodeJs: https://nodejs.org/en/download/package-manager/ ### Updating Since, I work full time, I can work only on weekends. Github updates are released only Sundays. Minor errors can be released any time, but reflects will be shown only in NPM. # Description [//]: #@corifeus-header:end Misc utils (async array iterator, random characters, exit on silent ```unhandledRejection``` errors, etc...) ```javascript const utils = require('corifeus-utils'); ``` * Modules * Async Array Iterator ```forEachAsync``` * ```JSON.strintify``` for ```Error``` * Lodash Pascal * Remove silent process ```unhandledRejection``` end ```process.exit()```, adds timestamp * Process ```uncaughtException``` that shows timestamp. * Random async Base62 string * Replace inject - finds a prefix and postfix in a string and replace the content, ```strings.inject``` * Convert a byte array or string to base62, ```utils.base.charset(string)``` * Async Hash (SHA-512, SHA-256) file using Base62, * Promise based HTTP Request * Time utilies * Additional file system utils * JSON based file database * HTTP/HTTPS based async/Promise request # Actual modules * time * verbose * span * regexp * escape * random * async (default is base62) * promise * deferred (simple extract the reject, resolve and promise function, instead of callback) * process * unhandledRejection * uncaughtException * writableCallbackExit * object * reduce * hash * async file * string * padStart * empty * inject * lodash * PascalCase * http * async request * db * file based json storage * child-process * async exec * array * forEachAsync, async for each [//]: #@corifeus-footer --- [**CORIFEUS-UTILS**](https://pages.corifeus.tk/corifeus-utils) Build v1.1.328-18 [Corifeus](http://www.corifeus.tk) by [Patrik Laszlo](http://patrikx3.tk) [//]: #@corifeus-footer:end corifeus-utils.iml000066400000000000000000000007601516705014400145440ustar00rootroot00000000000000 package.json000066400000000000000000000022731516705014400133530ustar00rootroot00000000000000{ "name": "corifeus-utils", "version": "1.1.328-18", "corifeus": { "icon": "fa fa-lightbulb-o", "code": "Memory", "publish": true }, "description": "Corifeus Utils - Memory", "main": "src/index.js", "directories": { "test": "test" }, "scripts": { "test": "grunt", "coverage": "istanbul cover node_modules/mocha/bin/_mocha --report clover -- -R spec test/mocha/**/*.js" }, "repository": { "type": "git", "url": "git+https://github.com/patrikx3/corifeus-utils.git" }, "keywords": [ "corifeus", "nodejs", "node", "utils" ], "author": "Patrik Laszlo ", "license": "MIT", "bugs": { "url": "https://github.com/patrikx3/corifeus-utils/issues" }, "homepage": "https://pages.corifeus.tk/corifeus-utils", "devDependencies": { "corifeus-builder": "^1.7.660-16" }, "dependencies": { "fs-extra": "^3.0.1", "glob": "^7.1.2", "lodash": "^4.17.4", "ms": "^2.0.0", "mz": "^2.6.0", "timestring": "^4.0.0" }, "engines": { "node": ">=7.8.0" } }src/000077500000000000000000000000001516705014400116505ustar00rootroot00000000000000src/array/000077500000000000000000000000001516705014400127665ustar00rootroot00000000000000src/array/for-each-async.js000066400000000000000000000013341516705014400161240ustar00rootroot00000000000000const forEachAsync = (array, cb, serial = false) => { const promises = []; let lastCb; for(let index = 0; index < array.length; index++) { const item = array[index]; const call = () => { cb(item, index) } if (serial) { if (lastCb === undefined) { lastCb = cb(item, index) } else { lastCb = lastCb.then(() => cb(item, index)); } } else { promises.push( cb(item, index)) } } if (serial) { return lastCb; } else { const result = Promise.all(promises); result.promises = promises; return result; } } module.exports = forEachAsync;src/array/index.js000066400000000000000000000007741516705014400144430ustar00rootroot00000000000000module.exports.forEachAsync = require('./for-each-async'); module.exports.isfy = (input) => { const args = Array.prototype.slice.call(input); return args.sort(); } if (!Array.prototype.forEachAsync) { const forEachAsync = module.exports.forEachAsync; Object.defineProperty(Array.prototype, 'forEachAsync', { enumerable: false, writable: true, value: function(callback, serial = false) { return forEachAsync(this, callback, serial); } }); } src/base.js000066400000000000000000000007361516705014400131260ustar00rootroot00000000000000const base62Charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; module.exports.charset = (bytes, charset = base62Charset) => { let string = '' for(let index = 0; index < bytes.length; index++) { const byte = bytes[index]; const percent = (100 / 256 * byte) / 100; const charIndex = Math.floor(charset.length * percent) ; const char = charset.charAt(charIndex) string += char; } return string; } src/child-process/000077500000000000000000000000001516705014400144075ustar00rootroot00000000000000src/child-process/index.js000066400000000000000000000016331516705014400160570ustar00rootroot00000000000000const childProcess = require('child_process'); const promiseUtil = require('../promise'); module.exports.exec = (command, options) => { if (options === true) { options = { display: true } } options = options || {}; options.stdio = options.stdio || 'inherit'; options.display = options.display || false; const { resolve, reject, promise} = promiseUtil.deferred(); const run = childProcess.exec(command, options, (err, stdout, stderr) => { if (err) { reject(err); return; } resolve({ stdout: stdout, stderr: stderr, }) }) if (options.display === true) { run.stdout.on('data', (data) => { console.log(data); }); run.stderr.on('data', (data) => { console.error(data); }); } promise.exec = run; return promise }src/db/000077500000000000000000000000001516705014400122355ustar00rootroot00000000000000src/db/index.js000066400000000000000000000026441516705014400137100ustar00rootroot00000000000000const coryFs = require('../fs'); const mz = require('mz'); const load = async (dbFile, data = {}) => { data = await coryFs.ensureFile(dbFile, data) data = JSON.parse(data.toString()); return new db(dbFile, data); } const db = function(dbFile, data) { const getTime = () => { return Date.now(); } if (!data.hasOwnProperty('_createdAt')) { data._createdAt = getTime(); data._updatedAt = getTime(); } Object.defineProperty(this, 'raw', { get: () => { return data; } }) this.exists = function(entity, key) { if (!data.hasOwnProperty(entity)) { return false; } if (!data[entity].hasOwnProperty(key)) { return false; } return true; } this.save = function(entity, key, saveData) { if (!data.hasOwnProperty(entity)) { data[entity] = {}; } if (data[entity].hasOwnProperty(key)) { saveData._updatedAt = getTime(); data[entity][key] = Object.assign(data[entity][key], saveData); } else { saveData._createdAt = getTime(); saveData._updatedAt = getTime(); data[entity][key] = saveData; } } this.write = async function() { data._updatedAt = getTime(); await mz.fs.writeFile(dbFile, JSON.stringify(data, null, 4)); } } module.exports.load = load;src/error.js000066400000000000000000000005711516705014400133420ustar00rootroot00000000000000if (!('toJSON' in Error.prototype)) { Object.defineProperty(Error.prototype, 'toJSON', { value: function () { const alt = {}; Object.getOwnPropertyNames(this).forEach(function (key) { alt[key] = this[key]; }, this); return alt; }, configurable: true, writable: true }); } src/fs/000077500000000000000000000000001516705014400122605ustar00rootroot00000000000000src/fs/find.js000066400000000000000000000051751516705014400135460ustar00rootroot00000000000000const path = require('path'); const mz = require('mz'); const multi = async (options) => { await options.find.forEachAsync(async (findable) => { const resolved = path.resolve(options.root, findable); const finds = await mz.fs.exists(resolved); if (finds) { const stat = await mz.fs.stat(resolved); if ( (options.type.hasOwnProperty('d') && stat.isDirectory()) || (options.type.hasOwnProperty('f') && stat.isFile()) ) { options.results.push({ path: resolved, dir: stat.isFile() ? path.dirname(resolved) : resolved, // stat: stat }); } } const foundHit= await mz.fs.readdir(options.root) const foundHitPromises = []; await foundHit.forEachAsync(async (foundDir) => { const resolvedFoundDir = path.resolve(options.root, foundDir); const stat = await mz.fs.stat(resolvedFoundDir); if (!stat.isDirectory()) { return; } if (options.find.includes(foundDir) || options.exclude.includes(foundDir)) { return; } const newOptions = Object.assign({}, options) newOptions.root = resolvedFoundDir; foundHitPromises.push(multi(newOptions)) }) await Promise.all(foundHitPromises); }) return options.results; } module.exports = async (options) => { if (typeof options === 'string') { options = { find: options } } options.root = options.root || process.cwd(); options.results = options.results || []; options.type = options.type || { d: true, f: true, }; if (!Array.isArray(options.find)) { options.find = [options.find]; } options.find = options.find.map(findable => { findable= findable.trim(); if (findable.startsWith('./')) { findable = findable.substr(2); } if (findable.endsWith('/')) { findable = findable.substr(0, findable.length - 1); } return findable; }) if (!options.exclude) { options.exclude = []; const excluder = (path) => { if (!options.find.includes(path)) { options.exclude.push(path); } } excluder('node_modules') excluder('bower_components') } if (options.dry || options.debug) { console.log(`Options: ${JSON.stringify(options, null, 2)}`) } return await multi(options); }; src/fs/index.js000066400000000000000000000013551516705014400137310ustar00rootroot00000000000000const fs = require('fs'); const mz = require('mz'); const path = require('path'); const fsExtra = require('fs-extra'); const ensureDir = async (dir) => { const exists = await mz.fs.exists(dir); if (exists) { return; } await mz.fs.mkdir(dir); } const ensureFile = async(file, defaultData = '') => { const exists = await mz.fs.exists(file); if (exists) { return true; } if (typeof(defaultData) === 'object') { defaultData = JSON.stringify(defaultData); } await fsExtra.ensureDir(path.dirname(file)); await mz.fs.writeFile(file, defaultData) return false; } module.exports.ensureFile = ensureFile; module.exports.ensureDir = ensureDir; module.exports.find = require('./find');src/hash.js000066400000000000000000000011461516705014400131330ustar00rootroot00000000000000const fs = require('fs'); const crypto = require('crypto'); const random = require('./random'); const fileHash = async (file, cryptoName = 'sha256') => { return new Promise((resolve, reject) => { const fstream = fs.createReadStream(file); const hash = crypto.createHash(cryptoName); fstream.on('error', reject); fstream.on('end', function() { hash.end(); const bytes = hash.read(); const string = require('./base').charset(bytes) resolve(string); }); fstream.pipe(hash); }) } module.exports.file = fileHash; src/http/000077500000000000000000000000001516705014400126275ustar00rootroot00000000000000src/http/index.js000066400000000000000000000044611516705014400143010ustar00rootroot00000000000000const url = require('url'); module.exports.request = (options) => { if (typeof(options) === 'string') { options = { url: options, method: 'GET', } } /* https://nodejs.org/api/http.html#http_http_request_options_callback */ const parsedUrl = url.parse(options.url); let request; if (parsedUrl.protocol === 'https:') { request = require('https').request; if (parsedUrl.port === null) { parsedUrl.port = 443; } } else if (parsedUrl.protocol === 'http:') { request = require('http').request; if (parsedUrl.port === null) { parsedUrl.port = 80; } } else { throw new Error(`Unknown protocol ${parsedUrl.protocol}`); } options.protocol = parsedUrl.protocol; options.port = parsedUrl.port; options.host = parsedUrl.host; options.hostname = parsedUrl.hostname; options.path = parsedUrl.path; let body; if (options.body !== undefined) { if (typeof(options.body) === 'object') { body = JSON.stringify(options.body); options.headers = options.headers || {}; if (!options.headers.hasOwnProperty('Content-Type')) { options.headers['Content-Type'] = 'application/json; charset=utf-8' options.headers['Content-Length'] = Buffer.byteLength(body) } } } return new Promise((resolve, reject) => { const req = request(options, (res) => { res.setEncoding('utf8'); let rawData = ''; res.on('data', (chunk) => { rawData += chunk; }); res.on('end', () => { try { if (res.headers.hasOwnProperty('content-type') && res.headers['content-type'].startsWith('application/json')) { const parsedData = JSON.parse(rawData); res.body = parsedData; } else { res.body = rawData; } resolve(res); } catch (e) { reject(e); } }); }) req.on('error', reject); if (body !== undefined) { req.write(body); } req.end(); }) }src/index.js000066400000000000000000000016211516705014400133150ustar00rootroot00000000000000module.exports = { lodash: require('./lodash'), error: require('./error'), process: require('./process'), base: require('./base'), random: require('./random'), array: require('./array'), string: require('./string'), time: require('./time'), object: require('./object'), hash: require('./hash'), http: require('./http'), childProcess: require('./child-process'), promise: require('./promise'), fs: require('./fs'), db: require('./db'), regexp: require('./regexp'), json: require('./json'), require: require('./require'), timer: require('./timer'), input: require('./input'), } const repeat = (count, callback) => { return [...Array(count).keys()].forEach(callback); } repeat.async = async (count, callback, serial) => { return await [...Array(count).keys()].forEachAsync(callback, serial); } module.exports.repeat = repeat;src/input.js000066400000000000000000000006131516705014400133450ustar00rootroot00000000000000const readline = require('readline'); module.exports.key = async (msg = "Press for enter...") => { return new Promise((resolve, reject) => { const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.question(msg, function (answer) { resolve(answer); rl.close(); }) }) }src/json.js000066400000000000000000000002701516705014400131560ustar00rootroot00000000000000const cloneDeep = require('lodash/cloneDeep') module.exports.clone = (obj) => { if (obj === null || obj === undefined) { return undefined } return cloneDeep(obj); }src/lodash/000077500000000000000000000000001516705014400131225ustar00rootroot00000000000000src/lodash/index.js000066400000000000000000000002741516705014400145720ustar00rootroot00000000000000const _ = require('lodash'); _.mixin({ 'pascalCase': _.flow(_.camelCase, _.upperFirst) }); _.dotCase = (name) => { return _.snakeCase(name).replace(/_/g, '.'); } module.exports = _;src/object.js000066400000000000000000000004511516705014400134540ustar00rootroot00000000000000module.exports.reduce = (obj, props = ['content'], length = 100) => { const reduced = Object.assign({}, obj); if (Array.isArray(props)) { props = [props]; } props.forEach((prop) => { reduced[prop] = reduced[prop].substring(0, length); }) return reduced; } src/process.js000066400000000000000000000012361516705014400136660ustar00rootroot00000000000000process.on("unhandledRejection", (err, promise) => { if (process.listeners('unhandledRejection').length > 1) { return; } console.error(new Date().toLocaleString(), 'unhandledRejection', err, promise); process.exit(1); }); process.on('uncaughtException', function (err) { if (process.listeners('uncaughtException').length > 1) { return; } console.error(new Date().toLocaleString(), 'uncaughtException', err); process.exit(1); }); module.exports.writableCallbackExit = (callback) => { process.on('exit', function () { if (!this.stdin._writableState.ended) { callback(this.stdin) } }); }src/promise.js000066400000000000000000000004011516705014400136570ustar00rootroot00000000000000module.exports.deferred = () => { let resolver, rejecter; const promise = new Promise((resolve, reject) => { resolver = resolve, rejecter = reject }) return { resolve: resolver, reject: rejecter, promise: promise, } }src/random.js000066400000000000000000000005171516705014400134710ustar00rootroot00000000000000const crypto = require('mz/crypto'); module.exports = async(length = 128) => { const random = await crypto.randomBytes(length); const string = require('./base').charset(random) return string; } module.exports.integer = (min = 0, max = Int.MAX_INTEGER) => { return Math.floor(Math.random() * (max - min + 1)) + min; }src/regexp.js000066400000000000000000000002551516705014400135020ustar00rootroot00000000000000const escape = function(s) { return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); }; if (!RegExp.escape) { RegExp.escape = escape; } module.exports.escape = escape;src/require.js000066400000000000000000000057221516705014400136700ustar00rootroot00000000000000const resovleDependencies =(options) => { if (Array.isArray(options)) { options = { modules: options } } let { modules, recursive, debug } = options; recursive = recursive || []; if (debug) { dconsole = console; } else { dconsole = { info: () => {}, } } let resovledModules = []; let lastWrongModule; let iteration = 0; dconsole.info(`Modules: ${modules.length}`); const ensureWants = () => { iteration++; dconsole.info(); dconsole.info(`Iteration: ${iteration}`) let totalOk = true; for(let index = 0 ; index < modules.length; index++) { const loadedModule = modules[index]; dconsole.info(); dconsole.info(`Module: ${loadedModule.name}`); if (recursive.includes(loadedModule.name) ) { if (!resovledModules.includes(loadedModule)) { dconsole.info(`Adding to the recursived list`); resovledModules.push(loadedModule); } } if (resovledModules.includes(loadedModule)) { dconsole.info(`Already got it`); continue; } let ok = true loadedModule.wants.forEach((want) => { let found = false; resovledModules.forEach((resultModule) => { if (resultModule.name === want ) { found = true; } }) if (!found) { ok = false; totalOk = false; } }) if (ok) { dconsole.info(`Found!`); resovledModules.push(loadedModule); } else { lastWrongModule = { name: loadedModule.name, wants: loadedModule.wants } } } return totalOk; } let checkCircular; while(!ensureWants()) { if (checkCircular === undefined) { checkCircular = resovledModules.length; continue; } if (checkCircular === resovledModules.length) { const print = (datas) => { return JSON.stringify(datas.map((data) => { return { name: data.name, wants: data.wants } }), null, 2) } dconsole.info(` Loaded factories `, print(modules)) dconsole.info(` Wanted factories in order `, print(resovledModules)); dconsole.info(` Last wrong factory `, lastWrongModule); dconsole.info(` `) throw Error('circular loading factory'); } checkCircular = resovledModules.length; } return resovledModules; } module.exports.resovleDependencies = resovleDependencies;src/string/000077500000000000000000000000001516705014400131565ustar00rootroot00000000000000src/string/index.js000066400000000000000000000030441516705014400146240ustar00rootroot00000000000000if (!String.prototype.padStart) { String.prototype.padStart = function padStart(targetLength,padString) { targetLength = targetLength>>0; //floor if number or convert non-number to 0; padString = String(padString || ' '); if (this.length > targetLength) { return String(this); } else { targetLength = targetLength-this.length; if (targetLength > padString.length) { padString += padString.repeat(targetLength/padString.length); //append to original to ensure we are longer than needed } return padString.slice(0,targetLength) + String(this); } }; } module.exports.empty = (spec) => { spec = String(spec).trim(); return spec === undefined || spec === '' || spec === 'undefined' } module.exports.inject = (str, options) => { const findPrefix = str.indexOf(options.prefix); const postixIndex = str.indexOf(options.postfix); if (findPrefix == -1 && postixIndex == -1 && !options.header && !options.footer) { return; } if (findPrefix == -1 && postixIndex == -1 ) { let replaceText = options.prefix + '\n' + options.replace + '\n' + options.postfix; if (options.header) { str = replaceText + '\n' +str; } else { str += '\n' + replaceText; } } else { const prefixIndex = findPrefix + options.prefix.length; str = str.substring(0, prefixIndex) + '\n' + options.replace + '\n' + str.substring(postixIndex); } return str; } src/time.js000066400000000000000000000011021516705014400131360ustar00rootroot00000000000000const ms = require('ms'); const timestring = require('timestring'); module.exports.span = (spec) => { let result = timestring(spec); if (typeof(result) === 'number') { result = result * 1000; } return result; } module.exports.verbose = (timestamp, started) => { if (timestamp === undefined) { return undefined; } return { left: ms(timestamp - Date.now()), end: new Date(timestamp).toLocaleString(), start: new Date(started).toLocaleString(), startstamp: started, timestamp: timestamp, } }src/timer.js000066400000000000000000000016731516705014400133350ustar00rootroot00000000000000const promiseUtils = require('./promise'); const wait = async(timeout) => { return await corySetTimeout(timeout); } const corySetTimeout = async (cb, timeout) => { if (timeout === undefined) { timeout = cb; cb = () => {}; } const { resolve, reject, promise} = promiseUtils.deferred(); promise.timer = setTimeout(async () => { try { await cb(); resolve(); } catch (e) { reject(e); } }, timeout) return promise; } const corySetInterval = async(cb, timeout) => { const { resolve, reject, promise} = promiseUtils.deferred(); promise.timer = setInterval(async() => { try { await cb(); resolve(); } catch (e) { reject(e); } }, timeout) return promise; } module.exports.wait = wait; module.exports.setTimeout = corySetTimeout; module.exports.setInterval = corySetInterval ;test/000077500000000000000000000000001516705014400120405ustar00rootroot00000000000000test/script/000077500000000000000000000000001516705014400133445ustar00rootroot00000000000000test/script/error.js000077500000000000000000000000661516705014400150400ustar00rootroot00000000000000#!/usr/bin/env node require('../../src'); throw 400;test/script/hash.js000077500000000000000000000002621516705014400146300ustar00rootroot00000000000000#!/usr/bin/env node const utils = require('../../src'); const start = async() => { const hash = await utils.hash.file('./package.json'); console.log(hash); } start();test/script/json-clone.js000077500000000000000000000002401516705014400157500ustar00rootroot00000000000000#!/usr/bin/env node const utils = require('../../src'); const obj = { a: 1, b: 2, } const obj2 = utils.json.clone(obj); obj.a = 2; console.log(obj2)test/script/last-day.js000077500000000000000000000007611516705014400154270ustar00rootroot00000000000000#!/usr/bin/env node const utils = require('../../src'); console.log(new Date(utils.time.lastDay(0)).toLocaleString()); console.log(new Date(utils.time.lastDay(1)).toLocaleString()); console.log(new Date(utils.time.lastDay(2)).toLocaleString()); console.log(new Date(utils.time.lastDay(3)).toLocaleString()); console.log(new Date(utils.time.lastDay(4)).toLocaleString()); console.log(new Date(utils.time.lastDay(5)).toLocaleString()); console.log(new Date(utils.time.lastDay(6)).toLocaleString()); test/script/random.js000077500000000000000000000002461516705014400151670ustar00rootroot00000000000000#!/usr/bin/env node const utils = require('../../src'); const start = async() => { const random = await utils.random(128); console.log(random); } start();