{"id":"6ea2efb2-6cc8-44b6-8b8e-d77863a7e73a","shortId":"6bdRbU","kind":"skill","title":"modern-javascript","tagline":"Proactively apply when creating web applications, Node.js services, or any JavaScript project. Triggers on JavaScript, ES6, ES2020, ES2022, ES2024, modern JS, refactor legacy, array methods, async/await, optional chaining, nullish coalescing, destructuring, spread, rest, template","description":"# Modern JavaScript (ES6-ES2025)\n\nWrite clean, performant, maintainable JavaScript using modern language features. This skill covers ES6 through ES2025, emphasizing immutability, functional patterns, and expressive syntax.\n\n## Quick Decision Trees\n\n### \"Which array method should I use?\"\n\n```\nWhat do I need?\n├─ Transform each element           → .map()\n├─ Keep some elements               → .filter()\n├─ Find one element                 → .find() / .findLast()\n├─ Check if condition met           → .some() / .every()\n├─ Reduce to single value           → .reduce()\n├─ Get last element                 → .at(-1)\n├─ Sort without mutating            → .toSorted()\n├─ Reverse without mutating         → .toReversed()\n├─ Group by property                → Object.groupBy()\n└─ Flatten nested arrays            → .flat() / .flatMap()\n```\n\n### \"How do I handle nullish values?\"\n\n```\nNullish handling?\n├─ Safe property access              → obj?.prop / obj?.[key]\n├─ Safe method call                  → obj?.method?.()\n├─ Default for null/undefined only   → value ?? 'default'\n├─ Default for any falsy             → value || 'default'\n├─ Assign if null/undefined          → obj.prop ??= 'default'\n└─ Check property exists             → Object.hasOwn(obj, 'key')\n```\n\n### \"Should I mutate or copy?\"\n\n```\nAlways prefer non-mutating methods:\n├─ Sort array      → .toSorted()    (not .sort())\n├─ Reverse array   → .toReversed()  (not .reverse())\n├─ Splice array    → .toSpliced()   (not .splice())\n├─ Update element  → .with(i, val)  (not arr[i] = val)\n├─ Add to array    → [...arr, item] (not .push())\n└─ Merge objects   → {...obj, key}  (not Object.assign())\n```\n\n## ES Version Quick Reference\n\n| Version | Year | Key Features |\n|---------|------|--------------|\n| ES6 | 2015 | let/const, arrow functions, classes, destructuring, spread, Promises, modules, Symbol, Map/Set, Proxy, generators |\n| ES2016 | 2016 | Array.includes(), exponentiation operator ** |\n| ES2017 | 2017 | async/await, Object.values/entries, padStart/padEnd, trailing commas, SharedArrayBuffer, Atomics |\n| ES2018 | 2018 | Rest/spread for objects, for await...of, Promise.finally(), RegExp named groups, lookbehind, dotAll flag |\n| ES2019 | 2019 | .flat(), .flatMap(), Object.fromEntries(), trimStart/End(), optional catch binding, stable Array.sort() |\n| ES2020 | 2020 | Optional chaining ?., nullish coalescing ??, BigInt, Promise.allSettled(), globalThis, dynamic import() |\n| ES2021 | 2021 | String.replaceAll(), Promise.any(), logical assignment ??= and or=, numeric separators 1_000_000 |\n| ES2022 | 2022 | .at(), Object.hasOwn(), top-level await, private class fields #field, static blocks, Error.cause |\n| ES2023 | 2023 | .toSorted(), .toReversed(), .toSpliced(), .with(), .findLast(), .findLastIndex(), hashbang grammar |\n| ES2024 | 2024 | Object.groupBy(), Map.groupBy(), Promise.withResolvers(), RegExp v flag, resizable ArrayBuffer |\n| ES2025 | 2025 | Iterator helpers (.map, .filter, .take), Set methods (.union, .intersection), RegExp.escape(), using/await using |\n\n## Modernization Patterns\n\n### Array Access\n\n```javascript\n// ❌ Legacy\nconst last = arr[arr.length - 1];\nconst secondLast = arr[arr.length - 2];\n\n// ✅ Modern (ES2022)\nconst last = arr.at(-1);\nconst secondLast = arr.at(-2);\n```\n\n### Non-Mutating Array Operations\n\n```javascript\n// ❌ Mutates original array\nconst sorted = arr.sort((a, b) => a - b);\nconst reversed = arr.reverse();\n\n// ✅ Returns new array (ES2023)\nconst sorted = arr.toSorted((a, b) => a - b);\nconst reversed = arr.toReversed();\nconst updated = arr.with(2, 'new value');\nconst removed = arr.toSpliced(1, 1);\n```\n\n### String Replacement\n\n```javascript\n// ❌ Legacy with regex\nconst result = str.replace(/foo/g, 'bar');\n\n// ✅ Modern (ES2021)\nconst result = str.replaceAll('foo', 'bar');\n```\n\n### Grouping Data\n\n```javascript\n// ❌ Manual grouping\nconst grouped = items.reduce((acc, item) => {\n  const key = item.category;\n  acc[key] = acc[key] || [];\n  acc[key].push(item);\n  return acc;\n}, {});\n\n// ✅ Modern (ES2024)\nconst grouped = Object.groupBy(items, item => item.category);\n```\n\n### Nullish Handling\n\n```javascript\n// ❌ Falsy check (0, '', false are valid values)\nconst value = input || 'default';\nconst name = user && user.profile && user.profile.name;\n\n// ✅ Nullish check (only null/undefined)\nconst value = input ?? 'default';\nconst name = user?.profile?.name;\n```\n\n### Property Existence\n\n```javascript\n// ❌ Can be fooled by prototype or overwritten hasOwnProperty\nif (obj.hasOwnProperty('key')) { }\n\n// ✅ Modern (ES2022)\nif (Object.hasOwn(obj, 'key')) { }\n```\n\n### Logical Assignment\n\n```javascript\n// ❌ Verbose assignment\nif (obj.prop === null || obj.prop === undefined) {\n  obj.prop = 'default';\n}\n\n// ✅ Modern (ES2021)\nobj.prop ??= 'default';  // Assign if null/undefined\nobj.count ||= 0;         // Assign if falsy\nobj.enabled &&= check(); // Assign if truthy\n```\n\n## Async Patterns\n\n### Promise Combinators\n\n```javascript\n// Wait for all, fail if any fails\nconst [users, posts] = await Promise.all([fetchUsers(), fetchPosts()]);\n\n// Wait for all, get status of each\nconst results = await Promise.allSettled([fetchA(), fetchB()]);\nresults.forEach(r => {\n  if (r.status === 'fulfilled') console.log(r.value);\n  else console.error(r.reason);\n});\n\n// First to succeed\nconst fastest = await Promise.any([fetchFromCDN1(), fetchFromCDN2()]);\n\n// First to settle\nconst winner = await Promise.race([fetchData(), timeout(5000)]);\n```\n\n### Promise.withResolvers (ES2024)\n\n```javascript\n// ❌ Legacy pattern\nlet resolve, reject;\nconst promise = new Promise((res, rej) => {\n  resolve = res;\n  reject = rej;\n});\n\n// ✅ Modern (ES2024)\nconst { promise, resolve, reject } = Promise.withResolvers();\n```\n\n### Top-Level Await (ES2022)\n\n```javascript\n// In ES modules, await at top level\nconst config = await fetch('/config.json').then(r => r.json());\nconst db = await connectDatabase(config);\n\nexport { db };\n```\n\n## Functional Patterns\n\n### Immutable Object Updates\n\n```javascript\n// Add/update property\nconst updated = { ...user, age: 31 };\n\n// Remove property\nconst { password, ...userWithoutPassword } = user;\n\n// Nested update\nconst updated = {\n  ...state,\n  user: { ...state.user, name: 'New Name' }\n};\n```\n\n### Array Transformations\n\n```javascript\n// Chain transformations (ES2023)\nconst result = users\n  .filter(u => u.active)\n  .map(u => u.name)\n  .toSorted();\n\n// Using flatMap for filter+map (single pass)\nconst activeNames = users.flatMap(u => u.active ? [u.name] : []);\n\n// ES2024: Group then process\nconst byStatus = Object.groupBy(users, u => u.active ? 'active' : 'inactive');\nconst activeNames = byStatus.active?.map(u => u.name) ?? [];\n```\n\n### Composition\n\n```javascript\nconst pipe = (...fns) => x => fns.reduce((v, f) => f(v), x);\nconst compose = (...fns) => x => fns.reduceRight((v, f) => f(v), x);\n\nconst processUser = pipe(\n  user => ({ ...user, name: user.name.trim() }),\n  user => ({ ...user, email: user.email.toLowerCase() }),\n  user => ({ ...user, createdAt: new Date() })\n);\n```\n\n## Destructuring Patterns\n\n### Object Destructuring\n\n```javascript\n// Basic with rename and default\nconst { name: userName, age = 18 } = user;\n\n// Nested\nconst { address: { city, country } } = user;\n\n// Rest\nconst { id, ...userData } = user;\n```\n\n### Array Destructuring\n\n```javascript\n// Skip elements\nconst [first, , third] = array;\n\n// Rest\nconst [head, ...tail] = array;\n\n// Swap variables\n[a, b] = [b, a];\n\n// Function returns\nconst [x, y] = getCoordinates();\n```\n\n## Anti-Patterns\n\n| Anti-Pattern | Problem | Modern Solution |\n|--------------|---------|-----------------|\n| `arr[arr.length-1]` | Verbose, error-prone | `arr.at(-1)` |\n| `.sort()` on original | Mutates array | `.toSorted()` |\n| `.replace(/g/)` for all | Regex overhead | `.replaceAll()` |\n| `obj.hasOwnProperty()` | Can be overwritten | `Object.hasOwn()` |\n| `value \\|\\| default` | 0, '', false treated as falsy | `value ?? default` |\n| `obj && obj.prop && obj.prop.method()` | Verbose null checks | `obj?.prop?.method?.()` |\n| `for (let i = 0; ...)` | Index bugs, verbose | `.map()`, `.filter()`, `for...of` |\n| `new Promise((res, rej) => ...)` | Boilerplate | `Promise.withResolvers()` |\n| Manual array grouping | Verbose, error-prone | `Object.groupBy()` |\n\n## Best Practices\n\n1. **Use `const` by default** — Only use `let` when reassignment is needed\n2. **Prefer arrow functions** — Especially for callbacks and short functions\n3. **Use template literals** — Instead of string concatenation\n4. **Destructure early** — Extract what you need at function start\n5. **Avoid mutations** — Use `.toSorted()`, `.toReversed()`, spread operator\n6. **Use optional chaining** — Prevent \"Cannot read property of undefined\"\n7. **Use nullish coalescing** — `??` for defaults, not `||` (unless intentional)\n8. **Prefer array methods** — `.map()`, `.filter()`, `.find()` over loops\n9. **Use `async/await`** — Instead of `.then()` chains\n10. **Handle errors properly** — `try/catch` with async/await\n\n## Reference Documentation\n\n### ES Version References\n| File | Purpose |\n|------|---------|\n| [references/ES2016-ES2017.md](references/ES2016-ES2017.md) | includes, async/await, Object.values/entries, string padding |\n| [references/ES2018-ES2019.md](references/ES2018-ES2019.md) | rest/spread objects, flat/flatMap, RegExp named groups |\n| [references/ES2022-ES2023.md](references/ES2022-ES2023.md) | .at(), .toSorted(), .toReversed(), .findLast(), class features |\n| [references/ES2024.md](references/ES2024.md) | Object.groupBy, Promise.withResolvers, RegExp v flag |\n| [references/ES2025.md](references/ES2025.md) | Set methods, iterator helpers, using/await using |\n| [references/UPCOMING.md](references/UPCOMING.md) | Temporal API, Decorators, Decorator Metadata |\n\n### Pattern References\n| File | Purpose |\n|------|---------|\n| [references/PROMISES.md](references/PROMISES.md) | Promise fundamentals, async/await, combinators |\n| [references/CONCURRENCY.md](references/CONCURRENCY.md) | Parallel, batched, pool patterns, retry, cancellation |\n| [references/IMMUTABILITY.md](references/IMMUTABILITY.md) | Immutable data patterns, pure functions |\n| [references/COMPOSITION.md](references/COMPOSITION.md) | Higher-order functions, memoization, monads |\n| [references/CHEATSHEET.md](references/CHEATSHEET.md) | Quick syntax reference\n\n## Resources\n\n### Specifications\n- **ECMAScript Specification**: https://tc39.es/ecma262/ (living standard)\n- **TC39 Proposals**: https://github.com/tc39/proposals (upcoming features)\n- **TC39 Process**: https://tc39.es/process-document/ (how features are added)\n\n### Documentation\n- **MDN Web Docs**: https://developer.mozilla.org/en-US/docs/Web/JavaScript\n- **JavaScript.info**: https://javascript.info/\n\n### Compatibility\n- **Can I Use**: https://caniuse.com (browser support tables)\n- **Node.js ES Compatibility**: https://node.green/","tags":["modern","javascript","robust","skills","ccheney","agent-skills","clean-architecture","domain-driven-design","drizzle-orm","feature-sliced-design","hexagonal-architecture","mermaid-diagrams"],"capabilities":["skill","source-ccheney","skill-modern-javascript","topic-agent-skills","topic-clean-architecture","topic-domain-driven-design","topic-drizzle-orm","topic-feature-sliced-design","topic-hexagonal-architecture","topic-mermaid-diagrams","topic-modern-javascript","topic-postgres","topic-skills","topic-slack-block-kit","topic-slack-mrkdwn"],"categories":["robust-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/ccheney/robust-skills/modern-javascript","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add ccheney/robust-skills","source_repo":"https://github.com/ccheney/robust-skills","install_from":"skills.sh"}},"qualityScore":"0.469","qualityRationale":"deterministic score 0.47 from registry signals: · indexed on github topic:agent-skills · 39 github stars · SKILL.md body (10,842 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-02T00:57:21.013Z","embedding":null,"createdAt":"2026-04-18T22:18:45.301Z","updatedAt":"2026-05-02T00:57:21.013Z","lastSeenAt":"2026-05-02T00:57:21.013Z","tsv":"'-1':106,373,844,850 '-2':377 '/config.json':655 '/ecma262/':1102 '/en-us/docs/web/javascript':1127 '/entries,':247,1017 '/foo/g':431 '/g':858 '/process-document/':1116 '/tc39/proposals':1109 '0':476,543,871,890 '000':301,302 '1':300,362,420,421,914 '10':997 '18':794 '2':367,414,926 '2015':224 '2016':238 '2017':243 '2018':254 '2019':269 '2020':280 '2021':291 '2022':304 '2023':319 '2024':329 '2025':339 '3':936 '31':678 '4':944 '5':954 '5000':612 '6':962 '7':972 '8':981 '9':990 'acc':448,453,455,457,462 'access':134,355 'activ':734 'activenam':719,737 'ad':1120 'add':202 'add/update':672 'address':798 'age':677,793 'alway':172 'anti':834,837 'anti-pattern':833,836 'api':1054 'appli':5 'applic':9 'arr':199,205,360,365,842 'arr.at':372,376,849 'arr.length':361,366,843 'arr.reverse':396 'arr.sort':389 'arr.toreversed':410 'arr.tosorted':403 'arr.tospliced':419 'arr.with':413 'array':27,69,121,179,184,189,204,354,381,386,399,695,807,815,820,855,905,983 'array.includes':239 'array.sort':278 'arraybuff':337 'arrow':226,928 'assign':156,295,524,527,539,544,549 'async':552 'async/await':29,244,992,1003,1014,1066 'atom':252 'avoid':955 'await':259,310,567,580,599,608,641,647,653,661 'b':391,393,405,407,824,825 'bar':432,439 'basic':785 'batch':1071 'best':912 'bigint':285 'bind':276 'block':316 'boilerpl':902 'browser':1135 'bug':892 'bystatus':729 'bystatus.active':738 'call':141 'callback':932 'cancel':1075 'caniuse.com':1134 'cannot':967 'catch':275 'chain':31,282,698,965,996 'check':91,161,475,491,548,883 'citi':799 'class':228,312,1034 'clean':44 'coalesc':33,284,975 'combin':555,1067 'comma':250 'compat':1130,1140 'compos':755 'composit':742 'concaten':943 'condit':93 'config':652,663 'connectdatabas':662 'console.error':592 'console.log':589 'const':358,363,370,374,387,394,401,408,411,417,428,435,445,450,465,481,485,494,498,564,578,597,606,621,633,651,659,674,681,687,701,718,728,736,744,754,764,790,797,803,812,817,829,916 'copi':171 'countri':800 'cover':54 'creat':7 'createdat':777 'data':441,1079 'date':779 'db':660,665 'decis':66 'decor':1055,1056 'default':144,149,150,155,160,484,497,534,538,789,870,877,918,977 'destructur':34,229,780,783,808,945 'developer.mozilla.org':1126 'developer.mozilla.org/en-us/docs/web/javascript':1125 'doc':1124 'document':1005,1121 'dotal':266 'dynam':288 'earli':946 'ecmascript':1098 'element':80,84,88,104,194,811 'els':591 'email':773 'emphas':58 'error':847,909,999 'error-pron':846,908 'error.cause':317 'es':215,645,1006,1139 'es2016':237 'es2017':242 'es2018':253 'es2019':268 'es2020':20,279 'es2021':290,434,536 'es2022':21,303,369,518,642 'es2023':318,400,700 'es2024':22,328,464,614,632,724 'es2025':42,57,338 'es6':19,41,55,223 'es6-es2025':40 'especi':930 'everi':96 'exist':163,504 'exponenti':240 'export':664 'express':63 'extract':947 'f':750,751,760,761 'fail':560,563 'fals':477,872 'falsi':153,474,546,875 'fastest':598 'featur':51,222,1035,1111,1118 'fetch':654 'fetcha':582 'fetchb':583 'fetchdata':610 'fetchfromcdn1':601 'fetchfromcdn2':602 'fetchpost':570 'fetchus':569 'field':313,314 'file':1009,1060 'filter':85,343,704,714,895,986 'find':86,89,987 'findlast':90,324,1033 'findlastindex':325 'first':594,603,813 'flag':267,335,1042 'flat':122,270 'flat/flatmap':1024 'flatmap':123,271,712 'flatten':119 'fns':746,756 'fns.reduce':748 'fns.reduceright':758 'foo':438 'fool':508 'fulfil':588 'function':60,227,666,827,929,935,952,1082,1088 'fundament':1065 'generat':236 'get':102,574 'getcoordin':832 'github.com':1108 'github.com/tc39/proposals':1107 'globalthi':287 'grammar':327 'group':115,264,440,444,446,466,725,906,1027 'handl':127,131,472,998 'hashbang':326 'hasownproperti':513 'head':818 'helper':341,1048 'higher':1086 'higher-ord':1085 'id':804 'immut':59,668,1078 'import':289 'inact':735 'includ':1013 'index':891 'input':483,496 'instead':940,993 'intent':980 'intersect':348 'item':206,449,460,468,469 'item.category':452,470 'items.reduce':447 'iter':340,1047 'javascript':3,14,18,39,47,356,383,424,442,473,505,525,556,615,643,671,697,743,784,809 'javascript.info':1128,1129 'js':24 'keep':82 'key':138,166,212,221,451,454,456,458,516,522 'languag':50 'last':103,359,371 'legaci':26,357,425,616 'let':618,888,921 'let/const':225 'level':309,640,650 'liter':939 'live':1103 'logic':294,523 'lookbehind':265 'loop':989 'maintain':46 'manual':443,904 'map':81,342,707,715,739,894,985 'map.groupby':331 'map/set':234 'mdn':1122 'memoiz':1089 'merg':209 'met':94 'metadata':1057 'method':28,70,140,143,177,346,886,984,1046 'modern':2,23,38,49,352,368,433,463,517,535,631,840 'modern-javascript':1 'modul':232,646 'monad':1090 'mutat':109,113,169,176,380,384,854,956 'name':263,486,499,502,692,694,769,791,1026 'need':77,925,950 'nest':120,685,796 'new':398,415,623,693,778,898 'node.green':1141 'node.js':10,1138 'non':175,379 'non-mut':174,378 'null':530,882 'null/undefined':146,158,493,541 'nullish':32,128,130,283,471,490,974 'numer':298 'obj':135,137,142,165,211,521,878,884 'obj.count':542 'obj.enabled':547 'obj.hasownproperty':515,864 'obj.prop':159,529,531,533,537,879 'obj.prop.method':880 'object':210,257,669,782,1023 'object.assign':214 'object.fromentries':272 'object.groupby':118,330,467,730,911,1038 'object.hasown':164,306,520,868 'object.values':246,1016 'object.values/entries,':245,1015 'one':87 'oper':241,382,961 'option':30,274,281,964 'order':1087 'origin':385,853 'overhead':862 'overwritten':512,867 'pad':1019 'padstart/padend':248 'parallel':1070 'pass':717 'password':682 'pattern':61,353,553,617,667,781,835,838,1058,1073,1080 'perform':45 'pipe':745,766 'pool':1072 'post':566 'practic':913 'prefer':173,927,982 'prevent':966 'privat':311 'proactiv':4 'problem':839 'process':727,1113 'processus':765 'profil':501 'project':15 'promis':231,554,622,624,634,899,1064 'promise.all':568 'promise.allsettled':286,581 'promise.any':293,600 'promise.finally':261 'promise.race':609 'promise.withresolvers':332,613,637,903,1039 'prone':848,910 'prop':136,885 'proper':1000 'properti':117,133,162,503,673,680,969 'propos':1106 'prototyp':510 'proxi':235 'pure':1081 'purpos':1010,1061 'push':208,459 'quick':65,217,1093 'r':585,657 'r.json':658 'r.reason':593 'r.status':587 'r.value':590 'read':968 'reassign':923 'reduc':97,101 'refactor':25 'refer':218,1004,1008,1059,1095 'references/cheatsheet.md':1091,1092 'references/composition.md':1083,1084 'references/concurrency.md':1068,1069 'references/es2016-es2017.md':1011,1012 'references/es2018-es2019.md':1020,1021 'references/es2022-es2023.md':1028,1029 'references/es2024.md':1036,1037 'references/es2025.md':1043,1044 'references/immutability.md':1076,1077 'references/promises.md':1062,1063 'references/upcoming.md':1051,1052 'regex':427,861 'regexp':262,333,1025,1040 'regexp.escape':349 'rej':626,630,901 'reject':620,629,636 'remov':418,679 'renam':787 'replac':423,857 'replaceal':863 'res':625,628,900 'resiz':336 'resolv':619,627,635 'resourc':1096 'rest':36,802,816 'rest/spread':255,1022 'result':429,436,579,702 'results.foreach':584 'retri':1074 'return':397,461,828 'revers':111,183,187,395,409 'safe':132,139 'secondlast':364,375 'separ':299 'servic':11 'set':345,1045 'settl':605 'sharedarraybuff':251 'short':934 'singl':99,716 'skill':53 'skill-modern-javascript' 'skip':810 'solut':841 'sort':107,178,182,388,402,851 'source-ccheney' 'specif':1097,1099 'splice':188,192 'spread':35,230,960 'stabl':277 'standard':1104 'start':953 'state':689 'state.user':691 'static':315 'status':575 'str.replace':430 'str.replaceall':437 'string':422,942,1018 'string.replaceall':292 'succeed':596 'support':1136 'swap':821 'symbol':233 'syntax':64,1094 'tabl':1137 'tail':819 'take':344 'tc39':1105,1112 'tc39.es':1101,1115 'tc39.es/ecma262/':1100 'tc39.es/process-document/':1114 'templat':37,938 'tempor':1053 'third':814 'timeout':611 'top':308,639,649 'top-level':307,638 'topic-agent-skills' 'topic-clean-architecture' 'topic-domain-driven-design' 'topic-drizzle-orm' 'topic-feature-sliced-design' 'topic-hexagonal-architecture' 'topic-mermaid-diagrams' 'topic-modern-javascript' 'topic-postgres' 'topic-skills' 'topic-slack-block-kit' 'topic-slack-mrkdwn' 'torevers':114,185,321,959,1032 'tosort':110,180,320,710,856,958,1031 'tosplic':190,322 'trail':249 'transform':78,696,699 'treat':873 'tree':67 'trigger':16 'trimstart/end':273 'truthi':551 'try/catch':1001 'u':705,708,721,732,740 'u.active':706,722,733 'u.name':709,723,741 'undefin':532,971 'union':347 'unless':979 'upcom':1110 'updat':193,412,670,675,686,688 'use':48,73,351,711,915,920,937,957,963,973,991,1050,1133 'user':487,500,565,676,684,690,703,731,767,768,771,772,775,776,795,801,806 'user.email.tolowercase':774 'user.name.trim':770 'user.profile':488 'user.profile.name':489 'userdata':805 'usernam':792 'users.flatmap':720 'userwithoutpassword':683 'using/await':350,1049 'v':334,749,752,759,762,1041 'val':197,201 'valid':479 'valu':100,129,148,154,416,480,482,495,869,876 'variabl':822 'verbos':526,845,881,893,907 'version':216,219,1007 'wait':557,571 'web':8,1123 'winner':607 'without':108,112 'write':43 'x':747,753,757,763,830 'y':831 'year':220","prices":[{"id":"e8a0cca5-c85c-4d4b-b379-676ca51d4508","listingId":"6ea2efb2-6cc8-44b6-8b8e-d77863a7e73a","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"ccheney","category":"robust-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:18:45.301Z"}],"sources":[{"listingId":"6ea2efb2-6cc8-44b6-8b8e-d77863a7e73a","source":"github","sourceId":"ccheney/robust-skills/modern-javascript","sourceUrl":"https://github.com/ccheney/robust-skills/tree/main/skills/modern-javascript","isPrimary":false,"firstSeenAt":"2026-04-18T22:18:45.301Z","lastSeenAt":"2026-05-02T00:57:21.013Z"}],"details":{"listingId":"6ea2efb2-6cc8-44b6-8b8e-d77863a7e73a","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"ccheney","slug":"modern-javascript","github":{"repo":"ccheney/robust-skills","stars":39,"topics":["agent-skills","clean-architecture","domain-driven-design","drizzle-orm","feature-sliced-design","hexagonal-architecture","mermaid-diagrams","modern-javascript","postgres","skills","slack-block-kit","slack-mrkdwn","slack-work-objects"],"license":"mit","html_url":"https://github.com/ccheney/robust-skills","pushed_at":"2026-04-27T15:23:12Z","description":"Robust skills for Agents","skill_md_sha":"3eba1c84dbd6188da4522e1616c2d855332b4c79","skill_md_path":"skills/modern-javascript/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/ccheney/robust-skills/tree/main/skills/modern-javascript"},"layout":"multi","source":"github","category":"robust-skills","frontmatter":{"name":"modern-javascript","description":"Proactively apply when creating web applications, Node.js services, or any JavaScript project. Triggers on JavaScript, ES6, ES2020, ES2022, ES2024, modern JS, refactor legacy, array methods, async/await, optional chaining, nullish coalescing, destructuring, spread, rest, template literals, arrow functions, toSorted, toReversed, at, groupBy, Promise, functional programming. Use when writing new JavaScript code, refactoring legacy code, modernizing codebases, implementing functional patterns, or reviewing JS for performance and readability. Modern JavaScript (ES6-ES2025) patterns and best practices."},"skills_sh_url":"https://skills.sh/ccheney/robust-skills/modern-javascript"},"updatedAt":"2026-05-02T00:57:21.013Z"}}