[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C4NK3XYW110MD60MQG6D71":3,"skill-same:01M6C4NK3XYW110MD60MQG6D71":80},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":30,"linkOnly":31,"markdownContent":32,"markdownBody":33,"frontMatter":34,"refName":35,"commitSha":36,"skillDirectory":37,"forksCount":38,"repositoryHtmlUrl":39,"repositoryHomepageUrl":6,"ownerHtmlUrl":40,"ownerBlogUrl":41,"ownerDescription":42,"updatedAt":43,"install":44,"resources":57},"01M6C4NK3XYW110MD60MQG6D71","typescript",null,"WHEN writing or reviewing TypeScript, defining types\u002Fschemas, or building type-safe apps; NOT for JavaScript-only files, framework architecture choices, or bundler configuration; outputs strict, schema-first, production-ready code.","mintuz\u002Fskills","mintuz","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F447031?v=4","01M6BVWJYSVR4XQC9AQCEMWQRG","Adam Bulmer","01M6C4DCXKNYZB281YB3PZDJJG",35,"MIT","https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Ftypescript\u002Fskills\u002Ftypescript\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26,27,28,29],"writing","safe","javascript","architecture","code","framework","Production","first","schema","only","ready","2026-11-10 10:12:30",false,"---\nname: typescript\ndescription: WHEN writing or reviewing TypeScript, defining types\u002Fschemas, or building type-safe apps; NOT for JavaScript-only files, framework architecture choices, or bundler configuration; outputs strict, schema-first, production-ready code.\n---\n\n# TypeScript Best Practices\n\nSchema-first design, strict type safety, and immutable patterns.\n\n## Core Principles\n\n1. **Type safety at all boundaries**: runtime validation (schemas) plus compile-time safety (TypeScript) (`principle-parse-at-the-boundary`).\n2. **Schema-first at trust boundaries**: where data enters the system, define the schema first and derive the type from it (`principle-type-system-discipline`).\n3. **Immutability at the boundary**: never mutate a value a caller owns or a value you have already returned. Local mutation is allowed inside the function that created the value, if the value cannot escape before the function returns.\n4. **Explicit types**: no implicit `any`; strict mode enabled.\n5. **Behaviour over implementation**: focus on contracts and outcomes.\n\n## Rules for Hard Cases\n\n### No schema library is available\n\nA trust boundary still needs a runtime check. When the dependency set is frozen, add no dependency and do not skip the check. Write a decoder that accepts `unknown`. Narrow each field with `typeof`, `Array.isArray`, or a type predicate. Report an invalid value through the failure path the function already contracts, such as a Result variant or a `null` return (`principle-parse-at-the-boundary`).\n\n### Building a collection in a hot path\n\nCreate the accumulator inside the function, append with `push` or assign by key, and return it under a `readonly` type. Do not build a growing collection with `[...accumulator, item]` or `{ ...accumulator, [key]: value }` inside a loop: each step copies the growing accumulator, so the loop becomes quadratic.\n\n### The request or a reused helper mutates in place\n\nWhen a request says \"update it in place\", or a helper that you must reuse writes into its argument, return a new value and leave the caller's value unchanged. Give a mutating helper only a value that you created, and keep the helper's behaviour unchanged for its other callers. When you return a new value against the request's wording, say so in your answer, and state that neither a documented mutable API nor a measured hot path requires mutation.\n\nWhen the caller's contract does require mutation through a documented mutable API or a measured hot path, both mutating and returning a new value break a rule. Write neither as the final patch. Name the conflict between that contract and Core Principle 3, and ask the contract's owner to choose (`principle-rank-sources-by-authority`).\n\n### External data that is not fully documented\n\nValidate every field the source documents. Type each undocumented part as `unknown`; do not guess its field names. State in your answer what the validator does not check, and why, so a reader sees how far validation reaches without reading the code.\n\n### An assertion the type system cannot avoid\n\nNever use `as` to state a fact you have not checked, including a shape that a document, contract, or upstream promise describes. Narrow a value you have just checked with a user-defined type predicate, or with one assertion placed immediately after the check. Name the checked condition in the predicate name or in a comment on the assertion (`principle-type-system-discipline`, `principle-observe-dont-infer`).\n\n## Reference Guides\n\n| Guide                                                 | Read for                                                                                                                                           |\n| ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |\n| [schemas.md](references\u002Fschemas.md)                   | Schema-first patterns; when a schema is required vs optional; trust boundary identification; test data factories with schema validation; schema examples (API responses, business validation) |\n| [types-interfaces.md](references\u002Ftypes-interfaces.md) | Type vs interface; `any` vs `unknown`; type assertions; strict mode and tsconfig.json settings                                                     |\n| [immutability.md](references\u002Fimmutability.md)         | Immutability patterns (spread operators); `readonly`; forbidden array methods; options objects vs positional parameters; boolean parameter anti-patterns; Result types; early returns |\n| [utilities.md](references\u002Futilities.md)               | Branded types for domain concepts; built-in utility types (`Pick`, `Omit`, `Partial`, etc.); custom utility types; code smell tables               |\n| [patterns.md](references\u002Fpatterns.md)                 | Worked examples: schema-first at trust boundaries; internal types without schemas; schema with test factory; Result type; branded types; immutable array operations; options object |\n\n## Decision Trees\n\n### Should I use a schema?\n\n```\nDoes data come from outside the application?\n├── Yes → Schema required\n└── No → Does it have validation rules (format, range, enum)?\n    ├── Yes → Schema required\n    └── No → Is it shared between systems?\n        ├── Yes → Schema required\n        └── No → Type is fine\n```\n\n### Should I use `type` or `interface`?\n\n```\nAm I defining a behavior contract for dependency injection?\n├── Yes → interface\n└── No → type\n```\n\n### Should I use `any` or `unknown`?\n\n```\nNever use any.\nAlways use unknown for truly unknown types.\n```\n\n### Options object or positional parameters?\n\n```\nHow many parameters?\n├── 1-2 → Positional is fine\n└── 3+ → Use options object\n```\n\n## Summary Checklist\n\nBefore committing TypeScript code, verify:\n\n- [ ] Strict mode enabled in tsconfig.json\n- [ ] No `any` types (use `unknown` instead)\n- [ ] Runtime validation at all trust boundaries (API, user input, files), by schema, or by a hand-written decoder when no schema library is available\n- [ ] Where a schema library supplies the validator, the type is derived from the schema (for example `z.infer`) rather than declared a second time\n- [ ] `type` for data, `interface` only for behaviour contracts\n- [ ] All data structures use `readonly` where appropriate\n- [ ] No mutation of caller-owned or already-returned values; any mutation stays inside the function that created the value\n- [ ] Functions with 3+ params use options objects\n- [ ] No boolean positional parameters\n- [ ] Every operation that can fail reports the failure through its own contract (a Result variant, a `null` return, or a documented throw)\n- [ ] Early returns instead of nested conditionals\n- [ ] Test factories validate with schemas\n- [ ] Branded types for domain concepts that shouldn't mix (`principle-type-system-discipline`)\n- [ ] Explicit return types on functions\n","# TypeScript Best Practices\n\nSchema-first design, strict type safety, and immutable patterns.\n\n## Core Principles\n\n1. **Type safety at all boundaries**: runtime validation (schemas) plus compile-time safety (TypeScript) (`principle-parse-at-the-boundary`).\n2. **Schema-first at trust boundaries**: where data enters the system, define the schema first and derive the type from it (`principle-type-system-discipline`).\n3. **Immutability at the boundary**: never mutate a value a caller owns or a value you have already returned. Local mutation is allowed inside the function that created the value, if the value cannot escape before the function returns.\n4. **Explicit types**: no implicit `any`; strict mode enabled.\n5. **Behaviour over implementation**: focus on contracts and outcomes.\n\n## Rules for Hard Cases\n\n### No schema library is available\n\nA trust boundary still needs a runtime check. When the dependency set is frozen, add no dependency and do not skip the check. Write a decoder that accepts `unknown`. Narrow each field with `typeof`, `Array.isArray`, or a type predicate. Report an invalid value through the failure path the function already contracts, such as a Result variant or a `null` return (`principle-parse-at-the-boundary`).\n\n### Building a collection in a hot path\n\nCreate the accumulator inside the function, append with `push` or assign by key, and return it under a `readonly` type. Do not build a growing collection with `[...accumulator, item]` or `{ ...accumulator, [key]: value }` inside a loop: each step copies the growing accumulator, so the loop becomes quadratic.\n\n### The request or a reused helper mutates in place\n\nWhen a request says \"update it in place\", or a helper that you must reuse writes into its argument, return a new value and leave the caller's value unchanged. Give a mutating helper only a value that you created, and keep the helper's behaviour unchanged for its other callers. When you return a new value against the request's wording, say so in your answer, and state that neither a documented mutable API nor a measured hot path requires mutation.\n\nWhen the caller's contract does require mutation through a documented mutable API or a measured hot path, both mutating and returning a new value break a rule. Write neither as the final patch. Name the conflict between that contract and Core Principle 3, and ask the contract's owner to choose (`principle-rank-sources-by-authority`).\n\n### External data that is not fully documented\n\nValidate every field the source documents. Type each undocumented part as `unknown`; do not guess its field names. State in your answer what the validator does not check, and why, so a reader sees how far validation reaches without reading the code.\n\n### An assertion the type system cannot avoid\n\nNever use `as` to state a fact you have not checked, including a shape that a document, contract, or upstream promise describes. Narrow a value you have just checked with a user-defined type predicate, or with one assertion placed immediately after the check. Name the checked condition in the predicate name or in a comment on the assertion (`principle-type-system-discipline`, `principle-observe-dont-infer`).\n\n## Reference Guides\n\n| Guide                                                 | Read for                                                                                                                                           |\n| ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |\n| [schemas.md](references\u002Fschemas.md)                   | Schema-first patterns; when a schema is required vs optional; trust boundary identification; test data factories with schema validation; schema examples (API responses, business validation) |\n| [types-interfaces.md](references\u002Ftypes-interfaces.md) | Type vs interface; `any` vs `unknown`; type assertions; strict mode and tsconfig.json settings                                                     |\n| [immutability.md](references\u002Fimmutability.md)         | Immutability patterns (spread operators); `readonly`; forbidden array methods; options objects vs positional parameters; boolean parameter anti-patterns; Result types; early returns |\n| [utilities.md](references\u002Futilities.md)               | Branded types for domain concepts; built-in utility types (`Pick`, `Omit`, `Partial`, etc.); custom utility types; code smell tables               |\n| [patterns.md](references\u002Fpatterns.md)                 | Worked examples: schema-first at trust boundaries; internal types without schemas; schema with test factory; Result type; branded types; immutable array operations; options object |\n\n## Decision Trees\n\n### Should I use a schema?\n\n```\nDoes data come from outside the application?\n├── Yes → Schema required\n└── No → Does it have validation rules (format, range, enum)?\n    ├── Yes → Schema required\n    └── No → Is it shared between systems?\n        ├── Yes → Schema required\n        └── No → Type is fine\n```\n\n### Should I use `type` or `interface`?\n\n```\nAm I defining a behavior contract for dependency injection?\n├── Yes → interface\n└── No → type\n```\n\n### Should I use `any` or `unknown`?\n\n```\nNever use any.\nAlways use unknown for truly unknown types.\n```\n\n### Options object or positional parameters?\n\n```\nHow many parameters?\n├── 1-2 → Positional is fine\n└── 3+ → Use options object\n```\n\n## Summary Checklist\n\nBefore committing TypeScript code, verify:\n\n- [ ] Strict mode enabled in tsconfig.json\n- [ ] No `any` types (use `unknown` instead)\n- [ ] Runtime validation at all trust boundaries (API, user input, files), by schema, or by a hand-written decoder when no schema library is available\n- [ ] Where a schema library supplies the validator, the type is derived from the schema (for example `z.infer`) rather than declared a second time\n- [ ] `type` for data, `interface` only for behaviour contracts\n- [ ] All data structures use `readonly` where appropriate\n- [ ] No mutation of caller-owned or already-returned values; any mutation stays inside the function that created the value\n- [ ] Functions with 3+ params use options objects\n- [ ] No boolean positional parameters\n- [ ] Every operation that can fail reports the failure through its own contract (a Result variant, a `null` return, or a documented throw)\n- [ ] Early returns instead of nested conditionals\n- [ ] Test factories validate with schemas\n- [ ] Branded types for domain concepts that shouldn't mix (`principle-type-system-discipline`)\n- [ ] Explicit return types on functions\n",{"name":5,"description":7},"main","4e0a12b5048eac78a3ace4feee657873cdd530ef","src\u002Ftypescript\u002Fskills\u002Ftypescript",7,"https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills","https:\u002F\u002Fgithub.com\u002Fmintuz","http:\u002F\u002Fwww.mintuz.com","Working at @monzo, Previously worked at Moonpig, @booking and @bbc","2026-11-13 19:21:11",{"source":8,"skillName":5,"commands":45,"prompt":55,"zipAvailable":56},[46,49,52],{"tool":47,"command":48},"npx","npx skills add mintuz\u002Fskills --skill typescript",{"tool":50,"command":51},"bunx","bunx skills add mintuz\u002Fskills --skill typescript",{"tool":53,"command":54},"pnpm","pnpm dlx skills add mintuz\u002Fskills --skill typescript","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Ftypescript\u002Fskills\u002Ftypescript\u002FSKILL.md",true,[58,64,68,72,76],{"path":59,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":62,"sourceHtmlUrl":63},"references\u002Fimmutability.md","REFERENCE","参考文档",4503,"https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Ftypescript\u002Fskills\u002Ftypescript\u002Freferences\u002Fimmutability.md",{"path":65,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":66,"sourceHtmlUrl":67},"references\u002Fpatterns.md",3729,"https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Ftypescript\u002Fskills\u002Ftypescript\u002Freferences\u002Fpatterns.md",{"path":69,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":70,"sourceHtmlUrl":71},"references\u002Fschemas.md",5185,"https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Ftypescript\u002Fskills\u002Ftypescript\u002Freferences\u002Fschemas.md",{"path":73,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":74,"sourceHtmlUrl":75},"references\u002Ftypes-interfaces.md",3759,"https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Ftypescript\u002Fskills\u002Ftypescript\u002Freferences\u002Ftypes-interfaces.md",{"path":77,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":78,"sourceHtmlUrl":79},"references\u002Futilities.md",4460,"https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Ftypescript\u002Fskills\u002Ftypescript\u002Freferences\u002Futilities.md",[81,104,126,139,160,176],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":95,"publishedAt":30},"01M6C4PDGB6ZZWBS35N3DF7PZZ","xstate","WHEN React state changes in response to an external answer — async submit, in-flight or loading flags, retries, cancellation, polling, optimistic updates, stale responses — or to an interaction with an interruptible middle, such as a drag or a gesture; or WHEN building, reviewing, testing, or visualising XState 5 actors and @xstate\u002Freact integrations; NOT for a value one event sets completely, such as a text draft, a focus flag, or a plain open and closed toggle; models typed lifecycles and renders legal Mermaid stateDiagram-v2 charts.","https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Fxstate\u002FSKILL.md",[87,92],{"categoryNo":88,"categoryName":89,"taxonomyType":90,"taxonomyTypeDesc":91},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":93,"categoryName":94,"taxonomyType":90,"taxonomyTypeDesc":91},"01JBSEEDCAT000000000000009","前端开发",[83,96,97,98,99,100,101,102,103],"react","text","state","integrations","Charts","mermaid","testing","open",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":118,"publishedAt":30},"01M6C4PB6VVC2X19B63B7YNH0T","web-design","WHEN refining UI layout, typography, color, or polish; NOT code implementation; provides concise principles for intentional, legible design.","https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Fweb-design\u002FSKILL.md",[110,115],{"categoryNo":111,"categoryName":112,"taxonomyType":113,"taxonomyTypeDesc":114},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",{"categoryNo":116,"categoryName":117,"taxonomyType":90,"taxonomyTypeDesc":91},"01JBSEEDCAT000000000000015","视觉设计",[119,120,121,122,123,124,125,23],"web","design","web design","code implementation","polish","ui","typography",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":133,"publishedAt":30},"01M6C4P8D92GJDA49V7X1CZXEV","tailwind","USE WHEN writing, fixing or reviewing styling in a project that uses Tailwind CSS, even a one-class change or a request that does not name Tailwind: colours, focus rings, spacing, class names chosen by a prop, map or CVA variants, theme tokens and dark mode in the Tailwind stylesheet or tailwind.config, setup or upgrades (if unsure whether the project uses Tailwind, check package.json or the main stylesheet first); NOT WHEN writing plain CSS or Sass in a project without Tailwind; produces class names Tailwind can find, syntax for the installed major version, visible focus indicators, and no unrequested dependency or invented brand value.","https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Ftailwind\u002FSKILL.md",[132],{"categoryNo":116,"categoryName":117,"taxonomyType":90,"taxonomyTypeDesc":91},[134,135,136,137,120,138],"Tailwind","libraries","component","css","design systems",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":148,"publishedAt":30},"01M6C4P5VWQ69Q32DA0634GDJY","refactoring","WHEN you need a plan to refactor, restructure, or clean up working code and the test result is known, either green or a recorded failing set; NOT for new feature delivery or any behavior change; reversible-baseline safety with prioritized improvements.","https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Frefactoring\u002FSKILL.md",[145],{"categoryNo":146,"categoryName":147,"taxonomyType":90,"taxonomyTypeDesc":91},"01JBSEEDCAT000000000000007","代码审查",[141,149,150,151,152,153,154,155,156,157,23,158,159],"Safety","baseline","refactor","behavior","change","plan","new feature","SET","up","feature delivery","test",{"skillNo":161,"name":96,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":167,"publishedAt":30},"01M6C4P345APEFEX00J8T7QMXQ","USE WHEN changing the logic, data, props, state, Effects or rendered text of a React component, hook or page, even a one-line change; NOT WHEN the request is styling only (class names, Tailwind, CSS, dark mode, spacing, shadows) or tests only, or when it models submit, in-flight, loading, retry or failure states, even for a named React form (xstate covers that, including its React wiring); applies React 19 composition, state, Effect, structure, API and performance rules with only the project's installed libraries.","https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Freact\u002FSKILL.md",[165,166],{"categoryNo":88,"categoryName":89,"taxonomyType":90,"taxonomyTypeDesc":91},{"categoryNo":93,"categoryName":94,"taxonomyType":90,"taxonomyTypeDesc":91},[96,23,137,134,168,102,169,170,22,171,172,98,159,173,174,175],"performance","hooks","components","api","react components","state management","styling","management",{"skillNo":177,"name":178,"nameZh":6,"description":179,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":180,"categories":181,"keywords":184,"publishedAt":30},"01M6C4P0DK385QBG3B3S86TQV2","react-testing","USE WHEN writing, fixing or reviewing a React Testing Library test for a component, hook or context provider, even one small test, or when asked for an end-to-end journey inside a Vitest or React Testing Library suite; NOT WHEN changing the component itself (react), testing XState actors or @xstate\u002Freact (xstate), or writing a Playwright or Cypress test; covers renderHook, providers, async results, forms and false-pass anti-patterns, and declines end-to-end journeys with the testable slices.","https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Freact-testing\u002FSKILL.md",[182,183],{"categoryNo":88,"categoryName":89,"taxonomyType":90,"taxonomyTypeDesc":91},{"categoryNo":93,"categoryName":94,"taxonomyType":90,"taxonomyTypeDesc":91},[185,102,96,186,169,187,188,189,170,190,191,172],"react testing","anti-patterns","e2e","library","testing library","Providers","context"]