{"id":16208465,"url":"https://github.com/ehmicky/keep-func-props","last_synced_at":"2025-05-12T03:31:48.361Z","repository":{"id":40571997,"uuid":"172788871","full_name":"ehmicky/keep-func-props","owner":"ehmicky","description":"Wrap a function without changing its name and other properties","archived":false,"fork":false,"pushed_at":"2025-03-29T02:36:01.000Z","size":8299,"stargazers_count":13,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-28T18:03:43.535Z","etag":null,"topics":["call","es6","function","functional","functional-programming","functor","javascript","length","library","mimic","name","nodejs","properties","typescript","wrapper"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/ehmicky.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"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}},"created_at":"2019-02-26T20:53:06.000Z","updated_at":"2025-03-29T02:36:05.000Z","dependencies_parsed_at":"2024-06-24T03:23:50.898Z","dependency_job_id":"410d53f4-bc6d-40d0-9df5-f3bf76d8c582","html_url":"https://github.com/ehmicky/keep-func-props","commit_stats":{"total_commits":958,"total_committers":3,"mean_commits":319.3333333333333,"dds":"0.013569937369519836","last_synced_commit":"e80ba14816843597ee949dd4b42c6da93b11d474"},"previous_names":[],"tags_count":36,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ehmicky%2Fkeep-func-props","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ehmicky%2Fkeep-func-props/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ehmicky%2Fkeep-func-props/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ehmicky%2Fkeep-func-props/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ehmicky","download_url":"https://codeload.github.com/ehmicky/keep-func-props/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253668066,"owners_count":21944971,"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":["call","es6","function","functional","functional-programming","functor","javascript","length","library","mimic","name","nodejs","properties","typescript","wrapper"],"created_at":"2024-10-10T10:17:07.641Z","updated_at":"2025-05-12T03:31:48.352Z","avatar_url":"https://github.com/ehmicky.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/ehmicky/design/main/keep-func-props/keep-func-props_dark.svg\"/\u003e\n  \u003cimg alt=\"keep-func-props logo\" src=\"https://raw.githubusercontent.com/ehmicky/design/main/keep-func-props/keep-func-props.svg\" width=\"700\"/\u003e\n\u003c/picture\u003e\n\n[![Node](https://img.shields.io/badge/-Node.js-808080?logo=node.js\u0026colorA=404040\u0026logoColor=66cc33)](https://www.npmjs.com/package/keep-func-props)\n[![Browsers](https://img.shields.io/badge/-Browsers-808080?logo=firefox\u0026colorA=404040)](https://unpkg.com/keep-func-props?module)\n[![TypeScript](https://img.shields.io/badge/-Typed-808080?logo=typescript\u0026colorA=404040\u0026logoColor=0096ff)](/src/main.d.ts)\n[![Codecov](https://img.shields.io/badge/-Tested%20100%25-808080?logo=codecov\u0026colorA=404040)](https://codecov.io/gh/ehmicky/keep-func-props)\n[![Minified size](https://img.shields.io/bundlephobia/minzip/keep-func-props?label\u0026colorA=404040\u0026colorB=808080\u0026logo=webpack)](https://bundlephobia.com/package/keep-func-props)\n[![Mastodon](https://img.shields.io/badge/-Mastodon-808080.svg?logo=mastodon\u0026colorA=404040\u0026logoColor=9590F9)](https://fosstodon.org/@ehmicky)\n[![Medium](https://img.shields.io/badge/-Medium-808080.svg?logo=medium\u0026colorA=404040)](https://medium.com/@ehmicky)\n\nWrap a function without changing its name and other properties.\n\nFunction wrappers return a new function which means the original function's\n`name` and other properties are usually lost. This module enhances them to keep\nthose properties instead.\n\nThe new function will also print the original function's body when stringified.\n\nFunction wrappers are commonly used in functional programming. They take a\nfunction as input and return it wrapped. Examples include\n[memoizing](https://github.com/planttheidea/moize) or ensuring a function is\nonly called once.\n\n# Example\n\n\u003c!-- eslint-disable node/file-extension-in-import, import/order --\u003e\n\n```js\nimport keepFuncProps from 'keep-func-props'\n// Any function wrapper works\nimport memoize from 'lodash/memoize.js'\n\nconst betterMemoize = keepFuncProps(memoize)\n\nconst anyFunction = () =\u003e true\n\n// Function `name` and other properties are kept\nconsole.log(anyFunction) // `[Function: anyFunction]`\nconsole.log(memoize(anyFunction)) // `[Function: memoized]`\nconsole.log(betterMemoize(anyFunction)) // `[Function: anyFunction]`\n\n// Function body is kept when stringified\nconsole.log(String(anyFunction))\n// () =\u003e true\nconsole.log(String(memoize(anyFunction)))\n// function() {\n//   var args = arguments,\n//   key = resolver ? resolver.apply(this, args) : args[0],\n//   cache = memoized.cache;\n//   ...\n// }\nconsole.log(String(betterMemoize(anyFunction)))\n// /* Wrapped with memoized() */\n// () =\u003e true\n```\n\n# Install\n\n```bash\nnpm install keep-func-props\n```\n\nThis package works in both Node.js \u003e=18.18.0 and\n[browsers](https://raw.githubusercontent.com/ehmicky/dev-tasks/main/src/browserslist).\n\nThis is an ES module. It must be loaded using\n[an `import` or `import()` statement](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c),\nnot `require()`. If TypeScript is used, it must be configured to\n[output ES modules](https://www.typescriptlang.org/docs/handbook/esm-node.html),\nnot CommonJS.\n\n# Usage\n\n```js\nimport keepFuncProps from 'keep-func-props'\n\n// Any function wrapper works\nconst wrapper =\n  (anyFunction) =\u003e\n  (...args) =\u003e\n    anyFunction(...args)\n\n// `betterWrapper` is like `wrapper` but it keeps the function properties\nconst betterWrapper = keepFuncProps(wrapper)\n```\n\n## keepFuncProps(wrapper)\n\n`wrapper`: `(anyFunction, [...args]) =\u003e newFunction`\\\n_Returns_: new `wrapper`\n\nA function `wrapper` is passed as argument. A copy of it is returned.\n\n# See also\n\n- [`mimic-function`](https://github.com/sindresorhus/mimic-function): same but\n  for functions that do not wrap other functions.\n\n# Support\n\nFor any question, _don't hesitate_ to [submit an issue on GitHub](../../issues).\n\nEveryone is welcome regardless of personal background. We enforce a\n[Code of conduct](CODE_OF_CONDUCT.md) in order to promote a positive and\ninclusive environment.\n\n# Contributing\n\nThis project was made with ❤️. The simplest way to give back is by starring and\nsharing it online.\n\nIf the documentation is unclear or has a typo, please click on the page's `Edit`\nbutton (pencil icon) and suggest a correction.\n\nIf you would like to help us fix a bug or add a new feature, please check our\n[guidelines](CONTRIBUTING.md). Pull requests are welcome!\n\n\u003c!-- Thanks go to our wonderful contributors: --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START --\u003e\n\u003c!-- prettier-ignore --\u003e\n\u003c!--\n\u003ctable\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003e\u003ca href=\"https://fosstodon.org/@ehmicky\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/8136211?v=4\" width=\"100px;\" alt=\"ehmicky\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eehmicky\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/ehmicky/keep-func-props/commits?author=ehmicky\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#design-ehmicky\" title=\"Design\"\u003e🎨\u003c/a\u003e \u003ca href=\"#ideas-ehmicky\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"https://github.com/ehmicky/keep-func-props/commits?author=ehmicky\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n--\u003e\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fehmicky%2Fkeep-func-props","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fehmicky%2Fkeep-func-props","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fehmicky%2Fkeep-func-props/lists"}