{"id":13603046,"url":"https://github.com/Open-Tech-Foundation/js-std","last_synced_at":"2025-04-11T13:32:36.169Z","repository":{"id":57133398,"uuid":"384390624","full_name":"Open-Tech-Foundation/js-std","owner":"Open-Tech-Foundation","description":"An Extensive  JavaScript Standard Library.","archived":false,"fork":false,"pushed_at":"2024-04-29T18:51:37.000Z","size":4104,"stargazers_count":5,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-05-01T09:36:25.438Z","etag":null,"topics":["browser","bun","deno","javascript","library","nodejs","standard","stdlib","typescript"],"latest_commit_sha":null,"homepage":"https://js-std.pages.dev/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Open-Tech-Foundation.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["Open-Tech-Foundation"]}},"created_at":"2021-07-09T09:40:06.000Z","updated_at":"2024-07-06T22:11:49.173Z","dependencies_parsed_at":"2024-01-12T04:57:03.703Z","dependency_job_id":"574f12d1-b5fc-4be9-91df-918113217661","html_url":"https://github.com/Open-Tech-Foundation/js-std","commit_stats":{"total_commits":152,"total_committers":3,"mean_commits":"50.666666666666664","dds":0.1578947368421053,"last_synced_commit":"a7abe61ac94f58c7e5ca67fa5c462a1345508117"},"previous_names":["open-tech-world/js-utils","open-tech-world/es-utils","open-tech-foundation/js-std","open-tech-foundation/js-utils"],"tags_count":68,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Open-Tech-Foundation%2Fjs-std","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Open-Tech-Foundation%2Fjs-std/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Open-Tech-Foundation%2Fjs-std/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Open-Tech-Foundation%2Fjs-std/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Open-Tech-Foundation","download_url":"https://codeload.github.com/Open-Tech-Foundation/js-std/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223435243,"owners_count":17144469,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["browser","bun","deno","javascript","library","nodejs","standard","stdlib","typescript"],"created_at":"2024-08-01T18:01:47.609Z","updated_at":"2024-11-07T06:31:03.040Z","avatar_url":"https://github.com/Open-Tech-Foundation.png","language":"TypeScript","readme":"\u003cimg align=\"left\" src=\"https://open-tech-foundation.pages.dev/img/Logo.svg\" width=\"50\" height=\"50\"\u003e\n\n\u0026nbsp;[OPEN TECH FOUNDATION](https://open-tech-foundation.pages.dev/)\n\n\u003cdiv align=\"center\"\u003e\n\n# JavaScript Standard Library\n\n[![Build](https://github.com/open-tech-foundation/js-std/actions/workflows/build.yml/badge.svg)](https://github.com/open-tech-foundation/js-std/actions/workflows/build.yml) \u0026nbsp; [![JSR Score](https://jsr.io/badges/@opentf/std/score)](https://jsr.io/@opentf/std)\n\n\u003c/div\u003e\n\n\u003e An Extensive JavaScript Standard Library.\n\n\u003cdiv align=\"center\"\u003e\n\n### [Playground](https://js-std.pages.dev/playground) | [Documentation](https://js-std.pages.dev)\n\n\u003c/div\u003e\n\n## Features\n\n- Simple \u0026 Familiar API with some differences\n\n- Cross-Environment Compatibility: Execute seamlessly in browsers, Node.js, Bun, Deno, etc.\n- Practical Default Options\n- Includes Async Utils\n- TypeScript Support\n- Works with both CJS \u0026 ESM\n- Supports some Older Browsers \u0026 Node.js \u003e= 16\n\n## Installation\n\nInstall it using your favourite package manager.\n\n```sh\nnpm install @opentf/std\n```\n\n```sh\nyarn add @opentf/std\n```\n\n```sh\npnpm add @opentf/std\n```\n\n```sh\nbun add @opentf/std\n```\n\n```sh\ndeno add @opentf/std\n```\n\n## Usage\n\nLet’s explore some of the library’s capabilities:\n\n1. Checking if a Value is Numeric:\n\n```js\nimport { isNum } from \"@opentf/std\";\n\nisNum(NaN); //=\u003e false\nisNum(\"1\"); //=\u003e false\nisNum(\"1\", true); //=\u003e true\nisNum(1); //=\u003e true\n```\n\n2. Converting Strings to Pascal Case:\n\n```js\nimport { pascalCase } from \"@opentf/std\";\n\npascalCase(\"pascal case\"); //=\u003e PascalCase\n```\n\n3. Sorting an Array in Descending Order:\n\n```js\nimport { sort } from \"@opentf/std\";\n\nsort([1, 10, 21, 2], \"desc\"); //=\u003e [21, 10, 2, 1]\n```\n\n4. Deep Cloning an Object:\n\n```js\nimport { clone } from \"@opentf/std\";\n\nconst obj = { a: 1, b: \"abc\", c: new Map([[\"key\", \"val\"]]) };\n\nclone(obj); // Returns deeply cloned value\n```\n\n5. Checking Equality of Objects \u0026 Arrays:\n\n```js\nimport { isEql, isEqlArr } from \"@opentf/std\";\n\nconst mapA = new Map([\n  [\"a\", 1],\n  [\"b\", 2],\n]);\nconst mapB = new Map([\n  [\"b\", 2],\n  [\"a\", 1],\n]);\n\nisEql(mapA, mapB); //=\u003e false\n\nisEqlArr([1, 2, 3], [2, 3, 1]); //=\u003e true\n```\n\n6. Adding a Delay (1 second) with sleep:\n\n```js\nimport { sleep } from \"@opentf/std\";\n\nawait sleep(1000); // Suspends execution for 1 second\n```\n\n7. Functions composition using `pipe` \u0026 `compose` functions:\n\n```js\nimport { pipe, compose } from \"@opentf/std\";\n\npipe(\n  1,\n  (x) =\u003e x + 1,\n  (x) =\u003e x * 5,\n); //=\u003e 10\n\ncompose(\n  1,\n  (x) =\u003e x + 1,\n  (x) =\u003e x * 5,\n); //=\u003e 6\n```\n\n8. Pick \u0026 Omit Paths in an Object\n\n```js\nimport { pick omit } from '@opentf/std';\n\nconst obj = { a: 1, b: 2, c: 3 };\n\npick(obj, 'a', 'c'); //=\u003e { a: 1, c: 3 }\n\nomit(obj, 'a', 'c'); //=\u003e { b: 2 }\n```\n\n## API\n\n### Array\n\n- [arrIns](https://js-std.pages.dev/Array/arrIns)\n- [arrReplace](https://js-std.pages.dev/Array/arrReplace)\n- [arrRm](https://js-std.pages.dev/Array/arrRm)\n- [bounds](https://js-std.pages.dev/Array/bounds)\n- [chunk](https://js-std.pages.dev/Array/chunk)\n- [compact](https://js-std.pages.dev/Array/compact)\n- [countBy](https://js-std.pages.dev/Array/countBy)\n- [diff](https://js-std.pages.dev/Array/diff)\n- [drop](https://js-std.pages.dev/Array/drop)\n- [groupBy](https://js-std.pages.dev/Array/groupBy)\n- [intersection](https://js-std.pages.dev/Array/intersection)\n- [intersperse](https://js-std.pages.dev/Array/intersperse)\n- [max](https://js-std.pages.dev/Array/max)\n- [min](https://js-std.pages.dev/Array/min)\n- [move](https://js-std.pages.dev/Array/move)\n- [range](https://js-std.pages.dev/Array/range)\n- [reverse](https://js-std.pages.dev/Array/reverse)\n- [shuffle](https://js-std.pages.dev/Array/shuffle)\n- [sort](https://js-std.pages.dev/Array/sort)\n- [sortBy](https://js-std.pages.dev/Array/sortBy)\n- [swap](https://js-std.pages.dev/Array/swap)\n- [symDiff](https://js-std.pages.dev/Array/symDiff)\n- [take](https://js-std.pages.dev/Array/take)\n- [union](https://js-std.pages.dev/Array/union)\n- [uniq](https://js-std.pages.dev/Array/uniq)\n\n## Async\n\n- [aCompose](https://js-std.pages.dev/Async/aCompose)\n- [aComposeFn](https://js-std.pages.dev/Async/aComposeFn)\n- [aFilter](https://js-std.pages.dev/Async/aFilter)\n- [aForEach](https://js-std.pages.dev/Async/aForEach)\n- [aMap](https://js-std.pages.dev/Async/aMap)\n- [aPipe](https://js-std.pages.dev/Async/aPipe)\n- [aPipeFn](https://js-std.pages.dev/Async/aPipeFn)\n- [aResolvers](https://js-std.pages.dev/Async/aResolvers)\n\n### Maths\n\n- [avg](https://js-std.pages.dev/Maths/avg)\n- [clamp](https://js-std.pages.dev/Maths/clamp)\n- [divMod](https://js-std.pages.dev/Maths/divMod)\n- [isDisjointFrom](https://js-std.pages.dev/Maths/isDisjointFrom)\n- [isEven](https://js-std.pages.dev/Maths/isEven)\n- [isOdd](https://js-std.pages.dev/Maths/isOdd)\n- [isSubsetOf](https://js-std.pages.dev/Maths/isSubsetOf)\n- [isSupersetOf](https://js-std.pages.dev/Maths/isSupersetOf)\n- [mean](https://js-std.pages.dev/Maths/mean)\n- [median](https://js-std.pages.dev/Maths/median)\n- [mode](https://js-std.pages.dev/Maths/mode)\n- [percentage](https://js-std.pages.dev/Maths/percentage)\n- [percentageOf](https://js-std.pages.dev/Maths/percentageOf)\n- [prod](https://js-std.pages.dev/Maths/prod)\n- [sum](https://js-std.pages.dev/Maths/sum)\n\n### Number\n\n- [isNegZero](https://js-std.pages.dev/Number/isNegZero)\n- [isZero](https://js-std.pages.dev/Number/isZero)\n- [toNum](https://js-std.pages.dev/Number/toNum)\n\n### Function\n\n- [compose](https://js-std.pages.dev/Function/compose)\n- [composeFn](https://js-std.pages.dev/Function/composeFn)\n- [noop](https://js-std.pages.dev/Function/noop)\n- [pipe](https://js-std.pages.dev/Function/pipe)\n- [pipeFn](https://js-std.pages.dev/Function/pipeFn)\n- [sleep](https://js-std.pages.dev/Function/sleep)\n\n### Colors\n\n- [hexToRGB](https://js-std.pages.dev/Colors/hexToRGB)\n- [rgbToHex](https://js-std.pages.dev/Colors/rgbToHex)\n\n### Assert\n\n- [isEmpty](https://js-std.pages.dev/Assert/isEmpty)\n- [isEql](https://js-std.pages.dev/Assert/isEql)\n- [isEqlArr](https://js-std.pages.dev/Assert/isEqlArr)\n- [isNil](https://js-std.pages.dev/Assert/isNil)\n- [isShallowEql](https://js-std.pages.dev/Assert/isShallowEql)\n\n### Object\n\n- [clone](https://js-std.pages.dev/Object/clone)\n- [fromPath](https://js-std.pages.dev/Object/fromPath)\n- [get](https://js-std.pages.dev/Object/get)\n- [has](https://js-std.pages.dev/Object/has)\n- [merge](https://js-std.pages.dev/Object/merge)\n- [mergeAll](https://js-std.pages.dev/Object/mergeAll)\n- [omit](https://js-std.pages.dev/Object/omit)\n- [pick](https://js-std.pages.dev/Object/pick)\n- [set](https://js-std.pages.dev/Object/set)\n- [shallowMerge](https://js-std.pages.dev/Object/shallowMerge)\n- [shallowMergeAll](https://js-std.pages.dev/Object/shallowMergeAll)\n- [size](https://js-std.pages.dev/Object/size)\n- [toPath](https://js-std.pages.dev/Object/toPath)\n- [unset](https://js-std.pages.dev/Object/unset)\n\n### String\n\n- [camelCase](https://js-std.pages.dev/String/camelCase)\n- [capitalize](https://js-std.pages.dev/String/capitalize)\n- [insertAt](https://js-std.pages.dev/String/insertAt)\n- [isEmail](https://js-std.pages.dev/String/isEmail)\n- [pascalCase](https://js-std.pages.dev/String/pascalCase)\n- [replaceAt](https://js-std.pages.dev/String/replaceAt)\n- [strReplace](https://js-std.pages.dev/String/strReplace)\n\n### Types\n\n- [isArr](https://js-std.pages.dev/Types/isArr)\n- [isArrBuf](https://js-std.pages.dev/Types/isArrBuf)\n- [isAsynFn](https://js-std.pages.dev/Types/isAsynFn)\n- [isBigInt](https://js-std.pages.dev/Types/isBigInt)\n- [isBlob](https://js-std.pages.dev/Types/isBlob)\n- [isBool](https://js-std.pages.dev/Types/isBool)\n- [isDataView](https://js-std.pages.dev/Types/isDataView)\n- [isDate](https://js-std.pages.dev/Types/isDate)\n- [isErr](https://js-std.pages.dev/Types/isErr)\n- [isFn](https://js-std.pages.dev/Types/isFn)\n- [isGenFn](https://js-std.pages.dev/Types/isGenFn)\n- [isInfinity](https://js-std.pages.dev/Types/isInfinity)\n- [isJSON](https://js-std.pages.dev/Types/isJSON)\n- [isMap](https://js-std.pages.dev/Types/isMap)\n- [isNull](https://js-std.pages.dev/Types/isNull)\n- [isNum](https://js-std.pages.dev/Types/isNum)\n- [isObj](https://js-std.pages.dev/Types/isObj)\n- [isPureObj](https://js-std.pages.dev/Types/isPureObj)\n- [isRegEx](https://js-std.pages.dev/Types/isRegEx)\n- [isSet](https://js-std.pages.dev/Types/isSet)\n- [isStr](https://js-std.pages.dev/Types/isStr)\n- [isSym](https://js-std.pages.dev/Types/isSym)\n- [isTypedArr](https://js-std.pages.dev/Types/isTypedArr)\n- [isUndef](https://js-std.pages.dev/Types/isUndef)\n- [isWkMap](https://js-std.pages.dev/Types/isWkMap)\n- [isWkRef](https://js-std.pages.dev/Types/isWkRef)\n- [isWkSet](https://js-std.pages.dev/Types/isWkSet)\n\n## Benchmarks\n\nSome benchmark outputs are shown here for reference.\n\n\u003e [!IMPORTANT]  \n\u003e Our priorities are reliability and accuracy rather than performance.\n\n```diff\nclone:\n┌───┬──────────────────────────┬─────────┬────────────────────┬────────┬─────────┐\n│   │ Task Name                │ ops/sec │ Average Time (ns)  │ Margin │ Samples │\n├───┼──────────────────────────┼─────────┼────────────────────┼────────┼─────────┤\n│ 0 │ structuredClone (Native) │ 276,824 │ 3612.3959469709525 │ ±1.29% │ 27683   │\n│ 1 │ _.cloneDeep (Lodash)     │ 216,965 │ 4609.032953864744  │ ±2.41% │ 21697   │\n│ 2 │ R.clone (ramda)          │ 174,567 │ 5728.439422580611  │ ±1.92% │ 17457   │\n│ 3 │ R2.clone (remeda)        │ 310,268 │ 3223.0154703960834 │ ±2.40% │ 31027   │\n│ 4 │ cloneDeep (clone-deep)   │ 468,908 │ 2132.611673882092  │ ±1.70% │ 46891   │\n│ 5 │ copy (fast-copy)         │ 486,179 │ 2056.852050680814  │ ±1.91% │ 48618   │\n+ 6 │ clone                    │ 535,302 │ 1868.1028376072306 │ ±2.07% │ 53531   │\n└───┴──────────────────────────┴─────────┴────────────────────┴────────┴─────────┘\n*Note:\n    - Here the lodash does not support errors, sparse arrays \u0026 objects in map keys.\n\n    - Here the ramda \u0026 remeda does not support cloning Map \u0026 Set.\n\n    - The fast-copy does not clone objects within Map, buffers in TypedArray, sparse arrays.\n\n    - The clone-deep does not handle circular refs, does not clone objects within map,\n    sparse arrays, internal refs within the object, TypedArray buffers \u0026 DataView.\n\nsortBy:\n┌───┬────────────────────┬───────────┬───────────────────┬────────┬─────────┐\n│   │ Task Name          │ ops/sec   │ Average Time (ns) │ Margin │ Samples │\n├───┼────────────────────┼───────────┼───────────────────┼────────┼─────────┤\n│ 0 │ _.orderBy (Lodash) │ 1,231,295 │ 812.1529684071648 │ ±3.09% │ 123130  │\n│ 1 │ R.sortWith (Ramda) │ 1,279,200 │ 781.7380570822326 │ ±2.27% │ 127921  │\n│ 2 │ R2.sortBy (Remeda) │ 1,419,707 │ 704.3703291518029 │ ±2.81% │ 141971  │\n│ 3 │ sort (Moderndash)  │ 2,697,568 │ 370.7042634668106 │ ±1.82% │ 269757  │\n+ 4 │ sortBy             │ 2,728,366 │ 366.5196435965459 │ ±2.19% │ 272837  │\n└───┴────────────────────┴───────────┴───────────────────┴────────┴─────────┘\n\n*Note: Here the Moderndash does not support passing object prop as string.\n\nisEql:\n┌───┬─────────────────────────────────────┬─────────┬────────────────────┬────────┬─────────┐\n│   │ Task Name                           │ ops/sec │ Average Time (ns)  │ Margin │ Samples │\n├───┼─────────────────────────────────────┼─────────┼────────────────────┼────────┼─────────┤\n│ 0 │ deepStrictEqual (Native)            │ 950,686 │ 1051.871609041841  │ ±0.24% │ 95069   │\n│ 1 │ fastDeepEqual (fast-deep-equal/es6) │ 652,611 │ 1532.3058134904193 │ ±1.49% │ 65262   │\n│ 2 │ dequal                              │ 120,791 │ 8278.7573675501    │ ±0.74% │ 12080   │\n│ 3 │ _.isEqual (Lodash)                  │ 152,075 │ 6575.660376117521  │ ±2.02% │ 15208   │\n│ 4 │ R.equals (Ramda)                    │ 51,496  │ 19418.976504855284 │ ±1.70% │ 5150    │\n+ 5 │ isEql                               │ 104,355 │ 9582.655710998957  │ ±1.13% │ 10436   │\n└───┴─────────────────────────────────────┴─────────┴────────────────────┴────────┴─────────┘\n\n*Note:\n\n  - The native util `deepStrictEqual` not available in browsers, does not check `Map` ordering \u0026 same invalid dates.\n  - The `fast-deep-equal/es6` does not support cyclic refs, Map ordering check, invalid dates, symbols, objects values in Set \u0026 TypedArrays.\n  - The lodash `isEqual` having issues with Map \u0026 does not check `Map` ordering \u0026 object values in `Set`.\n  - The ramda `equals` does not check `Map` ordering \u0026 symbols.\n  - The dequal does not support cyclic refs, Map ordering, symbols \u0026 same invalid dates.\n```\n\n### Running benchmarks\n\n```sh\n$ bun run build\n$ bun benchmark.js\n```\n\n## Articles\n\nPlease read our important articles:\n\n- [Introducing Our New JavaScript Standard Library](https://ganapathy.hashnode.dev/introducing-our-new-javascript-standard-library)\n\n- [You Don’t Need JavaScript Native Methods](https://ganapathy.hashnode.dev/you-dont-need-javascript-native-methods)\n\n## License\n\nCopyright (c) [Thanga Ganapathy](https://github.com/Thanga-Ganapathy) ([MIT License](./LICENSE)).\n","funding_links":["https://github.com/sponsors/Open-Tech-Foundation"],"categories":["browser"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FOpen-Tech-Foundation%2Fjs-std","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FOpen-Tech-Foundation%2Fjs-std","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FOpen-Tech-Foundation%2Fjs-std/lists"}