├── .gitattributes ├── .gitignore ├── .nvmrc ├── docs ├── code-of-conduct.md ├── contributing.md └── deployment.md ├── notes ├── Carlillo - 1591148366070747347.md ├── Steve8708 - 1605322303319199744.md ├── erikras - 1457999235564154882.md ├── housecor - 1581638360543600640.md ├── housecor - 1586865516395876359.md ├── housecor - 1596861970170671104.md ├── kulkarniankita9 - 1594154991148597250.md ├── mattpocockuk - 1506607945445949446.md ├── mattpocockuk - 1509850662795989005.md ├── mattpocockuk - 1509964736275927042.md ├── mattpocockuk - 1512388535692652547.md ├── mattpocockuk - 1536670032360611840.md ├── mattpocockuk - 1542079199543975937.md ├── mattpocockuk - 1590333383501979649.md ├── mattpocockuk - 1591047557702389760.md ├── mattpocockuk - 1592130978234900484.md ├── mattpocockuk - 1593584053042630657.md ├── mattpocockuk - 1598708710523772929.md ├── mattpocockuk - 1638562171863834625.md ├── mgechev - 1309379618034642946.md ├── mgechev - 1361186013029269506.md ├── mgechev - 1462654597059817481.md ├── sebastienlorber - 1512420374201446405.md ├── stackblitz - 1325818478675304448.md ├── stackblitz - 1328353096179789824.md ├── stackblitz - 1330890655351123968.md ├── sulco - 1160890708615716864.md ├── sulco - 1222507593287028736.md ├── wesbos - 1524040757518258176.md ├── wesbos - 1582803702225989637.md ├── wesbos - 1583093975359315968.md ├── wesbos - 1584905090628034560.md ├── wesbos - 1585258976421224450.md ├── wesbos - 1585641232155348992.md ├── wesbos - 1587082842110033926.md └── wesbos - 1615777112408866832.md ├── package.json ├── readme.md ├── renovate.json ├── videos ├── Steve8708 - 1605322303319199744.mp4 ├── mattpocockuk - 1506607945445949446.mp4 ├── mattpocockuk - 1509850662795989005.mp4 ├── mattpocockuk - 1512388535692652547.mp4 ├── mattpocockuk - 1536670032360611840.mp4 ├── mattpocockuk - 1590333383501979649.mp4 ├── mattpocockuk - 1591047557702389760.mp4 ├── mattpocockuk - 1592130978234900484.mp4 ├── mattpocockuk - 1593584053042630657.mp4 ├── mattpocockuk - 1598708710523772929.mp4 ├── mattpocockuk - 1638562171863834625.mp4 ├── stackblitz - 1325818478675304448.mp4 ├── stackblitz - 1328353096179789824.mp4 ├── stackblitz - 1330890655351123968.mp4 ├── wesbos - 1582803702225989637.mp4 ├── wesbos - 1583093975359315968.mp4 ├── wesbos - 1584905090628034560.mp4 ├── wesbos - 1585258976421224450.mp4 ├── wesbos - 1585641232155348992.mp4 ├── wesbos - 1587082842110033926.mp4 └── wesbos - 1615777112408866832.mp4 └── yarn.lock /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | readme.md merge=union 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .envrc 2 | _site 3 | node_modules -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | lts/* 2 | -------------------------------------------------------------------------------- /docs/code-of-conduct.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of experience, 9 | nationality, personal appearance, race, religion, or sexual identity and 10 | orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at dung@productsway.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at [http://contributor-covenant.org/version/1/4][version] 72 | 73 | [homepage]: http://contributor-covenant.org 74 | [version]: http://contributor-covenant.org/version/1/4/ 75 | -------------------------------------------------------------------------------- /docs/contributing.md: -------------------------------------------------------------------------------- 1 | # Contribution Guidelines 2 | 3 | Please note that this project is released with a 4 | [Contributor Code of Conduct](./code-of-conduct.md). By participating in this 5 | project you agree to abide by its terms. 6 | 7 | --- 8 | 9 | Ensure your pull request adheres to the following guidelines: 10 | 11 | - Make sure you take care of this 12 | - And this as well 13 | - And don't forget to check this 14 | 15 | Thank you for your suggestions! 16 | 17 | ## Updating your PR 18 | 19 | A lot of times, making a PR adhere to the standards above can be difficult. 20 | If the maintainers notice anything that we'd like changed, we'll ask you to 21 | edit your PR before we merge it. There's no need to open a new PR, just edit 22 | the existing one. If you're not sure how to do that, 23 | [here is a guide](https://github.com/RichardLitt/knowledge/blob/master/github/amending-a-commit-guide.md) 24 | on the different ways you can update your PR so that we can merge it. 25 | -------------------------------------------------------------------------------- /docs/deployment.md: -------------------------------------------------------------------------------- 1 | # Deploy to Github Page [Typescript Tips | typescript-tips](https://jellydn.github.io/typescript-tips/) 2 | 3 | ## Step 1: Sync the change from `main` branch to `gh-pages` branch 4 | 5 | ## Step 2: Create index.md from readme.md and replace `.md` with `.html` 6 | 7 | ```sh 8 | cp readme.md to index.md 9 | ``` 10 | 11 | ## Step 3: Change the configuration on \_.config.yaml 12 | 13 | Add all markdown files to the config. For example: 14 | 15 | ```yaml 16 | plugins: 17 | - jekyll-relative-links 18 | relative_links: 19 | enabled: true 20 | collections: true 21 | include: 22 | - Carlillo - 1591148366070747347.md 23 | - mgechev - 1462654597059817481.md 24 | - code-of-conduct.md 25 | - readme.md 26 | - contributing.md 27 | - stackblitz - 1325818478675304448.md 28 | - housecor - 1581638360543600640.md 29 | - stackblitz - 1328353096179789824.md 30 | - housecor - 1586865516395876359.md 31 | - stackblitz - 1330890655351123968.md 32 | - mattpocockuk - 1509964736275927042.md 33 | - sulco - 1160890708615716864.md 34 | - mattpocockuk - 1542079199543975937.md 35 | - wesbos - 1524040757518258176.md 36 | - mattpocockuk - 1591047557702389760.md 37 | - wesbos - 1584905090628034560.md 38 | - mattpocockuk - 1592130978234900484.md 39 | - wesbos - 1585641232155348992.md 40 | - mgechev - 1309379618034642946.md 41 | - wesbos - 1587082842110033926.md 42 | - mgechev - 1361186013029269506.md 43 | ``` 44 | 45 | Please refer to [pages build and deployment · jellydn/typescript-tips@45cd36c](https://github.com/jellydn/typescript-tips/actions/runs/3497633573) 46 | 47 | Credits to [mryap/markdown-to-github-pages: Turn a folder of markdown files into website without using command-line tools](https://github.com/mryap/markdown-to-github-pages) 48 | -------------------------------------------------------------------------------- /notes/Carlillo - 1591148366070747347.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Carlos Caballero" 3 | handle: "@Carlillo" 4 | source: "https://twitter.com/Carlillo/status/1591148366070747347" 5 | date: 2022-11-11T19:18:27.000Z 6 | --- 7 | 8 | ![Carlillo](https://pbs.twimg.com/profile_images/1519684231378653184/jtNtUlUQ_normal.jpg) 9 | Carlos Caballero ([@Carlillo](https://twitter.com/Carlillo)) - November 12, 2022 at 3:18 AM 10 | 11 | [#javascript](https://twitter.com/hashtag/javascript) Tips&Tricks🐸: Use look up tables instead of "if" 12 | 13 | Look tables are a method to avoid repeating "if" control structures in our code. 14 | 15 | [#typescript](https://twitter.com/hashtag/typescript) [#angular](https://twitter.com/hashtag/angular) [#vue](https://twitter.com/hashtag/vue) [#react](https://twitter.com/hashtag/react) [#100DaysOfCode](https://twitter.com/hashtag/100DaysOfCode) [#CodeNewbies](https://twitter.com/hashtag/CodeNewbies) [#developers](https://twitter.com/hashtag/developers) [pic.twitter.com/IKuxkh8CWa](https://twitter.com/Carlillo/status/1591148366070747347/photo/1) 16 | 17 | ![](https://pbs.twimg.com/media/FhTlAQ7XEAcg5y-.jpg) 18 | 19 | [Tweet link](https://twitter.com/Carlillo/status/1591148366070747347) 20 | 21 | [Thread by @Carlillo on Threadify Reader App](https://threadify.productsway.com/thread/1591148366070747347) 22 | -------------------------------------------------------------------------------- /notes/Steve8708 - 1605322303319199744.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Steve (Builder.io)" 3 | handle: "@Steve8708" 4 | source: "https://twitter.com/Steve8708/status/1605322303319199744" 5 | date: 2022-12-20T22:00:37.000Z 6 | --- 7 | 8 | ![Steve8708](https://pbs.twimg.com/profile_images/1579200056090951680/j3-H7soT_normal.jpg) 9 | Steve (Builder.io) ([@Steve8708](https://twitter.com/Steve8708)) - December 21, 2022 at 6:00 AM 10 | 11 | The `satisfies` operator in TypeScript 4.9 is a game changer 12 | 13 | Here is a quick overview of how it compares to a couple alternative ways of annotating types 14 | 15 | Learn more about the `satisfies` operator here: [typescriptlang.org/docs/handbook/…](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-9#the-satisfies-operator) [pic.twitter.com/LSWai5tsPf](https://twitter.com/Steve8708/status/1605322303319199744/video/1) 16 | 17 | https://user-images.githubusercontent.com/870029/209563574-a96bffb7-2b7a-44e2-8b97-b7e9c616460d.mp4 18 | 19 | [Download mp4](../videos/Steve8708%20-%201605322303319199744.mp4) 20 | 21 | [Tweet link](https://twitter.com/Steve8708/status/1605322303319199744) 22 | 23 | [Thread by @Steve8708 on Threadify Reader App](https://threadify.productsway.com/thread/1605322303319199744) 24 | -------------------------------------------------------------------------------- /notes/erikras - 1457999235564154882.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Erik Rasmussen 👨🏻‍💻🇺🇸🇪🇸" 3 | handle: "@erikras" 4 | source: "https://twitter.com/erikras/status/1457999235564154882" 5 | date: 2021-11-09T09:11:20.000Z 6 | --- 7 | 8 | ![erikras](https://pbs.twimg.com/profile_images/1484421794803208192/r2zQ_mx3_normal.jpg) 9 | Erik Rasmussen 👨🏻‍💻🇺🇸🇪🇸 ([@erikras](https://twitter.com/erikras)) - November 9, 2021 at 5:11 PM 10 | 11 | [#TypeScript](https://twitter.com/hashtag/TypeScript) Pro Tip: When passing around unique identifiers of objects, select the type of the identifier right off of the object type. 12 | 13 | - More refactor-proof 🔒 14 | - Less cognitive load 🤯 15 | - Much more legible to others 🧐 [pic.twitter.com/iAUVQBZOdg](https://twitter.com/erikras/status/1457999235564154882/photo/1) 16 | 17 | ![](https://pbs.twimg.com/media/FDvak5QWEAUUK2m.jpg) 18 | 19 | [Tweet link](https://twitter.com/erikras/status/1457999235564154882) 20 | -------------------------------------------------------------------------------- /notes/housecor - 1581638360543600640.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Cory House" 3 | handle: "@housecor" 4 | source: "https://twitter.com/housecor/status/1581638360543600640" 5 | date: 2022-10-16T13:29:05.000Z 6 | --- 7 | 8 | ![housecor](https://pbs.twimg.com/profile_images/1525874017630035970/veQQouGw_normal.jpg) 9 | Cory House ([@housecor](https://twitter.com/housecor)) - October 16, 2022 at 9:29 PM 10 | 11 | TypeScript tip: 12 | 13 | Avoid making a property optional when the property isn’t valid in a certain case. 14 | 15 | Instead, declare 2 separate types, and use Omit to avoid copy/paste. 16 | 17 | Example: Many objects lack an id until they're saved. So declare a separate "Unsaved" type. 18 | 19 | [#typescript](https://twitter.com/hashtag/typescript) [pic.twitter.com/Wzzx3DtYEE](https://twitter.com/housecor/status/1581638360543600640/photo/1) 20 | 21 | ![// Avoid making a property optional to support two separate scenarios. // Doing so redunces type safety. type User = { // Making id optional since unsaved users don't have an id yet. 👎 id?: number; name: string; email: string; } // Instead, declare separate types. Then each scenario is fully type safe. 👍 type User = { id: number; name: string; email: string; } // Separate type for unsaved users. // Deriving from the User type via Omit to keep types clean and lean. type UnsavedUser = Omit;](https://pbs.twimg.com/media/FfMalUHXEAIELCa.jpg) 22 | 23 | [Tweet link](https://twitter.com/housecor/status/1581638360543600640) 24 | 25 | [Thread by @housecor on Threadify Reader App](https://threadify.productsway.com/thread/1581638360543600640) 26 | -------------------------------------------------------------------------------- /notes/housecor - 1586865516395876359.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Cory House" 3 | handle: "@housecor" 4 | source: "https://twitter.com/housecor/status/1586865516395876359" 5 | date: 2022-10-30T23:39:56.000Z 6 | --- 7 | 8 | ![housecor](https://pbs.twimg.com/profile_images/1525874017630035970/veQQouGw_normal.jpg) 9 | Cory House ([@housecor](https://twitter.com/housecor)) - October 31, 2022 at 7:39 AM 10 | 11 | TypeScript tip: Sometimes a type's name conflicts with an existing identifier. 12 | 13 | When this happens, I alias the type's name: 14 | 15 | import { Link as LinkType } from "./types"; [pic.twitter.com/uVENVOqUee](https://twitter.com/housecor/status/1586865516395876359/photo/1) 16 | 17 | ![import { Link } from "react-router-dom"; // Aliasing Link type to avoid conflict with React Router's Link import { Link as LinkType } from "./types/Link.types"; type NavProps = { links: LinkType[]; }; export default function Nav({ links }: NavProps) { return ( ); } ](https://pbs.twimg.com/media/FgWtM9GX0AEgks2.jpg) 18 | 19 | [Tweet link](https://twitter.com/housecor/status/1586865516395876359) 20 | 21 | [Thread by @housecor on Threadify Reader App](https://threadify.productsway.com/thread/1586865516395876359) 22 | -------------------------------------------------------------------------------- /notes/housecor - 1596861970170671104.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Cory House" 3 | handle: "@housecor" 4 | source: "https://twitter.com/housecor/status/1596861970170671104" 5 | date: 2022-11-27T13:42:16.000Z 6 | --- 7 | 8 | ![housecor](https://pbs.twimg.com/profile_images/1525874017630035970/veQQouGw_normal.jpg) 9 | Cory House ([@housecor](https://twitter.com/housecor)) - November 27, 2022 at 9:42 PM 10 | 11 | TypeScript tip: Many optional properties are a code smell. 12 | 13 | Why? Because it reduces type safety. 14 | 15 | Example, I joined a project where every REST API call accepts this same argument. This creates confusion, and hurts type safety. 16 | 17 | Solution? Specify exactly what each call needs. [pic.twitter.com/NEjVi4b2HF](https://twitter.com/housecor/status/1596861970170671104/photo/1) 18 | 19 | ![](https://pbs.twimg.com/media/Fikw9nnXgAAh1iF.png) 20 | 21 | [Tweet link](https://twitter.com/housecor/status/1596861970170671104) 22 | 23 | [Thread by @housecor on Threadify Reader App](https://threadify.productsway.com/thread/1596861970170671104) 24 | -------------------------------------------------------------------------------- /notes/kulkarniankita9 - 1594154991148597250.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Ankita Kulkarni" 3 | handle: "@kulkarniankita9" 4 | source: "https://twitter.com/kulkarniankita9/status/1594154991148597250" 5 | date: 2022-11-20T02:25:42.000Z 6 | --- 7 | 8 | ![kulkarniankita9](https://pbs.twimg.com/profile_images/1579695763508060162/OfUxKy07_normal.jpg) 9 | Ankita Kulkarni ([@kulkarniankita9](https://twitter.com/kulkarniankita9)) - November 20, 2022 at 10:25 AM 10 | 11 | Last week, we learned about the Typescript 4.9 satisfies operator in my weekly newsletter! 12 | 13 | ​In a nutshell, it allows you to check if the type matches one of these listed types. 14 | 15 | For example, 👇 [pic.twitter.com/KnspTZe4uu](https://twitter.com/kulkarniankita9/status/1594154991148597250/photo/1) 16 | 17 | ![](https://pbs.twimg.com/media/Fh-Tg_sXgAE_Q9W.jpg) 18 | 19 | [Tweet link](https://twitter.com/kulkarniankita9/status/1594154991148597250) 20 | 21 | [Thread by @kulkarniankita9 on Threadify Reader App](https://threadify.productsway.com/thread/1594154991148597250) 22 | -------------------------------------------------------------------------------- /notes/mattpocockuk - 1506607945445949446.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Matt Pocock 🏖️" 3 | handle: "@mattpocockuk" 4 | source: "https://twitter.com/mattpocockuk/status/1506607945445949446" 5 | date: 2022-03-23T20:05:24.000Z 6 | --- 7 | 8 | ![mattpocockuk](https://pbs.twimg.com/profile_images/1666460461884211204/SmBm505D_normal.jpg) 9 | Matt Pocock 🏖️ ([@mattpocockuk](https://twitter.com/mattpocockuk)) - March 23, 2022 at 8:25 PM 10 | 11 | 🔥 TypeScript Tip #12 🔥 12 | 13 | Ever wanted just a _bit_ of autocomplete? 14 | 15 | Here, we create a TypeScript helped called LooseAutocomplete which gives us autocomplete while also allowing arbitrary values. 16 | 17 | Picked up this tip from [@GavinRayDev](https://twitter.com/GavinRayDev) - worth a follow! 18 | 19 | 20 | 21 | https://github.com/jellydn/typescript-tips/assets/870029/dcd89b44-71db-4d25-bc33-a0200c89b7f8 22 | 23 | 24 | 25 | [Download mp4](../videos/mattpocockuk%20-%201506607945445949446.mp4) 26 | 27 | [Tweet link](https://twitter.com/mattpocockuk/status/1506607945445949446) 28 | -------------------------------------------------------------------------------- /notes/mattpocockuk - 1509850662795989005.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Matt Pocock 🏖️" 3 | handle: "@mattpocockuk" 4 | source: "https://twitter.com/mattpocockuk/status/1509850662795989005" 5 | date: 2022-04-01T11:10:24.000Z 6 | --- 7 | 8 | ![mattpocockuk](https://pbs.twimg.com/profile_images/1666460461884211204/SmBm505D_normal.jpg) 9 | Matt Pocock 🏖️ ([@mattpocockuk](https://twitter.com/mattpocockuk)) - April 1, 2022 at 7:10 PM 10 | 11 | 🔥 TypeScript Tip #15 🔥 12 | 13 | You can use generics to dynamically specify the number, and type, of arguments to functions. 14 | 15 | Here, we create a sendEvent function which only asks for a payload if it's present on the event you're sending. [pic.twitter.com/vvhYrBX0nR](https://twitter.com/mpocock1/status/1509850662795989005/video/1) 16 | 17 | https://user-images.githubusercontent.com/870029/206737480-2ee2dfe6-b892-446a-8635-aceb814efaa1.mp4 18 | 19 | [Download mp4](../videos/mattpocockuk%20-%201509850662795989005.mp4) 20 | 21 | [Tweet link](https://twitter.com/mattpocockuk/status/1509850662795989005) 22 | 23 | [Thread by @mattpocockuk on Threadify Reader App](https://threadify.productsway.com/thread/1509850662795989005) 24 | -------------------------------------------------------------------------------- /notes/mattpocockuk - 1509964736275927042.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Matt Pocock ✈️ Modern Frontends" 3 | handle: "@mattpocockuk" 4 | source: "https://twitter.com/mattpocockuk/status/1509964736275927042" 5 | date: 2022-04-01T18:43:41.000Z 6 | --- 7 | 8 | ![mattpocockuk](https://pbs.twimg.com/profile_images/1666460461884211204/SmBm505D_normal.jpg) 9 | Matt Pocock ✈️ Modern Frontends ([@mattpocockuk](https://twitter.com/mattpocockuk)) - April 2, 2022 at 2:43 AM 10 | 11 | 🧵 The Ultimate TypeScript Thread 🧵 12 | 13 | Here's everything I've learned from leading TS dev teams and working on XState's core team. 14 | 15 | My goal is to turn you into a TypeScript wizard. 16 | 17 | And yes, this thread is EVERGREEN - I'll add at least 3 more tips a week 🚀 18 | 19 | Let's get started. 20 | 21 | [Tweet link](https://twitter.com/mattpocockuk/status/1509964736275927042) 22 | 23 | [Thread by @mattpocockuk on Threadify Reader App](https://threadify.productsway.com/thread/1509964736275927042) 24 | -------------------------------------------------------------------------------- /notes/mattpocockuk - 1512388535692652547.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Matt Pocock" 3 | handle: "@mattpocockuk" 4 | source: "https://twitter.com/mattpocockuk/status/1512388535692652547" 5 | date: 2022-04-08T11:15:00.000Z 6 | --- 7 | 8 | ![mattpocockuk](https://pbs.twimg.com/profile_images/1597707219176497153/MTGb1VXu_normal.png) 9 | Matt Pocock ([@mattpocockuk](https://twitter.com/mattpocockuk)) - April 8, 2022 at 7:15 PM 10 | 11 | 🔥 TypeScript Tip #18 🔥 12 | 13 | You can do some really, really neat stuff with assertion functions inside classes. 14 | 15 | Here, we assert that the user is logged in and get proper inference on the user's logged in user id. [pic.twitter.com/4XmfKsrsTe](https://twitter.com/mpocock1/status/1512388535692652547/video/1) 16 | 17 | https://user-images.githubusercontent.com/870029/206737808-497086e7-aa9b-4b9d-bb42-af6a56671c33.mp4 18 | 19 | [Download mp4](../videos/mattpocockuk%20-%201512388535692652547.mp4) 20 | 21 | [Tweet link](https://twitter.com/mattpocockuk/status/1512388535692652547) 22 | -------------------------------------------------------------------------------- /notes/mattpocockuk - 1536670032360611840.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Matt Pocock 🏖️" 3 | handle: "@mattpocockuk" 4 | source: "https://twitter.com/mattpocockuk/status/1536670032360611840" 5 | date: 2022-06-14T11:21:00.000Z 6 | --- 7 | 8 | ![mattpocockuk](https://pbs.twimg.com/profile_images/1666460461884211204/SmBm505D_normal.jpg) 9 | Matt Pocock 🏖️ ([@mattpocockuk](https://twitter.com/mattpocockuk)) - June 14, 2022 at 7:21 PM 10 | 11 | 🔥 TypeScript Tip #24 🔥 12 | 13 | Deriving vs Declaring is key to getting the most inference out of your types with as few lines of code as possible. 14 | 15 | But sometimes, you want to _ensure_ that some code conforms to a type without losing its literal values. 16 | 17 | Enter satisfies()() 👀 [pic.twitter.com/j8a9ahdesI](https://twitter.com/mattpocockuk/status/1536670032360611840/video/1) 18 | 19 | https://user-images.githubusercontent.com/870029/206738005-1cda2b29-582e-4d87-b714-daad4383d7ef.mp4 20 | 21 | [Download mp4](../videos/mattpocockuk%20-%201536670032360611840.mp4) 22 | 23 | [Tweet link](https://twitter.com/mattpocockuk/status/1536670032360611840) 24 | -------------------------------------------------------------------------------- /notes/mattpocockuk - 1542079199543975937.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Matt Pocock ✈️ Modern Frontends" 3 | handle: "@mattpocockuk" 4 | source: "https://twitter.com/mattpocockuk/status/1542079199543975937" 5 | date: 2022-06-29T09:35:06.000Z 6 | --- 7 | 8 | ![mattpocockuk](https://pbs.twimg.com/profile_images/1666460461884211204/SmBm505D_normal.jpg) 9 | Matt Pocock ✈️ Modern Frontends ([@mattpocockuk](https://twitter.com/mattpocockuk)) - June 29, 2022 at 5:35 PM 10 | 11 | 🔥 TypeScript Tip 🔥 12 | 13 | Tired of 'as const'? You can use Object.freeze to ensure your objects are readonly at the type level AND the runtime level. [pic.twitter.com/5yGa0AiG7v](https://twitter.com/mattpocockuk/status/1542079199543975937/photo/1) 14 | 15 | ![](https://pbs.twimg.com/media/FWaQTdVWIAI0m1D.jpg) 16 | 17 | [Tweet link](https://twitter.com/mattpocockuk/status/1542079199543975937) 18 | 19 | [Thread by @mattpocockuk on Threadify Reader App](https://threadify.productsway.com/thread/1542079199543975937) 20 | -------------------------------------------------------------------------------- /notes/mattpocockuk - 1590333383501979649.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Matt Pocock 🏖️" 3 | handle: "@mattpocockuk" 4 | source: "https://twitter.com/mattpocockuk/status/1590333383501979649" 5 | date: 2022-11-09T13:20:00.000Z 6 | --- 7 | 8 | ![mattpocockuk](https://pbs.twimg.com/profile_images/1666460461884211204/SmBm505D_normal.jpg) 9 | Matt Pocock 🏖️ ([@mattpocockuk](https://twitter.com/mattpocockuk)) - November 9, 2022 at 9:20 PM 10 | 11 | 🔥 TypeScript Tip 🔥 12 | 13 | Adding things to the global scope in TypeScript can be frustrating - the syntax is a little 'out there'. 14 | 15 | But learning a few of the tricks can help you figure out process.env, the Window interface and just general globals. [pic.twitter.com/5KF7F17H0Y](https://twitter.com/mattpocockuk/status/1590333383501979649/video/1) 16 | 17 | https://user-images.githubusercontent.com/870029/206738329-3d274d84-a09d-4f5c-ae8a-25b283d7ce43.mp4 18 | 19 | [Download mp4](../videos/mattpocockuk%20-%201590333383501979649.mp4) 20 | 21 | [Tweet link](https://twitter.com/mattpocockuk/status/1590333383501979649) 22 | 23 | [Thread by @mattpocockuk on Threadify Reader App](https://threadify.productsway.com/thread/1590333383501979649) 24 | -------------------------------------------------------------------------------- /notes/mattpocockuk - 1591047557702389760.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Matt Pocock ✈️ Modern Frontends" 3 | handle: "@mattpocockuk" 4 | source: "https://twitter.com/mattpocockuk/status/1591047557702389760" 5 | date: 2022-11-11T12:37:52.000Z 6 | --- 7 | 8 | ![mattpocockuk](https://pbs.twimg.com/profile_images/1666460461884211204/SmBm505D_normal.jpg) 9 | Matt Pocock ✈️ Modern Frontends ([@mattpocockuk](https://twitter.com/mattpocockuk)) - November 11, 2022 at 8:37 PM 10 | 11 | 🔥 TypeScript Tip 🔥 12 | 13 | If you're feeling like a function you're writing is lacking flexibility, try PASSING IT A FUNCTION. 14 | 15 | This is called 'Inversion of control', and it lets you write dainty little API's which give full control over to the users of your function. [pic.twitter.com/OQnuIMkWV4](https://twitter.com/mattpocockuk/status/1591047557702389760/video/1) 16 | 17 | https://user-images.githubusercontent.com/870029/206738481-8f0f8729-2ef1-4b1f-8ad4-4cdd801bcbaa.mp4 18 | 19 | [Download mp4](../videos/mattpocockuk%20-%201591047557702389760.mp4) 20 | 21 | [Tweet link](https://twitter.com/mattpocockuk/status/1591047557702389760) 22 | 23 | [Thread by @mattpocockuk on Threadify Reader App](https://threadify.productsway.com/thread/1591047557702389760) 24 | -------------------------------------------------------------------------------- /notes/mattpocockuk - 1592130978234900484.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Matt Pocock ✈️ Modern Frontends" 3 | handle: "@mattpocockuk" 4 | source: "https://twitter.com/mattpocockuk/status/1592130978234900484" 5 | date: 2022-11-14T12:23:00.000Z 6 | --- 7 | 8 | ![mattpocockuk](https://pbs.twimg.com/profile_images/1666460461884211204/SmBm505D_normal.jpg) 9 | Matt Pocock ✈️ Modern Frontends ([@mattpocockuk](https://twitter.com/mattpocockuk)) - November 14, 2022 at 8:23 PM 10 | 11 | 🔥 TypeScript Tip 🔥 12 | 13 | Using union types can make your types more accurate, but each approach has pro's and con's. 14 | 15 | Here, we compare a normal union, a discriminated union, and a type predicate. Which do you prefer? [pic.twitter.com/5GWhRk6TlF](https://twitter.com/mattpocockuk/status/1592130978234900484/video/1) 16 | 17 | https://user-images.githubusercontent.com/870029/206738595-d59a5559-537f-4696-98c4-33fde48aaaa5.mp4 18 | 19 | [Download mp4](../videos/mattpocockuk%20-%201592130978234900484.mp4) 20 | 21 | [Tweet link](https://twitter.com/mattpocockuk/status/1592130978234900484) 22 | 23 | [Thread by @mattpocockuk on Threadify Reader App](https://threadify.productsway.com/thread/1592130978234900484) 24 | -------------------------------------------------------------------------------- /notes/mattpocockuk - 1593584053042630657.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Matt Pocock ✈️ Modern Frontends" 3 | handle: "@mattpocockuk" 4 | source: "https://twitter.com/mattpocockuk/status/1593584053042630657" 5 | date: 2022-11-18T12:37:00.000Z 6 | --- 7 | 8 | ![mattpocockuk](https://pbs.twimg.com/profile_images/1666460461884211204/SmBm505D_normal.jpg) 9 | Matt Pocock ✈️ Modern Frontends ([@mattpocockuk](https://twitter.com/mattpocockuk)) - November 18, 2022 at 8:37 PM 10 | 11 | 🔥 TypeScript Tip 🔥 12 | 13 | Got a utility type like Maybe that you just want to use everywhere without importing it? 14 | 15 | Stick it in a declare global {}, and boom - it's global! [pic.twitter.com/7bdfVTi8cl](https://twitter.com/mattpocockuk/status/1593584053042630657/video/1) 16 | 17 | https://user-images.githubusercontent.com/870029/206738699-e03169a6-ca2e-4ce0-a1b3-57db55d922a1.mp4 18 | 19 | [Download mp4](../videos/mattpocockuk%20-%201593584053042630657.mp4) 20 | 21 | [Tweet link](https://twitter.com/mattpocockuk/status/1593584053042630657) 22 | 23 | [Thread by @mattpocockuk on Threadify Reader App](https://threadify.productsway.com/thread/1593584053042630657) 24 | -------------------------------------------------------------------------------- /notes/mattpocockuk - 1598708710523772929.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Matt Pocock" 3 | handle: "@mattpocockuk" 4 | source: "https://twitter.com/mattpocockuk/status/1598708710523772929" 5 | date: 2022-12-02T16:00:33.000Z 6 | --- 7 | 8 | ![mattpocockuk](https://pbs.twimg.com/profile_images/1597707219176497153/MTGb1VXu_normal.png) 9 | Matt Pocock ([@mattpocockuk](https://twitter.com/mattpocockuk)) - December 3, 2022 at 12:00 AM 10 | 11 | 🔥 TypeScript Tip 🔥 12 | 13 | Checking out TS codebases like [@excalidraw](https://twitter.com/excalidraw)'s has been so enlightening - especially how many of them are using 'as const' over enums. [pic.twitter.com/zIuvuNPWyJ](https://twitter.com/mattpocockuk/status/1598708710523772929/video/1) 14 | 15 | https://user-images.githubusercontent.com/870029/206738786-8df81b9c-df34-4785-95c2-09864403fb7d.mp4 16 | 17 | [Download mp4](../videos/mattpocockuk%20-%201598708710523772929.mp4) 18 | 19 | [Tweet link](https://twitter.com/mattpocockuk/status/1598708710523772929) 20 | 21 | [Thread by @mattpocockuk on Threadify Reader App](https://threadify.productsway.com/thread/1598708710523772929) 22 | -------------------------------------------------------------------------------- /notes/mattpocockuk - 1638562171863834625.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Matt Pocock" 3 | handle: "@mattpocockuk" 4 | source: "https://twitter.com/mattpocockuk/status/1638562171863834625" 5 | date: 2023-03-22T15:23:59.000Z 6 | --- 7 | 8 | ![mattpocockuk](https://pbs.twimg.com/profile_images/1597707219176497153/MTGb1VXu_normal.png) 9 | Matt Pocock ([@mattpocockuk](https://twitter.com/mattpocockuk)) - March 22, 2023 at 11:23 PM 10 | 11 | Compound Components in React are SUPER easy to type in TS. 12 | 13 | I was always a bit scared of using them, but thanks to some magic from the TS team they're gorgeous to work with. [pic.twitter.com/gTxMll4FrO](https://twitter.com/mattpocockuk/status/1638562171863834625/video/1) 14 | 15 | 16 | 17 | https://user-images.githubusercontent.com/870029/229268079-2f7ed2bf-ecb3-49d4-befe-670aff1daa19.mp4 18 | 19 | 20 | [Download mp4](../videos/mattpocockuk%20-%201638562171863834625.mp4) 21 | 22 | [Tweet link](https://twitter.com/mattpocockuk/status/1638562171863834625) 23 | 24 | [Thread by @mattpocockuk on Threadify Reader App](https://threadify.productsway.com/thread/1638562171863834625) 25 | -------------------------------------------------------------------------------- /notes/mgechev - 1309379618034642946.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Minko Gechev (@mgechev@mstdn.social)" 3 | handle: "@mgechev" 4 | source: "https://twitter.com/mgechev/status/1309379618034642946" 5 | date: 2020-09-25T06:30:02.000Z 6 | --- 7 | 8 | ![mgechev](https://pbs.twimg.com/profile_images/1541061664098947073/kUH07uES_normal.jpg) 9 | Minko Gechev (@mgechev@mstdn.social) ([@mgechev](https://twitter.com/mgechev)) - September 25, 2020 at 2:30 PM 10 | 11 | Tip: const enums in TypeScript don't let you specify values at runtime, but using them you can get smaller production bundles. [pic.twitter.com/aiRS4UKeto](https://twitter.com/mgechev/status/1309379618034642946/photo/1) 12 | 13 | ![](https://pbs.twimg.com/media/EivZ0pZXcAIrbzH.jpg) 14 | 15 | [Tweet link](https://twitter.com/mgechev/status/1309379618034642946) 16 | 17 | [Thread by @mgechev on Threadify Reader App](https://threadify.productsway.com/thread/1309379618034642946) 18 | -------------------------------------------------------------------------------- /notes/mgechev - 1361186013029269506.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Minko Gechev (@mgechev@mstdn.social)" 3 | handle: "@mgechev" 4 | source: "https://twitter.com/mgechev/status/1361186013029269506" 5 | date: 2021-02-15T05:30:09.000Z 6 | --- 7 | 8 | ![mgechev](https://pbs.twimg.com/profile_images/1541061664098947073/kUH07uES_normal.jpg) 9 | Minko Gechev (@mgechev@mstdn.social) ([@mgechev](https://twitter.com/mgechev)) - February 15, 2021 at 1:30 PM 10 | 11 | TypeScript tip: Use labeled tuple elements to get better hints from your text editor or IDE when working with tuples. This feature is available in TypeScript 4.0 and newer. ✨ [pic.twitter.com/fsdWyE3tqN](https://twitter.com/mgechev/status/1361186013029269506/photo/1) 12 | 13 | ![](https://pbs.twimg.com/media/EuPndvrXYAAH4P5.jpg) 14 | 15 | [Tweet link](https://twitter.com/mgechev/status/1361186013029269506) 16 | 17 | [Thread by @mgechev on Threadify Reader App](https://threadify.productsway.com/thread/1361186013029269506) 18 | -------------------------------------------------------------------------------- /notes/mgechev - 1462654597059817481.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Minko Gechev (@mgechev@mstdn.social)" 3 | handle: "@mgechev" 4 | source: "https://twitter.com/mgechev/status/1462654597059817481" 5 | date: 2021-11-22T05:30:05.000Z 6 | --- 7 | 8 | ![mgechev](https://pbs.twimg.com/profile_images/1541061664098947073/kUH07uES_normal.jpg) 9 | Minko Gechev (@mgechev@mstdn.social) ([@mgechev](https://twitter.com/mgechev)) - November 22, 2021 at 1:30 PM 10 | 11 | TypeScript tip: use `as const` after literals to: 12 | ‣ Recursively set object properties to readonly 13 | ‣ Make arrays readonly tuples 14 | ‣ Disable type widening [pic.twitter.com/uDjNeUnK2U](https://twitter.com/mgechev/status/1462654597059817481/photo/1) 15 | 16 | ![](https://pbs.twimg.com/media/FExkmmVXMAUI7AN.jpg) 17 | 18 | [Tweet link](https://twitter.com/mgechev/status/1462654597059817481) 19 | 20 | [Thread by @mgechev on Threadify Reader App](https://threadify.productsway.com/thread/1462654597059817481) 21 | -------------------------------------------------------------------------------- /notes/sebastienlorber - 1512420374201446405.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Sebastien Lorber • ⚛️ ThisWeekInReact.com 📨" 3 | handle: "@sebastienlorber" 4 | source: "https://twitter.com/sebastienlorber/status/1512420374201446405" 5 | date: 2022-04-08T13:21:31.000Z 6 | --- 7 | 8 | ![sebastienlorber](https://pbs.twimg.com/profile_images/573206276819140608/gKAusMeX_normal.jpeg) 9 | Sebastien Lorber • ⚛️ ThisWeekInReact.com 📨 ([@sebastienlorber](https://twitter.com/sebastienlorber)) - April 8, 2022 at 9:21 PM 10 | 11 | React + TypeScript tip 12 | 13 | No need to import DOM event handler types 14 | 15 | This always works and is easy to remember [pic.twitter.com/oRwYFg492t](https://twitter.com/sebastienlorber/status/1512420374201446405/photo/1) 16 | 17 | ![](https://pbs.twimg.com/media/FP0yFXbWQAwZowN.jpg) 18 | 19 | [Tweet link](https://twitter.com/sebastienlorber/status/1512420374201446405) 20 | 21 | [Thread by @sebastienlorber on Threadify Reader App](https://threadify.productsway.com/thread/1512420374201446405) 22 | -------------------------------------------------------------------------------- /notes/stackblitz - 1325818478675304448.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "StackBlitz" 3 | handle: "@stackblitz" 4 | source: "https://twitter.com/stackblitz/status/1325818478675304448" 5 | date: 2020-11-09T15:12:12.000Z 6 | --- 7 | 8 | ![stackblitz](https://pbs.twimg.com/profile_images/1579877335188221967/nadl7xwv_normal.jpg) 9 | StackBlitz ([@stackblitz](https://twitter.com/stackblitz)) - November 9, 2020 at 11:12 PM 10 | 11 | 💡 TypeScript tip: 12 | 13 | TypeScript infers array's type as an Array of the union of included types... which may not be precise enough. 14 | 15 | If you want this value to be inferred as a Tuple instead, add `as const` [pic.twitter.com/mLbG6yXuKX](https://twitter.com/stackblitz/status/1325818478675304448/video/1) 16 | 17 | https://user-images.githubusercontent.com/870029/208133398-a7d56091-baf8-452a-a452-7f184229a7fb.mp4 18 | 19 | [Download mp4](../videos/stackblitz%20-%201325818478675304448.mp4) 20 | 21 | [Tweet link](https://twitter.com/stackblitz/status/1325818478675304448) 22 | 23 | [Thread by @stackblitz on Threadify Reader App](https://threadify.productsway.com/thread/1325818478675304448) 24 | -------------------------------------------------------------------------------- /notes/stackblitz - 1328353096179789824.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "StackBlitz" 3 | handle: "@stackblitz" 4 | source: "https://twitter.com/stackblitz/status/1328353096179789824" 5 | date: 2020-11-16T15:03:52.000Z 6 | --- 7 | 8 | ![stackblitz](https://pbs.twimg.com/profile_images/1579877335188221967/nadl7xwv_normal.jpg) 9 | StackBlitz ([@stackblitz](https://twitter.com/stackblitz)) - November 16, 2020 at 11:03 PM 10 | 11 | 💡 TypeScript tip (6): 12 | 13 | If your function/class will work with multiple types but they need to meet some minimal criteria, you can specify the minimal shape a generic must have by extending it: 14 | 15 | `` [pic.twitter.com/F74tddnmdU](https://twitter.com/stackblitz/status/1328353096179789824/video/1) 16 | 17 | https://user-images.githubusercontent.com/870029/208133765-cdc499ec-1783-49bc-8bd3-82d4bb37f8ef.mp4 18 | 19 | [Download mp4](../videos/stackblitz%20-%201328353096179789824.mp4) 20 | 21 | [Tweet link](https://twitter.com/stackblitz/status/1328353096179789824) 22 | 23 | [Thread by @stackblitz on Threadify Reader App](https://threadify.productsway.com/thread/1328353096179789824) 24 | -------------------------------------------------------------------------------- /notes/stackblitz - 1330890655351123968.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "StackBlitz" 3 | handle: "@stackblitz" 4 | source: "https://twitter.com/stackblitz/status/1330890655351123968" 5 | date: 2020-11-23T15:07:13.000Z 6 | --- 7 | 8 | ![stackblitz](https://pbs.twimg.com/profile_images/1579877335188221967/nadl7xwv_normal.jpg) 9 | StackBlitz ([@stackblitz](https://twitter.com/stackblitz)) - November 23, 2020 at 11:07 PM 10 | 11 | 💡 TypeScript tip (8): 12 | 13 | If you want to make sure no-one mutates your array, make it `readonly`: [pic.twitter.com/QCeIcTC7zD](https://twitter.com/stackblitz/status/1330890655351123968/video/1) 14 | 15 | https://user-images.githubusercontent.com/870029/208133936-cbb0dfec-14c9-4b96-aec8-ca584daa469b.mp4 16 | 17 | [Download mp4](../videos/stackblitz%20-%201330890655351123968.mp4) 18 | 19 | [Tweet link](https://twitter.com/stackblitz/status/1330890655351123968) 20 | 21 | [Thread by @stackblitz on Threadify Reader App](https://threadify.productsway.com/thread/1330890655351123968) 22 | -------------------------------------------------------------------------------- /notes/sulco - 1160890708615716864.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Tomek Sułkowski" 3 | handle: "@sulco" 4 | source: "https://twitter.com/sulco/status/1160890708615716864" 5 | date: 2019-08-12T12:28:07.000Z 6 | --- 7 | 8 | ![sulco](https://pbs.twimg.com/profile_images/799913500600598528/z4Wctlai_normal.jpg) 9 | Tomek Sułkowski ([@sulco](https://twitter.com/sulco)) - August 12, 2019 at 8:28 PM 10 | 11 | [#React](https://twitter.com/hashtag/React) [#Typescript](https://twitter.com/hashtag/Typescript) tip for today: 12 | 13 | You don't have to export component's prop type/interface - when you need it you can extract it from a component using the handy `ComponentProps` generic. [pic.twitter.com/pGPECfibkL](https://twitter.com/sulco/status/1160890708615716864/photo/1) 14 | 15 | ![](https://pbs.twimg.com/media/EBxP6QQW4AQMAhz.jpg) 16 | 17 | [Tweet link](https://twitter.com/sulco/status/1160890708615716864) 18 | 19 | [Thread by @sulco on Threadify Reader App](https://threadify.productsway.com/thread/1160890708615716864) 20 | -------------------------------------------------------------------------------- /notes/sulco - 1222507593287028736.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Tomek Sułkowski" 3 | handle: "@sulco" 4 | source: "https://twitter.com/sulco/status/1222507593287028736" 5 | date: 2020-01-29T13:11:37.000Z 6 | --- 7 | 8 | ![sulco](https://pbs.twimg.com/profile_images/799913500600598528/z4Wctlai_normal.jpg) 9 | Tomek Sułkowski ([@sulco](https://twitter.com/sulco)) - January 29, 2020 at 9:11 PM 10 | 11 | [#TypeScript](https://twitter.com/hashtag/TypeScript) tip for today: 12 | 13 | `keyof` gets a union type of all properties of the given object – useful for defining params for sorting, filtering, etc. [pic.twitter.com/nqlWC5POhx](https://twitter.com/sulco/status/1222507593287028736/photo/1) 14 | 15 | ![](https://pbs.twimg.com/media/EPc4LB-X4AM19Sh.jpg) 16 | 17 | [Tweet link](https://twitter.com/sulco/status/1222507593287028736) 18 | 19 | [Thread by @sulco on Threadify Reader App](https://threadify.productsway.com/thread/1222507593287028736) 20 | -------------------------------------------------------------------------------- /notes/wesbos - 1524040757518258176.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Wes Bos" 3 | handle: "@wesbos" 4 | source: "https://twitter.com/wesbos/status/1524040757518258176" 5 | date: 2022-05-10T14:56:46.000Z 6 | --- 7 | 8 | ![wesbos](https://pbs.twimg.com/profile_images/877525007185858562/7G9vGTca_normal.jpg) 9 | Wes Bos ([@wesbos](https://twitter.com/wesbos)) - May 10, 2022 at 10:56 PM 10 | 11 | 🔥 Four ways to define an object type in TypeScript [pic.twitter.com/km4PQ4nMWl](https://twitter.com/wesbos/status/1524040757518258176/photo/1) 12 | 13 | ![// 1. We can manually define the keys with an interface or type interface Sizes { small: number; medium: number; large: number; } // 2. We can use the keys to define the types from a union type SizeList = 'small' | 'medium' | 'large'; interface Sizes2 { [key in SizeList]: number; } // 3. A record does exactly as above, but puts it into a utility function type Sizes3 = Record; // 4. We can even make our own with Generics! let's step through what all this means type MakeRecord = { [Prop in Keys]: ValType; } // 1. The key of an object can be a string, number, or symbol // 2. The value of an object can be any type, we pass it in as a generic ValType // 3. Loop over each key and set as a property on the type // 4. ValType will be whatever we pass in - in our case `number` type sizes4 = MakeRecord;](https://pbs.twimg.com/media/FSZ62g9XsAYbOSH.jpg) 14 | 15 | [Tweet link](https://twitter.com/wesbos/status/1524040757518258176) 16 | 17 | [Thread by @wesbos on Threadify Reader App](https://threadify.productsway.com/thread/1524040757518258176) 18 | -------------------------------------------------------------------------------- /notes/wesbos - 1582803702225989637.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Wes Bos" 3 | handle: "@wesbos" 4 | source: "https://twitter.com/wesbos/status/1582803702225989637" 5 | date: 2022-10-19T18:39:44.000Z 6 | --- 7 | 8 | ![wesbos](https://pbs.twimg.com/profile_images/877525007185858562/7G9vGTca_normal.jpg) 9 | Wes Bos ([@wesbos](https://twitter.com/wesbos)) - October 20, 2022 at 2:39 AM 10 | 11 | 🔥 Quickly add all properties to a typed object in TypeScript with the ts-quickfixes extension [pic.twitter.com/3mfwTYqPVX](https://twitter.com/wesbos/status/1582803702225989637/video/1) 12 | 13 | https://user-images.githubusercontent.com/870029/209562138-5c5c6076-ddd2-4a67-93aa-fd5173a2bc59.mp4 14 | 15 | [Download mp4](../videos/wesbos%20-%201582803702225989637.mp4) 16 | 17 | [Tweet link](https://twitter.com/wesbos/status/1582803702225989637) 18 | 19 | [Thread by @wesbos on Threadify Reader App](https://threadify.productsway.com/thread/1524040757518258176) 20 | -------------------------------------------------------------------------------- /notes/wesbos - 1583093975359315968.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Wes Bos" 3 | handle: "@wesbos" 4 | source: "https://twitter.com/wesbos/status/1583093975359315968" 5 | date: 2022-10-20T13:53:10.000Z 6 | --- 7 | 8 | ![wesbos](https://pbs.twimg.com/profile_images/877525007185858562/7G9vGTca_normal.jpg) 9 | Wes Bos ([@wesbos](https://twitter.com/wesbos)) - October 20, 2022 at 9:53 PM 10 | 11 | 🔥 TypeScript has a bunch of super handy commands for refactoring your codebase - made available in most editors [pic.twitter.com/zvifLo6MQJ](https://twitter.com/wesbos/status/1583093975359315968/video/1) 12 | 13 | https://user-images.githubusercontent.com/870029/209562259-edc7ee75-b883-4079-b5f7-d7784d830245.mp4 14 | 15 | [Download mp4](../videos/wesbos%20-%201583093975359315968.mp4) 16 | 17 | [Tweet link](https://twitter.com/wesbos/status/1583093975359315968) 18 | 19 | [Thread by @wesbos on Threadify Reader App](https://threadify.productsway.com/thread/1583093975359315968) 20 | -------------------------------------------------------------------------------- /notes/wesbos - 1584905090628034560.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Wes Bos" 3 | handle: "@wesbos" 4 | source: "https://twitter.com/wesbos/status/1584905090628034560" 5 | date: 2022-10-25T13:49:54.000Z 6 | --- 7 | 8 | ![wesbos](https://pbs.twimg.com/profile_images/877525007185858562/7G9vGTca_normal.jpg) 9 | Wes Bos ([@wesbos](https://twitter.com/wesbos)) - October 25, 2022 at 9:49 PM 10 | 11 | 🔥 The difference between `any` and `unknown` in TypeScript: [pic.twitter.com/L7MZ3tblf3](https://twitter.com/wesbos/status/1584905090628034560/video/1) 12 | 13 | https://user-images.githubusercontent.com/870029/209562299-c6f00482-1670-4027-bada-7ec930d2f242.mp4 14 | 15 | [Download mp4](../videos/wesbos%20-%201584905090628034560.mp4) 16 | 17 | [Tweet link](https://twitter.com/wesbos/status/1584905090628034560) 18 | 19 | [Thread by @wesbos on Threadify Reader App](https://threadify.productsway.com/thread/1584905090628034560) 20 | -------------------------------------------------------------------------------- /notes/wesbos - 1585258976421224450.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Wes Bos" 3 | handle: "@wesbos" 4 | source: "https://twitter.com/wesbos/status/1585258976421224450" 5 | date: 2022-10-26T13:16:07.000Z 6 | --- 7 | 8 | ![wesbos](https://pbs.twimg.com/profile_images/877525007185858562/7G9vGTca_normal.jpg) 9 | Wes Bos ([@wesbos](https://twitter.com/wesbos)) - October 26, 2022 at 9:16 PM 10 | 11 | 🔥 You can create a Type Guard in TypeScript by using the `is` keyword in a functions return type. [pic.twitter.com/SM1Dghwg7F](https://twitter.com/wesbos/status/1585258976421224450/video/1) 12 | 13 | https://user-images.githubusercontent.com/870029/209562348-b6f47031-ab84-48bd-a694-f68dd916d7e5.mp4 14 | 15 | [Download mp4](../videos/wesbos%20-%201585258976421224450.mp4) 16 | 17 | [Tweet link](https://twitter.com/wesbos/status/1585258976421224450) 18 | 19 | [Thread by @wesbos on Threadify Reader App](https://threadify.productsway.com/thread/1585258976421224450) 20 | -------------------------------------------------------------------------------- /notes/wesbos - 1585641232155348992.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Wes Bos" 3 | handle: "@wesbos" 4 | source: "https://twitter.com/wesbos/status/1585641232155348992" 5 | date: 2022-10-27T14:35:04.000Z 6 | --- 7 | 8 | ![wesbos](https://pbs.twimg.com/profile_images/877525007185858562/7G9vGTca_normal.jpg) 9 | Wes Bos ([@wesbos](https://twitter.com/wesbos)) - October 27, 2022 at 10:35 PM 10 | 11 | 🔥 TypeScript's `never` is great for making sure you hit every scenario when coding an if/else or switch statement [pic.twitter.com/KixYd4jWMZ](https://twitter.com/wesbos/status/1585641232155348992/video/1) 12 | 13 | https://user-images.githubusercontent.com/870029/209562401-48fc3880-b038-4087-856a-fa278c9fbdeb.mp4 14 | 15 | [Download mp4](../videos/wesbos%20-%201585641232155348992.mp4) 16 | 17 | [Tweet link](https://twitter.com/wesbos/status/1585641232155348992) 18 | 19 | [Thread by @wesbos on Threadify Reader App](https://threadify.productsway.com/thread/1585641232155348992) 20 | -------------------------------------------------------------------------------- /notes/wesbos - 1587082842110033926.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Wes Bos" 3 | handle: "@wesbos" 4 | source: "https://twitter.com/wesbos/status/1587082842110033926" 5 | date: 2022-10-31T14:03:30.000Z 6 | --- 7 | 8 | ![wesbos](https://pbs.twimg.com/profile_images/877525007185858562/7G9vGTca_normal.jpg) 9 | Wes Bos ([@wesbos](https://twitter.com/wesbos)) - October 31, 2022 at 10:03 PM 10 | 11 | 🔥 Use TypeScript's `never` to enforce "one or the other" properties on a type [pic.twitter.com/2Qje7tpVmG](https://twitter.com/wesbos/status/1587082842110033926/video/1) 12 | 13 | https://user-images.githubusercontent.com/870029/209562463-7dc7824f-1117-4b8b-8c9b-a476d14d70e6.mp4 14 | 15 | [Download mp4](../videos/wesbos%20-%201587082842110033926.mp4) 16 | 17 | [Tweet link](https://twitter.com/wesbos/status/1587082842110033926) 18 | 19 | [Thread by @wesbos on Threadify Reader App](https://threadify.productsway.com/thread/1587082842110033926) 20 | -------------------------------------------------------------------------------- /notes/wesbos - 1615777112408866832.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: "Wes Bos" 3 | handle: "@wesbos" 4 | source: "https://twitter.com/wesbos/status/1615777112408866832" 5 | date: 2023-01-18T18:24:17.000Z 6 | --- 7 | 8 | ![wesbos](https://pbs.twimg.com/profile_images/877525007185858562/7G9vGTca_normal.jpg) 9 | Wes Bos ([@wesbos](https://twitter.com/wesbos)) - January 19, 2023 at 2:24 AM 10 | 11 | 🔥 4 TypeScript tips in context of when you would use them. as const, typeof, keyof and template string types [pic.twitter.com/HaNfZcbQMX](https://twitter.com/wesbos/status/1615777112408866832/video/1) 12 | 13 | 14 | https://user-images.githubusercontent.com/870029/232818557-05788124-23bf-42e4-9be1-aeb4aa295c4e.mp4 15 | 16 | 17 | [Download mp4](../videos/wesbos%20-%201615777112408866832.mp4) 18 | 19 | [Tweet link](https://twitter.com/wesbos/status/1615777112408866832) 20 | 21 | [Thread by @wesbos on Threadify Reader App](https://threadify.productsway.com/thread/1615777112408866832) 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typescript-tips", 3 | "version": "0.1.0", 4 | "main": "index.js", 5 | "repository": "https://github.com/jellydn/typescript-tips.git", 6 | "author": "Huynh Duc Dung ", 7 | "license": "MIT", 8 | "scripts": { 9 | "build": "npx @11ty/eleventy" 10 | }, 11 | "devDependencies": { 12 | "@11ty/eleventy": "2.0.1" 13 | } 14 | } -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Typescript Tips [![Awesome](https://awesome.re/badge.svg)](https://awesome.re) 2 | 3 | > A curated list of awesome 🔥 TypeScript Tips 🔥 4 | 5 | If you enjoy TypeScript and really want to use Typesafe, you can check [awesome-typesafe](https://github.com/jellydn/awesome-typesafe) 6 | 7 | ## 🏠 [Homepage](https://github.com/jellydn/typescript-tips) 8 | 9 | ### ✨ [Gitbook](https://productsway.gitbook.io/typescript-tips/) 10 | 11 | ## Contents 12 | 13 | - [Tips](#tips) 14 | - [Matt Pocock](#matt-pocock) 15 | - [Wes Bos](#wes-bos) 16 | - [Erik Rasmussen](#erik-rasmussen) 17 | - [Carlos Caballero](#carlos-caballero) 18 | - [Ankita Kulkarni](#ankita-kulkarni) 19 | - [Minko Gechev](#minko-gechev) 20 | - [Cory House](#cory-house) 21 | - [Tomek Sułkowski](#tomek-sułkowski) 22 | - [Sebastien Lorber](#sebastien-lorber) 23 | - [Steve (Builder.io)](#steve-builderio) 24 | - [StackBlitz](#stackblitz) 25 | - [Extending existing types](#extending-existing-types) 26 | - [Built-in types](#built-in-types) 27 | - [Contribute](#contribute) 28 | - [Twitter to markdown file](#twitter-to-markdown-file) 29 | - [Credits](#credits) 30 | 31 | ## Tips 32 | 33 | ### Matt Pocock 34 | 35 | - [TypeScript Tips Series](https://www.totaltypescript.com/tips) 36 | - [LooseAutocomplete]() 37 | - [Normal union, a discriminated union, and a type predicate](notes/mattpocockuk%20-%201592130978234900484.md) 38 | - [Enter satisfies()() 👀](notes/mattpocockuk%20-%201536670032360611840.md) 39 | - [Use Object.freeze to ensure your objects are readonly at the type level AND the runtime level](notes/mattpocockuk%20-%201542079199543975937.md) 40 | - [Inversion of control](notes/mattpocockuk%20-%201591047557702389760.md) 41 | - [Ultimate TypeScript Thread](notes/mattpocockuk%20-%201509964736275927042.md) 42 | - [Expose type to global with declare global](notes/mattpocockuk%20-%201593584053042630657.md) 43 | - [Use generics to dynamically specify the number, and type, of arguments to functions](notes/mattpocockuk%20-%201509850662795989005.md) 44 | - [Adding things to the global scope in TypeScript](notes/mattpocockuk%20-%201590333383501979649.md) 45 | - [Using 'as const' over enums](notes/mattpocockuk%20-%201598708710523772929.md) 46 | - [Use assertion functions inside classes](notes/mattpocockuk%20-%201512388535692652547.md) 47 | - [Compound Components in React are SUPER easy to type in TS](notes/mattpocockuk%20-%201638562171863834625.md) 48 | 49 | ### Wes Bos 50 | 51 | - [Four ways to define an object type in TypeScript](notes/wesbos%20-%201524040757518258176.md) 52 | - [The difference between `any` and `unknown`](notes/wesbos%20-%201584905090628034560.md) 53 | - [Use TypeScript's `never` for making sure you hit every scenario](notes/wesbos%20-%201585641232155348992.md) 54 | - [Use TypeScript's `never` to enforce "one or the other" properties on a type](notes/wesbos%20-%201587082842110033926.md) 55 | - [Type Guard in TypeScript by using the `is` keyword in a functions return type](notes/wesbos%20-%201585258976421224450.md) 56 | - [VSCode - quickly add all properties to a typed object in TypeScript with the ts-quickfixes](notes/wesbos%20-%201582803702225989637.md) 57 | - [VSCode - refactoring your codebase](notes/wesbos%20-%201583093975359315968.md) 58 | - [4 TypeScript tips in context of when you would use them. as const, typeof, keyof and template string types](notes/wesbos%20-%201615777112408866832.md) 59 | 60 | ### Erik Rasmussen 61 | 62 | - [Passing around unique identifiers of objects, select the type of the identifier right off of the object type](notes/erikras%20-%201457999235564154882.md) 63 | 64 | ### Carlos Caballero 65 | 66 | - [Use look up tables instead of "if"](notes/Carlillo%20-%201591148366070747347.md) 67 | 68 | ### Ankita Kulkarni 69 | 70 | - [Typescript 4.9 satisfies operator - check if the type matches one of these listed type](notes/kulkarniankita9%20-%201594154991148597250.md) 71 | 72 | ### Minko Gechev 73 | 74 | - [Enum vs const enums](notes/mgechev%20-%201309379618034642946.md) 75 | - [Use labeled tuple elements to get better hints from your text editor ](notes/mgechev%20-%201361186013029269506.md) 76 | - [Use `as const` after literals](notes/mgechev%20-%201462654597059817481.md) 77 | 78 | ### Cory House 79 | 80 | - [Avoid making a property optional when the property isn’t valid in a certain case](notes/housecor%20-%201581638360543600640.md) 81 | - [Alias the type's name when conflicts with an existing identifier](notes/housecor%20-%201586865516395876359.md) 82 | - [Many optional properties are a code smell](notes/housecor%20-%201596861970170671104.md) 83 | 84 | ### Tomek Sułkowski 85 | 86 | - [Extract it from a component using the handy `ComponentProps`](notes/sulco%20-%201160890708615716864.md) 87 | - [Use `keyof` gets a union type of all properties of the given object](notes/sulco%20-%201222507593287028736.md) 88 | 89 | ### Sebastien Lorber 90 | 91 | - [No need to import DOM event handler types](notes/sebastienlorber%20-%201512420374201446405.md) 92 | 93 | ### Steve (Builder.io) 94 | 95 | - [The `satisfies` operator in TypeScript 4.9 is a game changer](notes/Steve8708%20-%201605322303319199744.md) 96 | 97 | ### StackBlitz 98 | 99 | - [Infers array's type as const](notes/stackblitz%20-%201325818478675304448.md) 100 | - [How to use extends](notes/stackblitz%20-%201328353096179789824.md) 101 | - [How to use readonly](notes/stackblitz%20-%201330890655351123968.md) 102 | 103 | ### Extending existing types 104 | 105 | - [`PackageJson`](https://github.com/sindresorhus/type-fest/blob/main/source/package-json.d.ts) - There are a lot of tools that 106 | place extra configurations inside the `package.json` file. You can extend 107 | `PackageJson` to support these additional configurations. 108 |
109 | 110 | Example 111 | 112 | 113 | [Playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBDAnmApnA3gBQIYGMDW2A5igFIDOEAdnNuXAEJ0o4HFmVUC+cAZlBBBwA5ElQBaXinIxhAbgCwAKFCRYCZGnQAZYFRgooPfoJHSANntmKlysWlaESFanAC8jZo-YuaAMgwLKwBhal5gIgB+AC44XX1DADpQqnCiLhsgA) 114 | 115 | ```ts 116 | import type { PackageJson as BasePackageJson } from "type-fest"; 117 | import type { Linter } from "eslint"; 118 | 119 | type PackageJson = BasePackageJson & { eslintConfig?: Linter.Config }; 120 | ``` 121 | 122 |
123 | 124 | ### Built-in types 125 | 126 | There are many advanced types most users don't know about. 127 | 128 | - [`Partial`](https://www.typescriptlang.org/docs/handbook/utility-types.html#partialtype) - 129 | Make all properties in `T` optional. 130 |
131 | 132 | Example 133 | 134 | 135 | [Playground](https://www.typescriptlang.org/play/#code/JYOwLgpgTgZghgYwgAgHIHsAmEDC6QzADmyA3gLABQyycADnanALYQBcyAzmFKEQNxUaddFDAcQAV2YAjaIMoBfKlQQAbOJ05osEAIIMAQpOBrsUMkOR1eANziRkCfISKSoD4Pg4ZseAsTIALyW1DS0DEysHADkvvoMMQA0VsKi4sgAzAAMuVaKClY2wPaOknSYDrguADwA0sgQAB6QIJjaANYQAJ7oMDp+LsQAfAAUXd0cdUnI9mo+uv6uANp1ALoAlKHhyGAAFsCcAHTOAW4eYF4gyxNrwbNwago0ypRWp66jH8QcAApwYmAjxq8SWIy2FDCNDA3ToKFBQyIdR69wmfQG1TOhShyBgomQX3w3GQE2Q6IA8jIAFYQBBgI4TTiEs5bTQYsFInrLTbbHZOIlgZDlSqQABqj0kKBC3yINx6a2xfOQwH6o2FVXFaklwSCIUkbQghBAEEwENSfNOlykEGefNe5uhB2O6sgS3GPRmLogmslG1tLxUOKgEDA7hAuydtteryAA) 136 | 137 | ```ts 138 | interface NodeConfig { 139 | appName: string; 140 | port: number; 141 | } 142 | 143 | class NodeAppBuilder { 144 | private configuration: NodeConfig = { 145 | appName: "NodeApp", 146 | port: 3000, 147 | }; 148 | 149 | private updateConfig( 150 | key: Key, 151 | value: NodeConfig[Key] 152 | ) { 153 | this.configuration[key] = value; 154 | } 155 | 156 | config(config: Partial) { 157 | type NodeConfigKey = keyof NodeConfig; 158 | 159 | for (const key of Object.keys(config) as NodeConfigKey[]) { 160 | const updateValue = config[key]; 161 | 162 | if (updateValue === undefined) { 163 | continue; 164 | } 165 | 166 | this.updateConfig(key, updateValue); 167 | } 168 | 169 | return this; 170 | } 171 | } 172 | 173 | // `Partial`` allows us to provide only a part of the 174 | // NodeConfig interface. 175 | new NodeAppBuilder().config({ appName: "ToDoApp" }); 176 | ``` 177 | 178 |
179 | 180 | - [`Required`](https://www.typescriptlang.org/docs/handbook/utility-types.html#requiredtype) - 181 | Make all properties in `T` required. 182 |
183 | 184 | Example 185 | 186 | 187 | [Playground](https://typescript-play.js.org/?target=6#code/AQ4SwOwFwUwJwGYEMDGNgGED21VQGJZwC2wA3gFCjXAzFJgA2A-AFzADOUckA5gNxUaIYjA4ckvGG07c+g6gF8KQkAgCuEFFDA5O6gEbEwUbLm2ESwABQIixACJIoSdgCUYAR3Vg4MACYAPGYuFvYAfACU5Ko0APRxwADKMBD+wFAAFuh2Vv7OSBlYGdmc8ABu8LHKsRyGxqY4oQT21pTCIHQMjOwA5DAAHgACxAAOjDAAdChYxL0ANLHUouKSMH0AEmAAhJhY6ozpAJ77GTCMjMCiV0ToSAb7UJPPC9WRgrEJwAAqR6MwSRQPFGUFocDgRHYxnEfGAowh-zgUCOwF6KwkUl6tXqJhCeEsxDaS1AXSYfUGI3GUxmc0WSneQA) 188 | 189 | ```ts 190 | interface ContactForm { 191 | email?: string; 192 | message?: string; 193 | } 194 | 195 | function submitContactForm(formData: Required) { 196 | // Send the form data to the server. 197 | } 198 | 199 | submitContactForm({ 200 | email: "ex@mple.com", 201 | message: "Hi! Could you tell me more about�", 202 | }); 203 | 204 | // TypeScript error: missing property 'message' 205 | submitContactForm({ 206 | email: "ex@mple.com", 207 | }); 208 | ``` 209 | 210 |
211 | 212 | - [`Readonly`](https://www.typescriptlang.org/docs/handbook/utility-types.html#readonlytype) - 213 | Make all properties in `T` readonly. 214 |
215 | 216 | Example 217 | 218 | 219 | [Playground](https://typescript-play.js.org/?target=6#code/AQ4UwOwVwW2AZA9gc3mAbmANsA3gKFCOAHkAzMgGkOJABEwAjKZa2kAUQCcvEu32AMQCGAF2FYBIAL4BufDRABLCKLBcywgMZgEKZOoDCiCGSXI8i4hGEwwALmABnUVxXJ57YFgzZHSVF8sT1BpBSItLGEnJz1kAy5LLy0TM2RHACUwYQATEywATwAeAITjU3MAPnkrCJMXLigtUT4AClxgGztKbyDgaX99I1TzAEokr1BRAAslJwA6FIqLAF48TtswHp9MHDla9hJGACswZvmyLjAwAC8wVpm5xZHkUZDaMKIwqyWXYCW0oN4sNlsA1h0ug5gAByACyBQAggAHJHQ7ZBIFoXbzBjMCz7OoQP5YIaJNYQMAAdziCVaALGNSIAHomcAACoFJFgADKWjcSNEwG4vC4ji0wggEEQguiTnMEGALWAV1yAFp8gVgEjeFyuKICvMrCTgVxnst5jtsGC4ljsPNhXxGaAWcAAOq6YRXYDCRg+RWIcA5JSC+kWdCepQ+v3RYCU3RInzRMCGwlpC19NYBW1Ye08R1AA) 220 | 221 | ```ts 222 | enum LogLevel { 223 | Off, 224 | Debug, 225 | Error, 226 | Fatal, 227 | } 228 | 229 | interface LoggerConfig { 230 | name: string; 231 | level: LogLevel; 232 | } 233 | 234 | class Logger { 235 | config: Readonly; 236 | 237 | constructor({ name, level }: LoggerConfig) { 238 | this.config = { name, level }; 239 | Object.freeze(this.config); 240 | } 241 | } 242 | 243 | const config: LoggerConfig = { 244 | name: "MyApp", 245 | level: LogLevel.Debug, 246 | }; 247 | 248 | const logger = new Logger(config); 249 | 250 | // TypeScript Error: cannot assign to read-only property. 251 | logger.config.level = LogLevel.Error; 252 | 253 | // We are able to edit config variable as we please. 254 | config.level = LogLevel.Error; 255 | ``` 256 | 257 |
258 | 259 | - [`Pick`](https://www.typescriptlang.org/docs/handbook/utility-types.html#picktype-keys) - 260 | From `T`, pick a set of properties whose keys are in the union `K`. 261 |
262 | 263 | Example 264 | 265 | 266 | [Playground](https://typescript-play.js.org/?target=6#code/AQ4SwOwFwUwJwGYEMDGNgEE5TCgNugN4BQoZwOUBAXMAM5RyQDmA3KeSFABYCuAtgCMISMHloMmENh04oA9tBjQJjFuzIBfYrOAB6PcADCcGElh1gEGAHcKATwAO6ebyjB5CTNlwFwSxFR0BX5HeToYABNgBDh5fm8cfBg6AHIKG3ldA2BHOOcfFNpUygJ0pAhokr4hETFUgDpswywkggAFUwA3MFtgAF5gQgowKhhVKTYKGuFRcXo1aVZgbTIoJ3RW3xhOmB6+wfbcAGsAHi3kgBpgEtGy4AAfG54BWfqAPnZm4AAlZUj4MAkMA8GAGB4vEgfMlLLw6CwPBA8PYRmMgZVgAC6CgmI4cIommQELwICh8RBgKZKvALh1ur0bHQABR5PYMui0Wk7em2ADaAF0AJS0AASABUALIAGQAogR+Mp3CROCAFBBwVC2ikBpj5CgBIqGjizLA5TAFdAmalImAuqlBRoVQh5HBgEy1eDWfs7J5cjzGYKhroVfpDEhHM4MV6GRR5NN0JrtnRg6BVirTFBeHAKYmYY6QNpdB73LmCJZBlSAXAubtvczeSmQMNSuMbmKNgBlHFgPEUNwusBIPAAQlS1xetTmxT0SDoESgdD0C4aACtHMwxytLrohawgA) 267 | 268 | ```ts 269 | interface Article { 270 | title: string; 271 | thumbnail: string; 272 | content: string; 273 | } 274 | 275 | // Creates new type out of the `Article` interface composed 276 | // from the Articles' two properties: `title` and `thumbnail`. 277 | // `ArticlePreview = {title: string; thumbnail: string}` 278 | type ArticlePreview = Pick; 279 | 280 | // Render a list of articles using only title and description. 281 | function renderArticlePreviews(previews: ArticlePreview[]): HTMLElement { 282 | const articles = document.createElement("div"); 283 | 284 | for (const preview of previews) { 285 | // Append preview to the articles. 286 | } 287 | 288 | return articles; 289 | } 290 | 291 | const articles = renderArticlePreviews([ 292 | { 293 | title: "TypeScript tutorial!", 294 | thumbnail: "/assets/ts.jpg", 295 | }, 296 | ]); 297 | ``` 298 | 299 |
300 | 301 | - [`Record`](https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkeys-type) - 302 | Construct a type with a set of properties `K` of type `T`. 303 |
304 | 305 | Example 306 | 307 | 308 | [Playground](https://typescript-play.js.org/?target=6#code/AQ4ejYAUHsGcCWAXBMB2dgwGbAKYC2ADgDYwCeeemCaWArgE7ADGMxAhmuQHQBQoYEnJE8wALKEARnkaxEKdMAC8wAOS0kstGuAAfdQBM8ANzxlRjXQbVaWACwC0JPB0NqA3HwGgIwAJJoWozYHCxixnAsjAhStADmwESMMJYo1Fi4HMCIaPEu+MRklHj8gpqyoeHAAKJFFFTAAN4+giDYCIxwSAByHAR4AFw5SDF5Xm2gJBzdfQPD3WPxE5PAlBxdAPLYNQAelgh4aOHDaPQEMowrIAC+3oJ+AMKMrlrAXFhSAFZ4LEhC9g4-0BmA4JBISXgiCkBQABpILrJ5MhUGhYcATGD6Bk4Hh-jNgABrPDkOBlXyQAAq9ngYmJpOAAHcEOCRjAXqwYODfoo6DhakUSph+Uh7GI4P0xER4Cj0OSQGwMP8tP1hgAlX7swwAHgRl2RvIANALSA08ABtAC6AD4VM1Wm0Kow0MMrYaHYJjGYLLJXZb3at1HYnC43Go-QHQDcvA6-JsmEJXARgCDgMYWAhjIYhDAU+YiMAAFIwex0ZmilMITCGF79TLAGRsAgJYAAZRwSEZGzEABFTOZUrJ5Yn+jwnWgeER6HB7AAKJrADpdXqS4ZqYultTG6azVfqHswPBbtauLY7fayQ7HIbAAAMwBuAEoYw9IBq2Ixs9h2eFMOQYPQObALQKJgggABeYhghCIpikkKRpOQRIknAsZUiIeCttECBEP8NSMCkjDDAARMGziuIYxHwYOjDCMBmDNnAuTxA6irdCOBB1Lh5Dqpqn66tISIykawBnOCtqqC0gbjqc9DgpGkxegOliyfJDrRkAA) 309 | 310 | ```ts 311 | // Positions of employees in our company. 312 | type MemberPosition = "intern" | "developer" | "tech-lead"; 313 | 314 | // Interface describing properties of a single employee. 315 | interface Employee { 316 | firstName: string; 317 | lastName: string; 318 | yearsOfExperience: number; 319 | } 320 | 321 | // Create an object that has all possible `MemberPosition` values set as keys. 322 | // Those keys will store a collection of Employees of the same position. 323 | const team: Record = { 324 | intern: [], 325 | developer: [], 326 | "tech-lead": [], 327 | }; 328 | 329 | // Our team has decided to help John with his dream of becoming Software Developer. 330 | team.intern.push({ 331 | firstName: "John", 332 | lastName: "Doe", 333 | yearsOfExperience: 0, 334 | }); 335 | 336 | // `Record` forces you to initialize all of the property keys. 337 | // TypeScript Error: "tech-lead" property is missing 338 | const teamEmpty: Record = { 339 | intern: null, 340 | developer: null, 341 | }; 342 | ``` 343 | 344 |
345 | 346 | - [`Exclude`](https://www.typescriptlang.org/docs/handbook/utility-types.html#excludetype-excludedunion) - 347 | Exclude from `T` those types that are assignable to `U`. 348 |
349 | 350 | Example 351 | 352 | 353 | [Playground](https://typescript-play.js.org/?target=6#code/JYOwLgpgTgZghgYwgAgMrQG7QMIHsQzADmyA3gFDLIAOuUYAXMiAK4A2byAPsgM5hRQJHqwC2AI2gBucgF9y5MAE9qKAEoQAjiwj8AEnBAATNtGQBeZAAooWphu26wAGmS3e93bRC8IASgsAPmRDJRlyAHoI5ABRAA8ENhYjFFYOZGVVZBgoXFFkAAM0zh5+QRBhZhYJaAKAOkjogEkQZAQ4X2QAdwALCFbaemRgXmQtFjhOMFwq9K6ULuB0lk6U+HYwZAxJnQaYFhAEMGB8ZCIIMAAFOjAANR2IK0HGWISklIAedCgsKDwCYgAbQA5M9gQBdVzFQJ+JhiSRQMiUYYwayZCC4VHPCzmSzAspCYEBWxgFhQAZwKC+FpgJ43VwARgADH4ZFQSWSBjcZPJyPtDsdTvxKWBvr8rD1DCZoJ5HPopaYoK4EPhCEQmGKcKriLCtrhgEYkVQVT5Nr4fmZLLZtMBbFZgT0wGBqES6ghbHBIJqoBKFdBWQpjfh+DQbhY2tqiHVsbjLMVkAB+ZAAZiZaeQTHOVxu9ySjxNaujNwDVHNvzqbBGkBAdPoAfkQA) 354 | 355 | ```ts 356 | interface ServerConfig { 357 | port: null | string | number; 358 | } 359 | 360 | type RequestHandler = (request: Request, response: Response) => void; 361 | 362 | // Exclude `null` type from `null | string | number`. 363 | // In case the port is equal to `null`, we will use default value. 364 | function getPortValue(port: Exclude): number { 365 | if (typeof port === "string") { 366 | return parseInt(port, 10); 367 | } 368 | 369 | return port; 370 | } 371 | 372 | function startServer(handler: RequestHandler, config: ServerConfig): void { 373 | const server = require("http").createServer(handler); 374 | 375 | const port = config.port === null ? 3000 : getPortValue(config.port); 376 | server.listen(port); 377 | } 378 | ``` 379 | 380 |
381 | 382 | - [`Extract`](https://www.typescriptlang.org/docs/handbook/utility-types.html#extracttype-union) - 383 | Extract from `T` those types that are assignable to `U`. 384 |
385 | 386 | Example 387 | 388 | 389 | [Playground](https://typescript-play.js.org/?target=6#code/CYUwxgNghgTiAEAzArgOzAFwJYHtXzSwEdkQBJYACgEoAueVZAWwCMQYBuAKDDwGcM8MgBF4AXngBlAJ6scESgHIRi6ty5ZUGdoihgEABXZ888AN5d48ANoiAuvUat23K6ihMQ9ATE0BzV3goPy8GZjZOLgBfLi4Aejj4AEEICBwAdz54MAALKFQQ+BxEeAAHY1NgKAwoIKy0grr4DByEUpgccpgMaXgAaxBerCzi+B9-ZulygDouFHRsU1z8kKMYE1RhaqgAHkt4AHkWACt4EAAPbVRgLLWNgBp9gGlBs8uQa6yAUUuYPQwdgNpKM7nh7mMML4CgA+R5WABqUAgpDeVxuhxO1he0jsXGh8EoOBO9COx3BQPo2PBADckaR6IjkSA6PBqTgsMBzPsicdrEC7OJWXSQNwYvFEgAVTS9JLXODpeDpKBZFg4GCoWa8VACIJykAKiQWKy2YQOAioYikCg0OEMDyhRSy4DyxS24KhAAMjyi6gS8AAwjh5OD0iBFHAkJoEOksC1mnkMJq8gUQKDNttKPlnfrwYp3J5XfBHXqoKpfYkAOI4ansTxaeDADmoRSCCBYAbxhC6TDx6rwYHIRX5bScjA4bLJwoDmDwDkfbA9JMrVMVdM1TN69LgkTgwgkchUahqIA) 390 | 391 | ```ts 392 | declare function uniqueId(): number; 393 | 394 | const ID = Symbol("ID"); 395 | 396 | interface Person { 397 | [ID]: number; 398 | name: string; 399 | age: number; 400 | } 401 | 402 | // Allows changing the person data as long as the property key is of string type. 403 | function changePersonData< 404 | Obj extends Person, 405 | Key extends Extract, 406 | Value extends Obj[Key] 407 | >(obj: Obj, key: Key, value: Value): void { 408 | obj[key] = value; 409 | } 410 | 411 | // Tiny Andrew was born. 412 | const andrew = { 413 | [ID]: uniqueId(), 414 | name: "Andrew", 415 | age: 0, 416 | }; 417 | 418 | // Cool, we're fine with that. 419 | changePersonData(andrew, "name", "Pony"); 420 | 421 | // Goverment didn't like the fact that you wanted to change your identity. 422 | changePersonData(andrew, ID, uniqueId()); 423 | ``` 424 | 425 |
426 | 427 | - [`NonNullable`](https://www.typescriptlang.org/docs/handbook/utility-types.html#nonnullabletype) - 428 | Exclude `null` and `undefined` from `T`. 429 |
430 | 431 | Example 432 | 433 | Works with strictNullChecks set to true. 434 | 435 | [Playground](https://typescript-play.js.org/?target=6#code/C4TwDgpgBACg9gJ2AOQK4FsBGEFQLxQDOwCAlgHYDmUAPlORtrnQwDasDcAUFwPQBU-WAEMkUOADMowqAGNWwwoSgATCBIqlgpOOSjAAFsOBRSy1IQgr9cKJlSlW1mZYQA3HFH68u8xcoBlHA8EACEHJ08Aby4oKDBUTFZSWXjEFEYcAEIALihkXTR2YSSIAB54JDQsHAA+blj4xOTUsHSACkMzPKD3HHDHNQQAGjSkPMqMmoQASh7g-oihqBi4uNIpdraxPAI2VhmVxrX9AzMAOm2ppnwoAA4ABifuE4BfKAhWSyOTuK7CS7pao3AhXF5rV48E4ICDAVAIPT-cGQyG+XTEIgLMJLTx7CAAdygvRCA0iCHaMwarhJOIQjUBSHaACJHk8mYdeLwxtdcVAAOSsh58+lXdr7Dlcq7A3n3J4PEUdADMcspUE53OluAIUGVTx46oAKuAIAFZGQwCYAKIIBCILjUxaDHAMnla+iodjcIA) 436 | 437 | ```ts 438 | type PortNumber = string | number | null; 439 | 440 | /** Part of a class definition that is used to build a server */ 441 | class ServerBuilder { 442 | portNumber!: NonNullable; 443 | 444 | port(this: ServerBuilder, port: PortNumber): ServerBuilder { 445 | if (port == null) { 446 | this.portNumber = 8000; 447 | } else { 448 | this.portNumber = port; 449 | } 450 | 451 | return this; 452 | } 453 | } 454 | 455 | const serverBuilder = new ServerBuilder(); 456 | 457 | serverBuilder 458 | .port("8000") // portNumber = '8000' 459 | .port(null) // portNumber = 8000 460 | .port(3000); // portNumber = 3000 461 | 462 | // TypeScript error 463 | serverBuilder.portNumber = null; 464 | ``` 465 | 466 |
467 | 468 | - [`Parameters`](https://www.typescriptlang.org/docs/handbook/utility-types.html#parameterstype) - 469 | Obtain the parameters of a function type in a tuple. 470 |
471 | 472 | Example 473 | 474 | 475 | [Playground](https://typescript-play.js.org/?target=6#code/GYVwdgxgLglg9mABAZwBYmMANgUwBQxgAOIUAXIgIZgCeA2gLoCUFAbnDACaIDeAUIkQB6IYgCypSlBxUATrMo1ECsJzgBbLEoipqAc0J7EMKMgDkiHLnU4wp46pwAPHMgB0fAL58+oSLARECEosLAA5ABUYG2QAHgAxJGdpVWREPDdMylk9ZApqemZEAF4APipacrw-CApEgBogkKwAYThwckQwEHUAIxxZJl4BYVEImiIZKF0oZRwiWVdbeygJmThgOYgcGFYcbhqApCJsyhtpWXcR1cnEePBoeDAABVPzgbTixFeFd8uEsClADcIxGiygIFkSEOT3SmTc2VydQeRx+ZxwF2QQ34gkEwDgsnSuFmMBKiAADEDjIhYk1Qm0OlSYABqZnYka4xA1DJZHJYkGc7yCbyeRA+CAIZCzNAYbA4CIAdxg2zJwVCkWirjwMswuEaACYmCCgA) 476 | 477 | ```ts 478 | function shuffle(input: any[]): void { 479 | // Mutate array randomly changing its' elements indexes. 480 | } 481 | 482 | function callNTimes any>( 483 | func: Fn, 484 | callCount: number 485 | ) { 486 | // Type that represents the type of the received function parameters. 487 | type FunctionParameters = Parameters; 488 | 489 | return function (...args: FunctionParameters) { 490 | for (let i = 0; i < callCount; i++) { 491 | func(...args); 492 | } 493 | }; 494 | } 495 | 496 | const shuffleTwice = callNTimes(shuffle, 2); 497 | ``` 498 | 499 |
500 | 501 | - [`ConstructorParameters`](https://www.typescriptlang.org/docs/handbook/utility-types.html#constructorparameterstype) - 502 | Obtain the parameters of a constructor function type in a tuple. 503 |
504 | 505 | Example 506 | 507 | 508 | [Playground](https://typescript-play.js.org/?target=6#code/MYGwhgzhAECCBOAXAlqApgWQPYBM0mgG8AoaaFRENALmgkXmQDsBzAblOmCycTV4D8teo1YdO3JiICuwRFngAKClWENmLAJRFOZRAAtkEAHQq00ALzlklNBzIBfYk+KhIMAJJTEYJsDQAwmDA+mgAPAAq0GgAHnxMODCKTGgA7tCKxllg8CwQtL4AngDaALraFgB80EWa1SRkAA6MAG5gfNAB4FABPDJyCrQR9tDNyG0dwMGhtBhgjWEiGgA00F70vv4RhY3hEZXVVinpc42KmuJkkv3y8Bly8EPaDWTkhiZd7r3e8LK3llwGCMXGQWGhEOsfH5zJlsrl8p0+gw-goAAo5MAAW3BaHgEEilU0tEhmzQ212BJ0ry4SOg+kg+gBBiMximIGA0nAfAQLGk2N4EAAEgzYcYcnkLsRdDTvNEYkYUKwSdCme9WdM0MYwYhFPSIPpJdTkAAzDKxBUaZX+aAAQgsVmkCTQxuYaBw2ng4Ok8CYcotSu8pMur09iG9vuObxZnx6SN+AyUWTF8MN0CcZE4Ywm5jZHK5aB5fP4iCFIqT4oRRTKRLo6lYVNeAHpG50wOzOe1zHr9NLQ+HoABybsD4HOKXXRA1JCoKhBELmI5pNaB6Fz0KKBAodDYPAgSUTmqYsAALx4m5nC6nW9nGq14KtaEUA9gR9PvuNCjQ9BgACNvcwNBtAcLiAA) 509 | 510 | ```ts 511 | class ArticleModel { 512 | title: string; 513 | content?: string; 514 | 515 | constructor(title: string) { 516 | this.title = title; 517 | } 518 | } 519 | 520 | class InstanceCache any> { 521 | private ClassConstructor: T; 522 | private cache: Map> = new Map(); 523 | 524 | constructor(ctr: T) { 525 | this.ClassConstructor = ctr; 526 | } 527 | 528 | getInstance(...args: ConstructorParameters): InstanceType { 529 | const hash = this.calculateArgumentsHash(...args); 530 | 531 | const existingInstance = this.cache.get(hash); 532 | if (existingInstance !== undefined) { 533 | return existingInstance; 534 | } 535 | 536 | return new this.ClassConstructor(...args); 537 | } 538 | 539 | private calculateArgumentsHash(...args: any[]): string { 540 | // Calculate hash. 541 | return "hash"; 542 | } 543 | } 544 | 545 | const articleCache = new InstanceCache(ArticleModel); 546 | const amazonArticle = articleCache.getInstance("Amazon forests burining!"); 547 | ``` 548 | 549 |
550 | 551 | - [`ReturnType`](https://www.typescriptlang.org/docs/handbook/utility-types.html#returntypetype) - 552 | Obtain the return type of a function type. 553 |
554 | 555 | Example 556 | 557 | 558 | [Playground](https://typescript-play.js.org/?target=6#code/MYGwhgzhAECSAmICmBlJAnAbgS2E6A3gFDTTwD2AcuQC4AW2AdgOYAUAlAFzSbnbyEAvkWFFQkGJSQB3GMVI1sNZNwg10TZgG4S0YOUY0kh1es07d+xmvQBXYDXLpWi5UlMaWAGj0GjJ6BtNdkJdBQYIADpXZGgAXmgYpB1ScOwoq38aeN9DYxoU6GFRKzVoJjUwRjwAYXJbPPRuAFkwAAcAHgAxBodsAx9GWwBbACMMAD4cxhloVraOCyYjdAAzMDxoOut1e0d0UNIZ6WhWSPOwdGYIbiqATwBtAF0uaHudUQB6ACpv6ABpJBINqJdAbADW0Do5BOw3u5R2VTwMHIq2gAANtjZ0bkbHsnFCwJh8ONjHp0EgwEZ4JFoN9PkRVr1FAZoMwkDRYIjqkgOrosepoEgAB7+eAwAV2BxOLy6ACCVxgIrFEoMeOl6AACpcwMMORgIB1JRMiBNWKVdhruJKfOdIpdrtwFddXlzKjyACp3Nq842HaDIbL6BrZBIVGhIpB1EMYSLsmjmtWW-YhAA+qegAAYLKQLQj3ZsEsdccmnGcLor2Dn8xGedHGpEIBzEzspfsfMHDNAANTQACMVaIljV5GQkRA5DYmIpVKQAgAJARO9le33BDXIyi0YuLW2nJFGLqkOvxFB0YPdBSaLZ0IwNzyPkO8-xkGgsLh8Al427a3hWAhXwwHA8EHT5PmgAB1bAQBAANJ24adKWpft72RaBUTgRBUCAj89HAM8xCTaBjggABRQx0DuHJv25P9dCkWRZVIAAiBjoFImpmjlFBgA0NpsjadByDacgIDAEAIAAQmYpjoGYgAZSBsmGPw6DtZiiFA8CoJguDmAQmoZ2QvtUKQLdoAYmBTwgdEiCAA) 559 | 560 | ```ts 561 | /** Provides every element of the iterable `iter` into the `callback` function and stores the results in an array. */ 562 | function mapIter< 563 | Elem, 564 | Func extends (elem: Elem) => any, 565 | Ret extends ReturnType 566 | >(iter: Iterable, callback: Func): Ret[] { 567 | const mapped: Ret[] = []; 568 | 569 | for (const elem of iter) { 570 | mapped.push(callback(elem)); 571 | } 572 | 573 | return mapped; 574 | } 575 | 576 | const setObject: Set = new Set(); 577 | const mapObject: Map = new Map(); 578 | 579 | mapIter(setObject, (value: string) => value.indexOf("Foo")); // number[] 580 | 581 | mapIter(mapObject, ([key, value]: [number, string]) => { 582 | return key % 2 === 0 ? value : "Odd"; 583 | }); // string[] 584 | ``` 585 | 586 |
587 | 588 | - [`InstanceType`](https://www.typescriptlang.org/docs/handbook/utility-types.html#instancetypetype) - 589 | Obtain the instance type of a constructor function type. 590 |
591 | 592 | Example 593 | 594 | 595 | [Playground](https://typescript-play.js.org/?target=6#code/MYGwhgzhAECSAmICmBlJAnAbgS2E6A3gFDTTwD2AcuQC4AW2AdgOYAUAlAFzSbnbyEAvkWFFQkGJSQB3GMVI1sNZNwg10TZgG4S0YOUY0kh1es07d+xmvQBXYDXLpWi5UlMaWAGj0GjJ6BtNdkJdBQYIADpXZGgAXmgYpB1ScOwoq38aeN9DYxoU6GFRKzVoJjUwRjwAYXJbPPRuAFkwAAcAHgAxBodsAx9GWwBbACMMAD4cxhloVraOCyYjdAAzMDxoOut1e0d0UNIZ6WhWSPOwdGYIbiqATwBtAF0uaHudUQB6ACpv6ABpJBINqJdAbADW0Do5BOw3u5R2VTwMHIq2gAANtjZ0bkbHsnFCwJh8ONjHp0EgwEZ4JFoN9PkRVr1FAZoMwkDRYIjqkgOrosepoEgAB7+eAwAV2BxOLy6ACCVxgIrFEoMeOl6AACpcwMMORgIB1JRMiBNWKVdhruJKfOdIpdrtwFddXlzKjyACp3Nq842HaDIbL6BrZBIVGhIpB1EMYSLsmjmtWW-YhAA+qegAAYLKQLQj3ZsEsdccmnGcLor2Dn8xGedHGpEIBzEzspfsfMHDNAANTQACMVaIljV5GQkRA5DYmIpVKQAgAJARO9le33BDXIyi0YuLW2nJFGLqkOvxFB0YPdBSaLZ0IwNzyPkO8-xkGgsLh8Al427a3hWAhXwwHA8EHT5PmgAB1bAQBAANJ24adKWpft72RaBUTgRBUCAj89HAM8xCTaBjggABRQx0DuHJv25P9dCkWRZVIAAiBjoFImpmjlFBgA0NpsjadByDacgIDAEAIAAQmYpjoGYgAZSBsmGPw6DtZiiFA8CoJguDmAQmoZ2QvtUKQLdoAYmBTwgdEiCAA) 596 | 597 | ```ts 598 | class IdleService { 599 | doNothing(): void {} 600 | } 601 | 602 | class News { 603 | title: string; 604 | content: string; 605 | 606 | constructor(title: string, content: string) { 607 | this.title = title; 608 | this.content = content; 609 | } 610 | } 611 | 612 | const instanceCounter: Map = new Map(); 613 | 614 | interface Constructor { 615 | new (...args: any[]): any; 616 | } 617 | 618 | // Keep track how many instances of `Constr` constructor have been created. 619 | function getInstance< 620 | Constr extends Constructor, 621 | Args extends ConstructorParameters 622 | >(constructor: Constr, ...args: Args): InstanceType { 623 | let count = instanceCounter.get(constructor) || 0; 624 | 625 | const instance = new constructor(...args); 626 | 627 | instanceCounter.set(constructor, count + 1); 628 | 629 | console.log(`Created ${count + 1} instances of ${Constr.name} class`); 630 | 631 | return instance; 632 | } 633 | 634 | const idleService = getInstance(IdleService); 635 | // Will log: `Created 1 instances of IdleService class` 636 | const newsEntry = getInstance( 637 | News, 638 | "New ECMAScript proposals!", 639 | "Last month..." 640 | ); 641 | // Will log: `Created 1 instances of News class` 642 | ``` 643 | 644 |
645 | 646 | - [`Omit`](https://www.typescriptlang.org/docs/handbook/utility-types.html#omittype-keys) - 647 | Constructs a type by picking all properties from T and then removing K. 648 |
649 | 650 | Example 651 | 652 | 653 | [Playground](https://typescript-play.js.org/?target=6#code/JYOwLgpgTgZghgYwgAgIImAWzgG2QbwChlks4BzCAVShwC5kBnMKUcgbmKYAcIFgIjBs1YgOXMpSFMWbANoBdTiW5woFddwAW0kfKWEAvoUIB6U8gDCUCHEiNkICAHdkYAJ69kz4GC3JcPG4oAHteKDABBxCYNAxsPFBIWEQUCAAPJG4wZABySUFcgJAAEzMLXNV1ck0dIuCw6EjBADpy5AB1FAQ4EGQAV0YUP2AHDy8wEOQbUugmBLwtEIA3OcmQnEjuZBgQqE7gAGtgZAhwKHdkHFGwNvGUdDIcAGUliIBJEF3kAF5kAHlML4ADyPBIAGjyBUYRQAPnkqho4NoYQA+TiEGD9EAISIhPozErQMG4AASK2gn2+AApek9pCSXm8wFSQooAJQMUkAFQAsgAZACiOAgmDOOSIJAQ+OYyGl4DgoDmf2QJRCCH6YvALQQNjsEGFovF1NyJWAy1y7OUyHMyE+yRAuFImG4Iq1YDswHxbRINjA-SgfXlHqVUE4xiAA) 654 | 655 | ```ts 656 | interface Animal { 657 | imageUrl: string; 658 | species: string; 659 | images: string[]; 660 | paragraphs: string[]; 661 | } 662 | 663 | // Creates new type with all properties of the `Animal` interface 664 | // except 'images' and 'paragraphs' properties. We can use this 665 | // type to render small hover tooltip for a wiki entry list. 666 | type AnimalShortInfo = Omit; 667 | 668 | function renderAnimalHoverInfo(animals: AnimalShortInfo[]): HTMLElement { 669 | const container = document.createElement("div"); 670 | // Internal implementation. 671 | return container; 672 | } 673 | ``` 674 | 675 |
676 | 677 | - [`Uppercase`](https://www.typescriptlang.org/docs/handbook/utility-types.html#uppercasestringtype) - 678 | Transforms every character in a string into uppercase. 679 |
680 | 681 | Example 682 | 683 | 684 | ```ts 685 | type T = Uppercase<"hello">; // 'HELLO' 686 | 687 | type T2 = Uppercase<"foo" | "bar">; // 'FOO' | 'BAR' 688 | 689 | type T3 = Uppercase<`aB${S}`>; 690 | type T4 = T3<"xYz">; // 'ABXYZ' 691 | 692 | type T5 = Uppercase; // string 693 | type T6 = Uppercase; // any 694 | type T7 = Uppercase; // never 695 | type T8 = Uppercase<42>; // Error, type 'number' does not satisfy the constraint 'string' 696 | ``` 697 | 698 |
699 | 700 | - [`Lowercase`](https://www.typescriptlang.org/docs/handbook/utility-types.html#lowercasestringtype) - 701 | Transforms every character in a string into lowercase. 702 |
703 | 704 | Example 705 | 706 | 707 | ```ts 708 | type T = Lowercase<"HELLO">; // 'hello' 709 | 710 | type T2 = Lowercase<"FOO" | "BAR">; // 'foo' | 'bar' 711 | 712 | type T3 = Lowercase<`aB${S}`>; 713 | type T4 = T3<"xYz">; // 'abxyz' 714 | 715 | type T5 = Lowercase; // string 716 | type T6 = Lowercase; // any 717 | type T7 = Lowercase; // never 718 | type T8 = Lowercase<42>; // Error, type 'number' does not satisfy the constraint 'string' 719 | ``` 720 | 721 |
722 | 723 | - [`Capitalize`](https://www.typescriptlang.org/docs/handbook/utility-types.html#capitalizestringtype) - 724 | Transforms the first character in a string into uppercase. 725 |
726 | 727 | Example 728 | 729 | 730 | ```ts 731 | type T = Capitalize<"hello">; // 'Hello' 732 | 733 | type T2 = Capitalize<"foo" | "bar">; // 'Foo' | 'Bar' 734 | 735 | type T3 = Capitalize<`aB${S}`>; 736 | type T4 = T3<"xYz">; // 'ABxYz' 737 | 738 | type T5 = Capitalize; // string 739 | type T6 = Capitalize; // any 740 | type T7 = Capitalize; // never 741 | type T8 = Capitalize<42>; // Error, type 'number' does not satisfy the constraint 'string' 742 | ``` 743 | 744 |
745 | 746 | - [`Uncapitalize`](https://www.typescriptlang.org/docs/handbook/utility-types.html#uncapitalizestringtype) - 747 | Transforms the first character in a string into lowercase. 748 |
749 | 750 | Example 751 | 752 | 753 | ```ts 754 | type T = Uncapitalize<"Hello">; // 'hello' 755 | 756 | type T2 = Uncapitalize<"Foo" | "Bar">; // 'foo' | 'bar' 757 | 758 | type T3 = Uncapitalize<`AB${S}`>; 759 | type T4 = T3<"xYz">; // 'aBxYz' 760 | 761 | type T5 = Uncapitalize; // string 762 | type T6 = Uncapitalize; // any 763 | type T7 = Uncapitalize; // never 764 | type T8 = Uncapitalize<42>; // Error, type 'number' does not satisfy the constraint 'string' 765 | ``` 766 | 767 |
768 | 769 | You can find some examples in the 770 | [TypeScript docs](https://www.typescriptlang.org/docs/handbook/utility-types.html). 771 | 772 | ## Contribute 773 | 774 | Contributions welcome! Read the [contribution guidelines](docs/contributing.md) 775 | first. 776 | 777 | ### Twitter to markdown file 778 | 779 | Create .envrc and fill the value then Use [tweet-to-markdown](https://github.com/kbravh/tweet-to-markdown) 780 | 781 | ```sh 782 | # .envrc 783 | export TTM_API_KEY=YOUR_API_KEY 784 | ``` 785 | 786 | Then run the [direnv](https://direnv.net/) command 787 | 788 | ```sh 789 | direnv allow . 790 | ``` 791 | 792 | And, generate markdown from a twitter url 793 | 794 | ```sh 795 | npx tweet-to-markdown -p notes https://twitter.com/mattpocockuk/status/1509964736275927042\?s\=20\&t\=sA-g5MNM5TPjN6Ozs1qxgA 796 | ``` 797 | 798 | Then save video if available 799 | 800 | ```sh 801 | npx twt-dl-cli@latest https://twitter.com/mattpocockuk/status/1592130978234900484 802 | ``` 803 | 804 | Finally, add the [Thread Reader App](https://threadreaderapp.com) at the end with below format. 805 | 806 | ```markdown 807 | [Thread by @USERNAME on Threadify Reader App](https://threadify.productsway.com/thread/STATUS_ID) 808 | ``` 809 | 810 | NOTE: I have sent a pull request about this step to `tweet-to-markdown` repository: [feat: add Thread Reader App link and the end #19](https://github.com/kbravh/tweet-to-markdown/pull/19) Might not need this step if this PR is accepted. 811 | 812 | ## Credits 813 | 814 | This project is made by community and especially the wonderful people and projects listed in this document 815 | 816 | ### Open Source 817 | 818 | - [sindresorhus/type-fest](https://github.com/sindresorhus/type-fest): for 2 sections (Extending existing type, Built-in types) 819 | - [kbravh/tweet-to-markdown](https://github.com/kbravh/tweet-to-markdown): A command line tool to convert Tweets to Markdown. 820 | - [jellydn/threadify-plus](https://github.com/jellydn/threadify-plus): ThreadifyPlus is a simple and easy-to-use tool that helps users read and share Twitter threads with ease. (WIP) 821 | - [egoist/download-twitter-video](https://github.com/egoist/download-twitter-video) : The easiest way to download any Twitter video 822 | 823 | ### Tech Twitter 824 | 825 | - [Matt Pocock ✈️ Modern Frontends](https://twitter.com/mattpocockuk) 826 | - [Wes Bos](https://twitter.com/wesbos) 827 | - [Erik Rasmussen](https://twitter.com/erikras) 828 | - [Carlos Caballero](https://twitter.com/Carlillo) 829 | - [Ankita Kulkarni](https://twitter.com/kulkarniankita9) 830 | - [Minko Gechev (@mgechev@mstdn.social)](https://twitter.com/mgechev) 831 | - [Cory House](https://twitter.com/housecor) 832 | - [Tomek Sułkowski](https://twitter.com/sulco) 833 | - [Sebastien Lorber](https://twitter.com/sebastienlorber) 834 | - [Steve (Builder.io)](https://twitter.com/Steve8708) 835 | - [StackBlitz](https://twitter.com/StackBlitz) 836 | 837 | ## Author 838 | 839 | 👤 **Huynh Duc Dung** 840 | 841 | - Website: https://productsway.com/ 842 | - Twitter: [@jellydn](https://twitter.com/jellydn) 843 | - Github: [@jellydn](https://github.com/jellydn) 844 | 845 | ## Show your support 846 | 847 | Give a ⭐️ if this project helped you! 848 | 849 | [![kofi](https://img.shields.io/badge/Ko--fi-F16061?style=for-the-badge&logo=ko-fi&logoColor=white)](https://ko-fi.com/dunghd) 850 | [![paypal](https://img.shields.io/badge/PayPal-00457C?style=for-the-badge&logo=paypal&logoColor=white)](https://paypal.me/dunghd) 851 | [![buymeacoffee](https://img.shields.io/badge/Buy_Me_A_Coffee-FFDD00?style=for-the-badge&logo=buy-me-a-coffee&logoColor=black)](https://www.buymeacoffee.com/dunghd) 852 | 853 | ### Stargazers over time 854 | 855 | [![Stargazers over time](https://starchart.cc/jellydn/typescript-tips.svg)](https://starchart.cc/jellydn/typescript-tips) 856 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:base", 5 | "group:allNonMajor", 6 | ":pinAllExceptPeerDependencies" 7 | ], 8 | "lockFileMaintenance": { 9 | "enabled": true 10 | }, 11 | "automerge": true, 12 | "major": { 13 | "automerge": false 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /videos/Steve8708 - 1605322303319199744.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/Steve8708 - 1605322303319199744.mp4 -------------------------------------------------------------------------------- /videos/mattpocockuk - 1506607945445949446.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/mattpocockuk - 1506607945445949446.mp4 -------------------------------------------------------------------------------- /videos/mattpocockuk - 1509850662795989005.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/mattpocockuk - 1509850662795989005.mp4 -------------------------------------------------------------------------------- /videos/mattpocockuk - 1512388535692652547.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/mattpocockuk - 1512388535692652547.mp4 -------------------------------------------------------------------------------- /videos/mattpocockuk - 1536670032360611840.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/mattpocockuk - 1536670032360611840.mp4 -------------------------------------------------------------------------------- /videos/mattpocockuk - 1590333383501979649.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/mattpocockuk - 1590333383501979649.mp4 -------------------------------------------------------------------------------- /videos/mattpocockuk - 1591047557702389760.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/mattpocockuk - 1591047557702389760.mp4 -------------------------------------------------------------------------------- /videos/mattpocockuk - 1592130978234900484.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/mattpocockuk - 1592130978234900484.mp4 -------------------------------------------------------------------------------- /videos/mattpocockuk - 1593584053042630657.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/mattpocockuk - 1593584053042630657.mp4 -------------------------------------------------------------------------------- /videos/mattpocockuk - 1598708710523772929.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/mattpocockuk - 1598708710523772929.mp4 -------------------------------------------------------------------------------- /videos/mattpocockuk - 1638562171863834625.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/mattpocockuk - 1638562171863834625.mp4 -------------------------------------------------------------------------------- /videos/stackblitz - 1325818478675304448.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/stackblitz - 1325818478675304448.mp4 -------------------------------------------------------------------------------- /videos/stackblitz - 1328353096179789824.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/stackblitz - 1328353096179789824.mp4 -------------------------------------------------------------------------------- /videos/stackblitz - 1330890655351123968.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/stackblitz - 1330890655351123968.mp4 -------------------------------------------------------------------------------- /videos/wesbos - 1582803702225989637.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/wesbos - 1582803702225989637.mp4 -------------------------------------------------------------------------------- /videos/wesbos - 1583093975359315968.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/wesbos - 1583093975359315968.mp4 -------------------------------------------------------------------------------- /videos/wesbos - 1584905090628034560.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/wesbos - 1584905090628034560.mp4 -------------------------------------------------------------------------------- /videos/wesbos - 1585258976421224450.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/wesbos - 1585258976421224450.mp4 -------------------------------------------------------------------------------- /videos/wesbos - 1585641232155348992.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/wesbos - 1585641232155348992.mp4 -------------------------------------------------------------------------------- /videos/wesbos - 1587082842110033926.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/wesbos - 1587082842110033926.mp4 -------------------------------------------------------------------------------- /videos/wesbos - 1615777112408866832.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/typescript-tips/ff530965bfcbf2ae602f21d2b8f406943abd3f75/videos/wesbos - 1615777112408866832.mp4 -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@11ty/dependency-tree@^2.0.1": 6 | version "2.0.1" 7 | resolved "https://registry.yarnpkg.com/@11ty/dependency-tree/-/dependency-tree-2.0.1.tgz#b3c8fa6c91c4a29257e70dd19d26cca75cde89d2" 8 | integrity sha512-5R+DsT9LJ9tXiSQ4y+KLFppCkQyXhzAm1AIuBWE/sbU0hSXY5pkhoqQYEcPJQFg/nglL+wD55iv2j+7O96UAvg== 9 | 10 | "@11ty/eleventy-dev-server@^1.0.4": 11 | version "1.0.4" 12 | resolved "https://registry.yarnpkg.com/@11ty/eleventy-dev-server/-/eleventy-dev-server-1.0.4.tgz#87c2cf182ed22f90ac2793e1e1337a0d9e32b318" 13 | integrity sha512-qVBmV2G1KF/0o5B/3fITlrrDHy4bONUI2YuN3/WJ3BNw4NU1d/we8XhKrlgq13nNvHoBx5czYp3LZt8qRG53Fg== 14 | dependencies: 15 | "@11ty/eleventy-utils" "^1.0.1" 16 | chokidar "^3.5.3" 17 | debug "^4.3.4" 18 | dev-ip "^1.0.1" 19 | finalhandler "^1.2.0" 20 | mime "^3.0.0" 21 | minimist "^1.2.8" 22 | morphdom "^2.7.0" 23 | please-upgrade-node "^3.2.0" 24 | ssri "^8.0.1" 25 | ws "^8.13.0" 26 | 27 | "@11ty/eleventy-utils@^1.0.1": 28 | version "1.0.3" 29 | resolved "https://registry.yarnpkg.com/@11ty/eleventy-utils/-/eleventy-utils-1.0.3.tgz#fb70305aed2499eba93b7d1d31de045efe3997fa" 30 | integrity sha512-nULO91om7vQw4Y/UBjM8i7nJ1xl+/nyK4rImZ41lFxiY2d+XUz7ChAj1CDYFjrLZeu0utAYJTZ45LlcHTkUG4g== 31 | dependencies: 32 | normalize-path "^3.0.0" 33 | 34 | "@11ty/eleventy@2.0.1": 35 | version "2.0.1" 36 | resolved "https://registry.yarnpkg.com/@11ty/eleventy/-/eleventy-2.0.1.tgz#d96104c401a83b59f69a207c96aa53ad42131b15" 37 | integrity sha512-t8XVUbCJByhVEa1RzO0zS2QzbL3wPY8ot1yUw9noqiSHxJWUwv6jiwm1/MZDPTYtkZH2ZHvdQIRQ5/SjG9XmLw== 38 | dependencies: 39 | "@11ty/dependency-tree" "^2.0.1" 40 | "@11ty/eleventy-dev-server" "^1.0.4" 41 | "@11ty/eleventy-utils" "^1.0.1" 42 | "@11ty/lodash-custom" "^4.17.21" 43 | "@iarna/toml" "^2.2.5" 44 | "@sindresorhus/slugify" "^1.1.2" 45 | bcp-47-normalize "^1.1.1" 46 | chokidar "^3.5.3" 47 | cross-spawn "^7.0.3" 48 | debug "^4.3.4" 49 | dependency-graph "^0.11.0" 50 | ejs "^3.1.9" 51 | fast-glob "^3.2.12" 52 | graceful-fs "^4.2.11" 53 | gray-matter "^4.0.3" 54 | hamljs "^0.6.2" 55 | handlebars "^4.7.7" 56 | is-glob "^4.0.3" 57 | iso-639-1 "^2.1.15" 58 | kleur "^4.1.5" 59 | liquidjs "^10.7.0" 60 | luxon "^3.3.0" 61 | markdown-it "^13.0.1" 62 | micromatch "^4.0.5" 63 | minimist "^1.2.8" 64 | moo "^0.5.2" 65 | multimatch "^5.0.0" 66 | mustache "^4.2.0" 67 | normalize-path "^3.0.0" 68 | nunjucks "^3.2.3" 69 | path-to-regexp "^6.2.1" 70 | please-upgrade-node "^3.2.0" 71 | posthtml "^0.16.6" 72 | posthtml-urls "^1.0.0" 73 | pug "^3.0.2" 74 | recursive-copy "^2.0.14" 75 | semver "^7.3.8" 76 | slugify "^1.6.6" 77 | 78 | "@11ty/lodash-custom@^4.17.21": 79 | version "4.17.21" 80 | resolved "https://registry.yarnpkg.com/@11ty/lodash-custom/-/lodash-custom-4.17.21.tgz#a8d2e25a47ee3bb58b71cde4edc2ae8dd3d1b269" 81 | integrity sha512-Mqt6im1xpb1Ykn3nbcCovWXK3ggywRJa+IXIdoz4wIIK+cvozADH63lexcuPpGS/gJ6/m2JxyyXDyupkMr5DHw== 82 | 83 | "@babel/helper-string-parser@^7.27.1": 84 | version "7.27.1" 85 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" 86 | integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== 87 | 88 | "@babel/helper-validator-identifier@^7.27.1": 89 | version "7.27.1" 90 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" 91 | integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== 92 | 93 | "@babel/parser@^7.6.0", "@babel/parser@^7.9.6": 94 | version "7.27.4" 95 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.4.tgz#f92e89e4f51847be05427285836fc88341c956df" 96 | integrity sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g== 97 | dependencies: 98 | "@babel/types" "^7.27.3" 99 | 100 | "@babel/types@^7.27.3", "@babel/types@^7.6.1", "@babel/types@^7.9.6": 101 | version "7.27.3" 102 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.3.tgz#c0257bedf33aad6aad1f406d35c44758321eb3ec" 103 | integrity sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw== 104 | dependencies: 105 | "@babel/helper-string-parser" "^7.27.1" 106 | "@babel/helper-validator-identifier" "^7.27.1" 107 | 108 | "@iarna/toml@^2.2.5": 109 | version "2.2.5" 110 | resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" 111 | integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== 112 | 113 | "@nodelib/fs.scandir@2.1.5": 114 | version "2.1.5" 115 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 116 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 117 | dependencies: 118 | "@nodelib/fs.stat" "2.0.5" 119 | run-parallel "^1.1.9" 120 | 121 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 122 | version "2.0.5" 123 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 124 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 125 | 126 | "@nodelib/fs.walk@^1.2.3": 127 | version "1.2.8" 128 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 129 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 130 | dependencies: 131 | "@nodelib/fs.scandir" "2.1.5" 132 | fastq "^1.6.0" 133 | 134 | "@sindresorhus/slugify@^1.1.2": 135 | version "1.1.2" 136 | resolved "https://registry.yarnpkg.com/@sindresorhus/slugify/-/slugify-1.1.2.tgz#c2c0129298b8caace2d9156176fe244d0e83156c" 137 | integrity sha512-V9nR/W0Xd9TSGXpZ4iFUcFGhuOJtZX82Fzxj1YISlbSgKvIiNa7eLEZrT0vAraPOt++KHauIVNYgGRgjc13dXA== 138 | dependencies: 139 | "@sindresorhus/transliterate" "^0.1.1" 140 | escape-string-regexp "^4.0.0" 141 | 142 | "@sindresorhus/transliterate@^0.1.1": 143 | version "0.1.2" 144 | resolved "https://registry.yarnpkg.com/@sindresorhus/transliterate/-/transliterate-0.1.2.tgz#ffce368271d153550e87de81486004f2637425af" 145 | integrity sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w== 146 | dependencies: 147 | escape-string-regexp "^2.0.0" 148 | lodash.deburr "^4.1.0" 149 | 150 | "@types/minimatch@^3.0.3": 151 | version "3.0.5" 152 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" 153 | integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== 154 | 155 | a-sync-waterfall@^1.0.0: 156 | version "1.0.1" 157 | resolved "https://registry.yarnpkg.com/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz#75b6b6aa72598b497a125e7a2770f14f4c8a1fa7" 158 | integrity sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA== 159 | 160 | acorn@^7.1.1: 161 | version "7.4.1" 162 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" 163 | integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== 164 | 165 | ansi-styles@^4.1.0: 166 | version "4.3.0" 167 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 168 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 169 | dependencies: 170 | color-convert "^2.0.1" 171 | 172 | any-promise@^0.1.0: 173 | version "0.1.0" 174 | resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-0.1.0.tgz#830b680aa7e56f33451d4b049f3bd8044498ee27" 175 | integrity sha512-lqzY9o+BbeGHRCOyxQkt/Tgvz0IZhTmQiA+LxQW8wSNpcTbj8K+0cZiSEvbpNZZP9/11Gy7dnLO3GNWUXO4d1g== 176 | 177 | anymatch@~3.1.2: 178 | version "3.1.3" 179 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 180 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 181 | dependencies: 182 | normalize-path "^3.0.0" 183 | picomatch "^2.0.4" 184 | 185 | argparse@^1.0.7: 186 | version "1.0.10" 187 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 188 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 189 | dependencies: 190 | sprintf-js "~1.0.2" 191 | 192 | argparse@^2.0.1: 193 | version "2.0.1" 194 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 195 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 196 | 197 | array-differ@^1.0.0: 198 | version "1.0.0" 199 | resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" 200 | integrity sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ== 201 | 202 | array-differ@^3.0.0: 203 | version "3.0.0" 204 | resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" 205 | integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== 206 | 207 | array-union@^1.0.1: 208 | version "1.0.2" 209 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 210 | integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== 211 | dependencies: 212 | array-uniq "^1.0.1" 213 | 214 | array-union@^2.1.0: 215 | version "2.1.0" 216 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 217 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 218 | 219 | array-uniq@^1.0.1: 220 | version "1.0.3" 221 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 222 | integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== 223 | 224 | arrify@^1.0.0: 225 | version "1.0.1" 226 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 227 | integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== 228 | 229 | arrify@^2.0.1: 230 | version "2.0.1" 231 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" 232 | integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== 233 | 234 | asap@^2.0.3, asap@~2.0.3: 235 | version "2.0.6" 236 | resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" 237 | integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== 238 | 239 | assert-never@^1.2.1: 240 | version "1.4.0" 241 | resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.4.0.tgz#b0d4988628c87f35eb94716cc54422a63927e175" 242 | integrity sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA== 243 | 244 | async@^3.2.3: 245 | version "3.2.6" 246 | resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" 247 | integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== 248 | 249 | babel-walk@3.0.0-canary-5: 250 | version "3.0.0-canary-5" 251 | resolved "https://registry.yarnpkg.com/babel-walk/-/babel-walk-3.0.0-canary-5.tgz#f66ecd7298357aee44955f235a6ef54219104b11" 252 | integrity sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw== 253 | dependencies: 254 | "@babel/types" "^7.9.6" 255 | 256 | balanced-match@^1.0.0: 257 | version "1.0.2" 258 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 259 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 260 | 261 | bcp-47-match@^1.0.0: 262 | version "1.0.3" 263 | resolved "https://registry.yarnpkg.com/bcp-47-match/-/bcp-47-match-1.0.3.tgz#cb8d03071389a10aff2062b862d6575ffd7cd7ef" 264 | integrity sha512-LggQ4YTdjWQSKELZF5JwchnBa1u0pIQSZf5lSdOHEdbVP55h0qICA/FUp3+W99q0xqxYa1ZQizTUH87gecII5w== 265 | 266 | bcp-47-normalize@^1.1.1: 267 | version "1.1.1" 268 | resolved "https://registry.yarnpkg.com/bcp-47-normalize/-/bcp-47-normalize-1.1.1.tgz#d2c76218d132f223c44e4a06a7224be3030f8ec3" 269 | integrity sha512-jWZ1Jdu3cs0EZdfCkS0UE9Gg01PtxnChjEBySeB+Zo6nkqtFfnvtoQQgP1qU1Oo4qgJgxhTI6Sf9y/pZIhPs0A== 270 | dependencies: 271 | bcp-47 "^1.0.0" 272 | bcp-47-match "^1.0.0" 273 | 274 | bcp-47@^1.0.0: 275 | version "1.0.8" 276 | resolved "https://registry.yarnpkg.com/bcp-47/-/bcp-47-1.0.8.tgz#bf63ae4269faabe7c100deac0811121a48b6a561" 277 | integrity sha512-Y9y1QNBBtYtv7hcmoX0tR+tUNSFZGZ6OL6vKPObq8BbOhkCoyayF6ogfLTgAli/KuAEbsYHYUNq2AQuY6IuLag== 278 | dependencies: 279 | is-alphabetical "^1.0.0" 280 | is-alphanumerical "^1.0.0" 281 | is-decimal "^1.0.0" 282 | 283 | binary-extensions@^2.0.0: 284 | version "2.3.0" 285 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" 286 | integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== 287 | 288 | brace-expansion@^1.1.7: 289 | version "1.1.11" 290 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 291 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 292 | dependencies: 293 | balanced-match "^1.0.0" 294 | concat-map "0.0.1" 295 | 296 | brace-expansion@^2.0.1: 297 | version "2.0.1" 298 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 299 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 300 | dependencies: 301 | balanced-match "^1.0.0" 302 | 303 | braces@^3.0.3, braces@~3.0.2: 304 | version "3.0.3" 305 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 306 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 307 | dependencies: 308 | fill-range "^7.1.1" 309 | 310 | call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: 311 | version "1.0.2" 312 | resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" 313 | integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== 314 | dependencies: 315 | es-errors "^1.3.0" 316 | function-bind "^1.1.2" 317 | 318 | call-bound@^1.0.2: 319 | version "1.0.4" 320 | resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" 321 | integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== 322 | dependencies: 323 | call-bind-apply-helpers "^1.0.2" 324 | get-intrinsic "^1.3.0" 325 | 326 | chalk@^4.0.2: 327 | version "4.1.2" 328 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 329 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 330 | dependencies: 331 | ansi-styles "^4.1.0" 332 | supports-color "^7.1.0" 333 | 334 | character-parser@^2.2.0: 335 | version "2.2.0" 336 | resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" 337 | integrity sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw== 338 | dependencies: 339 | is-regex "^1.0.3" 340 | 341 | chokidar@^3.5.3: 342 | version "3.6.0" 343 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" 344 | integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== 345 | dependencies: 346 | anymatch "~3.1.2" 347 | braces "~3.0.2" 348 | glob-parent "~5.1.2" 349 | is-binary-path "~2.1.0" 350 | is-glob "~4.0.1" 351 | normalize-path "~3.0.0" 352 | readdirp "~3.6.0" 353 | optionalDependencies: 354 | fsevents "~2.3.2" 355 | 356 | color-convert@^2.0.1: 357 | version "2.0.1" 358 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 359 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 360 | dependencies: 361 | color-name "~1.1.4" 362 | 363 | color-name@~1.1.4: 364 | version "1.1.4" 365 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 366 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 367 | 368 | commander@^10.0.0: 369 | version "10.0.1" 370 | resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" 371 | integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== 372 | 373 | commander@^5.1.0: 374 | version "5.1.0" 375 | resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" 376 | integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== 377 | 378 | concat-map@0.0.1: 379 | version "0.0.1" 380 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 381 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 382 | 383 | constantinople@^4.0.1: 384 | version "4.0.1" 385 | resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-4.0.1.tgz#0def113fa0e4dc8de83331a5cf79c8b325213151" 386 | integrity sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw== 387 | dependencies: 388 | "@babel/parser" "^7.6.0" 389 | "@babel/types" "^7.6.1" 390 | 391 | cross-spawn@^7.0.3: 392 | version "7.0.6" 393 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" 394 | integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== 395 | dependencies: 396 | path-key "^3.1.0" 397 | shebang-command "^2.0.0" 398 | which "^2.0.1" 399 | 400 | debug@2.6.9: 401 | version "2.6.9" 402 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 403 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 404 | dependencies: 405 | ms "2.0.0" 406 | 407 | debug@^4.3.4: 408 | version "4.4.1" 409 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" 410 | integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== 411 | dependencies: 412 | ms "^2.1.3" 413 | 414 | dependency-graph@^0.11.0: 415 | version "0.11.0" 416 | resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" 417 | integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== 418 | 419 | dev-ip@^1.0.1: 420 | version "1.0.1" 421 | resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" 422 | integrity sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A== 423 | 424 | doctypes@^1.1.0: 425 | version "1.1.0" 426 | resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" 427 | integrity sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ== 428 | 429 | dom-serializer@^1.0.1: 430 | version "1.4.1" 431 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" 432 | integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== 433 | dependencies: 434 | domelementtype "^2.0.1" 435 | domhandler "^4.2.0" 436 | entities "^2.0.0" 437 | 438 | domelementtype@^2.0.1, domelementtype@^2.2.0: 439 | version "2.3.0" 440 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" 441 | integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== 442 | 443 | domhandler@^4.2.0, domhandler@^4.2.2: 444 | version "4.3.1" 445 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" 446 | integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== 447 | dependencies: 448 | domelementtype "^2.2.0" 449 | 450 | domutils@^2.8.0: 451 | version "2.8.0" 452 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" 453 | integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== 454 | dependencies: 455 | dom-serializer "^1.0.1" 456 | domelementtype "^2.2.0" 457 | domhandler "^4.2.0" 458 | 459 | dunder-proto@^1.0.1: 460 | version "1.0.1" 461 | resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" 462 | integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== 463 | dependencies: 464 | call-bind-apply-helpers "^1.0.1" 465 | es-errors "^1.3.0" 466 | gopd "^1.2.0" 467 | 468 | ee-first@1.1.1: 469 | version "1.1.1" 470 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 471 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 472 | 473 | ejs@^3.1.9: 474 | version "3.1.10" 475 | resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" 476 | integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== 477 | dependencies: 478 | jake "^10.8.5" 479 | 480 | encodeurl@~2.0.0: 481 | version "2.0.0" 482 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" 483 | integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== 484 | 485 | entities@^2.0.0: 486 | version "2.2.0" 487 | resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" 488 | integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== 489 | 490 | entities@^3.0.1, entities@~3.0.1: 491 | version "3.0.1" 492 | resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" 493 | integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== 494 | 495 | errno@^0.1.2: 496 | version "0.1.8" 497 | resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" 498 | integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== 499 | dependencies: 500 | prr "~1.0.1" 501 | 502 | es-define-property@^1.0.1: 503 | version "1.0.1" 504 | resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" 505 | integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== 506 | 507 | es-errors@^1.3.0: 508 | version "1.3.0" 509 | resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" 510 | integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== 511 | 512 | es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: 513 | version "1.1.1" 514 | resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" 515 | integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== 516 | dependencies: 517 | es-errors "^1.3.0" 518 | 519 | escape-html@~1.0.3: 520 | version "1.0.3" 521 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 522 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 523 | 524 | escape-string-regexp@^2.0.0: 525 | version "2.0.0" 526 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" 527 | integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== 528 | 529 | escape-string-regexp@^4.0.0: 530 | version "4.0.0" 531 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 532 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 533 | 534 | esprima@^4.0.0: 535 | version "4.0.1" 536 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 537 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 538 | 539 | extend-shallow@^2.0.1: 540 | version "2.0.1" 541 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 542 | integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== 543 | dependencies: 544 | is-extendable "^0.1.0" 545 | 546 | fast-glob@^3.2.12: 547 | version "3.3.3" 548 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" 549 | integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== 550 | dependencies: 551 | "@nodelib/fs.stat" "^2.0.2" 552 | "@nodelib/fs.walk" "^1.2.3" 553 | glob-parent "^5.1.2" 554 | merge2 "^1.3.0" 555 | micromatch "^4.0.8" 556 | 557 | fastq@^1.6.0: 558 | version "1.19.1" 559 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" 560 | integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== 561 | dependencies: 562 | reusify "^1.0.4" 563 | 564 | filelist@^1.0.4: 565 | version "1.0.4" 566 | resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" 567 | integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== 568 | dependencies: 569 | minimatch "^5.0.1" 570 | 571 | fill-range@^7.1.1: 572 | version "7.1.1" 573 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 574 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 575 | dependencies: 576 | to-regex-range "^5.0.1" 577 | 578 | finalhandler@^1.2.0: 579 | version "1.3.1" 580 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" 581 | integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== 582 | dependencies: 583 | debug "2.6.9" 584 | encodeurl "~2.0.0" 585 | escape-html "~1.0.3" 586 | on-finished "2.4.1" 587 | parseurl "~1.3.3" 588 | statuses "2.0.1" 589 | unpipe "~1.0.0" 590 | 591 | fs.realpath@^1.0.0: 592 | version "1.0.0" 593 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 594 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 595 | 596 | fsevents@~2.3.2: 597 | version "2.3.3" 598 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 599 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 600 | 601 | function-bind@^1.1.2: 602 | version "1.1.2" 603 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 604 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 605 | 606 | get-intrinsic@^1.3.0: 607 | version "1.3.0" 608 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" 609 | integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== 610 | dependencies: 611 | call-bind-apply-helpers "^1.0.2" 612 | es-define-property "^1.0.1" 613 | es-errors "^1.3.0" 614 | es-object-atoms "^1.1.1" 615 | function-bind "^1.1.2" 616 | get-proto "^1.0.1" 617 | gopd "^1.2.0" 618 | has-symbols "^1.1.0" 619 | hasown "^2.0.2" 620 | math-intrinsics "^1.1.0" 621 | 622 | get-proto@^1.0.1: 623 | version "1.0.1" 624 | resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" 625 | integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== 626 | dependencies: 627 | dunder-proto "^1.0.1" 628 | es-object-atoms "^1.0.0" 629 | 630 | glob-parent@^5.1.2, glob-parent@~5.1.2: 631 | version "5.1.2" 632 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 633 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 634 | dependencies: 635 | is-glob "^4.0.1" 636 | 637 | glob@^7.1.3: 638 | version "7.2.3" 639 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 640 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 641 | dependencies: 642 | fs.realpath "^1.0.0" 643 | inflight "^1.0.4" 644 | inherits "2" 645 | minimatch "^3.1.1" 646 | once "^1.3.0" 647 | path-is-absolute "^1.0.0" 648 | 649 | gopd@^1.2.0: 650 | version "1.2.0" 651 | resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" 652 | integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== 653 | 654 | graceful-fs@^4.1.4, graceful-fs@^4.2.11: 655 | version "4.2.11" 656 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 657 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 658 | 659 | gray-matter@^4.0.3: 660 | version "4.0.3" 661 | resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" 662 | integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== 663 | dependencies: 664 | js-yaml "^3.13.1" 665 | kind-of "^6.0.2" 666 | section-matter "^1.0.0" 667 | strip-bom-string "^1.0.0" 668 | 669 | hamljs@^0.6.2: 670 | version "0.6.2" 671 | resolved "https://registry.yarnpkg.com/hamljs/-/hamljs-0.6.2.tgz#7b7116cf6dbe7278e42b3f6ef8725a33e177c8e3" 672 | integrity sha512-/chXRp4WpL47I+HX1vCCdSbEXAljEG2FBMmgO7Am0bYsqgnEjreeWzUdX1onXqwZtcfgxbCg5WtEYYvuZ5muBg== 673 | 674 | handlebars@^4.7.7: 675 | version "4.7.8" 676 | resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" 677 | integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== 678 | dependencies: 679 | minimist "^1.2.5" 680 | neo-async "^2.6.2" 681 | source-map "^0.6.1" 682 | wordwrap "^1.0.0" 683 | optionalDependencies: 684 | uglify-js "^3.1.4" 685 | 686 | has-flag@^4.0.0: 687 | version "4.0.0" 688 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 689 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 690 | 691 | has-symbols@^1.0.3, has-symbols@^1.1.0: 692 | version "1.1.0" 693 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" 694 | integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== 695 | 696 | has-tostringtag@^1.0.2: 697 | version "1.0.2" 698 | resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" 699 | integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== 700 | dependencies: 701 | has-symbols "^1.0.3" 702 | 703 | hasown@^2.0.2: 704 | version "2.0.2" 705 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" 706 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 707 | dependencies: 708 | function-bind "^1.1.2" 709 | 710 | htmlparser2@^7.1.1: 711 | version "7.2.0" 712 | resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5" 713 | integrity sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog== 714 | dependencies: 715 | domelementtype "^2.0.1" 716 | domhandler "^4.2.2" 717 | domutils "^2.8.0" 718 | entities "^3.0.1" 719 | 720 | http-equiv-refresh@^1.0.0: 721 | version "1.0.0" 722 | resolved "https://registry.yarnpkg.com/http-equiv-refresh/-/http-equiv-refresh-1.0.0.tgz#8ec538866042be5f3f7afa737d198d94beb1b07b" 723 | integrity sha512-TScO04soylRN9i/QdOdgZyhydXg9z6XdaGzEyOgDKycePeDeTT4KvigjBcI+tgfTlieLWauGORMq5F1eIDa+1w== 724 | 725 | inflight@^1.0.4: 726 | version "1.0.6" 727 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 728 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 729 | dependencies: 730 | once "^1.3.0" 731 | wrappy "1" 732 | 733 | inherits@2: 734 | version "2.0.4" 735 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 736 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 737 | 738 | is-alphabetical@^1.0.0: 739 | version "1.0.4" 740 | resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" 741 | integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== 742 | 743 | is-alphanumerical@^1.0.0: 744 | version "1.0.4" 745 | resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" 746 | integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== 747 | dependencies: 748 | is-alphabetical "^1.0.0" 749 | is-decimal "^1.0.0" 750 | 751 | is-binary-path@~2.1.0: 752 | version "2.1.0" 753 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 754 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 755 | dependencies: 756 | binary-extensions "^2.0.0" 757 | 758 | is-core-module@^2.16.0: 759 | version "2.16.1" 760 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" 761 | integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== 762 | dependencies: 763 | hasown "^2.0.2" 764 | 765 | is-decimal@^1.0.0: 766 | version "1.0.4" 767 | resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" 768 | integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== 769 | 770 | is-expression@^4.0.0: 771 | version "4.0.0" 772 | resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-4.0.0.tgz#c33155962abf21d0afd2552514d67d2ec16fd2ab" 773 | integrity sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A== 774 | dependencies: 775 | acorn "^7.1.1" 776 | object-assign "^4.1.1" 777 | 778 | is-extendable@^0.1.0: 779 | version "0.1.1" 780 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 781 | integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== 782 | 783 | is-extglob@^2.1.1: 784 | version "2.1.1" 785 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 786 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 787 | 788 | is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: 789 | version "4.0.3" 790 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 791 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 792 | dependencies: 793 | is-extglob "^2.1.1" 794 | 795 | is-json@^2.0.1: 796 | version "2.0.1" 797 | resolved "https://registry.yarnpkg.com/is-json/-/is-json-2.0.1.tgz#6be166d144828a131d686891b983df62c39491ff" 798 | integrity sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA== 799 | 800 | is-number@^7.0.0: 801 | version "7.0.0" 802 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 803 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 804 | 805 | is-promise@^2.0.0: 806 | version "2.2.2" 807 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" 808 | integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== 809 | 810 | is-regex@^1.0.3: 811 | version "1.2.1" 812 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" 813 | integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== 814 | dependencies: 815 | call-bound "^1.0.2" 816 | gopd "^1.2.0" 817 | has-tostringtag "^1.0.2" 818 | hasown "^2.0.2" 819 | 820 | isexe@^2.0.0: 821 | version "2.0.0" 822 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 823 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 824 | 825 | iso-639-1@^2.1.15: 826 | version "2.1.15" 827 | resolved "https://registry.yarnpkg.com/iso-639-1/-/iso-639-1-2.1.15.tgz#20cf78a4f691aeb802c16f17a6bad7d99271e85d" 828 | integrity sha512-7c7mBznZu2ktfvyT582E2msM+Udc1EjOyhVRE/0ZsjD9LBtWSm23h3PtiRh2a35XoUsTQQjJXaJzuLjXsOdFDg== 829 | 830 | jake@^10.8.5: 831 | version "10.9.2" 832 | resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" 833 | integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== 834 | dependencies: 835 | async "^3.2.3" 836 | chalk "^4.0.2" 837 | filelist "^1.0.4" 838 | minimatch "^3.1.2" 839 | 840 | js-stringify@^1.0.2: 841 | version "1.0.2" 842 | resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" 843 | integrity sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g== 844 | 845 | js-yaml@^3.13.1: 846 | version "3.14.1" 847 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" 848 | integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== 849 | dependencies: 850 | argparse "^1.0.7" 851 | esprima "^4.0.0" 852 | 853 | jstransformer@1.0.0: 854 | version "1.0.0" 855 | resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" 856 | integrity sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A== 857 | dependencies: 858 | is-promise "^2.0.0" 859 | promise "^7.0.1" 860 | 861 | junk@^1.0.1: 862 | version "1.0.3" 863 | resolved "https://registry.yarnpkg.com/junk/-/junk-1.0.3.tgz#87be63488649cbdca6f53ab39bec9ccd2347f592" 864 | integrity sha512-3KF80UaaSSxo8jVnRYtMKNGFOoVPBdkkVPsw+Ad0y4oxKXPduS6G6iHkrf69yJVff/VAaYXkV42rtZ7daJxU3w== 865 | 866 | kind-of@^6.0.0, kind-of@^6.0.2: 867 | version "6.0.3" 868 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" 869 | integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== 870 | 871 | kleur@^4.1.5: 872 | version "4.1.5" 873 | resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" 874 | integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== 875 | 876 | linkify-it@^4.0.1: 877 | version "4.0.1" 878 | resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-4.0.1.tgz#01f1d5e508190d06669982ba31a7d9f56a5751ec" 879 | integrity sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw== 880 | dependencies: 881 | uc.micro "^1.0.1" 882 | 883 | liquidjs@^10.7.0: 884 | version "10.21.1" 885 | resolved "https://registry.yarnpkg.com/liquidjs/-/liquidjs-10.21.1.tgz#5867dac16f1a74552e1ca5fdc976c0fa4bcdf527" 886 | integrity sha512-NZXmCwv3RG5nire3fmIn9HsOyJX3vo+ptp0yaXUHAMzSNBhx74Hm+dAGJvscUA6lNqbLuYfXgNavRQ9UbUJhQQ== 887 | dependencies: 888 | commander "^10.0.0" 889 | 890 | list-to-array@^1.1.0: 891 | version "1.1.0" 892 | resolved "https://registry.yarnpkg.com/list-to-array/-/list-to-array-1.1.0.tgz#ca7dff640606433cac75cbe8446acd864b15bf6f" 893 | integrity sha512-+dAZZ2mM+/m+vY9ezfoueVvrgnHIGi5FvgSymbIgJOFwiznWyA59mav95L+Mc6xPtL3s9gm5eNTlNtxJLbNM1g== 894 | 895 | lodash.deburr@^4.1.0: 896 | version "4.1.0" 897 | resolved "https://registry.yarnpkg.com/lodash.deburr/-/lodash.deburr-4.1.0.tgz#ddb1bbb3ef07458c0177ba07de14422cb033ff9b" 898 | integrity sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ== 899 | 900 | luxon@^3.3.0: 901 | version "3.6.1" 902 | resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.6.1.tgz#d283ffc4c0076cb0db7885ec6da1c49ba97e47b0" 903 | integrity sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ== 904 | 905 | markdown-it@^13.0.1: 906 | version "13.0.2" 907 | resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.2.tgz#1bc22e23379a6952e5d56217fbed881e0c94d536" 908 | integrity sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w== 909 | dependencies: 910 | argparse "^2.0.1" 911 | entities "~3.0.1" 912 | linkify-it "^4.0.1" 913 | mdurl "^1.0.1" 914 | uc.micro "^1.0.5" 915 | 916 | math-intrinsics@^1.1.0: 917 | version "1.1.0" 918 | resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" 919 | integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== 920 | 921 | maximatch@^0.1.0: 922 | version "0.1.0" 923 | resolved "https://registry.yarnpkg.com/maximatch/-/maximatch-0.1.0.tgz#86cd8d6b04c9f307c05a6b9419906d0360fb13a2" 924 | integrity sha512-9ORVtDUFk4u/NFfo0vG/ND/z7UQCVZBL539YW0+U1I7H1BkZwizcPx5foFv7LCPcBnm2U6RjFnQOsIvN4/Vm2A== 925 | dependencies: 926 | array-differ "^1.0.0" 927 | array-union "^1.0.1" 928 | arrify "^1.0.0" 929 | minimatch "^3.0.0" 930 | 931 | mdurl@^1.0.1: 932 | version "1.0.1" 933 | resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" 934 | integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== 935 | 936 | merge2@^1.3.0: 937 | version "1.4.1" 938 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 939 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 940 | 941 | micromatch@^4.0.5, micromatch@^4.0.8: 942 | version "4.0.8" 943 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" 944 | integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== 945 | dependencies: 946 | braces "^3.0.3" 947 | picomatch "^2.3.1" 948 | 949 | mime@^3.0.0: 950 | version "3.0.0" 951 | resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" 952 | integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== 953 | 954 | minimatch@^3.0.0, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: 955 | version "3.1.2" 956 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 957 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 958 | dependencies: 959 | brace-expansion "^1.1.7" 960 | 961 | minimatch@^5.0.1: 962 | version "5.1.6" 963 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" 964 | integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== 965 | dependencies: 966 | brace-expansion "^2.0.1" 967 | 968 | minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: 969 | version "1.2.8" 970 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" 971 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 972 | 973 | minipass@^3.1.1: 974 | version "3.3.6" 975 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" 976 | integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== 977 | dependencies: 978 | yallist "^4.0.0" 979 | 980 | mkdirp@^0.5.1: 981 | version "0.5.6" 982 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" 983 | integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== 984 | dependencies: 985 | minimist "^1.2.6" 986 | 987 | moo@^0.5.2: 988 | version "0.5.2" 989 | resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.2.tgz#f9fe82473bc7c184b0d32e2215d3f6e67278733c" 990 | integrity sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q== 991 | 992 | morphdom@^2.7.0: 993 | version "2.7.5" 994 | resolved "https://registry.yarnpkg.com/morphdom/-/morphdom-2.7.5.tgz#1f3942c85df3745a28674c41ddad572910259c05" 995 | integrity sha512-z6bfWFMra7kBqDjQGHud1LSXtq5JJC060viEkQFMBX6baIecpkNr2Ywrn2OQfWP3rXiNFQRPoFjD8/TvJcWcDg== 996 | 997 | ms@2.0.0: 998 | version "2.0.0" 999 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1000 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 1001 | 1002 | ms@^2.1.3: 1003 | version "2.1.3" 1004 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1005 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1006 | 1007 | multimatch@^5.0.0: 1008 | version "5.0.0" 1009 | resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" 1010 | integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== 1011 | dependencies: 1012 | "@types/minimatch" "^3.0.3" 1013 | array-differ "^3.0.0" 1014 | array-union "^2.1.0" 1015 | arrify "^2.0.1" 1016 | minimatch "^3.0.4" 1017 | 1018 | mustache@^4.2.0: 1019 | version "4.2.0" 1020 | resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" 1021 | integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== 1022 | 1023 | neo-async@^2.6.2: 1024 | version "2.6.2" 1025 | resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" 1026 | integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== 1027 | 1028 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1029 | version "3.0.0" 1030 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1031 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1032 | 1033 | nunjucks@^3.2.3: 1034 | version "3.2.4" 1035 | resolved "https://registry.yarnpkg.com/nunjucks/-/nunjucks-3.2.4.tgz#f0878eef528ce7b0aa35d67cc6898635fd74649e" 1036 | integrity sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ== 1037 | dependencies: 1038 | a-sync-waterfall "^1.0.0" 1039 | asap "^2.0.3" 1040 | commander "^5.1.0" 1041 | 1042 | object-assign@^4.1.1: 1043 | version "4.1.1" 1044 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1045 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 1046 | 1047 | on-finished@2.4.1: 1048 | version "2.4.1" 1049 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 1050 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 1051 | dependencies: 1052 | ee-first "1.1.1" 1053 | 1054 | once@^1.3.0: 1055 | version "1.4.0" 1056 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1057 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1058 | dependencies: 1059 | wrappy "1" 1060 | 1061 | parse-srcset@^1.0.2: 1062 | version "1.0.2" 1063 | resolved "https://registry.yarnpkg.com/parse-srcset/-/parse-srcset-1.0.2.tgz#f2bd221f6cc970a938d88556abc589caaaa2bde1" 1064 | integrity sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q== 1065 | 1066 | parseurl@~1.3.3: 1067 | version "1.3.3" 1068 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1069 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1070 | 1071 | path-is-absolute@^1.0.0: 1072 | version "1.0.1" 1073 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1074 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1075 | 1076 | path-key@^3.1.0: 1077 | version "3.1.1" 1078 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1079 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1080 | 1081 | path-parse@^1.0.7: 1082 | version "1.0.7" 1083 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1084 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1085 | 1086 | path-to-regexp@^6.2.1: 1087 | version "6.3.0" 1088 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4" 1089 | integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== 1090 | 1091 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: 1092 | version "2.3.1" 1093 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1094 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1095 | 1096 | pify@^2.3.0: 1097 | version "2.3.0" 1098 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1099 | integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== 1100 | 1101 | please-upgrade-node@^3.2.0: 1102 | version "3.2.0" 1103 | resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" 1104 | integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== 1105 | dependencies: 1106 | semver-compare "^1.0.0" 1107 | 1108 | posthtml-parser@^0.11.0: 1109 | version "0.11.0" 1110 | resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.11.0.tgz#25d1c7bf811ea83559bc4c21c189a29747a24b7a" 1111 | integrity sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw== 1112 | dependencies: 1113 | htmlparser2 "^7.1.1" 1114 | 1115 | posthtml-render@^3.0.0: 1116 | version "3.0.0" 1117 | resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-3.0.0.tgz#97be44931496f495b4f07b99e903cc70ad6a3205" 1118 | integrity sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA== 1119 | dependencies: 1120 | is-json "^2.0.1" 1121 | 1122 | posthtml-urls@^1.0.0: 1123 | version "1.0.0" 1124 | resolved "https://registry.yarnpkg.com/posthtml-urls/-/posthtml-urls-1.0.0.tgz#3102d7b9e5c2fbdf19c8ec7ca825600dad3b9164" 1125 | integrity sha512-CMJ0L009sGQVUuYM/g6WJdscsq6ooAwhUuF6CDlYPMLxKp2rmCYVebEU+wZGxnQstGJhZPMvXsRhtqekILd5/w== 1126 | dependencies: 1127 | http-equiv-refresh "^1.0.0" 1128 | list-to-array "^1.1.0" 1129 | parse-srcset "^1.0.2" 1130 | promise-each "^2.2.0" 1131 | 1132 | posthtml@^0.16.6: 1133 | version "0.16.6" 1134 | resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.16.6.tgz#e2fc407f67a64d2fa3567afe770409ffdadafe59" 1135 | integrity sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ== 1136 | dependencies: 1137 | posthtml-parser "^0.11.0" 1138 | posthtml-render "^3.0.0" 1139 | 1140 | promise-each@^2.2.0: 1141 | version "2.2.0" 1142 | resolved "https://registry.yarnpkg.com/promise-each/-/promise-each-2.2.0.tgz#3353174eff2694481037e04e01f77aa0fb6d1b60" 1143 | integrity sha512-67roqt1k3QDA41DZ8xi0V+rF3GoaMiX7QilbXu0vXimut+9RcKBNZ/t60xCRgcsihmNUsEjh48xLfNqOrKblUg== 1144 | dependencies: 1145 | any-promise "^0.1.0" 1146 | 1147 | promise@^7.0.1: 1148 | version "7.3.1" 1149 | resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" 1150 | integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== 1151 | dependencies: 1152 | asap "~2.0.3" 1153 | 1154 | prr@~1.0.1: 1155 | version "1.0.1" 1156 | resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" 1157 | integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== 1158 | 1159 | pug-attrs@^3.0.0: 1160 | version "3.0.0" 1161 | resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-3.0.0.tgz#b10451e0348165e31fad1cc23ebddd9dc7347c41" 1162 | integrity sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA== 1163 | dependencies: 1164 | constantinople "^4.0.1" 1165 | js-stringify "^1.0.2" 1166 | pug-runtime "^3.0.0" 1167 | 1168 | pug-code-gen@^3.0.3: 1169 | version "3.0.3" 1170 | resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-3.0.3.tgz#58133178cb423fe1716aece1c1da392a75251520" 1171 | integrity sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw== 1172 | dependencies: 1173 | constantinople "^4.0.1" 1174 | doctypes "^1.1.0" 1175 | js-stringify "^1.0.2" 1176 | pug-attrs "^3.0.0" 1177 | pug-error "^2.1.0" 1178 | pug-runtime "^3.0.1" 1179 | void-elements "^3.1.0" 1180 | with "^7.0.0" 1181 | 1182 | pug-error@^2.0.0, pug-error@^2.1.0: 1183 | version "2.1.0" 1184 | resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-2.1.0.tgz#17ea37b587b6443d4b8f148374ec27b54b406e55" 1185 | integrity sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg== 1186 | 1187 | pug-filters@^4.0.0: 1188 | version "4.0.0" 1189 | resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-4.0.0.tgz#d3e49af5ba8472e9b7a66d980e707ce9d2cc9b5e" 1190 | integrity sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A== 1191 | dependencies: 1192 | constantinople "^4.0.1" 1193 | jstransformer "1.0.0" 1194 | pug-error "^2.0.0" 1195 | pug-walk "^2.0.0" 1196 | resolve "^1.15.1" 1197 | 1198 | pug-lexer@^5.0.1: 1199 | version "5.0.1" 1200 | resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-5.0.1.tgz#ae44628c5bef9b190b665683b288ca9024b8b0d5" 1201 | integrity sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w== 1202 | dependencies: 1203 | character-parser "^2.2.0" 1204 | is-expression "^4.0.0" 1205 | pug-error "^2.0.0" 1206 | 1207 | pug-linker@^4.0.0: 1208 | version "4.0.0" 1209 | resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-4.0.0.tgz#12cbc0594fc5a3e06b9fc59e6f93c146962a7708" 1210 | integrity sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw== 1211 | dependencies: 1212 | pug-error "^2.0.0" 1213 | pug-walk "^2.0.0" 1214 | 1215 | pug-load@^3.0.0: 1216 | version "3.0.0" 1217 | resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-3.0.0.tgz#9fd9cda52202b08adb11d25681fb9f34bd41b662" 1218 | integrity sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ== 1219 | dependencies: 1220 | object-assign "^4.1.1" 1221 | pug-walk "^2.0.0" 1222 | 1223 | pug-parser@^6.0.0: 1224 | version "6.0.0" 1225 | resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-6.0.0.tgz#a8fdc035863a95b2c1dc5ebf4ecf80b4e76a1260" 1226 | integrity sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw== 1227 | dependencies: 1228 | pug-error "^2.0.0" 1229 | token-stream "1.0.0" 1230 | 1231 | pug-runtime@^3.0.0, pug-runtime@^3.0.1: 1232 | version "3.0.1" 1233 | resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-3.0.1.tgz#f636976204723f35a8c5f6fad6acda2a191b83d7" 1234 | integrity sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg== 1235 | 1236 | pug-strip-comments@^2.0.0: 1237 | version "2.0.0" 1238 | resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz#f94b07fd6b495523330f490a7f554b4ff876303e" 1239 | integrity sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ== 1240 | dependencies: 1241 | pug-error "^2.0.0" 1242 | 1243 | pug-walk@^2.0.0: 1244 | version "2.0.0" 1245 | resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-2.0.0.tgz#417aabc29232bb4499b5b5069a2b2d2a24d5f5fe" 1246 | integrity sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ== 1247 | 1248 | pug@^3.0.2: 1249 | version "3.0.3" 1250 | resolved "https://registry.yarnpkg.com/pug/-/pug-3.0.3.tgz#e18324a314cd022883b1e0372b8af3a1a99f7597" 1251 | integrity sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g== 1252 | dependencies: 1253 | pug-code-gen "^3.0.3" 1254 | pug-filters "^4.0.0" 1255 | pug-lexer "^5.0.1" 1256 | pug-linker "^4.0.0" 1257 | pug-load "^3.0.0" 1258 | pug-parser "^6.0.0" 1259 | pug-runtime "^3.0.1" 1260 | pug-strip-comments "^2.0.0" 1261 | 1262 | queue-microtask@^1.2.2: 1263 | version "1.2.3" 1264 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1265 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1266 | 1267 | readdirp@~3.6.0: 1268 | version "3.6.0" 1269 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1270 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1271 | dependencies: 1272 | picomatch "^2.2.1" 1273 | 1274 | recursive-copy@^2.0.14: 1275 | version "2.0.14" 1276 | resolved "https://registry.yarnpkg.com/recursive-copy/-/recursive-copy-2.0.14.tgz#6358af3b5f8da89562f000db44720c4daa94b6d7" 1277 | integrity sha512-K8WNY8f8naTpfbA+RaXmkaQuD1IeW9EgNEfyGxSqqTQukpVtoOKros9jUqbpEsSw59YOmpd8nCBgtqJZy5nvog== 1278 | dependencies: 1279 | errno "^0.1.2" 1280 | graceful-fs "^4.1.4" 1281 | junk "^1.0.1" 1282 | maximatch "^0.1.0" 1283 | mkdirp "^0.5.1" 1284 | pify "^2.3.0" 1285 | promise "^7.0.1" 1286 | rimraf "^2.7.1" 1287 | slash "^1.0.0" 1288 | 1289 | resolve@^1.15.1: 1290 | version "1.22.10" 1291 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" 1292 | integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== 1293 | dependencies: 1294 | is-core-module "^2.16.0" 1295 | path-parse "^1.0.7" 1296 | supports-preserve-symlinks-flag "^1.0.0" 1297 | 1298 | reusify@^1.0.4: 1299 | version "1.1.0" 1300 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" 1301 | integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== 1302 | 1303 | rimraf@^2.7.1: 1304 | version "2.7.1" 1305 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 1306 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 1307 | dependencies: 1308 | glob "^7.1.3" 1309 | 1310 | run-parallel@^1.1.9: 1311 | version "1.2.0" 1312 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1313 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1314 | dependencies: 1315 | queue-microtask "^1.2.2" 1316 | 1317 | section-matter@^1.0.0: 1318 | version "1.0.0" 1319 | resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" 1320 | integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== 1321 | dependencies: 1322 | extend-shallow "^2.0.1" 1323 | kind-of "^6.0.0" 1324 | 1325 | semver-compare@^1.0.0: 1326 | version "1.0.0" 1327 | resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" 1328 | integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== 1329 | 1330 | semver@^7.3.8: 1331 | version "7.7.2" 1332 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" 1333 | integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== 1334 | 1335 | shebang-command@^2.0.0: 1336 | version "2.0.0" 1337 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1338 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1339 | dependencies: 1340 | shebang-regex "^3.0.0" 1341 | 1342 | shebang-regex@^3.0.0: 1343 | version "3.0.0" 1344 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1345 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1346 | 1347 | slash@^1.0.0: 1348 | version "1.0.0" 1349 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 1350 | integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg== 1351 | 1352 | slugify@^1.6.6: 1353 | version "1.6.6" 1354 | resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.6.tgz#2d4ac0eacb47add6af9e04d3be79319cbcc7924b" 1355 | integrity sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw== 1356 | 1357 | source-map@^0.6.1: 1358 | version "0.6.1" 1359 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1360 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1361 | 1362 | sprintf-js@~1.0.2: 1363 | version "1.0.3" 1364 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1365 | integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== 1366 | 1367 | ssri@^8.0.1: 1368 | version "8.0.1" 1369 | resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" 1370 | integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== 1371 | dependencies: 1372 | minipass "^3.1.1" 1373 | 1374 | statuses@2.0.1: 1375 | version "2.0.1" 1376 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 1377 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 1378 | 1379 | strip-bom-string@^1.0.0: 1380 | version "1.0.0" 1381 | resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" 1382 | integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== 1383 | 1384 | supports-color@^7.1.0: 1385 | version "7.2.0" 1386 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1387 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1388 | dependencies: 1389 | has-flag "^4.0.0" 1390 | 1391 | supports-preserve-symlinks-flag@^1.0.0: 1392 | version "1.0.0" 1393 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 1394 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 1395 | 1396 | to-regex-range@^5.0.1: 1397 | version "5.0.1" 1398 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1399 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1400 | dependencies: 1401 | is-number "^7.0.0" 1402 | 1403 | token-stream@1.0.0: 1404 | version "1.0.0" 1405 | resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4" 1406 | integrity sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg== 1407 | 1408 | uc.micro@^1.0.1, uc.micro@^1.0.5: 1409 | version "1.0.6" 1410 | resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" 1411 | integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== 1412 | 1413 | uglify-js@^3.1.4: 1414 | version "3.19.3" 1415 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" 1416 | integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== 1417 | 1418 | unpipe@~1.0.0: 1419 | version "1.0.0" 1420 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1421 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 1422 | 1423 | void-elements@^3.1.0: 1424 | version "3.1.0" 1425 | resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" 1426 | integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== 1427 | 1428 | which@^2.0.1: 1429 | version "2.0.2" 1430 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1431 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1432 | dependencies: 1433 | isexe "^2.0.0" 1434 | 1435 | with@^7.0.0: 1436 | version "7.0.2" 1437 | resolved "https://registry.yarnpkg.com/with/-/with-7.0.2.tgz#ccee3ad542d25538a7a7a80aad212b9828495bac" 1438 | integrity sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w== 1439 | dependencies: 1440 | "@babel/parser" "^7.9.6" 1441 | "@babel/types" "^7.9.6" 1442 | assert-never "^1.2.1" 1443 | babel-walk "3.0.0-canary-5" 1444 | 1445 | wordwrap@^1.0.0: 1446 | version "1.0.0" 1447 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 1448 | integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== 1449 | 1450 | wrappy@1: 1451 | version "1.0.2" 1452 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1453 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1454 | 1455 | ws@^8.13.0: 1456 | version "8.18.2" 1457 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.2.tgz#42738b2be57ced85f46154320aabb51ab003705a" 1458 | integrity sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ== 1459 | 1460 | yallist@^4.0.0: 1461 | version "4.0.0" 1462 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1463 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1464 | --------------------------------------------------------------------------------