lib0 0.2.49 → 0.2.52

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.
Files changed (78) hide show
  1. package/.github/workflows/node.js.yml +1 -1
  2. package/README.md +23 -23
  3. package/broadcastchannel.d.ts +4 -4
  4. package/broadcastchannel.d.ts.map +1 -1
  5. package/broadcastchannel.js +7 -6
  6. package/decoding.d.ts +2 -0
  7. package/decoding.d.ts.map +1 -1
  8. package/decoding.js +39 -14
  9. package/dist/{broadcastchannel-1ac6c212.cjs → broadcastchannel-7655b66f.cjs} +9 -8
  10. package/dist/broadcastchannel-7655b66f.cjs.map +1 -0
  11. package/dist/broadcastchannel.cjs +2 -2
  12. package/dist/broadcastchannel.d.ts +4 -4
  13. package/dist/broadcastchannel.d.ts.map +1 -1
  14. package/dist/{buffer-c98f67d5.cjs → buffer-d3ba308b.cjs} +92 -28
  15. package/dist/buffer-d3ba308b.cjs.map +1 -0
  16. package/dist/buffer.cjs +1 -1
  17. package/dist/cache.cjs +3 -0
  18. package/dist/cache.cjs.map +1 -1
  19. package/dist/decoding.cjs +4 -2
  20. package/dist/decoding.cjs.map +1 -1
  21. package/dist/decoding.d.ts +2 -0
  22. package/dist/decoding.d.ts.map +1 -1
  23. package/dist/encoding.cjs +4 -1
  24. package/dist/encoding.cjs.map +1 -1
  25. package/dist/encoding.d.ts +3 -0
  26. package/dist/encoding.d.ts.map +1 -1
  27. package/dist/encoding.test.d.ts +6 -1
  28. package/dist/encoding.test.d.ts.map +1 -1
  29. package/dist/index.cjs +3 -3
  30. package/dist/list.cjs +52 -1
  31. package/dist/list.cjs.map +1 -1
  32. package/dist/list.d.ts +5 -0
  33. package/dist/list.d.ts.map +1 -1
  34. package/dist/list.test.d.ts.map +1 -1
  35. package/dist/number.test.d.ts +1 -0
  36. package/dist/number.test.d.ts.map +1 -1
  37. package/dist/{prng-1aa0a1bc.cjs → prng-76a2f4be.cjs} +3 -3
  38. package/dist/prng-76a2f4be.cjs.map +1 -0
  39. package/dist/prng.cjs +2 -2
  40. package/dist/prng.d.ts +1 -1
  41. package/dist/random.cjs +7 -1
  42. package/dist/random.cjs.map +1 -1
  43. package/dist/random.d.ts +1 -0
  44. package/dist/random.d.ts.map +1 -1
  45. package/dist/random.test.d.ts +1 -0
  46. package/dist/random.test.d.ts.map +1 -1
  47. package/dist/testing.cjs +5 -5
  48. package/dist/testing.cjs.map +1 -1
  49. package/encoding.d.ts +3 -0
  50. package/encoding.d.ts.map +1 -1
  51. package/encoding.js +46 -14
  52. package/encoding.test.d.ts +6 -1
  53. package/encoding.test.d.ts.map +1 -1
  54. package/list.d.ts +5 -0
  55. package/list.d.ts.map +1 -1
  56. package/list.js +46 -1
  57. package/list.test.d.ts.map +1 -1
  58. package/number.test.d.ts +1 -0
  59. package/number.test.d.ts.map +1 -1
  60. package/package.json +2 -2
  61. package/prng.d.ts +1 -1
  62. package/prng.js +1 -1
  63. package/random.d.ts +1 -0
  64. package/random.d.ts.map +1 -1
  65. package/random.js +6 -1
  66. package/random.test.d.ts +1 -0
  67. package/random.test.d.ts.map +1 -1
  68. package/testing.js +3 -3
  69. package/.circleci/config.yml +0 -7
  70. package/dist/broadcastchannel-1ac6c212.cjs.map +0 -1
  71. package/dist/buffer-c98f67d5.cjs.map +0 -1
  72. package/dist/prng-1aa0a1bc.cjs.map +0 -1
  73. package/dist/test.cjs +0 -7604
  74. package/dist/test.cjs.map +0 -1
  75. package/dist/test.d.ts +0 -2
  76. package/dist/test.d.ts.map +0 -1
  77. package/dist/test.js +0 -7631
  78. package/dist/test.js.map +0 -1
@@ -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.js'\n * import * as log from 'lib0/logging.js'\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 './logging.js'\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'\n\nimport { performance } from './isomorphic.js'\n\nexport { production } from './environment.js'\n\nexport const extensive = env.hasConf('extensive')\n\n/* istanbul 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 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 /* istanbul ignore next */\n get seed () {\n /* istanbul ignore else */\n if (this._seed === null) {\n /* istanbul 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 /* istanbul 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/* istanbul ignore next */\nconst testFilter = env.hasParam('--filter') ? env.getParam('--filter', '') : null\n\n/* istanbul ignore next */\nconst testFilterRegExp = testFilter !== null ? new RegExp(testFilter) : new RegExp('.*')\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 /* istanbul ignore if */\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 /* istanbul ignore next */\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 /* istanbul ignore if */\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 /* istanbul ignore next */\n const againMessage = env.isBrowser\n ? ` - ${window.location.href}?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 /* istanbul ignore else */\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 } 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(void):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(void):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():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():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 /* istanbul ignore next */\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/* istanbul ignore next */\n/**\n * @param {boolean} condition\n * @param {string?} [message]\n * @throws {TestError}\n */\nexport const assert = (condition, message = null) => condition || fail(`Assertion failed${message !== null ? `: ${message}` : ''}`)\n\n/**\n * @param {function():void} f\n * @throws {TestError}\n */\nexport const fails = f => {\n let err = null\n try {\n f()\n } catch (_err) {\n err = _err\n log.print(log.GREEN, '⇖ This Error was expected')\n }\n /* istanbul ignore if */\n if (err === null) {\n fail('Expected this to fail')\n }\n}\n\n/**\n * @param {Object<string, Object<string, function(TestCase):void|Promise<any>>>} tests\n */\nexport const runTests = async tests => {\n const numberOfTests = object.map(tests, mod => object.map(mod, f => /* istanbul ignore next */ f ? 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 /* istanbul ignore else */\n if (f) {\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 /* istanbul 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 /* istanbul ignore next */\n if (success) {\n /* istanbul ignore next */\n log.print(log.GREEN, log.BOLD, 'All tests successful!', log.GREY, log.UNBOLD, ` in ${time.humanizeDuration(end - start)}`)\n /* istanbul ignore next */\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 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.GREY","log.PURPLE","log.BLUE","log.groupCollapsed","log.group","performance","promise.isPromise","log.printError","log.groupEnd","env.isBrowser","time.humanizeDuration","array.last","statistics.median","statistics.average","log.print","log.BOLD","log.UNBOLD","log.RED","log.UNCOLOR","log.GREEN","log.printDom","log.printCanvas","diff","simpleDiffString","object.equalFlat","json.stringify","object.length","object.forEach","object.hasProperty","object.map","math.add","log.printImgBase64"],"mappings":"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"}
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 './logging.js'\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'\n\nimport { performance } from './isomorphic.js'\n\nexport { production } from './environment.js'\n\nexport const extensive = env.hasConf('extensive')\n\n/* istanbul 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 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 /* istanbul ignore next */\n get seed () {\n /* istanbul ignore else */\n if (this._seed === null) {\n /* istanbul 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 /* istanbul 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/* istanbul ignore next */\nconst testFilter = env.hasParam('--filter') ? env.getParam('--filter', '') : null\n\n/* istanbul ignore next */\nconst testFilterRegExp = testFilter !== null ? new RegExp(testFilter) : new RegExp('.*')\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 /* istanbul ignore if */\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 /* istanbul ignore next */\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 /* istanbul ignore if */\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 /* istanbul ignore next */\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 /* istanbul ignore else */\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 } 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(void):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(void):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():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():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 /* istanbul ignore next */\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/* istanbul ignore next */\n/**\n * @param {boolean} condition\n * @param {string?} [message]\n * @throws {TestError}\n */\nexport const assert = (condition, message = null) => condition || fail(`Assertion failed${message !== null ? `: ${message}` : ''}`)\n\n/**\n * @param {function():void} f\n * @throws {TestError}\n */\nexport const fails = f => {\n let err = null\n try {\n f()\n } catch (_err) {\n err = _err\n log.print(log.GREEN, '⇖ This Error was expected')\n }\n /* istanbul ignore if */\n if (err === null) {\n fail('Expected this to fail')\n }\n}\n\n/**\n * @param {Object<string, Object<string, function(TestCase):void|Promise<any>>>} tests\n */\nexport const runTests = async tests => {\n const numberOfTests = object.map(tests, mod => object.map(mod, f => /* istanbul ignore next */ f ? 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 /* istanbul ignore else */\n if (f) {\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 /* istanbul 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 /* istanbul ignore next */\n if (success) {\n /* istanbul ignore next */\n log.print(log.GREEN, log.BOLD, 'All tests successful!', log.GREY, log.UNBOLD, ` in ${time.humanizeDuration(end - start)}`)\n /* istanbul ignore next */\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 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.GREY","log.PURPLE","log.BLUE","log.groupCollapsed","log.group","performance","promise.isPromise","log.printError","log.groupEnd","env.isBrowser","time.humanizeDuration","array.last","statistics.median","statistics.average","log.print","log.BOLD","log.UNBOLD","log.RED","log.UNCOLOR","log.GREEN","log.printDom","log.printCanvas","diff","simpleDiffString","object.equalFlat","json.stringify","object.length","object.forEach","object.hasProperty","object.map","math.add","log.printImgBase64"],"mappings":"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"}
package/encoding.d.ts CHANGED
@@ -12,6 +12,7 @@ export class Encoder {
12
12
  export function createEncoder(): Encoder;
13
13
  export function length(encoder: Encoder): number;
14
14
  export function toUint8Array(encoder: Encoder): Uint8Array;
15
+ export function verifyLen(encoder: Encoder, len: number): void;
15
16
  export function write(encoder: Encoder, num: number): void;
16
17
  export function set(encoder: Encoder, pos: number, num: number): void;
17
18
  export function writeUint8(encoder: Encoder, num: number): void;
@@ -23,6 +24,8 @@ export function writeUint32BigEndian(encoder: Encoder, num: number): void;
23
24
  export function setUint32(encoder: Encoder, pos: number, num: number): void;
24
25
  export function writeVarUint(encoder: Encoder, num: number): void;
25
26
  export function writeVarInt(encoder: Encoder, num: number): void;
27
+ export function _writeVarStringNative(encoder: Encoder, str: string): void;
28
+ export function _writeVarStringPolyfill(encoder: Encoder, str: string): void;
26
29
  export function writeVarString(encoder: Encoder, str: string): void;
27
30
  export function writeBinaryEncoder(encoder: Encoder, append: Encoder): void;
28
31
  export function writeUint8Array(encoder: Encoder, uint8Array: Uint8Array): void;
package/encoding.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["encoding.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["encoding.js"],"names":[],"mappings":"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"}
package/encoding.js CHANGED
@@ -30,6 +30,7 @@ import * as buffer from './buffer.js'
30
30
  import * as math from './math.js'
31
31
  import * as number from './number.js'
32
32
  import * as binary from './binary.js'
33
+ import * as string from './string.js'
33
34
 
34
35
  /**
35
36
  * A BinaryEncoder handles the encoding to an Uint8Array.
@@ -92,7 +93,7 @@ export const toUint8Array = encoder => {
92
93
  * @param {Encoder} encoder
93
94
  * @param {number} len
94
95
  */
95
- const verifyLen = (encoder, len) => {
96
+ export const verifyLen = (encoder, len) => {
96
97
  const bufferLen = encoder.cbuf.length
97
98
  if (bufferLen - encoder.cpos < len) {
98
99
  encoder.bufs.push(buffer.createUint8ArrayViewFromArrayBuffer(encoder.cbuf.buffer, 0, encoder.cpos))
@@ -232,9 +233,7 @@ export const setUint32 = (encoder, pos, num) => {
232
233
  }
233
234
 
234
235
  /**
235
- * Write a variable length unsigned integer.
236
- *
237
- * Encodes integers in the range from [0, 4294967295] / [0, 0xffffffff]. (max 32 bit unsigned integer)
236
+ * Write a variable length unsigned integer. Max encodable integer is 2^53.
238
237
  *
239
238
  * @function
240
239
  * @param {Encoder} encoder
@@ -243,7 +242,7 @@ export const setUint32 = (encoder, pos, num) => {
243
242
  export const writeVarUint = (encoder, num) => {
244
243
  while (num > binary.BITS7) {
245
244
  write(encoder, binary.BIT8 | (binary.BITS7 & num))
246
- num >>>= 7
245
+ num = math.floor(num / 128) // shift >>> 7
247
246
  }
248
247
  write(encoder, binary.BITS7 & num)
249
248
  }
@@ -251,11 +250,6 @@ export const writeVarUint = (encoder, num) => {
251
250
  /**
252
251
  * Write a variable length integer.
253
252
  *
254
- * Encodes integers in the range from [-2147483648, -2147483647].
255
- *
256
- * We don't use zig-zag encoding because we want to keep the option open
257
- * to use the same function for BigInt and 53bit integers (doubles).
258
- *
259
253
  * We use the 7th bit instead for signaling that this is a negative number.
260
254
  *
261
255
  * @function
@@ -269,15 +263,21 @@ export const writeVarInt = (encoder, num) => {
269
263
  }
270
264
  // |- whether to continue reading |- whether is negative |- number
271
265
  write(encoder, (num > binary.BITS6 ? binary.BIT8 : 0) | (isNegative ? binary.BIT7 : 0) | (binary.BITS6 & num))
272
- num >>>= 6
266
+ num = math.floor(num / 64) // shift >>> 6
273
267
  // We don't need to consider the case of num === 0 so we can use a different
274
268
  // pattern here than above.
275
269
  while (num > 0) {
276
270
  write(encoder, (num > binary.BITS7 ? binary.BIT8 : 0) | (binary.BITS7 & num))
277
- num >>>= 7
271
+ num = math.floor(num / 128) // shift >>> 7
278
272
  }
279
273
  }
280
274
 
275
+ /**
276
+ * A cache to store strings temporarily
277
+ */
278
+ const _strBuffer = new Uint8Array(30000)
279
+ const _maxStrBSize = _strBuffer.length / 3
280
+
281
281
  /**
282
282
  * Write a variable length string.
283
283
  *
@@ -285,7 +285,28 @@ export const writeVarInt = (encoder, num) => {
285
285
  * @param {Encoder} encoder
286
286
  * @param {String} str The string that is to be encoded.
287
287
  */
288
- export const writeVarString = (encoder, str) => {
288
+ export const _writeVarStringNative = (encoder, str) => {
289
+ if (str.length < _maxStrBSize) {
290
+ // We can encode the string into the existing buffer
291
+ /* istanbul ignore else */
292
+ const written = string.utf8TextEncoder.encodeInto(str, _strBuffer).written || 0
293
+ writeVarUint(encoder, written)
294
+ for (let i = 0; i < written; i++) {
295
+ write(encoder, _strBuffer[i])
296
+ }
297
+ } else {
298
+ writeVarUint8Array(encoder, string.encodeUtf8(str))
299
+ }
300
+ }
301
+
302
+ /**
303
+ * Write a variable length string.
304
+ *
305
+ * @function
306
+ * @param {Encoder} encoder
307
+ * @param {String} str The string that is to be encoded.
308
+ */
309
+ export const _writeVarStringPolyfill = (encoder, str) => {
289
310
  const encodedString = unescape(encodeURIComponent(str))
290
311
  const len = encodedString.length
291
312
  writeVarUint(encoder, len)
@@ -294,6 +315,16 @@ export const writeVarString = (encoder, str) => {
294
315
  }
295
316
  }
296
317
 
318
+ /**
319
+ * Write a variable length string.
320
+ *
321
+ * @function
322
+ * @param {Encoder} encoder
323
+ * @param {String} str The string that is to be encoded.
324
+ */
325
+ /* istanbul ignore next */
326
+ export const writeVarString = string.utf8TextEncoder ? _writeVarStringNative : _writeVarStringPolyfill
327
+
297
328
  /**
298
329
  * Write the content of another Encoder.
299
330
  *
@@ -721,7 +752,8 @@ export class IncUintOptRleEncoder {
721
752
  const flushIntDiffOptRleEncoder = encoder => {
722
753
  if (encoder.count > 0) {
723
754
  // 31 bit making up the diff | wether to write the counter
724
- const encodedDiff = encoder.diff << 1 | (encoder.count === 1 ? 0 : 1)
755
+ // const encodedDiff = encoder.diff << 1 | (encoder.count === 1 ? 0 : 1)
756
+ const encodedDiff = encoder.diff * 2 + (encoder.count === 1 ? 0 : 1)
725
757
  // flush counter, unless this is the first value (count = 0)
726
758
  // case 1: just a single value. set first bit to positive
727
759
  // case 2: write several values. set first bit to negative to indicate that there is a length coming
@@ -1,4 +1,7 @@
1
1
  export function testGolangBinaryEncodingCompatibility(): void;
2
+ export function testVerifyLen(): void;
3
+ export function testStringEncodingPerformanceNativeVsPolyfill(): void;
4
+ export function testDecodingPerformanceNativeVsPolyfill(): void;
2
5
  export function testStringDecodingPerformance(): void;
3
6
  export function testAnyEncodeUnknowns(tc: t.TestCase): void;
4
7
  export function testAnyEncodeDate(tc: t.TestCase): void;
@@ -6,8 +9,10 @@ export function testEncodeMax32bitUint(tc: t.TestCase): void;
6
9
  export function testVarUintEncoding(tc: t.TestCase): void;
7
10
  export function testVarIntEncoding(tc: t.TestCase): void;
8
11
  export function testRepeatVarUintEncoding(tc: t.TestCase): void;
12
+ export function testRepeatVarUintEncoding53bit(tc: t.TestCase): void;
9
13
  export function testRepeatVarIntEncoding(tc: t.TestCase): void;
10
- export function testRepeatAnyEncoding(tc: t.TestCase): void;
14
+ export function testRepeatVarIntEncoding53bit(tc: t.TestCase): void;
15
+ export function testRepeanntAnyEncoding(tc: t.TestCase): void;
11
16
  export function testRepeatPeekVarUintEncoding(tc: t.TestCase): void;
12
17
  export function testRepeatPeekVarIntEncoding(tc: t.TestCase): void;
13
18
  export function testAnyVsJsonEncoding(tc: t.TestCase): void;
@@ -1 +1 @@
1
- {"version":3,"file":"encoding.test.d.ts","sourceRoot":"","sources":["encoding.test.js"],"names":[],"mappings":"AA4CO,8DAiCN;AAwCM,sDA6EN;AAKM,0CAFI,EAAE,QAAQ,QAYpB;AAKM,sCAFI,EAAE,QAAQ,QAIpB;AAKM,2CAFI,EAAE,QAAQ,QAIpB;AAKM,wCAFI,EAAE,QAAQ,QAQpB;AAKM,uCAFI,EAAE,QAAQ,QAQpB;AAKM,8CAFI,EAAE,QAAQ,QAKpB;AAKM,6CAFI,EAAE,QAAQ,QAKpB;AAKM,0CAFI,EAAE,QAAQ,QAKpB;AAKM,kDAFI,EAAE,QAAQ,QAKpB;AAKM,iDAFI,EAAE,QAAQ,QAKpB;AAKM,0CAFI,EAAE,QAAQ,QAkBpB;AAKM,uCAFI,EAAE,QAAQ,QAWpB;AAKM,6CAFI,EAAE,QAAQ,QAGqB;AAKnC,mCAFI,EAAE,QAAQ,QAkBpB;AAyCM,2CAFI,EAAE,QAAQ,QA6BpB;AAKM,gDAFI,EAAE,QAAQ,QAiBpB;AAKM,sCAFI,EAAE,QAAQ,QAuBpB;AAKM,qCAFI,EAAE,QAAQ,QAcpB;AAKM,2CAFI,EAAE,QAAQ,QAYpB;AAKM,+CAFI,EAAE,QAAQ,QAapB;AAKM,mCAFI,EAAE,QAAQ,QAkBpB;AAKM,0CAFI,EAAE,QAAQ,QAkBpB;AAKM,0CAFI,EAAE,QAAQ,QAkBpB;AAKM,0CAFI,EAAE,QAAQ,QAkBpB;AAKM,oCAFI,EAAE,QAAQ,QAiCpB;AAKM,uCAFI,EAAE,QAAQ,QAYpB;AAKM,sCAFI,EAAE,QAAQ,QAyBpB;AAKM,+CAFI,EAAE,QAAQ,QASpB;;iBAnUsB,SAAS,OAAO,KAAE,GAAG;kBACrB,SAAS,OAAO,QAAC,GAAG,KAAE,IAAI;gBAC1B,KAAK,IAAI,KAAE,GAAG;oBACd,GAAG,QAAC,GAAG,KAAE,OAAO;UACzB,MAAM"}
1
+ {"version":3,"file":"encoding.test.d.ts","sourceRoot":"","sources":["encoding.test.js"],"names":[],"mappings":"AA6CO,8DAiCN;AAwCM,sCAON;AAEM,sEAyCN;AAEM,gEAkDN;AAEM,sDAiDN;AAKM,0CAFI,EAAE,QAAQ,QAYpB;AAKM,sCAFI,EAAE,QAAQ,QAIpB;AAKM,2CAFI,EAAE,QAAQ,QAIpB;AAKM,wCAFI,EAAE,QAAQ,QASpB;AAKM,uCAFI,EAAE,QAAQ,QAUpB;AAKM,8CAFI,EAAE,QAAQ,QAKpB;AAKM,mDAFI,EAAE,QAAQ,QAKpB;AAKM,6CAFI,EAAE,QAAQ,QAKpB;AAKM,kDAFI,EAAE,QAAQ,QAKpB;AAKM,4CAFI,EAAE,QAAQ,QAKpB;AAKM,kDAFI,EAAE,QAAQ,QAKpB;AAKM,iDAFI,EAAE,QAAQ,QAKpB;AAKM,0CAFI,EAAE,QAAQ,QAkBpB;AAKM,uCAFI,EAAE,QAAQ,QAWpB;AAKM,6CAFI,EAAE,QAAQ,QAGqB;AAKnC,mCAFI,EAAE,QAAQ,QAkBpB;AAyCM,2CAFI,EAAE,QAAQ,QA6BpB;AAKM,gDAFI,EAAE,QAAQ,QAiBpB;AAKM,sCAFI,EAAE,QAAQ,QAuBpB;AAKM,qCAFI,EAAE,QAAQ,QAcpB;AAKM,2CAFI,EAAE,QAAQ,QAYpB;AAKM,+CAFI,EAAE,QAAQ,QAapB;AAKM,mCAFI,EAAE,QAAQ,QAkBpB;AAKM,0CAFI,EAAE,QAAQ,QAkBpB;AAKM,0CAFI,EAAE,QAAQ,QAkBpB;AAKM,0CAFI,EAAE,QAAQ,QAkBpB;AAKM,oCAFI,EAAE,QAAQ,QAqCpB;AAKM,uCAFI,EAAE,QAAQ,QAYpB;AAKM,sCAFI,EAAE,QAAQ,QAyBpB;AAKM,+CAFI,EAAE,QAAQ,QASpB;;iBAvUsB,SAAS,OAAO,KAAE,GAAG;kBACrB,SAAS,OAAO,QAAC,GAAG,KAAE,IAAI;gBAC1B,KAAK,IAAI,KAAE,GAAG;oBACd,GAAG,QAAC,GAAG,KAAE,OAAO;UACzB,MAAM"}
package/list.d.ts CHANGED
@@ -20,14 +20,19 @@ export class List<N extends ListNode> {
20
20
  * @type {N | null}
21
21
  */
22
22
  end: N | null;
23
+ len: number;
23
24
  }
24
25
  export function create<N extends ListNode>(): List<N>;
25
26
  export function isEmpty<N extends ListNode>(queue: List<N>): boolean;
27
+ export function remove<N extends ListNode>(queue: List<N>, node: N): N;
26
28
  export function removeNode<N extends ListNode>(queue: List<N>, node: N): N;
27
29
  export function insertBetween<N extends ListNode>(queue: List<N>, left: N | null, right: N | null, node: N): void;
30
+ export function replace<N extends ListNode>(queue: List<N>, node: N, newNode: N): void;
28
31
  export function pushEnd<N extends ListNode>(queue: List<N>, n: N): void;
29
32
  export function pushFront<N extends ListNode>(queue: List<N>, n: N): void;
30
33
  export function popFront<N extends ListNode>(list: List<N>): N | null;
31
34
  export function popEnd<N extends ListNode>(list: List<N>): N | null;
32
35
  export function map<N extends ListNode, M>(list: List<N>, f: (arg0: N) => M): M[];
36
+ export function toArray<N extends ListNode>(list: List<N>): N[];
37
+ export function forEach<N extends ListNode, M>(list: List<N>, f: (arg0: N) => M): void;
33
38
  //# sourceMappingURL=list.d.ts.map
package/list.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["list.js"],"names":[],"mappings":"AAEA;IAEI;;OAEG;IACH,sBAAgB;IAChB;;OAEG;IACH,sBAAgB;CAEnB;AAED;;GAEG;AACH;IAEI;;OAEG;IACH,OAFU,CAAC,GAAG,IAAI,CAED;IACjB;;OAEG;IACH,KAFU,CAAC,GAAG,IAAI,CAEH;CAElB;AAUM,sDAA+B;AAO/B,qEAA6C;AAU7C,2EAcN;AAUM,kHAiBN;AAQM,wEACmC;AAQnC,0EACqC;AAQrC,sEAC2C;AAQ3C,oEACuC;AAUvC,kFAWN"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["list.js"],"names":[],"mappings":"AAGA;IAEI;;OAEG;IACH,sBAAgB;IAChB;;OAEG;IACH,sBAAgB;CAEnB;AAED;;GAEG;AACH;IAEI;;OAEG;IACH,OAFU,CAAC,GAAG,IAAI,CAED;IACjB;;OAEG;IACH,KAFU,CAAC,GAAG,IAAI,CAEH;IACf,YAAY;CAEf;AAUM,sDAA+B;AAO/B,qEAA6C;AAU7C,uEAeN;AAfM,2EAeN;AAeM,kHAkBN;AAWM,uFAGN;AAQM,wEACmC;AAQnC,0EACqC;AAQrC,sEAC2C;AAQ3C,oEACuC;AAUvC,kFAWN;AAOM,gEAAqC;AASrC,uFAMN"}
package/list.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { id } from './function.js'
1
2
  import * as error from './error.js'
2
3
 
3
4
  export class ListNode {
@@ -26,6 +27,7 @@ export class List {
26
27
  * @type {N | null}
27
28
  */
28
29
  this.end = null
30
+ this.len = 0
29
31
  }
30
32
  }
31
33
 
@@ -54,7 +56,7 @@ export const isEmpty = queue => queue.start === null
54
56
  * @param {List<N>} queue
55
57
  * @param {N} node
56
58
  */
57
- export const removeNode = (queue, node) => {
59
+ export const remove = (queue, node) => {
58
60
  const prev = node.prev
59
61
  const next = node.next
60
62
  if (prev) {
@@ -67,9 +69,15 @@ export const removeNode = (queue, node) => {
67
69
  } else {
68
70
  queue.end = prev
69
71
  }
72
+ queue.len--
70
73
  return node
71
74
  }
72
75
 
76
+ /**
77
+ * @deprecated @todo remove in next major release
78
+ */
79
+ export const removeNode = remove
80
+
73
81
  /**
74
82
  * @template {ListNode} N
75
83
  *
@@ -95,6 +103,21 @@ export const insertBetween = (queue, left, right, node) => {
95
103
  }
96
104
  node.prev = left
97
105
  node.next = right
106
+ queue.len++
107
+ }
108
+
109
+ /**
110
+ * Remove a single node from the queue. Only works with Queues that operate on Doubly-linked lists of nodes.
111
+ *
112
+ * @template {ListNode} N
113
+ *
114
+ * @param {List<N>} queue
115
+ * @param {N} node
116
+ * @param {N} newNode
117
+ */
118
+ export const replace = (queue, node, newNode) => {
119
+ insertBetween(queue, node, node.next, newNode)
120
+ remove(queue, node)
98
121
  }
99
122
 
100
123
  /**
@@ -153,3 +176,25 @@ export const map = (list, f) => {
153
176
  }
154
177
  return arr
155
178
  }
179
+
180
+ /**
181
+ * @template {ListNode} N
182
+ *
183
+ * @param {List<N>} list
184
+ */
185
+ export const toArray = list => map(list, id)
186
+
187
+ /**
188
+ * @template {ListNode} N
189
+ * @template M
190
+ *
191
+ * @param {List<N>} list
192
+ * @param {function(N):M} f
193
+ */
194
+ export const forEach = (list, f) => {
195
+ let n = list.start
196
+ while (n) {
197
+ f(n)
198
+ n = n.next
199
+ }
200
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"list.test.d.ts","sourceRoot":"","sources":["list.test.js"],"names":[],"mappings":"AAgBO,uCAFI,EAAE,QAAQ,QA8BpB;AAKM,qCAFI,EAAE,QAAQ,QAkBpB"}
1
+ {"version":3,"file":"list.test.d.ts","sourceRoot":"","sources":["list.test.js"],"names":[],"mappings":"AAgBO,uCAFI,EAAE,QAAQ,QA8BpB;AAKM,qCAFI,EAAE,QAAQ,QA0BpB"}
package/number.test.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export function testNumber(tc: t.TestCase): void;
2
+ export function testShiftVsDivision(tc: t.TestCase): void;
2
3
  import * as t from "./testing.js";
3
4
  //# sourceMappingURL=number.test.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"number.test.d.ts","sourceRoot":"","sources":["number.test.js"],"names":[],"mappings":"AAMO,+BAFI,EAAE,QAAQ,QAcpB"}
1
+ {"version":3,"file":"number.test.d.ts","sourceRoot":"","sources":["number.test.js"],"names":[],"mappings":"AAQO,+BAFI,EAAE,QAAQ,QAcpB;AAOM,wCAFI,EAAE,QAAQ,QA6DpB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lib0",
3
- "version": "0.2.49",
3
+ "version": "0.2.52",
4
4
  "description": "",
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -331,6 +331,6 @@
331
331
  ]
332
332
  },
333
333
  "engines": {
334
- "node": ">=12"
334
+ "node": ">=14"
335
335
  }
336
336
  }
package/prng.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Description of the function
3
3
  * @callback generatorNext
4
- * @return {number} A 32bit integer
4
+ * @return {number} A random float in the cange of [0,1)
5
5
  */
6
6
  /**
7
7
  * A random type generator.
package/prng.js CHANGED
@@ -16,7 +16,7 @@ import * as buffer from './buffer.js'
16
16
  /**
17
17
  * Description of the function
18
18
  * @callback generatorNext
19
- * @return {number} A 32bit integer
19
+ * @return {number} A random float in the cange of [0,1)
20
20
  */
21
21
 
22
22
  /**
package/random.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export const rand: () => number;
2
2
  export function uint32(): number;
3
+ export function uint53(): number;
3
4
  export function oneOf<T>(arr: T[]): T;
4
5
  export function uuidv4(): any;
5
6
  //# sourceMappingURL=random.d.ts.map
package/random.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"random.d.ts","sourceRoot":"","sources":["random.js"],"names":[],"mappings":"AAYA,gCAA+B;AAGxB,iCAA8D;AAO9D,sCAAyD;AAIzD,8BAEN"}
1
+ {"version":3,"file":"random.d.ts","sourceRoot":"","sources":["random.js"],"names":[],"mappings":"AAaA,gCAA+B;AAExB,iCAA8D;AAE9D,iCAGN;AAOM,sCAAyD;AAIzD,8BAEN"}
package/random.js CHANGED
@@ -8,13 +8,18 @@
8
8
  */
9
9
 
10
10
  import * as math from './math.js'
11
+ import * as binary from './binary.js'
11
12
  import { cryptoRandomBuffer } from './isomorphic.js'
12
13
 
13
14
  export const rand = Math.random
14
15
 
15
- /* istanbul ignore next */
16
16
  export const uint32 = () => new Uint32Array(cryptoRandomBuffer(4))[0]
17
17
 
18
+ export const uint53 = () => {
19
+ const arr = new Uint32Array(cryptoRandomBuffer(8))
20
+ return (arr[0] & binary.BITS21) * (binary.BITS32 + 1) + (arr[1] >>> 0)
21
+ }
22
+
18
23
  /**
19
24
  * @template T
20
25
  * @param {Array<T>} arr
package/random.test.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export function testUint32(tc: t.TestCase): void;
2
+ export function testUint53(tc: t.TestCase): void;
2
3
  export function testUuidv4(tc: t.TestCase): void;
3
4
  export function testUuidv4Overlaps(tc: t.TestCase): void;
4
5
  import * as t from "./testing.js";
@@ -1 +1 @@
1
- {"version":3,"file":"random.test.d.ts","sourceRoot":"","sources":["random.test.js"],"names":[],"mappings":"AASO,+BAFI,EAAE,QAAQ,QA0BpB;AAKM,+BAFI,EAAE,QAAQ,QAIpB;AAKM,uCAFI,EAAE,QAAQ,QAkBpB"}
1
+ {"version":3,"file":"random.test.d.ts","sourceRoot":"","sources":["random.test.js"],"names":[],"mappings":"AASO,+BAFI,EAAE,QAAQ,QA0BpB;AAKM,+BAFI,EAAE,QAAQ,QAyBpB;AAKM,+BAFI,EAAE,QAAQ,QAIpB;AAKM,uCAFI,EAAE,QAAQ,QAkBpB"}
package/testing.js CHANGED
@@ -3,8 +3,8 @@
3
3
  *
4
4
  * ```js
5
5
  * // test.js template for creating a test executable
6
- * import { runTests } from 'lib0/testing.js'
7
- * import * as log from 'lib0/logging.js'
6
+ * import { runTests } from 'lib0/testing'
7
+ * import * as log from 'lib0/logging'
8
8
  * import * as mod1 from './mod1.test.js'
9
9
  * import * as mod2 from './mod2.test.js'
10
10
 
@@ -186,7 +186,7 @@ export const run = async (moduleName, name, f, i, numberOfTests) => {
186
186
  times.sort((a, b) => a - b)
187
187
  /* istanbul ignore next */
188
188
  const againMessage = env.isBrowser
189
- ? ` - ${window.location.href}?filter=\\[${i + 1}/${tc._seed === null ? '' : `&seed=${tc._seed}`}`
189
+ ? ` - ${window.location.host + window.location.pathname}?filter=\\[${i + 1}/${tc._seed === null ? '' : `&seed=${tc._seed}`}`
190
190
  : `\nrepeat: npm run test -- --filter "\\[${i + 1}/" ${tc._seed === null ? '' : `--seed ${tc._seed}`}`
191
191
  const timeInfo = (repeat && err === null)
192
192
  ? ` - ${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))})`
@@ -1,7 +0,0 @@
1
- version: 2.1
2
- orbs:
3
- node: circleci/node@3.0.0
4
- workflows:
5
- node-tests:
6
- jobs:
7
- - node/test