{"id":22165949,"url":"https://github.com/alextanhongpin/js-learn","last_synced_at":"2026-01-27T06:01:49.121Z","repository":{"id":79115047,"uuid":"151682055","full_name":"alextanhongpin/js-learn","owner":"alextanhongpin","description":"Stuff I learn about js","archived":false,"fork":false,"pushed_at":"2026-01-16T14:19:41.000Z","size":366,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-17T04:37:57.289Z","etag":null,"topics":["javascript","patterns","reusable","typescript"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alextanhongpin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"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":"2018-10-05T06:55:34.000Z","updated_at":"2026-01-16T14:19:44.000Z","dependencies_parsed_at":null,"dependency_job_id":"a4c7561a-ddb5-44b1-9ab3-8cc59107fe3b","html_url":"https://github.com/alextanhongpin/js-learn","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/alextanhongpin/js-learn","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alextanhongpin%2Fjs-learn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alextanhongpin%2Fjs-learn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alextanhongpin%2Fjs-learn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alextanhongpin%2Fjs-learn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alextanhongpin","download_url":"https://codeload.github.com/alextanhongpin/js-learn/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alextanhongpin%2Fjs-learn/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28805329,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-27T05:43:52.625Z","status":"ssl_error","status_checked_at":"2026-01-27T05:43:48.957Z","response_time":168,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["javascript","patterns","reusable","typescript"],"created_at":"2024-12-02T05:17:24.178Z","updated_at":"2026-01-27T06:01:49.106Z","avatar_url":"https://github.com/alextanhongpin.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# js-learn\nStuff I learn about js\n\n\n## MutationObservers, WeakMap, WeakSet JS, CustomElements\n\nAlso sharedWorker with websocket. https://blog.pusher.com/reduce-websocket-connections-with-shared-workers/\n\nBuild your own approach to designing components without framework.\n\n\n## Updating npm packages\n\n```bash\n$ npm outdated\n$ npm i -g npm-check-updated\n\n$ ncu -u\n$ npm i\n```\n\n\n## Object-Oriented \n\n\nWrap domain model\n- wrap with empty, zero, value, map, find, where, view, parse,  validate, label, with, fulfill, sortable your, filterableby\n\n\n## Remove unused node modules\n\n```bash\n$ find . -name 'node_modules' -type d -prune -print -exec rm -rf '{}' \\;\n```\n\n\n## Semantic versioning \n\nNPM has a command to handle major/minor/patch versioning:\n```\n$ npm version\n```\n\n\n## Change NVM version when .nvmrc exists\n\nCreate `.nvmrc` file:\n\n```bash\nnode -v \u003e .nvmrc\n```\n\nYour `.nvmrc`:\n```\nv10.16.2\n```\n\nAdd to `.zshrc`:\n```bash\nautoload -U add-zsh-hook\nload-nvmrc() {\n  local node_version=\"$(nvm version)\"\n  local nvmrc_path=\"$(nvm_find_nvmrc)\"\n\n  if [ -n \"$nvmrc_path\" ]; then\n    local nvmrc_node_version=$(nvm version \"$(cat \"${nvmrc_path}\")\")\n\n    if [ \"$nvmrc_node_version\" = \"N/A\" ]; then\n      nvm install\n    elif [ \"$nvmrc_node_version\" != \"$node_version\" ]; then\n      nvm use\n    fi\n  elif [ \"$node_version\" != \"$(nvm version default)\" ]; then\n    echo \"Reverting to nvm default version\"\n    nvm use default\n  fi\n}\nadd-zsh-hook chpwd load-nvmrc\nload-nvmrc\n```\n\n### Proxy?\n\nSimplify write to local storage with this:\n```\nconst auth = {\n  get token () { \n    return window.localStorage.getItem('accessToken')\n  },\n  set token (token) {\n    token \n    ? window.localStorage.setItem('accessToken', token)\n    : window.localStorage.removeItem('accessToken')\n  }\n}\n```\n\n## Using symbol for non-conflicting key value\n\n```js\n// Use it to attach metadata, ghost value etc\n\n\nconst name = Symbol(\"name\")\n\nconst obj = {\n  name: 'hello world'\n}\n\nobj[name] = 'secret name'\n\nconsole.log(obj, obj.name)\nconsole.log(obj[name])\n\nfor (let key in obj) {\n  console.log('key', key)\n}\nconsole.log(name === 'name')\n\nfunction greet(n) {\n  switch (n) {\n    case name:\n      console.log('heloo')\n  }\n}\ngreet('name')\n```\n\n## State machine\n\n```js\nclass State {\n  #value = ''\n  #transitions = []\n  constructor(transitions, initialValue) {\n    this.#transitions = transitions\n    this.#value = initialValue\n  }\n\n  set value(value) {\n\t// Reduce it to a nested map, then use checking.\n    for (let {\n        from,\n        to,\n        fn\n      } of this.#transitions) {\n      if (from === this.#value \u0026\u0026 to === value) {\n        fn.call(fn)\n      }\n    }\n    this.#value = value\n  }\n\n  get value() {\n    return this.#value\n  }\n}\n\n\nconst s = new State([{\n    from: 'a', // Allow nested objects.\n    to: 'b',\n    fn: () =\u003e console.log('go to a')\n  },\n  {\n    from: 'b',\n    to: 'a',\n    fn: () =\u003e console.log('back to be a')\n  }\n], 'a')\ns.value = 'b'\ns.value = 'a'\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falextanhongpin%2Fjs-learn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falextanhongpin%2Fjs-learn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falextanhongpin%2Fjs-learn/lists"}