lib0 0.2.86 → 0.2.87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/buffer.d.ts.map +1 -1
- package/buffer.js +3 -6
- package/coverage/tmp/coverage-29846-1697198852740-0.json +1 -0
- package/decoding.d.ts.map +1 -1
- package/decoding.js +1 -2
- package/dist/aes-gcm.cjs +8 -13
- package/dist/aes-gcm.cjs.map +1 -1
- package/dist/{broadcastchannel-036aba21.cjs → broadcastchannel-554b85cd.cjs} +4 -4
- package/dist/{broadcastchannel-036aba21.cjs.map → broadcastchannel-554b85cd.cjs.map} +1 -1
- package/dist/broadcastchannel.cjs +6 -4
- package/dist/broadcastchannel.cjs.map +1 -1
- package/dist/buffer-f9b1a143.cjs +198 -0
- package/dist/buffer-f9b1a143.cjs.map +1 -0
- package/dist/buffer.cjs +18 -16
- package/dist/buffer.cjs.map +1 -1
- package/dist/buffer.d.ts.map +1 -1
- package/dist/decoding-fca97826.cjs +791 -0
- package/dist/decoding-fca97826.cjs.map +1 -0
- package/dist/decoding.cjs +40 -45
- package/dist/decoding.cjs.map +1 -1
- package/dist/decoding.d.ts.map +1 -1
- package/dist/{buffer-bc255c75.cjs → encoding-5bb79b9b.cjs} +9 -983
- package/dist/encoding-5bb79b9b.cjs.map +1 -0
- package/dist/encoding.cjs +1 -8
- package/dist/encoding.cjs.map +1 -1
- package/dist/encoding.d.ts.map +1 -1
- package/dist/{environment-ad129e4d.cjs → environment-819e9403.cjs} +4 -4
- package/dist/environment-819e9403.cjs.map +1 -0
- package/dist/environment.cjs +1 -1
- package/dist/environment.d.ts.map +1 -1
- package/dist/index.cjs +11 -9
- package/dist/index.cjs.map +1 -1
- package/dist/{indexeddb-2dd34f7d.cjs → indexeddb-8d495848.cjs} +1 -4
- package/dist/indexeddb-8d495848.cjs.map +1 -0
- package/dist/indexeddb.cjs +1 -1
- package/dist/indexeddb.d.ts.map +1 -1
- package/dist/jwt.cjs +9 -7
- package/dist/jwt.cjs.map +1 -1
- package/dist/logging.cjs +1 -1
- package/dist/logging.common.cjs +1 -1
- package/dist/logging.node.cjs +1 -1
- package/dist/observable.cjs +5 -5
- package/dist/observable.cjs.map +1 -1
- package/dist/observable.d.ts +10 -12
- package/dist/observable.d.ts.map +1 -1
- package/dist/{prng-d6655349.cjs → prng-33ae0b2e.cjs} +3 -3
- package/dist/{prng-d6655349.cjs.map → prng-33ae0b2e.cjs.map} +1 -1
- package/dist/prng.cjs +5 -3
- package/dist/prng.cjs.map +1 -1
- package/dist/rabin-gf2-polynomial.cjs +6 -4
- package/dist/rabin-gf2-polynomial.cjs.map +1 -1
- package/dist/rabin-uncached.cjs +6 -4
- package/dist/rabin-uncached.cjs.map +1 -1
- package/dist/rabin.cjs +7 -5
- package/dist/rabin.cjs.map +1 -1
- package/dist/storage.cjs +1 -1
- package/dist/storage.cjs.map +1 -1
- package/dist/testing.cjs +5 -3
- package/dist/testing.cjs.map +1 -1
- package/dist/{websocket-aa53d26d.cjs → websocket-ccb9bf5d.cjs} +1 -1
- package/dist/{websocket-aa53d26d.cjs.map → websocket-ccb9bf5d.cjs.map} +1 -1
- package/dist/websocket.cjs +1 -1
- package/encoding.d.ts.map +1 -1
- package/encoding.js +2 -3
- package/environment.d.ts.map +1 -1
- package/environment.js +3 -3
- package/indexeddb.d.ts.map +1 -1
- package/indexeddb.js +0 -3
- package/observable.d.ts +10 -12
- package/observable.d.ts.map +1 -1
- package/observable.js +5 -5
- package/package.json +21 -2
- package/storage.js +1 -1
- package/coverage/tmp/coverage-12951-1695475540140-0.json +0 -1
- package/dist/buffer-bc255c75.cjs.map +0 -1
- package/dist/environment-ad129e4d.cjs.map +0 -1
- package/dist/indexeddb-2dd34f7d.cjs.map +0 -1
package/dist/testing.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.cjs","sources":["../testing.js"],"sourcesContent":["/**\n * Testing framework with support for generating tests.\n *\n * ```js\n * // test.js template for creating a test executable\n * import { runTests } from 'lib0/testing'\n * import * as log from 'lib0/logging'\n * import * as mod1 from './mod1.test.js'\n * import * as mod2 from './mod2.test.js'\n\n * import { isBrowser, isNode } from 'lib0/environment.js'\n *\n * if (isBrowser) {\n * // optional: if this is ran in the browser, attach a virtual console to the dom\n * log.createVConsole(document.body)\n * }\n *\n * runTests({\n * mod1,\n * mod2,\n * }).then(success => {\n * if (isNode) {\n * process.exit(success ? 0 : 1)\n * }\n * })\n * ```\n *\n * ```js\n * // mod1.test.js\n * /**\n * * runTests automatically tests all exported functions that start with \"test\".\n * * The name of the function should be in camelCase and is used for the logging output.\n * *\n * * @param {t.TestCase} tc\n * *\\/\n * export const testMyFirstTest = tc => {\n * t.compare({ a: 4 }, { a: 4 }, 'objects are equal')\n * }\n * ```\n *\n * Now you can simply run `node test.js` to run your test or run test.js in the browser.\n *\n * @module testing\n */\n\nimport * as log from 'lib0/logging'\nimport { simpleDiffString } from './diff.js'\nimport * as object from './object.js'\nimport * as string from './string.js'\nimport * as math from './math.js'\nimport * as random from './random.js'\nimport * as prng from './prng.js'\nimport * as statistics from './statistics.js'\nimport * as array from './array.js'\nimport * as env from './environment.js'\nimport * as json from './json.js'\nimport * as time from './time.js'\nimport * as promise from './promise.js'\nimport * as performance from 'lib0/performance'\n\nexport { production } from './environment.js'\n\nexport const extensive = env.hasConf('extensive')\n\n/* c8 ignore next */\nexport const envSeed = env.hasParam('--seed') ? Number.parseInt(env.getParam('--seed', '0')) : null\n\nexport class TestCase {\n /**\n * @param {string} moduleName\n * @param {string} testName\n */\n constructor (moduleName, testName) {\n /**\n * @type {string}\n */\n this.moduleName = moduleName\n /**\n * @type {string}\n */\n this.testName = testName\n /**\n * This type can store custom information related to the TestCase\n *\n * @type {Map<string,any>}\n */\n this.meta = new Map()\n this._seed = null\n this._prng = null\n }\n\n resetSeed () {\n this._seed = null\n this._prng = null\n }\n\n /**\n * @type {number}\n */\n /* c8 ignore next */\n get seed () {\n /* c8 ignore else */\n if (this._seed === null) {\n /* c8 ignore next */\n this._seed = envSeed === null ? random.uint32() : envSeed\n }\n return this._seed\n }\n\n /**\n * A PRNG for this test case. Use only this PRNG for randomness to make the test case reproducible.\n *\n * @type {prng.PRNG}\n */\n get prng () {\n /* c8 ignore else */\n if (this._prng === null) {\n this._prng = prng.create(this.seed)\n }\n return this._prng\n }\n}\n\nexport const repetitionTime = Number(env.getParam('--repetition-time', '50'))\n/* c8 ignore next */\nconst testFilter = env.hasParam('--filter') ? env.getParam('--filter', '') : null\n\n/* c8 ignore next */\nconst testFilterRegExp = testFilter !== null ? new RegExp(testFilter) : /.*/\n\nconst repeatTestRegex = /^(repeat|repeating)\\s/\n\n/**\n * @param {string} moduleName\n * @param {string} name\n * @param {function(TestCase):void|Promise<any>} f\n * @param {number} i\n * @param {number} numberOfTests\n */\nexport const run = async (moduleName, name, f, i, numberOfTests) => {\n const uncamelized = string.fromCamelCase(name.slice(4), ' ')\n const filtered = !testFilterRegExp.test(`[${i + 1}/${numberOfTests}] ${moduleName}: ${uncamelized}`)\n /* c8 ignore next 3 */\n if (filtered) {\n return true\n }\n const tc = new TestCase(moduleName, name)\n const repeat = repeatTestRegex.test(uncamelized)\n const groupArgs = [log.GREY, `[${i + 1}/${numberOfTests}] `, log.PURPLE, `${moduleName}: `, log.BLUE, uncamelized]\n /* c8 ignore next 5 */\n if (testFilter === null) {\n log.groupCollapsed(...groupArgs)\n } else {\n log.group(...groupArgs)\n }\n const times = []\n const start = performance.now()\n let lastTime = start\n /**\n * @type {any}\n */\n let err = null\n performance.mark(`${name}-start`)\n do {\n try {\n const p = f(tc)\n if (promise.isPromise(p)) {\n await p\n }\n } catch (_err) {\n err = _err\n }\n const currTime = performance.now()\n times.push(currTime - lastTime)\n lastTime = currTime\n if (repeat && err === null && (lastTime - start) < repetitionTime) {\n tc.resetSeed()\n } else {\n break\n }\n } while (err === null && (lastTime - start) < repetitionTime)\n performance.mark(`${name}-end`)\n /* c8 ignore next 3 */\n if (err !== null && err.constructor !== SkipError) {\n log.printError(err)\n }\n performance.measure(name, `${name}-start`, `${name}-end`)\n log.groupEnd()\n const duration = lastTime - start\n let success = true\n times.sort((a, b) => a - b)\n /* c8 ignore next 3 */\n const againMessage = env.isBrowser\n ? ` - ${window.location.host + window.location.pathname}?filter=\\\\[${i + 1}/${tc._seed === null ? '' : `&seed=${tc._seed}`}`\n : `\\nrepeat: npm run test -- --filter \"\\\\[${i + 1}/\" ${tc._seed === null ? '' : `--seed ${tc._seed}`}`\n const timeInfo = (repeat && err === null)\n ? ` - ${times.length} repetitions in ${time.humanizeDuration(duration)} (best: ${time.humanizeDuration(times[0])}, worst: ${time.humanizeDuration(array.last(times))}, median: ${time.humanizeDuration(statistics.median(times))}, average: ${time.humanizeDuration(statistics.average(times))})`\n : ` in ${time.humanizeDuration(duration)}`\n if (err !== null) {\n /* c8 ignore start */\n if (err.constructor === SkipError) {\n log.print(log.GREY, log.BOLD, 'Skipped: ', log.UNBOLD, uncamelized)\n } else {\n success = false\n log.print(log.RED, log.BOLD, 'Failure: ', log.UNBOLD, log.UNCOLOR, uncamelized, log.GREY, timeInfo, againMessage)\n }\n /* c8 ignore stop */\n } else {\n log.print(log.GREEN, log.BOLD, 'Success: ', log.UNBOLD, log.UNCOLOR, uncamelized, log.GREY, timeInfo, againMessage)\n }\n return success\n}\n\n/**\n * Describe what you are currently testing. The message will be logged.\n *\n * ```js\n * export const testMyFirstTest = tc => {\n * t.describe('crunching numbers', 'already crunched 4 numbers!') // the optional second argument can describe the state.\n * }\n * ```\n *\n * @param {string} description\n * @param {string} info\n */\nexport const describe = (description, info = '') => log.print(log.BLUE, description, ' ', log.GREY, info)\n\n/**\n * Describe the state of the current computation.\n * ```js\n * export const testMyFirstTest = tc => {\n * t.info(already crunched 4 numbers!') // the optional second argument can describe the state.\n * }\n * ```\n *\n * @param {string} info\n */\nexport const info = info => describe('', info)\n\nexport const printDom = log.printDom\n\nexport const printCanvas = log.printCanvas\n\n/**\n * Group outputs in a collapsible category.\n *\n * ```js\n * export const testMyFirstTest = tc => {\n * t.group('subtest 1', () => {\n * t.describe('this message is part of a collapsible section')\n * })\n * await t.groupAsync('subtest async 2', async () => {\n * await someaction()\n * t.describe('this message is part of a collapsible section')\n * })\n * }\n * ```\n *\n * @param {string} description\n * @param {function(...any):void} f\n */\nexport const group = (description, f) => {\n log.group(log.BLUE, description)\n try {\n f()\n } finally {\n log.groupEnd()\n }\n}\n\n/**\n * Group outputs in a collapsible category.\n *\n * ```js\n * export const testMyFirstTest = async tc => {\n * t.group('subtest 1', () => {\n * t.describe('this message is part of a collapsible section')\n * })\n * await t.groupAsync('subtest async 2', async () => {\n * await someaction()\n * t.describe('this message is part of a collapsible section')\n * })\n * }\n * ```\n *\n * @param {string} description\n * @param {function(...any):Promise<any>} f\n */\nexport const groupAsync = async (description, f) => {\n log.group(log.BLUE, description)\n try {\n await f()\n } finally {\n log.groupEnd()\n }\n}\n\n/**\n * Measure the time that it takes to calculate something.\n *\n * ```js\n * export const testMyFirstTest = async tc => {\n * t.measureTime('measurement', () => {\n * heavyCalculation()\n * })\n * await t.groupAsync('async measurement', async () => {\n * await heavyAsyncCalculation()\n * })\n * }\n * ```\n *\n * @param {string} message\n * @param {function(...any):void} f\n * @return {number} Returns a promise that resolves the measured duration to apply f\n */\nexport const measureTime = (message, f) => {\n let duration\n const start = performance.now()\n try {\n f()\n } finally {\n duration = performance.now() - start\n log.print(log.PURPLE, message, log.GREY, ` ${time.humanizeDuration(duration)}`)\n }\n return duration\n}\n\n/**\n * Measure the time that it takes to calculate something.\n *\n * ```js\n * export const testMyFirstTest = async tc => {\n * t.measureTimeAsync('measurement', async () => {\n * await heavyCalculation()\n * })\n * await t.groupAsync('async measurement', async () => {\n * await heavyAsyncCalculation()\n * })\n * }\n * ```\n *\n * @param {string} message\n * @param {function(...any):Promise<any>} f\n * @return {Promise<number>} Returns a promise that resolves the measured duration to apply f\n */\nexport const measureTimeAsync = async (message, f) => {\n let duration\n const start = performance.now()\n try {\n await f()\n } finally {\n duration = performance.now() - start\n log.print(log.PURPLE, message, log.GREY, ` ${time.humanizeDuration(duration)}`)\n }\n return duration\n}\n\n/**\n * @template T\n * @param {Array<T>} as\n * @param {Array<T>} bs\n * @param {string} [m]\n * @return {boolean}\n */\nexport const compareArrays = (as, bs, m = 'Arrays match') => {\n if (as.length !== bs.length) {\n fail(m)\n }\n for (let i = 0; i < as.length; i++) {\n if (as[i] !== bs[i]) {\n fail(m)\n }\n }\n return true\n}\n\n/**\n * @param {string} a\n * @param {string} b\n * @param {string} [m]\n * @throws {TestError} Throws if tests fails\n */\nexport const compareStrings = (a, b, m = 'Strings match') => {\n if (a !== b) {\n const diff = simpleDiffString(a, b)\n log.print(log.GREY, a.slice(0, diff.index), log.RED, a.slice(diff.index, diff.remove), log.GREEN, diff.insert, log.GREY, a.slice(diff.index + diff.remove))\n fail(m)\n }\n}\n\n/**\n * @template K,V\n * @param {Object<K,V>} a\n * @param {Object<K,V>} b\n * @param {string} [m]\n * @throws {TestError} Throws if test fails\n */\nexport const compareObjects = (a, b, m = 'Objects match') => { object.equalFlat(a, b) || fail(m) }\n\n/**\n * @param {any} _constructor\n * @param {any} a\n * @param {any} b\n * @param {string} path\n * @throws {TestError}\n */\nconst compareValues = (_constructor, a, b, path) => {\n if (a !== b) {\n fail(`Values ${json.stringify(a)} and ${json.stringify(b)} don't match (${path})`)\n }\n return true\n}\n\n/**\n * @param {string?} message\n * @param {string} reason\n * @param {string} path\n * @throws {TestError}\n */\nconst _failMessage = (message, reason, path) => fail(\n message === null\n ? `${reason} ${path}`\n : `${message} (${reason}) ${path}`\n)\n\n/**\n * @param {any} a\n * @param {any} b\n * @param {string} path\n * @param {string?} message\n * @param {function(any,any,any,string,any):boolean} customCompare\n */\nconst _compare = (a, b, path, message, customCompare) => {\n // we don't use assert here because we want to test all branches (istanbul errors if one branch is not tested)\n if (a == null || b == null) {\n return compareValues(null, a, b, path)\n }\n if (a.constructor !== b.constructor) {\n _failMessage(message, 'Constructors don\\'t match', path)\n }\n let success = true\n switch (a.constructor) {\n case ArrayBuffer:\n a = new Uint8Array(a)\n b = new Uint8Array(b)\n // eslint-disable-next-line no-fallthrough\n case Uint8Array: {\n if (a.byteLength !== b.byteLength) {\n _failMessage(message, 'ArrayBuffer lengths match', path)\n }\n for (let i = 0; success && i < a.length; i++) {\n success = success && a[i] === b[i]\n }\n break\n }\n case Set: {\n if (a.size !== b.size) {\n _failMessage(message, 'Sets have different number of attributes', path)\n }\n // @ts-ignore\n a.forEach(value => {\n if (!b.has(value)) {\n _failMessage(message, `b.${path} does have ${value}`, path)\n }\n })\n break\n }\n case Map: {\n if (a.size !== b.size) {\n _failMessage(message, 'Maps have different number of attributes', path)\n }\n // @ts-ignore\n a.forEach((value, key) => {\n if (!b.has(key)) {\n _failMessage(message, `Property ${path}[\"${key}\"] does not exist on second argument`, path)\n }\n _compare(value, b.get(key), `${path}[\"${key}\"]`, message, customCompare)\n })\n break\n }\n case Object:\n if (object.length(a) !== object.length(b)) {\n _failMessage(message, 'Objects have a different number of attributes', path)\n }\n object.forEach(a, (value, key) => {\n if (!object.hasProperty(b, key)) {\n _failMessage(message, `Property ${path} does not exist on second argument`, path)\n }\n _compare(value, b[key], `${path}[\"${key}\"]`, message, customCompare)\n })\n break\n case Array:\n if (a.length !== b.length) {\n _failMessage(message, 'Arrays have a different number of attributes', path)\n }\n // @ts-ignore\n a.forEach((value, i) => _compare(value, b[i], `${path}[${i}]`, message, customCompare))\n break\n /* c8 ignore next 4 */\n default:\n if (!customCompare(a.constructor, a, b, path, compareValues)) {\n _failMessage(message, `Values ${json.stringify(a)} and ${json.stringify(b)} don't match`, path)\n }\n }\n assert(success, message)\n return true\n}\n\n/**\n * @template T\n * @param {T} a\n * @param {T} b\n * @param {string?} [message]\n * @param {function(any,T,T,string,any):boolean} [customCompare]\n */\nexport const compare = (a, b, message = null, customCompare = compareValues) => _compare(a, b, 'obj', message, customCompare)\n\n/**\n * @template T\n * @param {T} property\n * @param {string?} [message]\n * @return {asserts property is NonNullable<T>}\n * @throws {TestError}\n */\n/* c8 ignore next */\nexport const assert = (property, message = null) => { property || fail(`Assertion failed${message !== null ? `: ${message}` : ''}`) }\n\n/**\n * @param {function(...any):Promise<any>} f\n */\nexport const promiseRejected = async f => {\n try {\n await f()\n } catch (err) {\n return\n }\n fail('Expected promise to fail')\n}\n\n/**\n * @param {function(...any):void} f\n * @throws {TestError}\n */\nexport const fails = f => {\n try {\n f()\n } catch (_err) {\n log.print(log.GREEN, '⇖ This Error was expected')\n return\n }\n fail('Expected this to fail')\n}\n\n/**\n * @param {function(...any):Promise<any>} f\n * @throws {TestError}\n */\nexport const failsAsync = async f => {\n try {\n await f()\n } catch (_err) {\n log.print(log.GREEN, '⇖ This Error was expected')\n return\n }\n fail('Expected this to fail')\n}\n\n/**\n * @param {Object<string, Object<string, function(TestCase):void|Promise<any>>>} tests\n */\nexport const runTests = async tests => {\n /**\n * @param {string} testname\n */\n const filterTest = testname => testname.startsWith('test') || testname.startsWith('benchmark')\n const numberOfTests = object.map(tests, mod => object.map(mod, (f, fname) => /* c8 ignore next */ f && filterTest(fname) ? 1 : 0).reduce(math.add, 0)).reduce(math.add, 0)\n let successfulTests = 0\n let testnumber = 0\n const start = performance.now()\n for (const modName in tests) {\n const mod = tests[modName]\n for (const fname in mod) {\n const f = mod[fname]\n /* c8 ignore else */\n if (f && filterTest(fname)) {\n const repeatEachTest = 1\n let success = true\n for (let i = 0; success && i < repeatEachTest; i++) {\n success = await run(modName, fname, f, testnumber, numberOfTests)\n }\n testnumber++\n /* c8 ignore else */\n if (success) {\n successfulTests++\n }\n }\n }\n }\n const end = performance.now()\n log.print('')\n const success = successfulTests === numberOfTests\n /* c8 ignore start */\n if (success) {\n log.print(log.GREEN, log.BOLD, 'All tests successful!', log.GREY, log.UNBOLD, ` in ${time.humanizeDuration(end - start)}`)\n log.printImgBase64(nyanCatImage, 50)\n } else {\n const failedTests = numberOfTests - successfulTests\n log.print(log.RED, log.BOLD, `> ${failedTests} test${failedTests > 1 ? 's' : ''} failed`)\n }\n /* c8 ignore stop */\n return success\n}\n\nclass TestError extends Error {}\n\n/**\n * @param {string} reason\n * @throws {TestError}\n */\nexport const fail = reason => {\n log.print(log.RED, log.BOLD, 'X ', log.UNBOLD, reason)\n throw new TestError('Test Failed')\n}\n\nclass SkipError extends Error {}\n\n/**\n * @param {boolean} cond If true, this tests will be skipped\n * @throws {SkipError}\n */\nexport const skip = (cond = true) => {\n if (cond) {\n throw new SkipError('skipping..')\n }\n}\n\n// eslint-disable-next-line\nconst nyanCatImage = 'R0lGODlhjABMAPcAAMiSE0xMTEzMzUKJzjQ0NFsoKPc7//FM/9mH/z9x0HIiIoKCgmBHN+frGSkZLdDQ0LCwsDk71g0KCUzDdrQQEOFz/8yYdelmBdTiHFxcXDU2erR/mLrTHCgoKK5szBQUFNgSCTk6ymfpCB9VZS2Bl+cGBt2N8kWm0uDcGXhZRUvGq94NCFPhDiwsLGVlZTgqIPMDA1g3aEzS5D6xAURERDtG9JmBjJsZGWs2AD1W6Hp6eswyDeJ4CFNTU1LcEoJRmTMzSd14CTg5ser2GmDzBd17/xkZGUzMvoSMDiEhIfKruCwNAJaWlvRzA8kNDXDrCfi0pe1U/+GS6SZrAB4eHpZwVhoabsx9oiYmJt/TGHFxcYyMjOid0+Zl/0rF6j09PeRr/0zU9DxO6j+z0lXtBtp8qJhMAEssLGhoaPL/GVn/AAsWJ/9/AE3Z/zs9/3cAAOlf/+aa2RIyADo85uhh/0i84WtrazQ0UyMlmDMzPwUFBe16BTMmHau0E03X+g8pMEAoS1MBAf++kkzO8pBaqSZoe9uB/zE0BUQ3Sv///4WFheuiyzo880gzNDIyNissBNqF/8RiAOF2qG5ubj0vL1z6Avl5ASsgGkgUSy8vL/8n/z4zJy8lOv96uEssV1csAN5ZCDQ0Wz1a3tbEGHLeDdYKCg4PATE7PiMVFSoqU83eHEi43gUPAOZ8reGogeKU5dBBC8faHEez2lHYF4bQFMukFtl4CzY3kkzBVJfMGZkAAMfSFf27mP0t//g4/9R6Dfsy/1DRIUnSAPRD/0fMAFQ0Q+l7rnbaD0vEntCDD6rSGtO8GNpUCU/MK07LPNEfC7RaABUWWkgtOst+71v9AfD7GfDw8P19ATtA/NJpAONgB9yL+fm6jzIxMdnNGJxht1/2A9x//9jHGOSX3+5tBP27l35+fk5OTvZ9AhYgTjo0PUhGSDs9+LZjCFf2Aw0IDwcVAA8PD5lwg9+Q7YaChC0kJP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGNEM2MUEyMzE0QTRFMTExOUQzRkE3QTBCRDNBMjdBQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpERjQ0NEY0QkI2MTcxMUUxOUJEQkUzNUNGQTkwRTU2MiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpERjQ0NEY0QUI2MTcxMUUxOUJEQkUzNUNGQTkwRTU2MiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1OEE3RTIwRjcyQTlFMTExOTQ1QkY2QTU5QzVCQjJBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGNEM2MUEyMzE0QTRFMTExOUQzRkE3QTBCRDNBMjdBQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1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'\n"],"names":["env.hasConf","env.hasParam","env.getParam","random.uint32","prng.create","string.fromCamelCase","log","performance","promise.isPromise","env.isBrowser","time.humanizeDuration","array.last","statistics.median","statistics.average","diff","simpleDiffString","object.equalFlat","json.stringify","object.length","object.forEach","object.hasProperty","object.map","math.add"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAkBA;AACY,MAAC,SAAS,GAAGA,mBAAW,CAAC,WAAW,EAAC;AACjD;AACA;AACY,MAAC,OAAO,GAAGC,oBAAY,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,QAAQ,CAACC,oBAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,KAAI;AACnG;AACO,MAAM,QAAQ,CAAC;AACtB;AACA;AACA;AACA;AACA,EAAE,WAAW,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE;AACrC;AACA;AACA;AACA,IAAI,IAAI,CAAC,UAAU,GAAG,WAAU;AAChC;AACA;AACA;AACA,IAAI,IAAI,CAAC,QAAQ,GAAG,SAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,GAAE;AACzB,IAAI,IAAI,CAAC,KAAK,GAAG,KAAI;AACrB,IAAI,IAAI,CAAC,KAAK,GAAG,KAAI;AACrB,GAAG;AACH;AACA,EAAE,SAAS,CAAC,GAAG;AACf,IAAI,IAAI,CAAC,KAAK,GAAG,KAAI;AACrB,IAAI,IAAI,CAAC,KAAK,GAAG,KAAI;AACrB,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,IAAI,CAAC,GAAG;AACd;AACA,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;AAC7B;AACA,MAAM,IAAI,CAAC,KAAK,GAAG,OAAO,KAAK,IAAI,GAAGC,aAAa,EAAE,GAAG,QAAO;AAC/D,KAAK;AACL,IAAI,OAAO,IAAI,CAAC,KAAK;AACrB,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,IAAI,CAAC,GAAG;AACd;AACA,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;AAC7B,MAAM,IAAI,CAAC,KAAK,GAAGC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAC;AACzC,KAAK;AACL,IAAI,OAAO,IAAI,CAAC,KAAK;AACrB,GAAG;AACH,CAAC;AACD;AACY,MAAC,cAAc,GAAG,MAAM,CAACF,oBAAY,CAAC,mBAAmB,EAAE,IAAI,CAAC,EAAC;AAC7E;AACA,MAAM,UAAU,GAAGD,oBAAY,CAAC,UAAU,CAAC,GAAGC,oBAAY,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,KAAI;AACjF;AACA;AACA,MAAM,gBAAgB,GAAG,UAAU,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,KAAI;AAC5E;AACA,MAAM,eAAe,GAAG,wBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,GAAG,GAAG,OAAO,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,KAAK;AACpE,EAAE,MAAM,WAAW,GAAGG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAC;AAC9D,EAAE,MAAM,QAAQ,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,EAAC;AACtG;AACA,EAAE,IAAI,QAAQ,EAAE;AAChB,IAAI,OAAO,IAAI;AACf,GAAG;AACH,EAAE,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAC;AAC3C,EAAE,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,WAAW,EAAC;AAClD,EAAE,MAAM,SAAS,GAAG,CAACC,cAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,EAAEA,cAAG,CAAC,MAAM,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC,EAAEA,cAAG,CAAC,IAAI,EAAE,WAAW,EAAC;AACpH;AACA,EAAE,IAAI,UAAU,KAAK,IAAI,EAAE;AAC3B,IAAIA,cAAG,CAAC,cAAc,CAAC,GAAG,SAAS,EAAC;AACpC,GAAG,MAAM;AACT,IAAIA,cAAG,CAAC,KAAK,CAAC,GAAG,SAAS,EAAC;AAC3B,GAAG;AACH,EAAE,MAAM,KAAK,GAAG,GAAE;AAClB,EAAE,MAAM,KAAK,GAAGC,sBAAW,CAAC,GAAG,GAAE;AACjC,EAAE,IAAI,QAAQ,GAAG,MAAK;AACtB;AACA;AACA;AACA,EAAE,IAAI,GAAG,GAAG,KAAI;AAChB,EAAEA,sBAAW,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,EAAC;AACnC,EAAE,GAAG;AACL,IAAI,IAAI;AACR,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAC;AACrB,MAAM,IAAIC,iBAAiB,CAAC,CAAC,CAAC,EAAE;AAChC,QAAQ,MAAM,EAAC;AACf,OAAO;AACP,KAAK,CAAC,OAAO,IAAI,EAAE;AACnB,MAAM,GAAG,GAAG,KAAI;AAChB,KAAK;AACL,IAAI,MAAM,QAAQ,GAAGD,sBAAW,CAAC,GAAG,GAAE;AACtC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,EAAC;AACnC,IAAI,QAAQ,GAAG,SAAQ;AACvB,IAAI,IAAI,MAAM,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,QAAQ,GAAG,KAAK,IAAI,cAAc,EAAE;AACvE,MAAM,EAAE,CAAC,SAAS,GAAE;AACpB,KAAK,MAAM;AACX,MAAM,KAAK;AACX,KAAK;AACL,GAAG,QAAQ,GAAG,KAAK,IAAI,IAAI,CAAC,QAAQ,GAAG,KAAK,IAAI,cAAc,CAAC;AAC/D,EAAEA,sBAAW,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAC;AACjC;AACA,EAAE,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,EAAE;AACrD,IAAID,cAAG,CAAC,UAAU,CAAC,GAAG,EAAC;AACvB,GAAG;AACH,EAAEC,sBAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAC;AAC3D,EAAED,cAAG,CAAC,QAAQ,GAAE;AAChB,EAAE,MAAM,QAAQ,GAAG,QAAQ,GAAG,MAAK;AACnC,EAAE,IAAI,OAAO,GAAG,KAAI;AACpB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAC;AAC7B;AACA,EAAE,MAAM,YAAY,GAAGG,qBAAa;AACpC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpI,MAAM,CAAC,uCAAuC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAC;AAC1G,EAAE,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,GAAG,KAAK,IAAI;AAC1C,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAEC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAEA,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAEA,qBAAqB,CAACC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,EAAED,qBAAqB,CAACE,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,EAAEF,qBAAqB,CAACG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACrS,MAAM,CAAC,IAAI,EAAEH,qBAAqB,CAAC,QAAQ,CAAC,CAAC,EAAC;AAC9C,EAAE,IAAI,GAAG,KAAK,IAAI,EAAE;AACpB;AACA,IAAI,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,EAAE;AACvC,MAAMJ,cAAG,CAAC,KAAK,CAACA,cAAG,CAAC,IAAI,EAAEA,cAAG,CAAC,IAAI,EAAE,WAAW,EAAEA,cAAG,CAAC,MAAM,EAAE,WAAW,EAAC;AACzE,KAAK,MAAM;AACX,MAAM,OAAO,GAAG,MAAK;AACrB,MAAMA,cAAG,CAAC,KAAK,CAACA,cAAG,CAAC,GAAG,EAAEA,cAAG,CAAC,IAAI,EAAE,WAAW,EAAEA,cAAG,CAAC,MAAM,EAAEA,cAAG,CAAC,OAAO,EAAE,WAAW,EAAEA,cAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAC;AACvH,KAAK;AACL;AACA,GAAG,MAAM;AACT,IAAIA,cAAG,CAAC,KAAK,CAACA,cAAG,CAAC,KAAK,EAAEA,cAAG,CAAC,IAAI,EAAE,WAAW,EAAEA,cAAG,CAAC,MAAM,EAAEA,cAAG,CAAC,OAAO,EAAE,WAAW,EAAEA,cAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAC;AACvH,GAAG;AACH,EAAE,OAAO,OAAO;AAChB,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,QAAQ,GAAG,CAAC,WAAW,EAAE,IAAI,GAAG,EAAE,KAAKA,cAAG,CAAC,KAAK,CAACA,cAAG,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAEA,cAAG,CAAC,IAAI,EAAE,IAAI,EAAC;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,IAAI,GAAG,IAAI,IAAI,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAC;AAC9C;AACY,MAAC,QAAQ,GAAGA,cAAG,CAAC,SAAQ;AACpC;AACY,MAAC,WAAW,GAAGA,cAAG,CAAC,YAAW;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK;AACzC,EAAEA,cAAG,CAAC,KAAK,CAACA,cAAG,CAAC,IAAI,EAAE,WAAW,EAAC;AAClC,EAAE,IAAI;AACN,IAAI,CAAC,GAAE;AACP,GAAG,SAAS;AACZ,IAAIA,cAAG,CAAC,QAAQ,GAAE;AAClB,GAAG;AACH,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,UAAU,GAAG,OAAO,WAAW,EAAE,CAAC,KAAK;AACpD,EAAEA,cAAG,CAAC,KAAK,CAACA,cAAG,CAAC,IAAI,EAAE,WAAW,EAAC;AAClC,EAAE,IAAI;AACN,IAAI,MAAM,CAAC,GAAE;AACb,GAAG,SAAS;AACZ,IAAIA,cAAG,CAAC,QAAQ,GAAE;AAClB,GAAG;AACH,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,WAAW,GAAG,CAAC,OAAO,EAAE,CAAC,KAAK;AAC3C,EAAE,IAAI,SAAQ;AACd,EAAE,MAAM,KAAK,GAAGC,sBAAW,CAAC,GAAG,GAAE;AACjC,EAAE,IAAI;AACN,IAAI,CAAC,GAAE;AACP,GAAG,SAAS;AACZ,IAAI,QAAQ,GAAGA,sBAAW,CAAC,GAAG,EAAE,GAAG,MAAK;AACxC,IAAID,cAAG,CAAC,KAAK,CAACA,cAAG,CAAC,MAAM,EAAE,OAAO,EAAEA,cAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAEI,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAC;AACnF,GAAG;AACH,EAAE,OAAO,QAAQ;AACjB,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,gBAAgB,GAAG,OAAO,OAAO,EAAE,CAAC,KAAK;AACtD,EAAE,IAAI,SAAQ;AACd,EAAE,MAAM,KAAK,GAAGH,sBAAW,CAAC,GAAG,GAAE;AACjC,EAAE,IAAI;AACN,IAAI,MAAM,CAAC,GAAE;AACb,GAAG,SAAS;AACZ,IAAI,QAAQ,GAAGA,sBAAW,CAAC,GAAG,EAAE,GAAG,MAAK;AACxC,IAAID,cAAG,CAAC,KAAK,CAACA,cAAG,CAAC,MAAM,EAAE,OAAO,EAAEA,cAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAEI,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAC;AACnF,GAAG;AACH,EAAE,OAAO,QAAQ;AACjB,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,aAAa,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,cAAc,KAAK;AAC7D,EAAE,IAAI,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,EAAE;AAC/B,IAAI,IAAI,CAAC,CAAC,EAAC;AACX,GAAG;AACH,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACtC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;AACzB,MAAM,IAAI,CAAC,CAAC,EAAC;AACb,KAAK;AACL,GAAG;AACH,EAAE,OAAO,IAAI;AACb,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,cAAc,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,eAAe,KAAK;AAC7D,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;AACf,IAAI,MAAMI,MAAI,GAAGC,qBAAgB,CAAC,CAAC,EAAE,CAAC,EAAC;AACvC,IAAIT,cAAG,CAAC,KAAK,CAACA,cAAG,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAEQ,MAAI,CAAC,KAAK,CAAC,EAAER,cAAG,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAACQ,MAAI,CAAC,KAAK,EAAEA,MAAI,CAAC,MAAM,CAAC,EAAER,cAAG,CAAC,KAAK,EAAEQ,MAAI,CAAC,MAAM,EAAER,cAAG,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAACQ,MAAI,CAAC,KAAK,GAAGA,MAAI,CAAC,MAAM,CAAC,EAAC;AAC/J,IAAI,IAAI,CAAC,CAAC,EAAC;AACX,GAAG;AACH,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,cAAc,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,eAAe,KAAK,EAAEE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAC,GAAE;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,aAAa,GAAG,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,KAAK;AACpD,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;AACf,IAAI,IAAI,CAAC,CAAC,OAAO,EAAEC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,EAAEA,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,EAAC;AACtF,GAAG;AACH,EAAE,OAAO,IAAI;AACb,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,KAAK,IAAI;AACpD,EAAE,OAAO,KAAK,IAAI;AAClB,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACzB,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AACtC,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,KAAK;AACzD;AACA,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE;AAC9B,IAAI,OAAO,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;AAC1C,GAAG;AACH,EAAE,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW,EAAE;AACvC,IAAI,YAAY,CAAC,OAAO,EAAE,2BAA2B,EAAE,IAAI,EAAC;AAC5D,GAAG;AACH,EAAE,IAAI,OAAO,GAAG,KAAI;AACpB,EAAE,QAAQ,CAAC,CAAC,WAAW;AACvB,IAAI,KAAK,WAAW;AACpB,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,EAAC;AAC3B,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,EAAC;AAC3B;AACA,IAAI,KAAK,UAAU,EAAE;AACrB,MAAM,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,EAAE;AACzC,QAAQ,YAAY,CAAC,OAAO,EAAE,2BAA2B,EAAE,IAAI,EAAC;AAChE,OAAO;AACP,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpD,QAAQ,OAAO,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAC;AAC1C,OAAO;AACP,MAAM,KAAK;AACX,KAAK;AACL,IAAI,KAAK,GAAG,EAAE;AACd,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE;AAC7B,QAAQ,YAAY,CAAC,OAAO,EAAE,0CAA0C,EAAE,IAAI,EAAC;AAC/E,OAAO;AACP;AACA,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI;AACzB,QAAQ,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AAC3B,UAAU,YAAY,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,EAAC;AACrE,SAAS;AACT,OAAO,EAAC;AACR,MAAM,KAAK;AACX,KAAK;AACL,IAAI,KAAK,GAAG,EAAE;AACd,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE;AAC7B,QAAQ,YAAY,CAAC,OAAO,EAAE,0CAA0C,EAAE,IAAI,EAAC;AAC/E,OAAO;AACP;AACA,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK;AAChC,QAAQ,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACzB,UAAU,YAAY,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,oCAAoC,CAAC,EAAE,IAAI,EAAC;AACrG,SAAS;AACT,QAAQ,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,EAAC;AAChF,OAAO,EAAC;AACR,MAAM,KAAK;AACX,KAAK;AACL,IAAI,KAAK,MAAM;AACf,MAAM,IAAIC,aAAa,CAAC,CAAC,CAAC,KAAKA,aAAa,CAAC,CAAC,CAAC,EAAE;AACjD,QAAQ,YAAY,CAAC,OAAO,EAAE,+CAA+C,EAAE,IAAI,EAAC;AACpF,OAAO;AACP,MAAMC,cAAc,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK;AACxC,QAAQ,IAAI,CAACC,kBAAkB,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;AACzC,UAAU,YAAY,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,kCAAkC,CAAC,EAAE,IAAI,EAAC;AAC3F,SAAS;AACT,QAAQ,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,EAAC;AAC5E,OAAO,EAAC;AACR,MAAM,KAAK;AACX,IAAI,KAAK,KAAK;AACd,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE;AACjC,QAAQ,YAAY,CAAC,OAAO,EAAE,8CAA8C,EAAE,IAAI,EAAC;AACnF,OAAO;AACP;AACA,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,EAAC;AAC7F,MAAM,KAAK;AACX;AACA,IAAI;AACJ,MAAM,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE;AACpE,QAAQ,YAAY,CAAC,OAAO,EAAE,CAAC,OAAO,EAAEH,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,EAAEA,cAAc,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAC;AACvG,OAAO;AACP,GAAG;AACH,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAC;AAC1B,EAAE,OAAO,IAAI;AACb,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,aAAa,KAAK,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAC;AAC7H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,MAAM,GAAG,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,KAAK,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAC,gBAAgB,EAAE,OAAO,KAAK,IAAI,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAC,GAAE;AACrI;AACA;AACA;AACA;AACY,MAAC,eAAe,GAAG,MAAM,CAAC,IAAI;AAC1C,EAAE,IAAI;AACN,IAAI,MAAM,CAAC,GAAE;AACb,GAAG,CAAC,OAAO,GAAG,EAAE;AAChB,IAAI,MAAM;AACV,GAAG;AACH,EAAE,IAAI,CAAC,0BAA0B,EAAC;AAClC,EAAC;AACD;AACA;AACA;AACA;AACA;AACY,MAAC,KAAK,GAAG,CAAC,IAAI;AAC1B,EAAE,IAAI;AACN,IAAI,CAAC,GAAE;AACP,GAAG,CAAC,OAAO,IAAI,EAAE;AACjB,IAAIX,cAAG,CAAC,KAAK,CAACA,cAAG,CAAC,KAAK,EAAE,2BAA2B,EAAC;AACrD,IAAI,MAAM;AACV,GAAG;AACH,EAAE,IAAI,CAAC,uBAAuB,EAAC;AAC/B,EAAC;AACD;AACA;AACA;AACA;AACA;AACY,MAAC,UAAU,GAAG,MAAM,CAAC,IAAI;AACrC,EAAE,IAAI;AACN,IAAI,MAAM,CAAC,GAAE;AACb,GAAG,CAAC,OAAO,IAAI,EAAE;AACjB,IAAIA,cAAG,CAAC,KAAK,CAACA,cAAG,CAAC,KAAK,EAAE,2BAA2B,EAAC;AACrD,IAAI,MAAM;AACV,GAAG;AACH,EAAE,IAAI,CAAC,uBAAuB,EAAC;AAC/B,EAAC;AACD;AACA;AACA;AACA;AACY,MAAC,QAAQ,GAAG,MAAM,KAAK,IAAI;AACvC;AACA;AACA;AACA,EAAE,MAAM,UAAU,GAAG,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAC;AAChG,EAAE,MAAM,aAAa,GAAGe,UAAU,CAAC,KAAK,EAAE,GAAG,IAAIA,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,0BAA0B,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAACC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAACA,QAAQ,EAAE,CAAC,EAAC;AAC5K,EAAE,IAAI,eAAe,GAAG,EAAC;AACzB,EAAE,IAAI,UAAU,GAAG,EAAC;AACpB,EAAE,MAAM,KAAK,GAAGf,sBAAW,CAAC,GAAG,GAAE;AACjC,EAAE,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE;AAC/B,IAAI,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAC;AAC9B,IAAI,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE;AAC7B,MAAM,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,EAAC;AAC1B;AACA,MAAM,IAAI,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE;AAClC,QAAQ,MAAM,cAAc,GAAG,EAAC;AAChC,QAAQ,IAAI,OAAO,GAAG,KAAI;AAC1B,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE;AAC5D,UAAU,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,aAAa,EAAC;AAC3E,SAAS;AACT,QAAQ,UAAU,GAAE;AACpB;AACA,QAAQ,IAAI,OAAO,EAAE;AACrB,UAAU,eAAe,GAAE;AAC3B,SAAS;AACT,OAAO;AACP,KAAK;AACL,GAAG;AACH,EAAE,MAAM,GAAG,GAAGA,sBAAW,CAAC,GAAG,GAAE;AAC/B,EAAED,cAAG,CAAC,KAAK,CAAC,EAAE,EAAC;AACf,EAAE,MAAM,OAAO,GAAG,eAAe,KAAK,cAAa;AACnD;AACA,EAAE,IAAI,OAAO,EAAE;AACf,IAAIA,cAAG,CAAC,KAAK,CAACA,cAAG,CAAC,KAAK,EAAEA,cAAG,CAAC,IAAI,EAAE,uBAAuB,EAAEA,cAAG,CAAC,IAAI,EAAEA,cAAG,CAAC,MAAM,EAAE,CAAC,IAAI,EAAEI,qBAAqB,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAC;AAC9H,IAAIJ,cAAG,CAAC,cAAc,CAAC,YAAY,EAAE,EAAE,EAAC;AACxC,GAAG,MAAM;AACT,IAAI,MAAM,WAAW,GAAG,aAAa,GAAG,gBAAe;AACvD,IAAIA,cAAG,CAAC,KAAK,CAACA,cAAG,CAAC,GAAG,EAAEA,cAAG,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,EAAC;AAC7F,GAAG;AACH;AACA,EAAE,OAAO,OAAO;AAChB,EAAC;AACD;AACA,MAAM,SAAS,SAAS,KAAK,CAAC,EAAE;AAChC;AACA;AACA;AACA;AACA;AACY,MAAC,IAAI,GAAG,MAAM,IAAI;AAC9B,EAAEA,cAAG,CAAC,KAAK,CAACA,cAAG,CAAC,GAAG,EAAEA,cAAG,CAAC,IAAI,EAAE,IAAI,EAAEA,cAAG,CAAC,MAAM,EAAE,MAAM,EAAC;AACxD,EAAE,MAAM,IAAI,SAAS,CAAC,aAAa,CAAC;AACpC,EAAC;AACD;AACA,MAAM,SAAS,SAAS,KAAK,CAAC,EAAE;AAChC;AACA;AACA;AACA;AACA;AACY,MAAC,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,KAAK;AACrC,EAAE,IAAI,IAAI,EAAE;AACZ,IAAI,MAAM,IAAI,SAAS,CAAC,YAAY,CAAC;AACrC,GAAG;AACH,EAAC;AACD;AACA;AACA,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"testing.cjs","sources":["../testing.js"],"sourcesContent":["/**\n * Testing framework with support for generating tests.\n *\n * ```js\n * // test.js template for creating a test executable\n * import { runTests } from 'lib0/testing'\n * import * as log from 'lib0/logging'\n * import * as mod1 from './mod1.test.js'\n * import * as mod2 from './mod2.test.js'\n\n * import { isBrowser, isNode } from 'lib0/environment.js'\n *\n * if (isBrowser) {\n * // optional: if this is ran in the browser, attach a virtual console to the dom\n * log.createVConsole(document.body)\n * }\n *\n * runTests({\n * mod1,\n * mod2,\n * }).then(success => {\n * if (isNode) {\n * process.exit(success ? 0 : 1)\n * }\n * })\n * ```\n *\n * ```js\n * // mod1.test.js\n * /**\n * * runTests automatically tests all exported functions that start with \"test\".\n * * The name of the function should be in camelCase and is used for the logging output.\n * *\n * * @param {t.TestCase} tc\n * *\\/\n * export const testMyFirstTest = tc => {\n * t.compare({ a: 4 }, { a: 4 }, 'objects are equal')\n * }\n * ```\n *\n * Now you can simply run `node test.js` to run your test or run test.js in the browser.\n *\n * @module testing\n */\n\nimport * as log from 'lib0/logging'\nimport { simpleDiffString } from './diff.js'\nimport * as object from './object.js'\nimport * as string from './string.js'\nimport * as math from './math.js'\nimport * as random from './random.js'\nimport * as prng from './prng.js'\nimport * as statistics from './statistics.js'\nimport * as array from './array.js'\nimport * as env from './environment.js'\nimport * as json from './json.js'\nimport * as time from './time.js'\nimport * as promise from './promise.js'\nimport * as performance from 'lib0/performance'\n\nexport { production } from './environment.js'\n\nexport const extensive = env.hasConf('extensive')\n\n/* c8 ignore next */\nexport const envSeed = env.hasParam('--seed') ? Number.parseInt(env.getParam('--seed', '0')) : null\n\nexport class TestCase {\n /**\n * @param {string} moduleName\n * @param {string} testName\n */\n constructor (moduleName, testName) {\n /**\n * @type {string}\n */\n this.moduleName = moduleName\n /**\n * @type {string}\n */\n this.testName = testName\n /**\n * This type can store custom information related to the TestCase\n *\n * @type {Map<string,any>}\n */\n this.meta = new Map()\n this._seed = null\n this._prng = null\n }\n\n resetSeed () {\n this._seed = null\n this._prng = null\n }\n\n /**\n * @type {number}\n */\n /* c8 ignore next */\n get seed () {\n /* c8 ignore else */\n if (this._seed === null) {\n /* c8 ignore next */\n this._seed = envSeed === null ? random.uint32() : envSeed\n }\n return this._seed\n }\n\n /**\n * A PRNG for this test case. Use only this PRNG for randomness to make the test case reproducible.\n *\n * @type {prng.PRNG}\n */\n get prng () {\n /* c8 ignore else */\n if (this._prng === null) {\n this._prng = prng.create(this.seed)\n }\n return this._prng\n }\n}\n\nexport const repetitionTime = Number(env.getParam('--repetition-time', '50'))\n/* c8 ignore next */\nconst testFilter = env.hasParam('--filter') ? env.getParam('--filter', '') : null\n\n/* c8 ignore next */\nconst testFilterRegExp = testFilter !== null ? new RegExp(testFilter) : /.*/\n\nconst repeatTestRegex = /^(repeat|repeating)\\s/\n\n/**\n * @param {string} moduleName\n * @param {string} name\n * @param {function(TestCase):void|Promise<any>} f\n * @param {number} i\n * @param {number} numberOfTests\n */\nexport const run = async (moduleName, name, f, i, numberOfTests) => {\n const uncamelized = string.fromCamelCase(name.slice(4), ' ')\n const filtered = !testFilterRegExp.test(`[${i + 1}/${numberOfTests}] ${moduleName}: ${uncamelized}`)\n /* c8 ignore next 3 */\n if (filtered) {\n return true\n }\n const tc = new TestCase(moduleName, name)\n const repeat = repeatTestRegex.test(uncamelized)\n const groupArgs = [log.GREY, `[${i + 1}/${numberOfTests}] `, log.PURPLE, `${moduleName}: `, log.BLUE, uncamelized]\n /* c8 ignore next 5 */\n if (testFilter === null) {\n log.groupCollapsed(...groupArgs)\n } else {\n log.group(...groupArgs)\n }\n const times = []\n const start = performance.now()\n let lastTime = start\n /**\n * @type {any}\n */\n let err = null\n performance.mark(`${name}-start`)\n do {\n try {\n const p = f(tc)\n if (promise.isPromise(p)) {\n await p\n }\n } catch (_err) {\n err = _err\n }\n const currTime = performance.now()\n times.push(currTime - lastTime)\n lastTime = currTime\n if (repeat && err === null && (lastTime - start) < repetitionTime) {\n tc.resetSeed()\n } else {\n break\n }\n } while (err === null && (lastTime - start) < repetitionTime)\n performance.mark(`${name}-end`)\n /* c8 ignore next 3 */\n if (err !== null && err.constructor !== SkipError) {\n log.printError(err)\n }\n performance.measure(name, `${name}-start`, `${name}-end`)\n log.groupEnd()\n const duration = lastTime - start\n let success = true\n times.sort((a, b) => a - b)\n /* c8 ignore next 3 */\n const againMessage = env.isBrowser\n ? ` - ${window.location.host + window.location.pathname}?filter=\\\\[${i + 1}/${tc._seed === null ? '' : `&seed=${tc._seed}`}`\n : `\\nrepeat: npm run test -- --filter \"\\\\[${i + 1}/\" ${tc._seed === null ? '' : `--seed ${tc._seed}`}`\n const timeInfo = (repeat && err === null)\n ? ` - ${times.length} repetitions in ${time.humanizeDuration(duration)} (best: ${time.humanizeDuration(times[0])}, worst: ${time.humanizeDuration(array.last(times))}, median: ${time.humanizeDuration(statistics.median(times))}, average: ${time.humanizeDuration(statistics.average(times))})`\n : ` in ${time.humanizeDuration(duration)}`\n if (err !== null) {\n /* c8 ignore start */\n if (err.constructor === SkipError) {\n log.print(log.GREY, log.BOLD, 'Skipped: ', log.UNBOLD, uncamelized)\n } else {\n success = false\n log.print(log.RED, log.BOLD, 'Failure: ', log.UNBOLD, log.UNCOLOR, uncamelized, log.GREY, timeInfo, againMessage)\n }\n /* c8 ignore stop */\n } else {\n log.print(log.GREEN, log.BOLD, 'Success: ', log.UNBOLD, log.UNCOLOR, uncamelized, log.GREY, timeInfo, againMessage)\n }\n return success\n}\n\n/**\n * Describe what you are currently testing. The message will be logged.\n *\n * ```js\n * export const testMyFirstTest = tc => {\n * t.describe('crunching numbers', 'already crunched 4 numbers!') // the optional second argument can describe the state.\n * }\n * ```\n *\n * @param {string} description\n * @param {string} info\n */\nexport const describe = (description, info = '') => log.print(log.BLUE, description, ' ', log.GREY, info)\n\n/**\n * Describe the state of the current computation.\n * ```js\n * export const testMyFirstTest = tc => {\n * t.info(already crunched 4 numbers!') // the optional second argument can describe the state.\n * }\n * ```\n *\n * @param {string} info\n */\nexport const info = info => describe('', info)\n\nexport const printDom = log.printDom\n\nexport const printCanvas = log.printCanvas\n\n/**\n * Group outputs in a collapsible category.\n *\n * ```js\n * export const testMyFirstTest = tc => {\n * t.group('subtest 1', () => {\n * t.describe('this message is part of a collapsible section')\n * })\n * await t.groupAsync('subtest async 2', async () => {\n * await someaction()\n * t.describe('this message is part of a collapsible section')\n * })\n * }\n * ```\n *\n * @param {string} description\n * @param {function(...any):void} f\n */\nexport const group = (description, f) => {\n log.group(log.BLUE, description)\n try {\n f()\n } finally {\n log.groupEnd()\n }\n}\n\n/**\n * Group outputs in a collapsible category.\n *\n * ```js\n * export const testMyFirstTest = async tc => {\n * t.group('subtest 1', () => {\n * t.describe('this message is part of a collapsible section')\n * })\n * await t.groupAsync('subtest async 2', async () => {\n * await someaction()\n * t.describe('this message is part of a collapsible section')\n * })\n * }\n * ```\n *\n * @param {string} description\n * @param {function(...any):Promise<any>} f\n */\nexport const groupAsync = async (description, f) => {\n log.group(log.BLUE, description)\n try {\n await f()\n } finally {\n log.groupEnd()\n }\n}\n\n/**\n * Measure the time that it takes to calculate something.\n *\n * ```js\n * export const testMyFirstTest = async tc => {\n * t.measureTime('measurement', () => {\n * heavyCalculation()\n * })\n * await t.groupAsync('async measurement', async () => {\n * await heavyAsyncCalculation()\n * })\n * }\n * ```\n *\n * @param {string} message\n * @param {function(...any):void} f\n * @return {number} Returns a promise that resolves the measured duration to apply f\n */\nexport const measureTime = (message, f) => {\n let duration\n const start = performance.now()\n try {\n f()\n } finally {\n duration = performance.now() - start\n log.print(log.PURPLE, message, log.GREY, ` ${time.humanizeDuration(duration)}`)\n }\n return duration\n}\n\n/**\n * Measure the time that it takes to calculate something.\n *\n * ```js\n * export const testMyFirstTest = async tc => {\n * t.measureTimeAsync('measurement', async () => {\n * await heavyCalculation()\n * })\n * await t.groupAsync('async measurement', async () => {\n * await heavyAsyncCalculation()\n * })\n * }\n * ```\n *\n * @param {string} message\n * @param {function(...any):Promise<any>} f\n * @return {Promise<number>} Returns a promise that resolves the measured duration to apply f\n */\nexport const measureTimeAsync = async (message, f) => {\n let duration\n const start = performance.now()\n try {\n await f()\n } finally {\n duration = performance.now() - start\n log.print(log.PURPLE, message, log.GREY, ` ${time.humanizeDuration(duration)}`)\n }\n return duration\n}\n\n/**\n * @template T\n * @param {Array<T>} as\n * @param {Array<T>} bs\n * @param {string} [m]\n * @return {boolean}\n */\nexport const compareArrays = (as, bs, m = 'Arrays match') => {\n if (as.length !== bs.length) {\n fail(m)\n }\n for (let i = 0; i < as.length; i++) {\n if (as[i] !== bs[i]) {\n fail(m)\n }\n }\n return true\n}\n\n/**\n * @param {string} a\n * @param {string} b\n * @param {string} [m]\n * @throws {TestError} Throws if tests fails\n */\nexport const compareStrings = (a, b, m = 'Strings match') => {\n if (a !== b) {\n const diff = simpleDiffString(a, b)\n log.print(log.GREY, a.slice(0, diff.index), log.RED, a.slice(diff.index, diff.remove), log.GREEN, diff.insert, log.GREY, a.slice(diff.index + diff.remove))\n fail(m)\n }\n}\n\n/**\n * @template K,V\n * @param {Object<K,V>} a\n * @param {Object<K,V>} b\n * @param {string} [m]\n * @throws {TestError} Throws if test fails\n */\nexport const compareObjects = (a, b, m = 'Objects match') => { object.equalFlat(a, b) || fail(m) }\n\n/**\n * @param {any} _constructor\n * @param {any} a\n * @param {any} b\n * @param {string} path\n * @throws {TestError}\n */\nconst compareValues = (_constructor, a, b, path) => {\n if (a !== b) {\n fail(`Values ${json.stringify(a)} and ${json.stringify(b)} don't match (${path})`)\n }\n return true\n}\n\n/**\n * @param {string?} message\n * @param {string} reason\n * @param {string} path\n * @throws {TestError}\n */\nconst _failMessage = (message, reason, path) => fail(\n message === null\n ? `${reason} ${path}`\n : `${message} (${reason}) ${path}`\n)\n\n/**\n * @param {any} a\n * @param {any} b\n * @param {string} path\n * @param {string?} message\n * @param {function(any,any,any,string,any):boolean} customCompare\n */\nconst _compare = (a, b, path, message, customCompare) => {\n // we don't use assert here because we want to test all branches (istanbul errors if one branch is not tested)\n if (a == null || b == null) {\n return compareValues(null, a, b, path)\n }\n if (a.constructor !== b.constructor) {\n _failMessage(message, 'Constructors don\\'t match', path)\n }\n let success = true\n switch (a.constructor) {\n case ArrayBuffer:\n a = new Uint8Array(a)\n b = new Uint8Array(b)\n // eslint-disable-next-line no-fallthrough\n case Uint8Array: {\n if (a.byteLength !== b.byteLength) {\n _failMessage(message, 'ArrayBuffer lengths match', path)\n }\n for (let i = 0; success && i < a.length; i++) {\n success = success && a[i] === b[i]\n }\n break\n }\n case Set: {\n if (a.size !== b.size) {\n _failMessage(message, 'Sets have different number of attributes', path)\n }\n // @ts-ignore\n a.forEach(value => {\n if (!b.has(value)) {\n _failMessage(message, `b.${path} does have ${value}`, path)\n }\n })\n break\n }\n case Map: {\n if (a.size !== b.size) {\n _failMessage(message, 'Maps have different number of attributes', path)\n }\n // @ts-ignore\n a.forEach((value, key) => {\n if (!b.has(key)) {\n _failMessage(message, `Property ${path}[\"${key}\"] does not exist on second argument`, path)\n }\n _compare(value, b.get(key), `${path}[\"${key}\"]`, message, customCompare)\n })\n break\n }\n case Object:\n if (object.length(a) !== object.length(b)) {\n _failMessage(message, 'Objects have a different number of attributes', path)\n }\n object.forEach(a, (value, key) => {\n if (!object.hasProperty(b, key)) {\n _failMessage(message, `Property ${path} does not exist on second argument`, path)\n }\n _compare(value, b[key], `${path}[\"${key}\"]`, message, customCompare)\n })\n break\n case Array:\n if (a.length !== b.length) {\n _failMessage(message, 'Arrays have a different number of attributes', path)\n }\n // @ts-ignore\n a.forEach((value, i) => _compare(value, b[i], `${path}[${i}]`, message, customCompare))\n break\n /* c8 ignore next 4 */\n default:\n if (!customCompare(a.constructor, a, b, path, compareValues)) {\n _failMessage(message, `Values ${json.stringify(a)} and ${json.stringify(b)} don't match`, path)\n }\n }\n assert(success, message)\n return true\n}\n\n/**\n * @template T\n * @param {T} a\n * @param {T} b\n * @param {string?} [message]\n * @param {function(any,T,T,string,any):boolean} [customCompare]\n */\nexport const compare = (a, b, message = null, customCompare = compareValues) => _compare(a, b, 'obj', message, customCompare)\n\n/**\n * @template T\n * @param {T} property\n * @param {string?} [message]\n * @return {asserts property is NonNullable<T>}\n * @throws {TestError}\n */\n/* c8 ignore next */\nexport const assert = (property, message = null) => { property || fail(`Assertion failed${message !== null ? `: ${message}` : ''}`) }\n\n/**\n * @param {function(...any):Promise<any>} f\n */\nexport const promiseRejected = async f => {\n try {\n await f()\n } catch (err) {\n return\n }\n fail('Expected promise to fail')\n}\n\n/**\n * @param {function(...any):void} f\n * @throws {TestError}\n */\nexport const fails = f => {\n try {\n f()\n } catch (_err) {\n log.print(log.GREEN, '⇖ This Error was expected')\n return\n }\n fail('Expected this to fail')\n}\n\n/**\n * @param {function(...any):Promise<any>} f\n * @throws {TestError}\n */\nexport const failsAsync = async f => {\n try {\n await f()\n } catch (_err) {\n log.print(log.GREEN, '⇖ This Error was expected')\n return\n }\n fail('Expected this to fail')\n}\n\n/**\n * @param {Object<string, Object<string, function(TestCase):void|Promise<any>>>} tests\n */\nexport const runTests = async tests => {\n /**\n * @param {string} testname\n */\n const filterTest = testname => testname.startsWith('test') || testname.startsWith('benchmark')\n const numberOfTests = object.map(tests, mod => object.map(mod, (f, fname) => /* c8 ignore next */ f && filterTest(fname) ? 1 : 0).reduce(math.add, 0)).reduce(math.add, 0)\n let successfulTests = 0\n let testnumber = 0\n const start = performance.now()\n for (const modName in tests) {\n const mod = tests[modName]\n for (const fname in mod) {\n const f = mod[fname]\n /* c8 ignore else */\n if (f && filterTest(fname)) {\n const repeatEachTest = 1\n let success = true\n for (let i = 0; success && i < repeatEachTest; i++) {\n success = await run(modName, fname, f, testnumber, numberOfTests)\n }\n testnumber++\n /* c8 ignore else */\n if (success) {\n successfulTests++\n }\n }\n }\n }\n const end = performance.now()\n log.print('')\n const success = successfulTests === numberOfTests\n /* c8 ignore start */\n if (success) {\n log.print(log.GREEN, log.BOLD, 'All tests successful!', log.GREY, log.UNBOLD, ` in ${time.humanizeDuration(end - start)}`)\n log.printImgBase64(nyanCatImage, 50)\n } else {\n const failedTests = numberOfTests - successfulTests\n log.print(log.RED, log.BOLD, `> ${failedTests} test${failedTests > 1 ? 's' : ''} failed`)\n }\n /* c8 ignore stop */\n return success\n}\n\nclass TestError extends Error {}\n\n/**\n * @param {string} reason\n * @throws {TestError}\n */\nexport const fail = reason => {\n log.print(log.RED, log.BOLD, 'X ', log.UNBOLD, reason)\n throw new TestError('Test Failed')\n}\n\nclass SkipError extends Error {}\n\n/**\n * @param {boolean} cond If true, this tests will be skipped\n * @throws {SkipError}\n */\nexport const skip = (cond = true) => {\n if (cond) {\n throw new SkipError('skipping..')\n }\n}\n\n// eslint-disable-next-line\nconst nyanCatImage = 'R0lGODlhjABMAPcAAMiSE0xMTEzMzUKJzjQ0NFsoKPc7//FM/9mH/z9x0HIiIoKCgmBHN+frGSkZLdDQ0LCwsDk71g0KCUzDdrQQEOFz/8yYdelmBdTiHFxcXDU2erR/mLrTHCgoKK5szBQUFNgSCTk6ymfpCB9VZS2Bl+cGBt2N8kWm0uDcGXhZRUvGq94NCFPhDiwsLGVlZTgqIPMDA1g3aEzS5D6xAURERDtG9JmBjJsZGWs2AD1W6Hp6eswyDeJ4CFNTU1LcEoJRmTMzSd14CTg5ser2GmDzBd17/xkZGUzMvoSMDiEhIfKruCwNAJaWlvRzA8kNDXDrCfi0pe1U/+GS6SZrAB4eHpZwVhoabsx9oiYmJt/TGHFxcYyMjOid0+Zl/0rF6j09PeRr/0zU9DxO6j+z0lXtBtp8qJhMAEssLGhoaPL/GVn/AAsWJ/9/AE3Z/zs9/3cAAOlf/+aa2RIyADo85uhh/0i84WtrazQ0UyMlmDMzPwUFBe16BTMmHau0E03X+g8pMEAoS1MBAf++kkzO8pBaqSZoe9uB/zE0BUQ3Sv///4WFheuiyzo880gzNDIyNissBNqF/8RiAOF2qG5ubj0vL1z6Avl5ASsgGkgUSy8vL/8n/z4zJy8lOv96uEssV1csAN5ZCDQ0Wz1a3tbEGHLeDdYKCg4PATE7PiMVFSoqU83eHEi43gUPAOZ8reGogeKU5dBBC8faHEez2lHYF4bQFMukFtl4CzY3kkzBVJfMGZkAAMfSFf27mP0t//g4/9R6Dfsy/1DRIUnSAPRD/0fMAFQ0Q+l7rnbaD0vEntCDD6rSGtO8GNpUCU/MK07LPNEfC7RaABUWWkgtOst+71v9AfD7GfDw8P19ATtA/NJpAONgB9yL+fm6jzIxMdnNGJxht1/2A9x//9jHGOSX3+5tBP27l35+fk5OTvZ9AhYgTjo0PUhGSDs9+LZjCFf2Aw0IDwcVAA8PD5lwg9+Q7YaChC0kJP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGNEM2MUEyMzE0QTRFMTExOUQzRkE3QTBCRDNBMjdBQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpERjQ0NEY0QkI2MTcxMUUxOUJEQkUzNUNGQTkwRTU2MiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpERjQ0NEY0QUI2MTcxMUUxOUJEQkUzNUNGQTkwRTU2MiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1OEE3RTIwRjcyQTlFMTExOTQ1QkY2QTU5QzVCQjJBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGNEM2MUEyMzE0QTRFMTExOUQzRkE3QTBCRDNBMjdBQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1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'\n"],"names":["env.hasConf","env.hasParam","env.getParam","random.uint32","prng.create","string.fromCamelCase","log","performance","promise.isPromise","env.isBrowser","time.humanizeDuration","array.last","statistics.median","statistics.average","diff","simpleDiffString","object.equalFlat","json.stringify","object.length","object.forEach","object.hasProperty","object.map","math.add"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-
|
|
1
|
+
{"version":3,"file":"websocket-ccb9bf5d.cjs","sources":["../websocket.js"],"sourcesContent":["/* eslint-env browser */\n\n/**\n * Tiny websocket connection handler.\n *\n * Implements exponential backoff reconnects, ping/pong, and a nice event system using [lib0/observable].\n *\n * @module websocket\n */\n\nimport { Observable } from './observable.js'\nimport * as time from './time.js'\nimport * as math from './math.js'\n\nconst reconnectTimeoutBase = 1200\nconst maxReconnectTimeout = 2500\n// @todo - this should depend on awareness.outdatedTime\nconst messageReconnectTimeout = 30000\n\n/**\n * @param {WebsocketClient} wsclient\n */\nconst setupWS = (wsclient) => {\n if (wsclient.shouldConnect && wsclient.ws === null) {\n const websocket = new WebSocket(wsclient.url)\n const binaryType = wsclient.binaryType\n /**\n * @type {any}\n */\n let pingTimeout = null\n if (binaryType) {\n websocket.binaryType = binaryType\n }\n wsclient.ws = websocket\n wsclient.connecting = true\n wsclient.connected = false\n websocket.onmessage = event => {\n wsclient.lastMessageReceived = time.getUnixTime()\n const data = event.data\n const message = typeof data === 'string' ? JSON.parse(data) : data\n if (message && message.type === 'pong') {\n clearTimeout(pingTimeout)\n pingTimeout = setTimeout(sendPing, messageReconnectTimeout / 2)\n }\n wsclient.emit('message', [message, wsclient])\n }\n /**\n * @param {any} error\n */\n const onclose = error => {\n if (wsclient.ws !== null) {\n wsclient.ws = null\n wsclient.connecting = false\n if (wsclient.connected) {\n wsclient.connected = false\n wsclient.emit('disconnect', [{ type: 'disconnect', error }, wsclient])\n } else {\n wsclient.unsuccessfulReconnects++\n }\n // Start with no reconnect timeout and increase timeout by\n // log10(wsUnsuccessfulReconnects).\n // The idea is to increase reconnect timeout slowly and have no reconnect\n // timeout at the beginning (log(1) = 0)\n setTimeout(setupWS, math.min(math.log10(wsclient.unsuccessfulReconnects + 1) * reconnectTimeoutBase, maxReconnectTimeout), wsclient)\n }\n clearTimeout(pingTimeout)\n }\n const sendPing = () => {\n if (wsclient.ws === websocket) {\n wsclient.send({\n type: 'ping'\n })\n }\n }\n websocket.onclose = () => onclose(null)\n websocket.onerror = error => onclose(error)\n websocket.onopen = () => {\n wsclient.lastMessageReceived = time.getUnixTime()\n wsclient.connecting = false\n wsclient.connected = true\n wsclient.unsuccessfulReconnects = 0\n wsclient.emit('connect', [{ type: 'connect' }, wsclient])\n // set ping\n pingTimeout = setTimeout(sendPing, messageReconnectTimeout / 2)\n }\n }\n}\n\n/**\n * @deprecated\n * @extends Observable<string>\n */\nexport class WebsocketClient extends Observable {\n /**\n * @param {string} url\n * @param {object} opts\n * @param {'arraybuffer' | 'blob' | null} [opts.binaryType] Set `ws.binaryType`\n */\n constructor (url, { binaryType } = {}) {\n super()\n this.url = url\n /**\n * @type {WebSocket?}\n */\n this.ws = null\n this.binaryType = binaryType || null\n this.connected = false\n this.connecting = false\n this.unsuccessfulReconnects = 0\n this.lastMessageReceived = 0\n /**\n * Whether to connect to other peers or not\n * @type {boolean}\n */\n this.shouldConnect = true\n this._checkInterval = setInterval(() => {\n if (this.connected && messageReconnectTimeout < time.getUnixTime() - this.lastMessageReceived) {\n // no message received in a long time - not even your own awareness\n // updates (which are updated every 15 seconds)\n /** @type {WebSocket} */ (this.ws).close()\n }\n }, messageReconnectTimeout / 2)\n setupWS(this)\n }\n\n /**\n * @param {any} message\n */\n send (message) {\n if (this.ws) {\n this.ws.send(JSON.stringify(message))\n }\n }\n\n destroy () {\n clearInterval(this._checkInterval)\n this.disconnect()\n super.destroy()\n }\n\n disconnect () {\n this.shouldConnect = false\n if (this.ws !== null) {\n this.ws.close()\n }\n }\n\n connect () {\n this.shouldConnect = true\n if (!this.connected && this.ws === null) {\n setupWS(this)\n }\n }\n}\n"],"names":["time.getUnixTime","math.min","math.log10","Observable"],"mappings":"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"}
|
package/dist/websocket.cjs
CHANGED
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
require('./observable.cjs');
|
|
6
6
|
require('./time-bc2081b9.cjs');
|
|
7
7
|
require('./math-08e068f9.cjs');
|
|
8
|
-
var websocket = require('./websocket-
|
|
8
|
+
var websocket = require('./websocket-ccb9bf5d.cjs');
|
|
9
9
|
require('./map-9a5915e4.cjs');
|
|
10
10
|
require('./set-0f209abb.cjs');
|
|
11
11
|
require('./array-704ca50e.cjs');
|
package/encoding.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["encoding.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["encoding.js"],"names":[],"mappings":"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"}
|
package/encoding.js
CHANGED
|
@@ -26,7 +26,6 @@
|
|
|
26
26
|
* @module encoding
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
|
-
import * as buffer from './buffer.js'
|
|
30
29
|
import * as math from './math.js'
|
|
31
30
|
import * as number from './number.js'
|
|
32
31
|
import * as binary from './binary.js'
|
|
@@ -101,7 +100,7 @@ export const toUint8Array = encoder => {
|
|
|
101
100
|
uint8arr.set(d, curPos)
|
|
102
101
|
curPos += d.length
|
|
103
102
|
}
|
|
104
|
-
uint8arr.set(
|
|
103
|
+
uint8arr.set(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos), curPos)
|
|
105
104
|
return uint8arr
|
|
106
105
|
}
|
|
107
106
|
|
|
@@ -115,7 +114,7 @@ export const toUint8Array = encoder => {
|
|
|
115
114
|
export const verifyLen = (encoder, len) => {
|
|
116
115
|
const bufferLen = encoder.cbuf.length
|
|
117
116
|
if (bufferLen - encoder.cpos < len) {
|
|
118
|
-
encoder.bufs.push(
|
|
117
|
+
encoder.bufs.push(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos))
|
|
119
118
|
encoder.cbuf = new Uint8Array(math.max(bufferLen, len) * 2)
|
|
120
119
|
encoder.cpos = 0
|
|
121
120
|
}
|
package/environment.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["environment.js"],"names":[],"mappings":"AAcA,
|
|
1
|
+
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["environment.js"],"names":[],"mappings":"AAcA,6BAA0N;AAG1N,gCAAoG;AAEpG,4BAES;AAyDF,+BAJI,MAAM,GACL,OAAO,CAGwC;AAQpD,+BALI,MAAM,cACN,MAAM,GACL,MAAM,CAIuB;AAOlC,kCAJI,MAAM,GACL,MAAM,GAAC,IAAI,CAM2C;AAO3D,8BAJI,MAAM,GACL,MAAM,GAAC,IAAI,CAIgC;AAOhD,8BAJI,MAAM,GACL,OAAO,CAIkC;AAGrD,iCAA+C;AAO/C,oCAKC"}
|
package/environment.js
CHANGED
|
@@ -10,10 +10,10 @@ import * as conditions from './conditions.js'
|
|
|
10
10
|
import * as storage from './storage.js'
|
|
11
11
|
import * as f from './function.js'
|
|
12
12
|
|
|
13
|
-
/* c8 ignore next */
|
|
13
|
+
/* c8 ignore next 2 */
|
|
14
14
|
// @ts-ignore
|
|
15
|
-
export const isNode = typeof process !== 'undefined' && process.release &&
|
|
16
|
-
|
|
15
|
+
export const isNode = typeof process !== 'undefined' && process.release && /node|io\.js/.test(process.release.name) && Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]'
|
|
16
|
+
|
|
17
17
|
/* c8 ignore next */
|
|
18
18
|
export const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && !isNode
|
|
19
19
|
/* c8 ignore next 3 */
|
package/indexeddb.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexeddb.d.ts","sourceRoot":"","sources":["indexeddb.js"],"names":[],"mappings":"AAmBO,8BAHI,UAAU,GACT,QAAQ,GAAG,CAAC,CAOtB;AAOK,6BAJI,MAAM,iBACG,WAAW,KAAE,GAAG,GACxB,QAAQ,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"indexeddb.d.ts","sourceRoot":"","sources":["indexeddb.js"],"names":[],"mappings":"AAmBO,8BAHI,UAAU,GACT,QAAQ,GAAG,CAAC,CAOtB;AAOK,6BAJI,MAAM,iBACG,WAAW,KAAE,GAAG,GACxB,QAAQ,WAAW,CAAC,CAuB9B;AAKK,+BAFI,MAAM,gBAEmD;AAM7D,iCAHI,WAAW,eACX,MAAM,MAAM,MAAM,CAAC,GAAC,MAAM,MAAM,GAAC,wBAAwB,GAAC,SAAS,CAAC,CAAC,QAK/E;AAQM,6BALI,WAAW,UACX,MAAM,MAAM,CAAC,kDAEZ,MAAM,cAAc,CAAC,CAKhC;AAOM,6BAJI,cAAc,oCAEb,QAAQ,MAAM,CAAC,CAGD;AAOnB,2BAJI,cAAc,OACd,SAAS,MAAM,GAAG,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,CAAC,GAChD,QAAQ,SAAS,MAAM,GAAG,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,CAGhD;AAMf,2BAHI,cAAc,OACd,SAAS,MAAM,GAAG,WAAW,GAAG,IAAI,GAAG,WAAW,GAAG,MAAM,GAAG,CAAC,gBAGjD;AAOlB,2BAJI,cAAc,QACd,SAAS,MAAM,GAAG,WAAW,GAAG,IAAI,GAAG,OAAO,gFAI7B;AAQrB,2BALI,cAAc,QACd,SAAS,MAAM,GAAG,WAAW,GAAG,IAAI,GAAG,OAAO,OAC9C,SAAS,MAAM,GAAG,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,CAAC,GAChD,QAAQ,GAAG,CAAC,CAGI;AAOrB,kCAJI,cAAc,QACd,SAAS,MAAM,GAAG,WAAW,GAAG,IAAI,GACnC,QAAQ,MAAM,CAAC,CAGJ;AAQhB,8BALI,cAAc,gEAGb,QAAQ,MAAM,GAAG,CAAC,CAAC,CAGG;AAQ3B,kCALI,cAAc,gEAGb,QAAQ,MAAM,GAAG,CAAC,CAAC,CAGO;AAQ/B,kCALI,cAAc,SACd,WAAW,GAAC,IAAI,aAChB,MAAM,GAAC,MAAM,GAAC,YAAY,GAAC,YAAY,GACtC,QAAQ,GAAG,CAAC,CAWvB;AAOM,kCAJI,cAAc,2CAEb,QAAQ,GAAG,CAAC,CAE2D;AAO5E,mCAJI,cAAc,2CAEb,QAAQ,GAAG,CAAC,CAE4D;AAe7E,wCALI,cAAc,gEAGb,QAAQ,MAAM,YAAY,CAAC,CAAC,CAI6F;AA4B9H,+BALI,cAAc,YACd,WAAW,GAAC,IAAI,YACP,GAAG,QAAC,GAAG,KAAE,IAAI,GAAC,OAAO,GAAC,QAAQ,IAAI,GAAC,OAAO,CAAC,cACpD,MAAM,GAAC,MAAM,GAAC,YAAY,GAAC,YAAY,iBAG8C;AAUzF,mCALI,cAAc,YACd,WAAW,GAAC,IAAI,YACP,GAAG,KAAE,IAAI,GAAC,OAAO,GAAC,QAAQ,IAAI,GAAC,OAAO,CAAC,cAChD,MAAM,GAAC,MAAM,GAAC,YAAY,GAAC,YAAY,iBAGmC;AAQ9E,4BAJI,cAAc,kBAEZ,cAAc,CAE+B;AAQnD,8CALI,GAAG,SACH,GAAG,aACH,OAAO,aACP,OAAO,eAEiH;AAM5H,mDAHI,GAAG,aACH,OAAO,eAEuF;AAMlG,mDAHI,GAAG,aACH,OAAO,eAEuF;;;;;OAhF3F,GAAG;;;;OACH,GAAG"}
|
package/indexeddb.js
CHANGED
|
@@ -48,9 +48,6 @@ export const openDB = (name, initDB) => promise.create((resolve, reject) => {
|
|
|
48
48
|
*/
|
|
49
49
|
const db = event.target.result
|
|
50
50
|
db.onversionchange = () => { db.close() }
|
|
51
|
-
if (typeof addEventListener !== 'undefined') {
|
|
52
|
-
addEventListener('unload', () => db.close())
|
|
53
|
-
}
|
|
54
51
|
resolve(db)
|
|
55
52
|
}
|
|
56
53
|
})
|
package/observable.d.ts
CHANGED
|
@@ -5,45 +5,43 @@
|
|
|
5
5
|
* This is basically a (better typed) duplicate of Observable, which will replace Observable in the
|
|
6
6
|
* next release.
|
|
7
7
|
*
|
|
8
|
-
* @template {{[key
|
|
8
|
+
* @template {{[key in keyof EVENTS]: function(...any):void}} EVENTS
|
|
9
9
|
*/
|
|
10
|
-
export class ObservableV2<EVENTS extends {
|
|
11
|
-
[key: string]: (...arg0: any[]) => void;
|
|
12
|
-
}> {
|
|
10
|
+
export class ObservableV2<EVENTS extends { [key in keyof EVENTS]: (...arg0: any[]) => void; }> {
|
|
13
11
|
/**
|
|
14
12
|
* Some desc.
|
|
15
13
|
* @type {Map<string, Set<any>>}
|
|
16
14
|
*/
|
|
17
15
|
_observers: Map<string, Set<any>>;
|
|
18
16
|
/**
|
|
19
|
-
* @template {string} NAME
|
|
17
|
+
* @template {keyof EVENTS & string} NAME
|
|
20
18
|
* @param {NAME} name
|
|
21
19
|
* @param {EVENTS[NAME]} f
|
|
22
20
|
*/
|
|
23
|
-
on<NAME extends string>(name: NAME, f: EVENTS[NAME]): EVENTS[NAME];
|
|
21
|
+
on<NAME extends keyof EVENTS & string>(name: NAME, f: EVENTS[NAME]): EVENTS[NAME];
|
|
24
22
|
/**
|
|
25
|
-
* @template {string} NAME
|
|
23
|
+
* @template {keyof EVENTS & string} NAME
|
|
26
24
|
* @param {NAME} name
|
|
27
25
|
* @param {EVENTS[NAME]} f
|
|
28
26
|
*/
|
|
29
|
-
once<NAME_1 extends string>(name: NAME_1, f: EVENTS[NAME_1]): void;
|
|
27
|
+
once<NAME_1 extends keyof EVENTS & string>(name: NAME_1, f: EVENTS[NAME_1]): void;
|
|
30
28
|
/**
|
|
31
|
-
* @template {string} NAME
|
|
29
|
+
* @template {keyof EVENTS & string} NAME
|
|
32
30
|
* @param {NAME} name
|
|
33
31
|
* @param {EVENTS[NAME]} f
|
|
34
32
|
*/
|
|
35
|
-
off<NAME_2 extends string>(name: NAME_2, f: EVENTS[NAME_2]): void;
|
|
33
|
+
off<NAME_2 extends keyof EVENTS & string>(name: NAME_2, f: EVENTS[NAME_2]): void;
|
|
36
34
|
/**
|
|
37
35
|
* Emit a named event. All registered event listeners that listen to the
|
|
38
36
|
* specified name will receive the event.
|
|
39
37
|
*
|
|
40
38
|
* @todo This should catch exceptions
|
|
41
39
|
*
|
|
42
|
-
* @template {string} NAME
|
|
40
|
+
* @template {keyof EVENTS & string} NAME
|
|
43
41
|
* @param {NAME} name The event name.
|
|
44
42
|
* @param {Parameters<EVENTS[NAME]>} args The arguments that are applied to the event listener.
|
|
45
43
|
*/
|
|
46
|
-
emit<NAME_3 extends string>(name: NAME_3, args: Parameters<EVENTS[NAME_3]>): void;
|
|
44
|
+
emit<NAME_3 extends keyof EVENTS & string>(name: NAME_3, args: Parameters<EVENTS[NAME_3]>): void;
|
|
47
45
|
destroy(): void;
|
|
48
46
|
}
|
|
49
47
|
/**
|
package/observable.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observable.d.ts","sourceRoot":"","sources":["observable.js"],"names":[],"mappings":"AAUA;;;;;;;;GAQG;AACH
|
|
1
|
+
{"version":3,"file":"observable.d.ts","sourceRoot":"","sources":["observable.js"],"names":[],"mappings":"AAUA;;;;;;;;GAQG;AACH,4EAFkD,GAAG,OAAE,IAAI;IAIvD;;;OAGG;IACH,YAFU,IAAI,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,CAED;IAGhC;;;;OAIG;IACH,kFAGC;IAED;;;;OAIG;IACH,kFASC;IAED;;;;OAIG;IACH,iFAQC;IAED;;;;;;;;;OASG;IACH,iGAGC;IAED,gBAEC;CACF;AAGD;;;;;GAKG;AACH;IAEI;;;OAGG;IACH,YAFU,IAAI,CAAC,EAAE,GAAG,CAAC,CAES;IAGhC;;;OAGG;IACH,SAHW,CAAC,qBAKX;IAED;;;OAGG;IACH,WAHW,CAAC,qBAYX;IAED;;;OAGG;IACH,UAHW,CAAC,qBAWX;IAED;;;;;;;;OAQG;IACH,WAHW,CAAC,QACD,MAAM,GAAG,CAAC,QAKpB;IAED,gBAEC;CACF"}
|
package/observable.js
CHANGED
|
@@ -15,7 +15,7 @@ import * as array from './array.js'
|
|
|
15
15
|
* This is basically a (better typed) duplicate of Observable, which will replace Observable in the
|
|
16
16
|
* next release.
|
|
17
17
|
*
|
|
18
|
-
* @template {{[key
|
|
18
|
+
* @template {{[key in keyof EVENTS]: function(...any):void}} EVENTS
|
|
19
19
|
*/
|
|
20
20
|
export class ObservableV2 {
|
|
21
21
|
constructor () {
|
|
@@ -27,7 +27,7 @@ export class ObservableV2 {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
|
-
* @template {string} NAME
|
|
30
|
+
* @template {keyof EVENTS & string} NAME
|
|
31
31
|
* @param {NAME} name
|
|
32
32
|
* @param {EVENTS[NAME]} f
|
|
33
33
|
*/
|
|
@@ -37,7 +37,7 @@ export class ObservableV2 {
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
/**
|
|
40
|
-
* @template {string} NAME
|
|
40
|
+
* @template {keyof EVENTS & string} NAME
|
|
41
41
|
* @param {NAME} name
|
|
42
42
|
* @param {EVENTS[NAME]} f
|
|
43
43
|
*/
|
|
@@ -53,7 +53,7 @@ export class ObservableV2 {
|
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
/**
|
|
56
|
-
* @template {string} NAME
|
|
56
|
+
* @template {keyof EVENTS & string} NAME
|
|
57
57
|
* @param {NAME} name
|
|
58
58
|
* @param {EVENTS[NAME]} f
|
|
59
59
|
*/
|
|
@@ -73,7 +73,7 @@ export class ObservableV2 {
|
|
|
73
73
|
*
|
|
74
74
|
* @todo This should catch exceptions
|
|
75
75
|
*
|
|
76
|
-
* @template {string} NAME
|
|
76
|
+
* @template {keyof EVENTS & string} NAME
|
|
77
77
|
* @param {NAME} name The event name.
|
|
78
78
|
* @param {Parameters<EVENTS[NAME]>} args The arguments that are applied to the event listener.
|
|
79
79
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lib0",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.87",
|
|
4
4
|
"description": "",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"type": "module",
|
|
@@ -111,6 +111,11 @@
|
|
|
111
111
|
},
|
|
112
112
|
"./hash/sha256": {
|
|
113
113
|
"types": "./hash/sha256.d.ts",
|
|
114
|
+
"browser": {
|
|
115
|
+
"module": "./hash/sha256.js",
|
|
116
|
+
"require": "./dist/sha256.cjs",
|
|
117
|
+
"default": "./hash/sha256.js"
|
|
118
|
+
},
|
|
114
119
|
"node": {
|
|
115
120
|
"require": "./dist/sha256.node.cjs",
|
|
116
121
|
"default": "./hash/sha256.node.js"
|
|
@@ -231,6 +236,11 @@
|
|
|
231
236
|
"types": "./logging.node.d.ts",
|
|
232
237
|
"deno": "./logging.node.js",
|
|
233
238
|
"bun": "./logging.js",
|
|
239
|
+
"browser": {
|
|
240
|
+
"module": "./logging.js",
|
|
241
|
+
"require": "./dist/logging.cjs",
|
|
242
|
+
"default": "./logging.js"
|
|
243
|
+
},
|
|
234
244
|
"node": {
|
|
235
245
|
"module": "./logging.node.js",
|
|
236
246
|
"require": "./dist/logging.node.cjs",
|
|
@@ -430,7 +440,11 @@
|
|
|
430
440
|
"types": "./webcrypto.d.ts",
|
|
431
441
|
"deno": "./webcrypto.deno.js",
|
|
432
442
|
"bun": "./webcrypto.js",
|
|
433
|
-
"browser":
|
|
443
|
+
"browser": {
|
|
444
|
+
"module": "./webcrypto.js",
|
|
445
|
+
"require": "./dist/webcrypto.cjs",
|
|
446
|
+
"default": "./webcrypto.js"
|
|
447
|
+
},
|
|
434
448
|
"node": {
|
|
435
449
|
"module": "./webcrypto.node.js",
|
|
436
450
|
"require": "./dist/webcrypto.node.cjs",
|
|
@@ -448,6 +462,11 @@
|
|
|
448
462
|
"types": "./performance.d.ts",
|
|
449
463
|
"deno": "./performance.node.js",
|
|
450
464
|
"bun": "./performance.node.js",
|
|
465
|
+
"browser": {
|
|
466
|
+
"module": "./performance.js",
|
|
467
|
+
"require": "./dist/performance.cjs",
|
|
468
|
+
"default": "./performance.js"
|
|
469
|
+
},
|
|
451
470
|
"node": {
|
|
452
471
|
"module": "./performance.node.js",
|
|
453
472
|
"require": "./dist/performance.node.cjs",
|
package/storage.js
CHANGED
|
@@ -40,7 +40,7 @@ let usePolyfill = true
|
|
|
40
40
|
/* c8 ignore start */
|
|
41
41
|
try {
|
|
42
42
|
// if the same-origin rule is violated, accessing localStorage might thrown an error
|
|
43
|
-
if (typeof localStorage !== 'undefined') {
|
|
43
|
+
if (typeof localStorage !== 'undefined' && localStorage) {
|
|
44
44
|
_localStorage = localStorage
|
|
45
45
|
usePolyfill = false
|
|
46
46
|
}
|