@universe/util
Advanced tools
Comparing version
@@ -68,2 +68,3 @@ export declare const isNull: (v: unknown) => v is null; | ||
export declare const toPascalCase: (str: string) => string; | ||
export declare const toNameCase: (str: string) => string; | ||
export declare const toCamelCase: (str: string) => string; | ||
@@ -76,1 +77,8 @@ export declare function idToHue(input: string, shift?: number): number; | ||
export declare const deepClone: <T>(data: T) => Promise<T>; | ||
export default class Deferred<T> extends Promise<T> { | ||
resolve: (value: T | PromiseLike<T>) => void; | ||
reject: (err: Error) => void; | ||
constructor(); | ||
static get [Symbol.species](): typeof Promise; | ||
get [Symbol.toStringTag](): string; | ||
} |
@@ -9,3 +9,3 @@ "use strict"; | ||
describe('Utils', function () { | ||
describe('debounce should', function () { | ||
describe.skip('debounce should', function () { | ||
it('delay a call', async function () { | ||
@@ -33,2 +33,3 @@ const first = Date.now(); | ||
it('no debounce memory leak', async function () { | ||
var _a; | ||
this.timeout(120000); | ||
@@ -42,3 +43,3 @@ const func = index_1.debounce((arr) => { | ||
} | ||
global.gc(); | ||
(_a = global === null || global === void 0 ? void 0 : global.gc) === null || _a === void 0 ? void 0 : _a.call(global); | ||
await new Promise(resolve => setTimeout(resolve, 3000)); | ||
@@ -48,15 +49,22 @@ const after = process.memoryUsage().heapUsed / 1024 / 1024; | ||
}); | ||
it('runs md5', function () { | ||
assert.strictEqual(index_1.md5('hello'), '5d41402abc4b2a76b9719d911017c592'); | ||
assert.strictEqual(index_1.md5('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 'c1906fa4ec71ebdc02c49c5d19908a39'); | ||
assert.strictEqual(index_1.md5(fs.readFileSync(path.join(__dirname, '../../fixtures/share.jpg'), 'binary')), '7b55446ad872973c5db5006905cc92aa'); | ||
}); | ||
it('runs base64Url', function () { | ||
assert.strictEqual(index_1.base64UrlEncode('Adam Miller'), 'QWRhbSBNaWxsZXI'); | ||
assert.strictEqual(index_1.base64UrlDecode(index_1.base64UrlEncode('Adam Miller')), 'Adam Miller'); | ||
assert.strictEqual(index_1.base64UrlEncode('Kelly'), 'S2VsbHk'); | ||
assert.strictEqual(index_1.base64UrlDecode(index_1.base64UrlEncode('Kelly')), 'Kelly'); | ||
}); | ||
it('runs base85UuidEncode / base85UuidEncode', function () { | ||
const id = '1d0d0699-7002-4273-b013-2a963852c388'; | ||
}); | ||
it('runs md5', function () { | ||
assert.strictEqual(index_1.md5('hello'), '5d41402abc4b2a76b9719d911017c592'); | ||
assert.strictEqual(index_1.md5('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 'c1906fa4ec71ebdc02c49c5d19908a39'); | ||
assert.strictEqual(index_1.md5(fs.readFileSync(path.join(__dirname, '../../fixtures/share.jpg'), 'binary')), '7b55446ad872973c5db5006905cc92aa'); | ||
}); | ||
it('runs base64Url', function () { | ||
assert.strictEqual(index_1.base64UrlEncode('Adam Miller'), 'QWRhbSBNaWxsZXI'); | ||
assert.strictEqual(index_1.base64UrlDecode(index_1.base64UrlEncode('Adam Miller')), 'Adam Miller'); | ||
assert.strictEqual(index_1.base64UrlEncode('Kelly'), 'S2VsbHk'); | ||
assert.strictEqual(index_1.base64UrlDecode(index_1.base64UrlEncode('Kelly')), 'Kelly'); | ||
}); | ||
it('runs base85UuidEncode / base85UuidEncode', function () { | ||
const id = '1d0d0699-7002-4273-b013-2a963852c388'; | ||
const encoded = index_1.base85UuidEncode(id); | ||
assert.strictEqual(index_1.isUuid(id), true); | ||
assert.strictEqual(encoded.length, 20); | ||
assert.strictEqual(index_1.base85UuidDecode(encoded), id); | ||
for (let i = 0; i < 2000; i++) { | ||
const id = index_1.uuid(); | ||
const encoded = index_1.base85UuidEncode(id); | ||
@@ -66,50 +74,111 @@ assert.strictEqual(index_1.isUuid(id), true); | ||
assert.strictEqual(index_1.base85UuidDecode(encoded), id); | ||
for (let i = 0; i < 2000; i++) { | ||
const id = index_1.uuid(); | ||
const encoded = index_1.base85UuidEncode(id); | ||
assert.strictEqual(index_1.isUuid(id), true); | ||
assert.strictEqual(encoded.length, 20); | ||
assert.strictEqual(index_1.base85UuidDecode(encoded), id); | ||
} | ||
}); | ||
it('validates emails', function () { | ||
assert.ok(index_1.validateEmail('adam@universe.app')); | ||
assert.ok(index_1.validateEmail('adam+tag@universe.app')); | ||
assert.ok(!index_1.validateEmail('@universe.app')); | ||
assert.ok(!index_1.validateEmail('adam@universe')); | ||
assert.ok(!index_1.validateEmail('adam@universe.')); | ||
assert.ok(!index_1.validateEmail('superduperlongemailaddressthatistechnicallynotallowedsuperduperlongemailaddressthatistechnicallynotallowed@universe.app')); | ||
assert.ok(!index_1.validateEmail('INVALID')); | ||
assert.ok(!index_1.validateEmail(false)); | ||
assert.ok(!index_1.validateEmail(100)); | ||
assert.ok(!index_1.validateEmail(new Date())); | ||
assert.ok(!index_1.validateEmail({})); | ||
}); | ||
it('deep clones', async () => { | ||
const obj = { | ||
a: 1, | ||
b: { c: 3 }, | ||
d: [1, 2, { e: 5 }], | ||
}; | ||
const clone = await index_1.deepClone(obj); | ||
assert.notStrictEqual(obj, clone); | ||
assert.deepStrictEqual(obj, clone); | ||
}); | ||
it('converts posix to date', async () => { | ||
const dates = [ | ||
'6/29/1991', | ||
'1/1/1900', | ||
'1/1/3030', | ||
'12/31/1845', | ||
'12/31/7082', | ||
'6/1/2009', | ||
'6/29/2009', | ||
]; | ||
for (const date of dates) { | ||
const res = index_1.posixToDate(+(new Date(date))); | ||
assert.strictEqual(`${res.month}/${res.day}/${res.year}`, date); | ||
} | ||
}); | ||
} | ||
}); | ||
it('validates emails', function () { | ||
assert.ok(index_1.validateEmail('adam@universe.app')); | ||
assert.ok(index_1.validateEmail('adam+tag@universe.app')); | ||
assert.ok(!index_1.validateEmail('@universe.app')); | ||
assert.ok(!index_1.validateEmail('adam@universe')); | ||
assert.ok(!index_1.validateEmail('adam@universe.')); | ||
assert.ok(!index_1.validateEmail('superduperlongemailaddressthatistechnicallynotallowedsuperduperlongemailaddressthatistechnicallynotallowed@universe.app')); | ||
assert.ok(!index_1.validateEmail('INVALID')); | ||
assert.ok(!index_1.validateEmail(false)); | ||
assert.ok(!index_1.validateEmail(100)); | ||
assert.ok(!index_1.validateEmail(new Date())); | ||
assert.ok(!index_1.validateEmail({})); | ||
}); | ||
it('deep clones', async () => { | ||
const obj = { | ||
a: 1, | ||
b: { c: 3 }, | ||
d: [1, 2, { e: 5 }], | ||
}; | ||
const clone = await index_1.deepClone(obj); | ||
assert.notStrictEqual(obj, clone); | ||
assert.deepStrictEqual(obj, clone); | ||
}); | ||
it('converts posix to date', async () => { | ||
const dates = [ | ||
'6/29/1991', | ||
'1/1/1900', | ||
'1/1/3030', | ||
'12/31/1845', | ||
'12/31/7082', | ||
'6/1/2009', | ||
'6/29/2009', | ||
]; | ||
for (const date of dates) { | ||
const res = index_1.posixToDate(+(new Date(date))); | ||
assert.strictEqual(`${res.month}/${res.day}/${res.year}`, date); | ||
} | ||
}); | ||
it('runs toLowerCase', function () { | ||
assert.strictEqual(index_1.toLowerCase('WORKS'), 'works'); | ||
assert.strictEqual(index_1.toLowerCase('works'), 'works'); | ||
assert.strictEqual(index_1.toLowerCase('WoRkz 4-A c0^^P13X sTRing'), 'workz 4-a c0^^p13x string'); | ||
}); | ||
it('runs toUpperCase', function () { | ||
assert.strictEqual(index_1.toUpperCase('WORKS'), 'WORKS'); | ||
assert.strictEqual(index_1.toUpperCase('works'), 'WORKS'); | ||
assert.strictEqual(index_1.toUpperCase('WoRkz 4-A c0^^P13X sTRing'), 'WORKZ 4-A C0^^P13X STRING'); | ||
}); | ||
it('runs toSnakeCase', function () { | ||
assert.strictEqual(index_1.toSnakeCase('WORKS'), 'works'); | ||
assert.strictEqual(index_1.toSnakeCase('works'), 'works'); | ||
assert.strictEqual(index_1.toSnakeCase('WoRkz 4-A c0^^P13X sTRing'), 'wo_rkz_4_a_c0_p_13_x_s_t_ring'); | ||
assert.strictEqual(index_1.toSnakeCase('kebab-case'), 'kebab_case'); | ||
assert.strictEqual(index_1.toSnakeCase('snake_case'), 'snake_case'); | ||
assert.strictEqual(index_1.toSnakeCase('Title Case'), 'title_case'); | ||
assert.strictEqual(index_1.toSnakeCase('PascalCase'), 'pascal_case'); | ||
assert.strictEqual(index_1.toSnakeCase('camalCase'), 'camal_case'); | ||
}); | ||
it('runs toKebabCase', function () { | ||
assert.strictEqual(index_1.toKebabCase('WORKS'), 'works'); | ||
assert.strictEqual(index_1.toKebabCase('works'), 'works'); | ||
assert.strictEqual(index_1.toKebabCase('kebab-case'), 'kebab-case'); | ||
assert.strictEqual(index_1.toKebabCase('snake_case'), 'snake-case'); | ||
assert.strictEqual(index_1.toKebabCase('Title Case'), 'title-case'); | ||
assert.strictEqual(index_1.toKebabCase('PascalCase'), 'pascal-case'); | ||
assert.strictEqual(index_1.toKebabCase('camalCase'), 'camal-case'); | ||
}); | ||
it('runs toTitleCase', function () { | ||
assert.strictEqual(index_1.toTitleCase('WORKS'), 'WORKS'); | ||
assert.strictEqual(index_1.toTitleCase('works'), 'Works'); | ||
assert.strictEqual(index_1.toTitleCase('kebab-case'), 'Kebab Case'); | ||
assert.strictEqual(index_1.toTitleCase('snake_case'), 'Snake Case'); | ||
assert.strictEqual(index_1.toTitleCase('Title Case'), 'Title Case'); | ||
assert.strictEqual(index_1.toTitleCase('PascalCase'), 'Pascal Case'); | ||
assert.strictEqual(index_1.toTitleCase('camalCase'), 'Camal Case'); | ||
}); | ||
it('runs toPascalCase', function () { | ||
assert.strictEqual(index_1.toPascalCase('WORKS'), 'Works'); | ||
assert.strictEqual(index_1.toPascalCase('works'), 'Works'); | ||
assert.strictEqual(index_1.toPascalCase('kebab-case'), 'KebabCase'); | ||
assert.strictEqual(index_1.toPascalCase('snake_case'), 'SnakeCase'); | ||
assert.strictEqual(index_1.toPascalCase('Title Case'), 'TitleCase'); | ||
assert.strictEqual(index_1.toPascalCase('PascalCase'), 'PascalCase'); | ||
assert.strictEqual(index_1.toPascalCase('camalCase'), 'CamalCase'); | ||
}); | ||
it('runs toCamelCase', function () { | ||
assert.strictEqual(index_1.toCamelCase('WORKS'), 'works'); | ||
assert.strictEqual(index_1.toCamelCase('works'), 'works'); | ||
assert.strictEqual(index_1.toCamelCase('kebab-case'), 'kebabCase'); | ||
assert.strictEqual(index_1.toCamelCase('snake_case'), 'snakeCase'); | ||
assert.strictEqual(index_1.toCamelCase('Title Case'), 'titleCase'); | ||
assert.strictEqual(index_1.toCamelCase('PascalCase'), 'pascalCase'); | ||
assert.strictEqual(index_1.toCamelCase('camalCase'), 'camalCase'); | ||
}); | ||
it('runs toNameCase', function () { | ||
assert.strictEqual(index_1.toNameCase('WORKS'), 'Works'); | ||
assert.strictEqual(index_1.toNameCase('works'), 'Works'); | ||
assert.strictEqual(index_1.toNameCase('kebab-case'), 'Kebab-Case'); | ||
assert.strictEqual(index_1.toNameCase('snake_case'), 'SnakeCase'); | ||
assert.strictEqual(index_1.toNameCase('Title Case'), 'Title Case'); | ||
assert.strictEqual(index_1.toNameCase('PascalCase'), 'PascalCase'); | ||
assert.strictEqual(index_1.toNameCase('camalCase'), 'CamalCase'); | ||
assert.strictEqual(index_1.toNameCase('o\'Farrell'), 'O\'Farrell'); | ||
assert.strictEqual(index_1.toNameCase('emily baker-white'), 'Emily Baker-White'); | ||
assert.strictEqual(index_1.toNameCase('KellyRose fluty'), 'KellyRose Fluty'); | ||
}); | ||
}); | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90ZXN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFFN0Isd0NBQXdLO0FBRXhLLGlDQUFpQztBQUVqQyxRQUFRLENBQUMsT0FBTyxFQUFFO0lBQ2hCLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTtRQUMxQixFQUFFLENBQUMsY0FBYyxFQUFFLEtBQUs7WUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNmLE1BQU0sZ0JBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbEQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLDZCQUE2QixFQUFFLEtBQUs7WUFDckMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNmLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNkLE1BQU0sSUFBSSxHQUFHLGdCQUFRLENBQUMsR0FBRyxFQUFFO2dCQUN6QixLQUFLLEVBQUUsQ0FBQztnQkFDUixNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQztZQUNQLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFDYixNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxL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QyxLQUFLLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDakU7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgZGVzY3JpYmUsIGl0ICovXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBkZWJvdW5jZSwgbWQ1LCB1dWlkLCBpc1V1aWQsIGJhc2U2NFVybERlY29kZSwgYmFzZTY0VXJsRW5jb2RlLCBkZWVwQ2xvbmUsIHZhbGlkYXRlRW1haWwsIGJhc2U4NVV1aWRFbmNvZGUsIGJhc2U4NVV1aWREZWNvZGUsIHBvc2l4VG9EYXRlIH0gZnJvbSAnLi4vc3JjL2luZGV4JztcblxuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmRlc2NyaWJlKCdVdGlscycsIGZ1bmN0aW9uKCkge1xuICBkZXNjcmliZSgnZGVib3VuY2Ugc2hvdWxkJywgZnVuY3Rpb24oKSB7XG4gICAgaXQoJ2RlbGF5IGEgY2FsbCcsIGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZmlyc3QgPSBEYXRlLm5vdygpO1xuICAgICAgbGV0IHNlY29uZCA9IDA7XG4gICAgICBhd2FpdCBkZWJvdW5jZSgoKSA9PiBzZWNvbmQgPSBEYXRlLm5vdygpLCAxMDAwKSgpO1xuICAgICAgYXNzZXJ0Lm9rKHNlY29uZCAtIGZpcnN0ID49IDEwMDApO1xuICAgIH0pO1xuICAgIGl0KCdvbmx5IGNhbGwgdGhlIGZ1bmN0aW9uIG9uY2UnLCBhc3luYyBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGZpcnN0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGxldCBzZWNvbmQgPSAwO1xuICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgIGNvbnN0IGZ1bmMgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIHNlY29uZCA9IERhdGUubm93KCk7XG4gICAgICB9LCAxMDAwKTtcbiAgICAgIGZ1bmMoKTtcbiAgICAgIGZ1bmMoKTtcbiAgICAgIGZ1bmMoKTtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICAgIGFzc2VydC5vayhzZWNvbmQgLSBmaXJzdCA+PSAxMDAwKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjb3VudCwgMSk7XG4gICAgfSk7XG4gICAgaXQoJ25vIGRlYm91bmNlIG1lbW9yeSBsZWFrJywgYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLnRpbWVvdXQoMTIwMDAwKTtcbiAgICAgIGNvbnN0IGZ1bmMgPSBkZWJvdW5jZSgoYXJyOiBudW1iZXJbXSkgPT4ge1xuICAgICAgICBhcnJbMF0gPSBhcnJbMV07XG4gICAgICB9LCAxKTtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHByb2Nlc3MubWVtb3J5VXNhZ2UoKS5oZWFwVXNlZCAvIDEwMjQgLyAxMDI0O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyMDAwOyBpKyspIHtcbiAgICAgICAgYXdhaXQgZnVuYyhuZXcgQXJyYXkoMTAwMDAwMCkuZmlsbCgxKSk7XG4gICAgICB9XG4gICAgICBnbG9iYWwuZ2MoKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAzMDAwKSk7XG4gICAgICBjb25zdCBhZnRlciA9IHByb2Nlc3MubWVtb3J5VXNhZ2UoKS5oZWFwVXNlZCAvIDEwMjQgLyAxMDI0O1xuICAgICAgYXNzZXJ0Lm9rKGFmdGVyIDw9IGJlZm9yZSwgJ21lbW9yeSB1c2FnZSBkb2VzIG5vdCBncm93IHdpdGggbWFueSBkZWJvdW5jZSBjYWxscycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3J1bnMgbWQ1JywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobWQ1KCdoZWxsbycpLCAnNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTInKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtZDUoJzAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OScpLCAnYzE5MDZmYTRlYzcxZWJkYzAyYzQ5YzVkMTk5MDhhMzknKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtZDUoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9maXh0dXJlcy9zaGFyZS5qcGcnKSwgJ2JpbmFyeScpKSwgJzdiNTU0NDZhZDg3Mjk3M2M1ZGI1MDA2OTA1Y2M5MmFhJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncnVucyBiYXNlNjRVcmwnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChiYXNlNjRVcmxFbmNvZGUoJ0FkYW0gTWlsbGVyJyksICdRV1JoYlNCTmFXeHNaWEknKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChiYXNlNjRVcmxEZWNvZGUoYmFzZTY0VXJsRW5jb2RlKCdBZGFtIE1pbGxlcicpKSwgJ0FkYW0gTWlsbGVyJyk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChiYXNlNjRVcmxFbmNvZGUoJ0tlbGx5JyksICdTMlZzYkhrJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFzZTY0VXJsRGVjb2RlKGJhc2U2NFVybEVuY29kZSgnS2VsbHknKSksICdLZWxseScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3J1bnMgYmFzZTg1VXVpZEVuY29kZSAvIGJhc2U4NVV1aWRFbmNvZGUnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGlkID0gJzFkMGQwNjk5LTcwMDItNDI3My1iMDEzLTJhOTYzODUyYzM4OCc7XG4gICAgICBjb25zdCBlbmNvZGVkID0gYmFzZTg1VXVpZEVuY29kZShpZCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNVdWlkKGlkKSwgdHJ1ZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW5jb2RlZC5sZW5ndGgsIDIwKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChiYXNlODVVdWlkRGVjb2RlKGVuY29kZWQpLCBpZCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDIwMDA7IGkrKykge1xuICAgICAgICBjb25zdCBpZCA9IHV1aWQoKTtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGJhc2U4NVV1aWRFbmNvZGUoaWQpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNVdWlkKGlkKSwgdHJ1ZSk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbmNvZGVkLmxlbmd0aCwgMjApO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFzZTg1VXVpZERlY29kZShlbmNvZGVkKSwgaWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlcyBlbWFpbHMnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5vayh2YWxpZGF0ZUVtYWlsKCdhZGFtQHVuaXZlcnNlLmFwcCcpKTtcbiAgICAgIGFzc2VydC5vayh2YWxpZGF0ZUVtYWlsKCdhZGFtK3RhZ0B1bml2ZXJzZS5hcHAnKSk7XG4gICAgICBhc3NlcnQub2soIXZhbGlkYXRlRW1haWwoJ0B1bml2ZXJzZS5hcHAnKSk7XG4gICAgICBhc3NlcnQub2soIXZhbGlkYXRlRW1haWwoJ2FkYW1AdW5pdmVyc2UnKSk7XG4gICAgICBhc3NlcnQub2soIXZhbGlkYXRlRW1haWwoJ2FkYW1AdW5pdmVyc2UuJykpO1xuICAgICAgYXNzZXJ0Lm9rKCF2YWxpZGF0ZUVtYWlsKCdzdXBlcmR1cGVybG9uZ2VtYWlsYWRkcmVzc3RoYXRpc3RlY2huaWNhbGx5bm90YWxsb3dlZHN1cGVyZHVwZXJsb25nZW1haWxhZGRyZXNzdGhhdGlzdGVjaG5pY2FsbHlub3RhbGxvd2VkQHVuaXZlcnNlLmFwcCcpKTtcbiAgICAgIGFzc2VydC5vayghdmFsaWRhdGVFbWFpbCgnSU5WQUxJRCcpKTtcbiAgICAgIGFzc2VydC5vayghdmFsaWRhdGVFbWFpbChmYWxzZSkpO1xuICAgICAgYXNzZXJ0Lm9rKCF2YWxpZGF0ZUVtYWlsKDEwMCkpO1xuICAgICAgYXNzZXJ0Lm9rKCF2YWxpZGF0ZUVtYWlsKG5ldyBEYXRlKCkpKTtcbiAgICAgIGFzc2VydC5vayghdmFsaWRhdGVFbWFpbCh7fSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RlZXAgY2xvbmVzJywgYXN5bmMoKSA9PiB7XG4gICAgICBjb25zdCBvYmogPSB7XG4gICAgICAgIGE6IDEsXG4gICAgICAgIGI6IHsgYzogMyB9LFxuICAgICAgICBkOiBbIDEsIDIsIHsgZTogNSB9XSxcbiAgICAgIH07XG4gICAgICBjb25zdCBjbG9uZSA9IGF3YWl0IGRlZXBDbG9uZShvYmopO1xuICAgICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKG9iaiwgY2xvbmUpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChvYmosIGNsb25lKTtcbiAgICB9KTtcblxuICAgIGl0KCdjb252ZXJ0cyBwb3NpeCB0byBkYXRlJywgYXN5bmMoKSA9PiB7XG4gICAgICBjb25zdCBkYXRlcyA9IFtcbiAgICAgICAgJzYvMjkvMTk5MScsXG4gICAgICAgICcxLzEvMTkwMCcsXG4gICAgICAgICcxLzEvMzAzMCcsXG4gICAgICAgICcxMi8zMS8xODQ1JyxcbiAgICAgICAgJzEyLzMxLzcwODInLFxuICAgICAgICAnNi8xLzIwMDknLFxuICAgICAgICAnNi8yOS8yMDA5JyxcbiAgICAgIF07XG4gICAgICBmb3IgKGNvbnN0IGRhdGUgb2YgZGF0ZXMpIHtcbiAgICAgICAgY29uc3QgcmVzID0gcG9zaXhUb0RhdGUoKyhuZXcgRGF0ZShkYXRlKSkpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYCR7cmVzLm1vbnRofS8ke3Jlcy5kYXl9LyR7cmVzLnllYXJ9YCwgZGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90ZXN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFFN0Isd0NBb0JzQjtBQUV0QixpQ0FBaUM7QUFFakMsUUFBUSxDQUFDLE9BQU8sRUFBRTtJQUNoQixRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1FBQy9CLEVBQUUsQ0FBQyxjQUFjLEVBQUUsS0FBSztZQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDekIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsTUFBTSxnQkFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNsRCxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsNkJBQTZCLEVBQUUsS0FBSztZQUNyQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDekIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsTUFBTSxJQUFJLEdBQUcsZ0JBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3pCLEtBQUssRUFBRSxDQUFDO2dCQUNSLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDO1lBQ1AsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUNiLE1BQU0sQ0FBQyxFQUFFLENBQUMs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QztRQUMxRCxNQUFNLENBQUMsV0FBVyxDQUFDLGtCQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDM0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxrQkFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzNELE1BQU0sQ0FBQyxXQUFXLENBQUMsa0JBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsV0FBVyxDQUFDLGtCQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDM0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxrQkFBVSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUN6RSxNQUFNLENBQUMsV0FBVyxDQUFDLGtCQUFVLENBQUMsaUJBQWlCLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3ZFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgZGVzY3JpYmUsIGl0ICovXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge1xuICBkZWJvdW5jZSxcbiAgbWQ1LFxuICB1dWlkLFxuICBpc1V1aWQsXG4gIGJhc2U2NFVybERlY29kZSxcbiAgYmFzZTY0VXJsRW5jb2RlLFxuICBkZWVwQ2xvbmUsXG4gIHZhbGlkYXRlRW1haWwsXG4gIGJhc2U4NVV1aWRFbmNvZGUsXG4gIGJhc2U4NVV1aWREZWNvZGUsXG4gIHBvc2l4VG9EYXRlLFxuICB0b0xvd2VyQ2FzZSxcbiAgdG9VcHBlckNhc2UsXG4gIHRvU25ha2VDYXNlLFxuICB0b0tlYmFiQ2FzZSxcbiAgdG9UaXRsZUNhc2UsXG4gIHRvUGFzY2FsQ2FzZSxcbiAgdG9OYW1lQ2FzZSxcbiAgdG9DYW1lbENhc2UsXG59IGZyb20gJy4uL3NyYy9pbmRleCc7XG5cbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5kZXNjcmliZSgnVXRpbHMnLCBmdW5jdGlvbigpIHtcbiAgZGVzY3JpYmUuc2tpcCgnZGVib3VuY2Ugc2hvdWxkJywgZnVuY3Rpb24oKSB7XG4gICAgaXQoJ2RlbGF5IGEgY2FsbCcsIGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZmlyc3QgPSBEYXRlLm5vdygpO1xuICAgICAgbGV0IHNlY29uZCA9IDA7XG4gICAgICBhd2FpdCBkZWJvdW5jZSgoKSA9PiBzZWNvbmQgPSBEYXRlLm5vdygpLCAxMDAwKSgpO1xuICAgICAgYXNzZXJ0Lm9rKHNlY29uZCAtIGZpcnN0ID49IDEwMDApO1xuICAgIH0pO1xuICAgIGl0KCdvbmx5IGNhbGwgdGhlIGZ1bmN0aW9uIG9uY2UnLCBhc3luYyBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGZpcnN0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGxldCBzZWNvbmQgPSAwO1xuICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgIGNvbnN0IGZ1bmMgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIHNlY29uZCA9IERhdGUubm93KCk7XG4gICAgICB9LCAxMDAwKTtcbiAgICAgIGZ1bmMoKTtcbiAgICAgIGZ1bmMoKTtcbiAgICAgIGZ1bmMoKTtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICAgIGFzc2VydC5vayhzZWNvbmQgLSBmaXJzdCA+PSAxMDAwKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjb3VudCwgMSk7XG4gICAgfSk7XG4gICAgaXQoJ25vIGRlYm91bmNlIG1lbW9yeSBsZWFrJywgYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLnRpbWVvdXQoMTIwMDAwKTtcbiAgICAgIGNvbnN0IGZ1bmMgPSBkZWJvdW5jZSgoYXJyOiBudW1iZXJbXSkgPT4ge1xuICAgICAgICBhcnJbMF0gPSBhcnJbMV07XG4gICAgICB9LCAxKTtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHByb2Nlc3MubWVtb3J5VXNhZ2UoKS5oZWFwVXNlZCAvIDEwMjQgLyAxMDI0O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyMDAwOyBpKyspIHtcbiAgICAgICAgYXdhaXQgZnVuYyhuZXcgQXJyYXkoMTAwMDAwMCkuZmlsbCgxKSk7XG4gICAgICB9XG4gICAgICBnbG9iYWw/LmdjPy4oKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAzMDAwKSk7XG4gICAgICBjb25zdCBhZnRlciA9IHByb2Nlc3MubWVtb3J5VXNhZ2UoKS5oZWFwVXNlZCAvIDEwMjQgLyAxMDI0O1xuICAgICAgYXNzZXJ0Lm9rKGFmdGVyIDw9IGJlZm9yZSwgJ21lbW9yeSB1c2FnZSBkb2VzIG5vdCBncm93IHdpdGggbWFueSBkZWJvdW5jZSBjYWxscycpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgncnVucyBtZDUnLCBmdW5jdGlvbigpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwobWQ1KCdoZWxsbycpLCAnNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTInKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwobWQ1KCcwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODknKSwgJ2MxOTA2ZmE0ZWM3MWViZGMwMmM0OWM1ZDE5OTA4YTM5Jyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1kNShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2ZpeHR1cmVzL3NoYXJlLmpwZycpLCAnYmluYXJ5JykpLCAnN2I1NTQ0NmFkODcyOTczYzVkYjUwMDY5MDVjYzkyYWEnKTtcbiAgfSk7XG5cbiAgaXQoJ3J1bnMgYmFzZTY0VXJsJywgZnVuY3Rpb24oKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJhc2U2NFVybEVuY29kZSgnQWRhbSBNaWxsZXInKSwgJ1FXUmhiU0JOYVd4c1pYSScpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChiYXNlNjRVcmxEZWNvZGUoYmFzZTY0VXJsRW5jb2RlKCdBZGFtIE1pbGxlcicpKSwgJ0FkYW0gTWlsbGVyJyk7XG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFzZTY0VXJsRW5jb2RlKCdLZWxseScpLCAnUzJWc2JIaycpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChiYXNlNjRVcmxEZWNvZGUoYmFzZTY0VXJsRW5jb2RlKCdLZWxseScpKSwgJ0tlbGx5Jyk7XG4gIH0pO1xuXG4gIGl0KCdydW5zIGJhc2U4NVV1aWRFbmNvZGUgLyBiYXNlODVVdWlkRW5jb2RlJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgaWQgPSAnMWQwZDA2OTktNzAwMi00MjczLWIwMTMtMmE5NjM4NTJjMzg4JztcbiAgICBjb25zdCBlbmNvZGVkID0gYmFzZTg1VXVpZEVuY29kZShpZCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzVXVpZChpZCksIHRydWUpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbmNvZGVkLmxlbmd0aCwgMjApO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChiYXNlODVVdWlkRGVjb2RlKGVuY29kZWQpLCBpZCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyMDAwOyBpKyspIHtcbiAgICAgIGNvbnN0IGlkID0gdXVpZCgpO1xuICAgICAgY29uc3QgZW5jb2RlZCA9IGJhc2U4NVV1aWRFbmNvZGUoaWQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzVXVpZChpZCksIHRydWUpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGVuY29kZWQubGVuZ3RoLCAyMCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFzZTg1VXVpZERlY29kZShlbmNvZGVkKSwgaWQpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ3ZhbGlkYXRlcyBlbWFpbHMnLCBmdW5jdGlvbigpIHtcbiAgICBhc3NlcnQub2sodmFsaWRhdGVFbWFpbCgnYWRhbUB1bml2ZXJzZS5hcHAnKSk7XG4gICAgYXNzZXJ0Lm9rKHZhbGlkYXRlRW1haWwoJ2FkYW0rdGFnQHVuaXZlcnNlLmFwcCcpKTtcbiAgICBhc3NlcnQub2soIXZhbGlkYXRlRW1haWwoJ0B1bml2ZXJzZS5hcHAnKSk7XG4gICAgYXNzZXJ0Lm9rKCF2YWxpZGF0ZUVtYWlsKCdhZGFtQHVuaXZlcnNlJykpO1xuICAgIGFzc2VydC5vayghdmFsaWRhdGVFbWFpbCgnYWRhbUB1bml2ZXJzZS4nKSk7XG4gICAgYXNzZXJ0Lm9rKCF2YWxpZGF0ZUVtYWlsKCdzdXBlcmR1cGVybG9uZ2VtYWlsYWRkcmVzc3RoYXRpc3RlY2huaWNhbGx5bm90YWxsb3dlZHN1cGVyZHVwZXJsb25nZW1haWxhZGRyZXNzdGhhdGlzdGVjaG5pY2FsbHlub3RhbGxvd2VkQHVuaXZlcnNlLmFwcCcpKTtcbiAgICBhc3NlcnQub2soIXZhbGlkYXRlRW1haWwoJ0lOVkFMSUQnKSk7XG4gICAgYXNzZXJ0Lm9rKCF2YWxpZGF0ZUVtYWlsKGZhbHNlKSk7XG4gICAgYXNzZXJ0Lm9rKCF2YWxpZGF0ZUVtYWlsKDEwMCkpO1xuICAgIGFzc2VydC5vayghdmFsaWRhdGVFbWFpbChuZXcgRGF0ZSgpKSk7XG4gICAgYXNzZXJ0Lm9rKCF2YWxpZGF0ZUVtYWlsKHt9KSk7XG4gIH0pO1xuXG4gIGl0KCdkZWVwIGNsb25lcycsIGFzeW5jKCkgPT4ge1xuICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgIGE6IDEsXG4gICAgICBiOiB7IGM6IDMgfSxcbiAgICAgIGQ6IFsgMSwgMiwgeyBlOiA1IH1dLFxuICAgIH07XG4gICAgY29uc3QgY2xvbmUgPSBhd2FpdCBkZWVwQ2xvbmUob2JqKTtcbiAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwob2JqLCBjbG9uZSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChvYmosIGNsb25lKTtcbiAgfSk7XG5cbiAgaXQoJ2NvbnZlcnRzIHBvc2l4IHRvIGRhdGUnLCBhc3luYygpID0+IHtcbiAgICBjb25zdCBkYXRlcyA9IFtcbiAgICAgICc2LzI5LzE5OTEnLFxuICAgICAgJzEvMS8xOTAwJyxcbiAgICAgICcxLzEvMzAzMCcsXG4gICAgICAnMTIvMzEvMTg0NScsXG4gICAgICAnMTIvMzEvNzA4MicsXG4gICAgICAnNi8xLzIwMDknLFxuICAgICAgJzYvMjkvMjAwOScsXG4gICAgXTtcbiAgICBmb3IgKGNvbnN0IGRhdGUgb2YgZGF0ZXMpIHtcbiAgICAgIGNvbnN0IHJlcyA9IHBvc2l4VG9EYXRlKCsobmV3IERhdGUoZGF0ZSkpKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChgJHtyZXMubW9udGh9LyR7cmVzLmRheX0vJHtyZXMueWVhcn1gLCBkYXRlKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdydW5zIHRvTG93ZXJDYXNlJywgZnVuY3Rpb24oKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRvTG93ZXJDYXNlKCdXT1JLUycpLCAnd29ya3MnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodG9Mb3dlckNhc2UoJ3dvcmtzJyksICd3b3JrcycpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b0xvd2VyQ2FzZSgnV29Sa3ogNC1BIGMwXl5QMTNYIHNUUmluZycpLCAnd29ya3ogNC1hIGMwXl5wMTN4IHN0cmluZycpO1xuICB9KTtcblxuICBpdCgncnVucyB0b1VwcGVyQ2FzZScsIGZ1bmN0aW9uKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b1VwcGVyQ2FzZSgnV09SS1MnKSwgJ1dPUktTJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRvVXBwZXJDYXNlKCd3b3JrcycpLCAnV09SS1MnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodG9VcHBlckNhc2UoJ1dvUmt6IDQtQSBjMF5eUDEzWCBzVFJpbmcnKSwgJ1dPUktaIDQtQSBDMF5eUDEzWCBTVFJJTkcnKTtcbiAgfSk7XG5cbiAgaXQoJ3J1bnMgdG9TbmFrZUNhc2UnLCBmdW5jdGlvbigpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodG9TbmFrZUNhc2UoJ1dPUktTJyksICd3b3JrcycpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b1NuYWtlQ2FzZSgnd29ya3MnKSwgJ3dvcmtzJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRvU25ha2VDYXNlKCdXb1JreiA0LUEgYzBeXlAxM1ggc1RSaW5nJyksICd3b19ya3pfNF9hX2MwX3BfMTNfeF9zX3RfcmluZycpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b1NuYWtlQ2FzZSgna2ViYWItY2FzZScpLCAna2ViYWJfY2FzZScpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b1NuYWtlQ2FzZSgnc25ha2VfY2FzZScpLCAnc25ha2VfY2FzZScpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b1NuYWtlQ2FzZSgnVGl0bGUgQ2FzZScpLCAndGl0bGVfY2FzZScpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b1NuYWtlQ2FzZSgnUGFzY2FsQ2FzZScpLCAncGFzY2FsX2Nhc2UnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodG9TbmFrZUNhc2UoJ2NhbWFsQ2FzZScpLCAnY2FtYWxfY2FzZScpO1xuICB9KTtcblxuICBpdCgncnVucyB0b0tlYmFiQ2FzZScsIGZ1bmN0aW9uKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b0tlYmFiQ2FzZSgnV09SS1MnKSwgJ3dvcmtzJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRvS2ViYWJDYXNlKCd3b3JrcycpLCAnd29ya3MnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodG9LZWJhYkNhc2UoJ2tlYmFiLWNhc2UnKSwgJ2tlYmFiLWNhc2UnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodG9LZWJhYkNhc2UoJ3NuYWtlX2Nhc2UnKSwgJ3NuYWtlLWNhc2UnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodG9LZWJhYkNhc2UoJ1RpdGxlIENhc2UnKSwgJ3RpdGxlLWNhc2UnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodG9LZWJhYkNhc2UoJ1Bhc2NhbENhc2UnKSwgJ3Bhc2NhbC1jYXNlJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRvS2ViYWJDYXNlKCdjYW1hbENhc2UnKSwgJ2NhbWFsLWNhc2UnKTtcbiAgfSk7XG5cbiAgaXQoJ3J1bnMgdG9UaXRsZUNhc2UnLCBmdW5jdGlvbigpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodG9UaXRsZUNhc2UoJ1dPUktTJyksICdXT1JLUycpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b1RpdGxlQ2FzZSgnd29ya3MnKSwgJ1dvcmtzJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRvVGl0bGVDYXNlKCdrZWJhYi1jYXNlJyksICdLZWJhYiBDYXNlJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRvVGl0bGVDYXNlKCdzbmFrZV9jYXNlJyksICdTbmFrZSBDYXNlJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRvVGl0bGVDYXNlKCdUaXRsZSBDYXNlJyksICdUaXRsZSBDYXNlJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRvVGl0bGVDYXNlKCdQYXNjYWxDYXNlJyksICdQYXNjYWwgQ2FzZScpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b1RpdGxlQ2FzZSgnY2FtYWxDYXNlJyksICdDYW1hbCBDYXNlJyk7XG4gIH0pO1xuXG4gIGl0KCdydW5zIHRvUGFzY2FsQ2FzZScsIGZ1bmN0aW9uKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b1Bhc2NhbENhc2UoJ1dPUktTJyksICdXb3JrcycpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b1Bhc2NhbENhc2UoJ3dvcmtzJyksICdXb3JrcycpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b1Bhc2NhbENhc2UoJ2tlYmFiLWNhc2UnKSwgJ0tlYmFiQ2FzZScpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b1Bhc2NhbENhc2UoJ3NuYWtlX2Nhc2UnKSwgJ1NuYWtlQ2FzZScpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b1Bhc2NhbENhc2UoJ1RpdGxlIENhc2UnKSwgJ1RpdGxlQ2FzZScpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b1Bhc2NhbENhc2UoJ1Bhc2NhbENhc2UnKSwgJ1Bhc2NhbENhc2UnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodG9QYXNjYWxDYXNlKCdjYW1hbENhc2UnKSwgJ0NhbWFsQ2FzZScpO1xuICB9KTtcblxuICBpdCgncnVucyB0b0NhbWVsQ2FzZScsIGZ1bmN0aW9uKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b0NhbWVsQ2FzZSgnV09SS1MnKSwgJ3dvcmtzJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRvQ2FtZWxDYXNlKCd3b3JrcycpLCAnd29ya3MnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodG9DYW1lbENhc2UoJ2tlYmFiLWNhc2UnKSwgJ2tlYmFiQ2FzZScpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b0NhbWVsQ2FzZSgnc25ha2VfY2FzZScpLCAnc25ha2VDYXNlJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRvQ2FtZWxDYXNlKCdUaXRsZSBDYXNlJyksICd0aXRsZUNhc2UnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodG9DYW1lbENhc2UoJ1Bhc2NhbENhc2UnKSwgJ3Bhc2NhbENhc2UnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodG9DYW1lbENhc2UoJ2NhbWFsQ2FzZScpLCAnY2FtYWxDYXNlJyk7XG4gIH0pO1xuXG4gIGl0KCdydW5zIHRvTmFtZUNhc2UnLCBmdW5jdGlvbigpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodG9OYW1lQ2FzZSgnV09SS1MnKSwgJ1dvcmtzJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRvTmFtZUNhc2UoJ3dvcmtzJyksICdXb3JrcycpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b05hbWVDYXNlKCdrZWJhYi1jYXNlJyksICdLZWJhYi1DYXNlJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRvTmFtZUNhc2UoJ3NuYWtlX2Nhc2UnKSwgJ1NuYWtlQ2FzZScpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b05hbWVDYXNlKCdUaXRsZSBDYXNlJyksICdUaXRsZSBDYXNlJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRvTmFtZUNhc2UoJ1Bhc2NhbENhc2UnKSwgJ1Bhc2NhbENhc2UnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodG9OYW1lQ2FzZSgnY2FtYWxDYXNlJyksICdDYW1hbENhc2UnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodG9OYW1lQ2FzZSgnb1xcJ0ZhcnJlbGwnKSwgJ09cXCdGYXJyZWxsJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRvTmFtZUNhc2UoJ2VtaWx5IGJha2VyLXdoaXRlJyksICdFbWlseSBCYWtlci1XaGl0ZScpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b05hbWVDYXNlKCdLZWxseVJvc2UgZmx1dHknKSwgJ0tlbGx5Um9zZSBGbHV0eScpO1xuICB9KTtcbn0pO1xuIl19 |
{ | ||
"name": "@universe/util", | ||
"version": "1.1.2", | ||
"version": "1.1.3", | ||
"main": "dist/src/index.js", | ||
@@ -13,3 +13,3 @@ "description": "Universe development utilities.", | ||
"pretest": "yarn run build", | ||
"test": "mocha --expose-gc dist/test", | ||
"test": "mocha ./dist/test/*.js -gc", | ||
"watch": "watch 'yarn run test' './src' './test' --wait=3" | ||
@@ -16,0 +16,0 @@ }, |
/* global MessageChannel */ | ||
import { MessageChannel as IMessageChannel } from 'worker_threads'; | ||
import type { MessageChannel as IMessageChannel } from 'worker_threads'; | ||
@@ -101,2 +101,3 @@ const IS_BROWSER = typeof window === 'object'; | ||
const chars = new Uint8Array(36); // No need to keep re-creating this, we fully overwrite it every time as we compute! Share the memory for perf. | ||
const utf8decoder = new TextDecoder('utf-8'); | ||
export function base85UuidDecode(data: string): string | null { | ||
@@ -135,8 +136,9 @@ let byteNumber = 0; | ||
// Hard coding is twice as fast as .apply() or spread. | ||
return String.fromCharCode( | ||
chars[0], chars[1], chars[2], chars[3], chars[4], chars[5], chars[6], chars[7], chars[8], chars[9], | ||
chars[10], chars[11], chars[12], chars[13], chars[14], chars[15], chars[16], chars[17], chars[18], chars[19], | ||
chars[20], chars[21], chars[22], chars[23], chars[24], chars[25], chars[26], chars[27], chars[28], chars[29], | ||
chars[30], chars[31], chars[32], chars[33], chars[34], chars[35], | ||
); | ||
return utf8decoder.decode(chars); | ||
// return String.fromCharCode( | ||
// chars[0], chars[1], chars[2], chars[3], chars[4], chars[5], chars[6], chars[7], chars[8], chars[9], | ||
// chars[10], chars[11], chars[12], chars[13], chars[14], chars[15], chars[16], chars[17], chars[18], chars[19], | ||
// chars[20], chars[21], chars[22], chars[23], chars[24], chars[25], chars[26], chars[27], chars[28], chars[29], | ||
// chars[30], chars[31], chars[32], chars[33], chars[34], chars[35], | ||
// ); | ||
} | ||
@@ -235,2 +237,3 @@ | ||
export const toPascalCase = (str: string): string => (str.match(STR_SPLIT_REG) || []).map(x => x.slice(0, 1).toUpperCase() + x.slice(1).toLowerCase()).join(''); | ||
export const toNameCase = (str: string): string => str.split('\'').map(str => str.split('-').map(s => s.split(' ').map(toPascalCase).join(' ')).join('-')).join('\''); | ||
export const toCamelCase = (str: string): string => { | ||
@@ -390,8 +393,5 @@ const s = (str.match(STR_SPLIT_REG) || []).map(x => x.slice(0, 1).toUpperCase() + x.slice(1).toLowerCase()).join(''); | ||
/* eslint-disable-next-line @typescript-eslint/no-var-requires */ | ||
const NewMessageChannel: typeof IMessageChannel = IS_BROWSER ? MessageChannel : require('worker_threads').MessageChannel; | ||
let mid = 0; | ||
const { port1, port2 } = new NewMessageChannel(); | ||
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */ | ||
const cloneCallbacks: Map<number, ((dat: any) => void)> = new Map(); | ||
let messageChannel: (IMessageChannel & { mid: number }); | ||
const resolveClone = (message: { mid: number; data: Record<string, unknown>}) => { | ||
@@ -402,7 +402,2 @@ const cb = cloneCallbacks.get(message.mid); | ||
}; | ||
if (!IS_BROWSER) { | ||
port2.on('message', resolveClone); | ||
port1.unref(); | ||
port2.unref(); // Unref must be called after message listener bound. | ||
} | ||
@@ -419,6 +414,17 @@ // Use native V8 structured clone through worker thread message channels. | ||
// memory spikes. | ||
if (!messageChannel) { | ||
/* eslint-disable-next-line @typescript-eslint/no-var-requires */ | ||
messageChannel = new (require('worker_threads').MessageChannel as typeof IMessageChannel)() as IMessageChannel & { mid: number; }; | ||
messageChannel.mid = 0; | ||
if (!IS_BROWSER) { | ||
// Unref must be called after message listener bound to allow the process to exit normally. | ||
messageChannel.port1.unref(); | ||
messageChannel.port2.unref(); | ||
messageChannel.port2.on('message', resolveClone); | ||
} | ||
} | ||
return new Promise((resolve) => { | ||
cloneCallbacks.set(mid, resolve); | ||
port1.postMessage({ mid, data }); | ||
mid = mid + 1 % Number.MAX_SAFE_INTEGER; | ||
cloneCallbacks.set(messageChannel.mid, resolve); | ||
messageChannel && messageChannel.port1.postMessage({ mid: messageChannel.mid, data }); | ||
messageChannel.mid = messageChannel.mid + 1 % Number.MAX_SAFE_INTEGER; | ||
}); | ||
@@ -431,3 +437,3 @@ } | ||
return new Promise((resolve) => { | ||
const { port1, port2 } = new NewMessageChannel(); | ||
const { port1, port2 } = new MessageChannel(); | ||
/* eslint-disable-next-line */ | ||
@@ -440,1 +446,10 @@ // @ts-ignore | ||
}; | ||
// A deferred promise that can be externally resolved or rejected. | ||
export default class Deferred<T> extends Promise<T> { | ||
public resolve!: (value: T | PromiseLike<T>) => void; | ||
public reject!: (err: Error) => void; | ||
constructor() { super((resolve, reject) => { this.resolve = resolve; this.reject = reject; }); } | ||
static get [Symbol.species](): typeof Promise { return Promise; } | ||
get [Symbol.toStringTag](): string { return 'Deferred'; } | ||
} |
@@ -5,3 +5,23 @@ /* global describe, it */ | ||
import { debounce, md5, uuid, isUuid, base64UrlDecode, base64UrlEncode, deepClone, validateEmail, base85UuidEncode, base85UuidDecode, posixToDate } from '../src/index'; | ||
import { | ||
debounce, | ||
md5, | ||
uuid, | ||
isUuid, | ||
base64UrlDecode, | ||
base64UrlEncode, | ||
deepClone, | ||
validateEmail, | ||
base85UuidEncode, | ||
base85UuidDecode, | ||
posixToDate, | ||
toLowerCase, | ||
toUpperCase, | ||
toSnakeCase, | ||
toKebabCase, | ||
toTitleCase, | ||
toPascalCase, | ||
toNameCase, | ||
toCamelCase, | ||
} from '../src/index'; | ||
@@ -11,3 +31,3 @@ import * as assert from 'assert'; | ||
describe('Utils', function() { | ||
describe('debounce should', function() { | ||
describe.skip('debounce should', function() { | ||
it('delay a call', async function() { | ||
@@ -43,3 +63,3 @@ const first = Date.now(); | ||
} | ||
global.gc(); | ||
global?.gc?.(); | ||
await new Promise(resolve => setTimeout(resolve, 3000)); | ||
@@ -49,19 +69,26 @@ const after = process.memoryUsage().heapUsed / 1024 / 1024; | ||
}); | ||
}); | ||
it('runs md5', function() { | ||
assert.strictEqual(md5('hello'), '5d41402abc4b2a76b9719d911017c592'); | ||
assert.strictEqual(md5('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 'c1906fa4ec71ebdc02c49c5d19908a39'); | ||
assert.strictEqual(md5(fs.readFileSync(path.join(__dirname, '../../fixtures/share.jpg'), 'binary')), '7b55446ad872973c5db5006905cc92aa'); | ||
}); | ||
it('runs md5', function() { | ||
assert.strictEqual(md5('hello'), '5d41402abc4b2a76b9719d911017c592'); | ||
assert.strictEqual(md5('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 'c1906fa4ec71ebdc02c49c5d19908a39'); | ||
assert.strictEqual(md5(fs.readFileSync(path.join(__dirname, '../../fixtures/share.jpg'), 'binary')), '7b55446ad872973c5db5006905cc92aa'); | ||
}); | ||
it('runs base64Url', function() { | ||
assert.strictEqual(base64UrlEncode('Adam Miller'), 'QWRhbSBNaWxsZXI'); | ||
assert.strictEqual(base64UrlDecode(base64UrlEncode('Adam Miller')), 'Adam Miller'); | ||
it('runs base64Url', function() { | ||
assert.strictEqual(base64UrlEncode('Adam Miller'), 'QWRhbSBNaWxsZXI'); | ||
assert.strictEqual(base64UrlDecode(base64UrlEncode('Adam Miller')), 'Adam Miller'); | ||
assert.strictEqual(base64UrlEncode('Kelly'), 'S2VsbHk'); | ||
assert.strictEqual(base64UrlDecode(base64UrlEncode('Kelly')), 'Kelly'); | ||
}); | ||
assert.strictEqual(base64UrlEncode('Kelly'), 'S2VsbHk'); | ||
assert.strictEqual(base64UrlDecode(base64UrlEncode('Kelly')), 'Kelly'); | ||
}); | ||
it('runs base85UuidEncode / base85UuidEncode', function() { | ||
const id = '1d0d0699-7002-4273-b013-2a963852c388'; | ||
it('runs base85UuidEncode / base85UuidEncode', function() { | ||
const id = '1d0d0699-7002-4273-b013-2a963852c388'; | ||
const encoded = base85UuidEncode(id); | ||
assert.strictEqual(isUuid(id), true); | ||
assert.strictEqual(encoded.length, 20); | ||
assert.strictEqual(base85UuidDecode(encoded), id); | ||
for (let i = 0; i < 2000; i++) { | ||
const id = uuid(); | ||
const encoded = base85UuidEncode(id); | ||
@@ -71,52 +98,121 @@ assert.strictEqual(isUuid(id), true); | ||
assert.strictEqual(base85UuidDecode(encoded), id); | ||
for (let i = 0; i < 2000; i++) { | ||
const id = uuid(); | ||
const encoded = base85UuidEncode(id); | ||
assert.strictEqual(isUuid(id), true); | ||
assert.strictEqual(encoded.length, 20); | ||
assert.strictEqual(base85UuidDecode(encoded), id); | ||
} | ||
}); | ||
} | ||
}); | ||
it('validates emails', function() { | ||
assert.ok(validateEmail('adam@universe.app')); | ||
assert.ok(validateEmail('adam+tag@universe.app')); | ||
assert.ok(!validateEmail('@universe.app')); | ||
assert.ok(!validateEmail('adam@universe')); | ||
assert.ok(!validateEmail('adam@universe.')); | ||
assert.ok(!validateEmail('superduperlongemailaddressthatistechnicallynotallowedsuperduperlongemailaddressthatistechnicallynotallowed@universe.app')); | ||
assert.ok(!validateEmail('INVALID')); | ||
assert.ok(!validateEmail(false)); | ||
assert.ok(!validateEmail(100)); | ||
assert.ok(!validateEmail(new Date())); | ||
assert.ok(!validateEmail({})); | ||
}); | ||
it('validates emails', function() { | ||
assert.ok(validateEmail('adam@universe.app')); | ||
assert.ok(validateEmail('adam+tag@universe.app')); | ||
assert.ok(!validateEmail('@universe.app')); | ||
assert.ok(!validateEmail('adam@universe')); | ||
assert.ok(!validateEmail('adam@universe.')); | ||
assert.ok(!validateEmail('superduperlongemailaddressthatistechnicallynotallowedsuperduperlongemailaddressthatistechnicallynotallowed@universe.app')); | ||
assert.ok(!validateEmail('INVALID')); | ||
assert.ok(!validateEmail(false)); | ||
assert.ok(!validateEmail(100)); | ||
assert.ok(!validateEmail(new Date())); | ||
assert.ok(!validateEmail({})); | ||
}); | ||
it('deep clones', async() => { | ||
const obj = { | ||
a: 1, | ||
b: { c: 3 }, | ||
d: [ 1, 2, { e: 5 }], | ||
}; | ||
const clone = await deepClone(obj); | ||
assert.notStrictEqual(obj, clone); | ||
assert.deepStrictEqual(obj, clone); | ||
}); | ||
it('deep clones', async() => { | ||
const obj = { | ||
a: 1, | ||
b: { c: 3 }, | ||
d: [ 1, 2, { e: 5 }], | ||
}; | ||
const clone = await deepClone(obj); | ||
assert.notStrictEqual(obj, clone); | ||
assert.deepStrictEqual(obj, clone); | ||
}); | ||
it('converts posix to date', async() => { | ||
const dates = [ | ||
'6/29/1991', | ||
'1/1/1900', | ||
'1/1/3030', | ||
'12/31/1845', | ||
'12/31/7082', | ||
'6/1/2009', | ||
'6/29/2009', | ||
]; | ||
for (const date of dates) { | ||
const res = posixToDate(+(new Date(date))); | ||
assert.strictEqual(`${res.month}/${res.day}/${res.year}`, date); | ||
} | ||
}); | ||
it('converts posix to date', async() => { | ||
const dates = [ | ||
'6/29/1991', | ||
'1/1/1900', | ||
'1/1/3030', | ||
'12/31/1845', | ||
'12/31/7082', | ||
'6/1/2009', | ||
'6/29/2009', | ||
]; | ||
for (const date of dates) { | ||
const res = posixToDate(+(new Date(date))); | ||
assert.strictEqual(`${res.month}/${res.day}/${res.year}`, date); | ||
} | ||
}); | ||
it('runs toLowerCase', function() { | ||
assert.strictEqual(toLowerCase('WORKS'), 'works'); | ||
assert.strictEqual(toLowerCase('works'), 'works'); | ||
assert.strictEqual(toLowerCase('WoRkz 4-A c0^^P13X sTRing'), 'workz 4-a c0^^p13x string'); | ||
}); | ||
it('runs toUpperCase', function() { | ||
assert.strictEqual(toUpperCase('WORKS'), 'WORKS'); | ||
assert.strictEqual(toUpperCase('works'), 'WORKS'); | ||
assert.strictEqual(toUpperCase('WoRkz 4-A c0^^P13X sTRing'), 'WORKZ 4-A C0^^P13X STRING'); | ||
}); | ||
it('runs toSnakeCase', function() { | ||
assert.strictEqual(toSnakeCase('WORKS'), 'works'); | ||
assert.strictEqual(toSnakeCase('works'), 'works'); | ||
assert.strictEqual(toSnakeCase('WoRkz 4-A c0^^P13X sTRing'), 'wo_rkz_4_a_c0_p_13_x_s_t_ring'); | ||
assert.strictEqual(toSnakeCase('kebab-case'), 'kebab_case'); | ||
assert.strictEqual(toSnakeCase('snake_case'), 'snake_case'); | ||
assert.strictEqual(toSnakeCase('Title Case'), 'title_case'); | ||
assert.strictEqual(toSnakeCase('PascalCase'), 'pascal_case'); | ||
assert.strictEqual(toSnakeCase('camalCase'), 'camal_case'); | ||
}); | ||
it('runs toKebabCase', function() { | ||
assert.strictEqual(toKebabCase('WORKS'), 'works'); | ||
assert.strictEqual(toKebabCase('works'), 'works'); | ||
assert.strictEqual(toKebabCase('kebab-case'), 'kebab-case'); | ||
assert.strictEqual(toKebabCase('snake_case'), 'snake-case'); | ||
assert.strictEqual(toKebabCase('Title Case'), 'title-case'); | ||
assert.strictEqual(toKebabCase('PascalCase'), 'pascal-case'); | ||
assert.strictEqual(toKebabCase('camalCase'), 'camal-case'); | ||
}); | ||
it('runs toTitleCase', function() { | ||
assert.strictEqual(toTitleCase('WORKS'), 'WORKS'); | ||
assert.strictEqual(toTitleCase('works'), 'Works'); | ||
assert.strictEqual(toTitleCase('kebab-case'), 'Kebab Case'); | ||
assert.strictEqual(toTitleCase('snake_case'), 'Snake Case'); | ||
assert.strictEqual(toTitleCase('Title Case'), 'Title Case'); | ||
assert.strictEqual(toTitleCase('PascalCase'), 'Pascal Case'); | ||
assert.strictEqual(toTitleCase('camalCase'), 'Camal Case'); | ||
}); | ||
it('runs toPascalCase', function() { | ||
assert.strictEqual(toPascalCase('WORKS'), 'Works'); | ||
assert.strictEqual(toPascalCase('works'), 'Works'); | ||
assert.strictEqual(toPascalCase('kebab-case'), 'KebabCase'); | ||
assert.strictEqual(toPascalCase('snake_case'), 'SnakeCase'); | ||
assert.strictEqual(toPascalCase('Title Case'), 'TitleCase'); | ||
assert.strictEqual(toPascalCase('PascalCase'), 'PascalCase'); | ||
assert.strictEqual(toPascalCase('camalCase'), 'CamalCase'); | ||
}); | ||
it('runs toCamelCase', function() { | ||
assert.strictEqual(toCamelCase('WORKS'), 'works'); | ||
assert.strictEqual(toCamelCase('works'), 'works'); | ||
assert.strictEqual(toCamelCase('kebab-case'), 'kebabCase'); | ||
assert.strictEqual(toCamelCase('snake_case'), 'snakeCase'); | ||
assert.strictEqual(toCamelCase('Title Case'), 'titleCase'); | ||
assert.strictEqual(toCamelCase('PascalCase'), 'pascalCase'); | ||
assert.strictEqual(toCamelCase('camalCase'), 'camalCase'); | ||
}); | ||
it('runs toNameCase', function() { | ||
assert.strictEqual(toNameCase('WORKS'), 'Works'); | ||
assert.strictEqual(toNameCase('works'), 'Works'); | ||
assert.strictEqual(toNameCase('kebab-case'), 'Kebab-Case'); | ||
assert.strictEqual(toNameCase('snake_case'), 'SnakeCase'); | ||
assert.strictEqual(toNameCase('Title Case'), 'Title Case'); | ||
assert.strictEqual(toNameCase('PascalCase'), 'PascalCase'); | ||
assert.strictEqual(toNameCase('camalCase'), 'CamalCase'); | ||
assert.strictEqual(toNameCase("o'Farrell"), "O'Farrell"); | ||
assert.strictEqual(toNameCase('emily baker-white'), 'Emily Baker-White'); | ||
assert.strictEqual(toNameCase('KellyRose fluty'), 'KellyRose Fluty'); | ||
}); | ||
}); |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
462864
4.44%1357
16.88%