{"id":46825457,"url":"https://github.com/lbb00/use-singleton","last_synced_at":"2026-03-10T09:42:21.794Z","repository":{"id":48632777,"uuid":"383237320","full_name":"lbb00/use-singleton","owner":"lbb00","description":"Create the singleton easily by javascript.","archived":false,"fork":false,"pushed_at":"2023-12-18T11:50:33.000Z","size":109,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-21T16:56:30.586Z","etag":null,"topics":["npm-package","singleton","typescript"],"latest_commit_sha":null,"homepage":"","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/lbb00.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2021-07-05T18:51:56.000Z","updated_at":"2023-03-31T09:07:49.000Z","dependencies_parsed_at":"2023-12-18T12:53:55.578Z","dependency_job_id":null,"html_url":"https://github.com/lbb00/use-singleton","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/lbb00/use-singleton","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lbb00%2Fuse-singleton","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lbb00%2Fuse-singleton/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lbb00%2Fuse-singleton/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lbb00%2Fuse-singleton/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lbb00","download_url":"https://codeload.github.com/lbb00/use-singleton/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lbb00%2Fuse-singleton/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30328960,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T05:25:20.737Z","status":"ssl_error","status_checked_at":"2026-03-10T05:25:17.430Z","response_time":106,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["npm-package","singleton","typescript"],"created_at":"2026-03-10T09:42:20.930Z","updated_at":"2026-03-10T09:42:21.587Z","avatar_url":"https://github.com/lbb00.png","language":"TypeScript","readme":"# use-singleton\n\n[![Npm](https://badgen.net/npm/v/use-singleton)](https://www.npmjs.com/package/use-singleton)\n[![Bundlephobia](https://badgen.net/bundlephobia/minzip/use-singleton)](https://bundlephobia.com/result?p=use-singleton)\n[![Coverage](https://img.shields.io/codecov/c/github/lbb00/use-singleton.svg)](https://codecov.io/gh/lbb00/use-singleton)\n[![License](https://img.shields.io/github/license/lbb00/use-singleton.svg)](https://github.com/lbb00/use-singleton/blob/master/LICENSE)\n[![Npm](https://img.shields.io/npm/dt/use-singleton.svg)](https://www.npmjs.com/package/use-singleton)\n[![Known Vulnerabilities](https://snyk.io/test/github/lbb00/use-singleton/badge.svg)](https://snyk.io/test/github/lbb00/use-singleton)\n\n\u003e Create the powerful singleton easily.\n\n- Lazy or Immediately\n- Refresh\n- Cache value with key\n- Clean value and cache\n- Support cjs, ejs, umd\n- Typescript\n- Zero dependence\n- Side-effect free\n- Only ~.5kb after gzipped\n\n## Install\n\n### NPM\n\n```bash\nnpm install use-singleton --save\n```\n\n### Browser\n\n```html\n\u003cscript src=\"https://cdn.jsdelivr.net/npm/use-singleton/dist/index.min.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n  var useSingle = UseSingleton.useSingle;\n  var useSingleton = UseSingleton.useSingleton;\n\u003c/script\u003e\n\n// es2015+\n\u003cscript type=\"module\"\u003e\n  import { useSingle } from \"https://esm.sh/use-singleton\";\n\u003c/script\u003e\n```\n\n## Usage\n\n```javascript\nimport { useSingleton, useSingle } from \"use-singleton\";\n\n// the simple\nconst [getter, setter] = useSingle(initialValue);\n\n// the powerful\nconst getSingleton = useSingleton(createInstance, options);\n```\n\n## Example\n\n### useSingle\n\n```javascript\nconst [getCount, setCount] = useSingle(0);\ngetCount(); // -\u003e 0\nsetCount(1);\ngetCount(1); // -\u003e 1\n\n// vue\nconst [getCount, setCount] = useSingle(ref(0));\nwatch(getCount, (val) =\u003e console.log(val));\n\nsetCount(1);\n// log -\u003e 1\ngetCount().value; // -\u003e 1\n```\n\n### useSingleton\n\n#### Lazy\n\n```javascript\nconst getNumber = useSingleton(() =\u003e {\n  console.log(\"created\");\n  return 1;\n});\n\ngetNumber();\n// log -\u003e 'created'\n// -\u003e 1\n\ngetNumber(); // -\u003e 1\n```\n\n#### Immediately\n\n```javascript\nconst getNumber = useSingleton(\n  () =\u003e {\n    console.log(\"created\");\n    return 1;\n  },\n  {\n    immediately: true,\n  }\n);\n// log -\u003e 'created'\n\ngetNumber();\n// -\u003e 1\n```\n\n#### Async\n\n```javascript\nconst getServerInfo = useSingleton(\n  () =\u003e {\n    console.log('fetch data')\n    return  await api.get(`https://foo.bar/api/server-info`)\n  }\n);\n\nawait getServerKey()\n// log -\u003e 'fetch data'\n// -\u003e server-info\n\nawait getServerKey()\n// -\u003e server-info\n\nawait getServerKey(null,{ refresh: true})\n// log -\u003e 'fetch data'\n// -\u003e server-info_new\n\nawait getServerKey()\n// -\u003e server-info_new\n```\n\n#### With key\n\n```javascript\nconst getUserInfo = useSingleton(\n  async (key) =\u003e {\n    const userId = key;\n    console.log(`fetch user info: ${userId}`);\n    userInfo = await api.get(`https://foo.bar/api/user?id=${userId}`);\n    return userInfo;\n  },\n  {\n    withKey: true,\n  }\n);\n\nawait Promise.all[(getUserInfo(1), getUserInfo(1), getUserInfo(2))];\n// log -\u003e 'fetch user info: 1'\n// log -\u003e 'fetch user info: 2'\n// -\u003e [userInfo_1, userInfo_1, userInfo_2]\n\nawait getUserInfo(1);\n// log -\u003e 'fetch user info: 1'\n// -\u003e userInfo_1\n```\n\n#### Key cache\n\n\u003e To use the key cache, `withKey` must be set to `true`.\n\n```javascript\nconst getUserInfo = useSingleton(\n  async (key) =\u003e {\n    const userId = key;\n    console.log(`fetch user info: ${userId}`);\n    userInfo = await api.get(`https://foo.bar/api/user?id=${userId}`);\n    return userInfo;\n  },\n  {\n    withKey: true,\n    keyCache: true,\n  }\n);\n\nawait Promise.all[(getUserInfo(1), getUserInfo(1), getUserInfo(2))];\n// log -\u003e 'fetch user info: 1'\n// log -\u003e 'fetch user info: 2'\n// -\u003e [userInfo_1, userInfo_1, userInfo_2]\n\nawait getUserInfo(1);\n// form cache -\u003e userInfo_1\n\nawait getUserInfo(1, { refresh: false });\n// log -\u003e 'fetch user info: 1'\n// -\u003e userInfo_1\n```\n\n#### Clean value and cache\n\n```javascript\nconst getUserInfo = useSingleton(\n  async (key) =\u003e {\n    const userId = key;\n    console.log(`fetch user info: ${userId}`);\n    userInfo = await api.get(`https://foo.bar/api/user?id=${userId}`);\n    return userInfo;\n  },\n  {\n    withKey: true,\n    keyCache: true,\n  }\n);\n\nawait Promise.all[(getUserInfo(1), getUserInfo(1), getUserInfo(2))];\n// log -\u003e 'fetch user info: 1'\n// log -\u003e 'fetch user info: 2'\n// -\u003e [userInfo_1, userInfo_1, userInfo_2]\n\nawait getUserInfo(1);\n// form cache -\u003e userInfo_1\n\nawait getUserInfo(1, { clean: true });\n// form cache -\u003e userInfo_1\n\nawait getUserInfo(1);\n// log -\u003e 'fetch user info: 1'\n// -\u003e userInfo_1\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flbb00%2Fuse-singleton","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flbb00%2Fuse-singleton","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flbb00%2Fuse-singleton/lists"}