diff --git a/.stylelintignore b/.stylelintignore index 3aed1aaf090..24e0c5166d8 100644 --- a/.stylelintignore +++ b/.stylelintignore @@ -1,3 +1,11 @@ -components/**/*-generated.css -tokens/* -components/site/* +*-generated.css + +tokens/**/*.css +node_modules/**/*.css + +plugins/*/expected/* +plugins/*/fixtures/* +dist/* + +components/*/dist/* +components/*/node_modules/* diff --git a/README.md b/README.md index 6b0ab19f5fc..a7705ca8ab7 100644 --- a/README.md +++ b/README.md @@ -345,7 +345,9 @@ This project includes several small scripts to help with common tasks. - **Note** that you must run `yarn build` before running `yarn compare` to ensure that the latest build is being compared. - `yarn refresh:env`: This copies values for the project's `.env` file (an asset never committed to the repo as it contains login secrets) by using the `.env.example` file as a template. This script is useful when you need to update the `.env` file with new values from the `.env.example` file or when you checkout or clean the repo and need to restore the `.env` file. - `yarn refresh:directory`: This will remove any deprecated package folders that are no longer in use. The goal is to make migrating to a new project architecture easier for the most number of users. -- `yarn lint:components`: Provides helpful updates and warnings for a component's package.json file. This helps keep all components in alignment. +- `yarn lint`: Provides helpful updates and warnings for a component's package.json file. This helps keep all components in alignment. + - Use `yarn lint --fix` to automatically fix any issues that are found. + - To run on a single component, use `yarn linter accordion` (where `accordion` is the name of the component or components you want to lint). ### CLI @@ -355,7 +357,6 @@ The following tasks are available: - `yarn build` - Performs a build of all components - `yarn dev` - Performs a component build, runs storybook, and serves the documentation on the default port (3000), then starts watching components and website files - `yarn clean` - Cleans all output files for the project and all components -- `yarn watch` - Assuming a build has already been performed, re-starts starts watching components and website files. Presumes a browser is already open to your locally served docs --- diff --git a/components/accordion/project.json b/components/accordion/project.json index 313d25ce10d..7265466f2d5 100644 --- a/components/accordion/project.json +++ b/components/accordion/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/actionbar/project.json b/components/actionbar/project.json index 833ebca9581..6f53d30b2f9 100644 --- a/components/actionbar/project.json +++ b/components/actionbar/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/actionbutton/project.json b/components/actionbutton/project.json index 0e642b0d002..973247a564d 100644 --- a/components/actionbutton/project.json +++ b/components/actionbutton/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/actiongroup/project.json b/components/actiongroup/project.json index fefde14808b..148620c6f06 100644 --- a/components/actiongroup/project.json +++ b/components/actiongroup/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/alertbanner/project.json b/components/alertbanner/project.json index 0505a3e467d..c4ba96c28c3 100644 --- a/components/alertbanner/project.json +++ b/components/alertbanner/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/alertdialog/project.json b/components/alertdialog/project.json index 0c54791e313..557e23db8d6 100644 --- a/components/alertdialog/project.json +++ b/components/alertdialog/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/asset/project.json b/components/asset/project.json index 8db0f6b5fb2..a2dceddfb07 100644 --- a/components/asset/project.json +++ b/components/asset/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/assetcard/project.json b/components/assetcard/project.json index 9afb29407a1..e1a912c5009 100644 --- a/components/assetcard/project.json +++ b/components/assetcard/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/assetlist/project.json b/components/assetlist/project.json index 3567ad906f1..33f923ada67 100644 --- a/components/assetlist/project.json +++ b/components/assetlist/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/avatar/project.json b/components/avatar/project.json index 842b242a33d..c179b90e0f9 100644 --- a/components/avatar/project.json +++ b/components/avatar/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/badge/project.json b/components/badge/project.json index cc9844135e1..0f195e6fea0 100644 --- a/components/badge/project.json +++ b/components/badge/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/breadcrumb/project.json b/components/breadcrumb/project.json index a0854eeac1b..517a29e7d8f 100644 --- a/components/breadcrumb/project.json +++ b/components/breadcrumb/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/button/project.json b/components/button/project.json index edfd831ad5a..e291f407a3d 100644 --- a/components/button/project.json +++ b/components/button/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/buttongroup/project.json b/components/buttongroup/project.json index 793184392a3..1a0ae1a2129 100644 --- a/components/buttongroup/project.json +++ b/components/buttongroup/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/calendar/project.json b/components/calendar/project.json index dfc97ec5ae3..a8e93d00a82 100644 --- a/components/calendar/project.json +++ b/components/calendar/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/card/project.json b/components/card/project.json index 06c0f9ab5f1..642a041f861 100644 --- a/components/card/project.json +++ b/components/card/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/checkbox/project.json b/components/checkbox/project.json index 882077b8f10..8f52f614989 100644 --- a/components/checkbox/project.json +++ b/components/checkbox/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/clearbutton/project.json b/components/clearbutton/project.json index 591c3dc51a2..f78d9b51101 100644 --- a/components/clearbutton/project.json +++ b/components/clearbutton/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/closebutton/project.json b/components/closebutton/project.json index 1feb88eb408..711eaa12696 100644 --- a/components/closebutton/project.json +++ b/components/closebutton/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/coachindicator/project.json b/components/coachindicator/project.json index 78d914a6f87..4aa8f4b79e0 100644 --- a/components/coachindicator/project.json +++ b/components/coachindicator/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/coachmark/project.json b/components/coachmark/project.json index ebe3f64a301..7ee9999ba58 100644 --- a/components/coachmark/project.json +++ b/components/coachmark/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/colorarea/project.json b/components/colorarea/project.json index 04f50d57de0..f274767cf38 100644 --- a/components/colorarea/project.json +++ b/components/colorarea/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/colorhandle/project.json b/components/colorhandle/project.json index 84acf7b9a0e..479e3abbba2 100644 --- a/components/colorhandle/project.json +++ b/components/colorhandle/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/colorloupe/project.json b/components/colorloupe/project.json index 4e8e21a7189..4d84755d38d 100644 --- a/components/colorloupe/project.json +++ b/components/colorloupe/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/colorslider/project.json b/components/colorslider/project.json index 1d1cb7cc73f..c549928a573 100644 --- a/components/colorslider/project.json +++ b/components/colorslider/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/colorwheel/project.json b/components/colorwheel/project.json index c9eadd6b7aa..79a4c5b858b 100644 --- a/components/colorwheel/project.json +++ b/components/colorwheel/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/combobox/project.json b/components/combobox/project.json index 1652196ca74..2478d8ba62b 100644 --- a/components/combobox/project.json +++ b/components/combobox/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/commons/project.json b/components/commons/project.json index fc99eadba95..e5af9a0bf66 100644 --- a/components/commons/project.json +++ b/components/commons/project.json @@ -12,6 +12,8 @@ "compare": { "executor": "nx:noop" }, + "lint": {}, + "test": { "executor": "nx:noop" } diff --git a/components/contextualhelp/project.json b/components/contextualhelp/project.json index 950608158ee..76975ff88e3 100644 --- a/components/contextualhelp/project.json +++ b/components/contextualhelp/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/cyclebutton/project.json b/components/cyclebutton/project.json index b6f5748e832..70cf37d5923 100644 --- a/components/cyclebutton/project.json +++ b/components/cyclebutton/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/datepicker/project.json b/components/datepicker/project.json index b867831d405..a9ce1dac579 100644 --- a/components/datepicker/project.json +++ b/components/datepicker/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/dial/project.json b/components/dial/project.json index fc091a7728b..986835603e3 100644 --- a/components/dial/project.json +++ b/components/dial/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/dialog/project.json b/components/dialog/project.json index 111e2a95a08..71814b62fa7 100644 --- a/components/dialog/project.json +++ b/components/dialog/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/divider/project.json b/components/divider/project.json index 52546bcfbc9..c28d36ce5d1 100644 --- a/components/divider/project.json +++ b/components/divider/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/dropindicator/project.json b/components/dropindicator/project.json index 4dd17ffc36b..5481122a57f 100644 --- a/components/dropindicator/project.json +++ b/components/dropindicator/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/dropzone/project.json b/components/dropzone/project.json index 9f7ee274e07..9d06ae1fae7 100644 --- a/components/dropzone/project.json +++ b/components/dropzone/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/fieldgroup/project.json b/components/fieldgroup/project.json index 8df0eaea484..cfaa3ec9920 100644 --- a/components/fieldgroup/project.json +++ b/components/fieldgroup/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/fieldlabel/project.json b/components/fieldlabel/project.json index 245a567e722..7e16a4db9b7 100644 --- a/components/fieldlabel/project.json +++ b/components/fieldlabel/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/floatingactionbutton/project.json b/components/floatingactionbutton/project.json index 503597b18d6..477dae43a85 100644 --- a/components/floatingactionbutton/project.json +++ b/components/floatingactionbutton/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/helptext/project.json b/components/helptext/project.json index 940287b7e07..6fba10e2a7d 100644 --- a/components/helptext/project.json +++ b/components/helptext/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/icon/project.json b/components/icon/project.json index ef1ef3754db..733ab7a944f 100644 --- a/components/icon/project.json +++ b/components/icon/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/illustratedmessage/project.json b/components/illustratedmessage/project.json index e545e3ddb09..ab465c9427f 100644 --- a/components/illustratedmessage/project.json +++ b/components/illustratedmessage/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/infieldbutton/project.json b/components/infieldbutton/project.json index 22384347a86..d3b6c8294ad 100644 --- a/components/infieldbutton/project.json +++ b/components/infieldbutton/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/inlinealert/project.json b/components/inlinealert/project.json index 0425c86dd5c..cb5569246dd 100644 --- a/components/inlinealert/project.json +++ b/components/inlinealert/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/link/project.json b/components/link/project.json index 7f99838f5f3..32976ac48e3 100644 --- a/components/link/project.json +++ b/components/link/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/logicbutton/project.json b/components/logicbutton/project.json index fe876aba46d..9a676ad3101 100644 --- a/components/logicbutton/project.json +++ b/components/logicbutton/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/menu/project.json b/components/menu/project.json index 1f235fedebb..3f5fc9298ec 100644 --- a/components/menu/project.json +++ b/components/menu/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/miller/project.json b/components/miller/project.json index 7f80ed4c238..4eb9150b825 100644 --- a/components/miller/project.json +++ b/components/miller/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/modal/project.json b/components/modal/project.json index adb08bb232a..090c3b9dd3e 100644 --- a/components/modal/project.json +++ b/components/modal/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/opacitycheckerboard/project.json b/components/opacitycheckerboard/project.json index d2c01325e11..d1c25f2823e 100644 --- a/components/opacitycheckerboard/project.json +++ b/components/opacitycheckerboard/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/overlay/project.json b/components/overlay/project.json index 13dea438a98..7e7e650de76 100644 --- a/components/overlay/project.json +++ b/components/overlay/project.json @@ -12,6 +12,8 @@ "compare": { "executor": "nx:noop" }, + "lint": {}, + "test": { "executor": "nx:noop" } diff --git a/components/page/project.json b/components/page/project.json index 373d157f69a..d2391f78797 100644 --- a/components/page/project.json +++ b/components/page/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/pagination/project.json b/components/pagination/project.json index 52572e8c24c..e7ecb21773b 100644 --- a/components/pagination/project.json +++ b/components/pagination/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/picker/project.json b/components/picker/project.json index c9f142db1a9..46a6297ba1c 100644 --- a/components/picker/project.json +++ b/components/picker/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/pickerbutton/project.json b/components/pickerbutton/project.json index f1fe9eae1bf..afbbf4f4c32 100644 --- a/components/pickerbutton/project.json +++ b/components/pickerbutton/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/popover/project.json b/components/popover/project.json index bd0777e01ff..98803bab0e8 100644 --- a/components/popover/project.json +++ b/components/popover/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/progressbar/project.json b/components/progressbar/project.json index 592298cd908..dfda81337df 100644 --- a/components/progressbar/project.json +++ b/components/progressbar/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/progresscircle/project.json b/components/progresscircle/project.json index 9f3ca5ba620..9cad0f66cab 100644 --- a/components/progresscircle/project.json +++ b/components/progresscircle/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/quickaction/project.json b/components/quickaction/project.json index 2e3bf0c17da..75f129cc426 100644 --- a/components/quickaction/project.json +++ b/components/quickaction/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/radio/project.json b/components/radio/project.json index 18457708df3..2963b14716d 100644 --- a/components/radio/project.json +++ b/components/radio/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/rating/project.json b/components/rating/project.json index d3008bd16b0..c54ef153dbb 100644 --- a/components/rating/project.json +++ b/components/rating/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/search/project.json b/components/search/project.json index a4a2085302a..60ec1ad7ae4 100644 --- a/components/search/project.json +++ b/components/search/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/searchwithin/project.json b/components/searchwithin/project.json index 8378b2606a7..af0452bfb5d 100644 --- a/components/searchwithin/project.json +++ b/components/searchwithin/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/sidenav/project.json b/components/sidenav/project.json index b854a5ca003..2094743207c 100644 --- a/components/sidenav/project.json +++ b/components/sidenav/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/site/project.json b/components/site/project.json index 8db23bbef48..65745320a6e 100644 --- a/components/site/project.json +++ b/components/site/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/slider/project.json b/components/slider/project.json index 624d3503b3a..fc10876f3a7 100644 --- a/components/slider/project.json +++ b/components/slider/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/splitbutton/project.json b/components/splitbutton/project.json index d3aafd35ee4..2bf9a392890 100644 --- a/components/splitbutton/project.json +++ b/components/splitbutton/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/splitview/project.json b/components/splitview/project.json index 40f715f5bb0..53bd05a41d9 100644 --- a/components/splitview/project.json +++ b/components/splitview/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/statuslight/project.json b/components/statuslight/project.json index eb8950e8340..dcd5056fe10 100644 --- a/components/statuslight/project.json +++ b/components/statuslight/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/steplist/project.json b/components/steplist/project.json index 3128553f361..5e668372df9 100644 --- a/components/steplist/project.json +++ b/components/steplist/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/stepper/project.json b/components/stepper/project.json index 3b45e09418d..c53a30ee0fd 100644 --- a/components/stepper/project.json +++ b/components/stepper/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/swatch/project.json b/components/swatch/project.json index bf652851d68..213bb1057a4 100644 --- a/components/swatch/project.json +++ b/components/swatch/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/swatchgroup/project.json b/components/swatchgroup/project.json index 144b8b5d4c2..6c2d34af5b8 100644 --- a/components/swatchgroup/project.json +++ b/components/swatchgroup/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/switch/project.json b/components/switch/project.json index f681ad5429b..9f10cbb49d0 100644 --- a/components/switch/project.json +++ b/components/switch/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/table/project.json b/components/table/project.json index 3f9dd702706..b5fb1ed43f1 100644 --- a/components/table/project.json +++ b/components/table/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/tabs/project.json b/components/tabs/project.json index fa84e94f797..a0e04cf5473 100644 --- a/components/tabs/project.json +++ b/components/tabs/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/tag/project.json b/components/tag/project.json index 1266b916dc6..16bee8c64de 100644 --- a/components/tag/project.json +++ b/components/tag/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/taggroup/project.json b/components/taggroup/project.json index 6e57f81472a..a9b275cc211 100644 --- a/components/taggroup/project.json +++ b/components/taggroup/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/textfield/project.json b/components/textfield/project.json index d5bb0bf0d9d..b9b564030fc 100644 --- a/components/textfield/project.json +++ b/components/textfield/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/thumbnail/project.json b/components/thumbnail/project.json index 479bab2f16d..b82705fa71d 100644 --- a/components/thumbnail/project.json +++ b/components/thumbnail/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/toast/project.json b/components/toast/project.json index 88b6f1963dd..e17c5e38775 100644 --- a/components/toast/project.json +++ b/components/toast/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/tooltip/project.json b/components/tooltip/project.json index 899580b03fc..d3fbc87b6a1 100644 --- a/components/tooltip/project.json +++ b/components/tooltip/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/tray/project.json b/components/tray/project.json index 6f61adb83c5..0605d6b8c05 100644 --- a/components/tray/project.json +++ b/components/tray/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/treeview/project.json b/components/treeview/project.json index c8d5bc46482..634c6194a7d 100644 --- a/components/treeview/project.json +++ b/components/treeview/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/typography/project.json b/components/typography/project.json index 4da54dc0a8c..267b87e3b11 100644 --- a/components/typography/project.json +++ b/components/typography/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/underlay/project.json b/components/underlay/project.json index c40f010eb09..793a3796426 100644 --- a/components/underlay/project.json +++ b/components/underlay/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/components/well/project.json b/components/well/project.json index 9ec2a08beea..4fcb8385688 100644 --- a/components/well/project.json +++ b/components/well/project.json @@ -6,6 +6,8 @@ "build": {}, "clean": {}, "compare": {}, + "lint": {}, + "test": { "defaultConfiguration": "scope" } diff --git a/nx.json b/nx.json index ec207b37193..579754c5c30 100644 --- a/nx.json +++ b/nx.json @@ -90,6 +90,13 @@ ] } }, + "lint": { + "inputs": ["core", { "externalDependencies": ["stylelint"] }], + "executor": "nx:run-commands", + "options": { + "commands": ["stylelint {projectRoot}/*.css {projectRoot}/themes/*.css"] + } + }, "test": { "cache": true, "dependsOn": [{ "target": "test", "projects": "storybook" }], diff --git a/package.json b/package.json index 7a2f18a478f..78aaab1aa14 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,8 @@ "predev": "nx run-many --projects ui-icons,tokens --target build", "dev": "NODE_ENV=development BROWSERSYNC_OPEN=true gulp dev", "preinstall": "command -v nvm >/dev/null 2>&1 && nvm use || exit 0", + "lint": "yarn linter tag:component", + "linter": "nx run-many --target build --projects", "new": "nx run @spectrum-css/generator:new", "precommit": "lint-staged", "prepare": "husky install && run-p refresh:directory refresh:env && yarn refresh:config", @@ -89,7 +91,11 @@ "rimraf": "^5.0.5", "semver": "^7.5.1", "stylelint": "^15.11.0", + "stylelint-config-clean-order": "^5.2.0", "stylelint-config-standard": "^34.0.0", + "stylelint-header": "^1.0.0", + "stylelint-high-performance-animation": "^1.9.0", + "stylelint-selector-bem-pattern": "^3.0.1", "stylelint-use-logical": "^2.1.0", "tar": "^6.2.0", "through2": "^3.0.1", diff --git a/plugins/stylelint-no-missing-parenthesis/README.md b/plugins/stylelint-no-missing-parenthesis/README.md index 02917ec4880..22d0782c5df 100644 --- a/plugins/stylelint-no-missing-parenthesis/README.md +++ b/plugins/stylelint-no-missing-parenthesis/README.md @@ -21,10 +21,8 @@ For e.g: ## Installation -``` -npm install stylelint-no-missing-parenthesis - -yarn add stylelint-no-missing-parenthesis +```sh +yarn add -D stylelint-no-missing-parenthesis ``` ## How to use diff --git a/plugins/stylelint-no-missing-parenthesis/fixtures/missing-parenthesis.css b/plugins/stylelint-no-missing-parenthesis/fixtures/missing-parenthesis.css new file mode 100644 index 00000000000..03ef0ad47a6 --- /dev/null +++ b/plugins/stylelint-no-missing-parenthesis/fixtures/missing-parenthesis.css @@ -0,0 +1,3 @@ +.spectrum { + width: calc(100px - 10px; +} diff --git a/plugins/stylelint-no-missing-parenthesis/fixtures/passing.css b/plugins/stylelint-no-missing-parenthesis/fixtures/passing.css new file mode 100644 index 00000000000..47acf0ae2d6 --- /dev/null +++ b/plugins/stylelint-no-missing-parenthesis/fixtures/passing.css @@ -0,0 +1,3 @@ +.spectrum { + width: calc(100px - 10px); +} diff --git a/plugins/stylelint-no-missing-parenthesis/index.js b/plugins/stylelint-no-missing-parenthesis/index.js index 4a98bad0d3a..f24d9fe0e83 100644 --- a/plugins/stylelint-no-missing-parenthesis/index.js +++ b/plugins/stylelint-no-missing-parenthesis/index.js @@ -1,24 +1,42 @@ +/*! + * Copyright 2023 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + const stylelint = require("stylelint"); -const ruleName = "custom-rule/no-missing-parenthesis"; +const ruleName = "spectrum-tools/no-missing-parenthesis"; +const messages = stylelint.utils.ruleMessages(ruleName, { + expected: (value) => `Missing or extra parentheses in "${value}"`, +}); + +/** @type {import('stylelint').Plugin} */ +const plugin = stylelint.createPlugin(ruleName, (enabled) => { + return (root, result) => { + if (!enabled) return; -const plugin = stylelint.createPlugin(ruleName, (enabled, options) => { - return (root, result) => { - root.walkDecls((decl) => { - const value = decl.value; - if (value.includes("calc")) { - const openParenCount = (value.match(/\(/g) || []).length; - const closeParenCount = (value.match(/\)/g) || []).length; - if (openParenCount !== closeParenCount) { - const message = `Missing or extra parentheses in "${value}"`; - const node = decl.raws.value - ? decl.raws.value.raw.indexOf("calc") - : decl.toString().indexOf("calc"); - stylelint.utils.report({ message, node: decl, result, ruleName }); - } - } - }); - }; + root.walkDecls((decl) => { + if ((decl.value.match(/\(/g) || []).length !== (decl.value.match(/\)/g) || []).length) { + stylelint.utils.report({ + message: messages.expected, + messageArgs: [decl.value], + node: decl, + result, + ruleName, + }); + } + }); + }; }); +exports.ruleName = ruleName; +exports.messages = messages; + module.exports = plugin; diff --git a/plugins/stylelint-no-missing-parenthesis/package.json b/plugins/stylelint-no-missing-parenthesis/package.json index 0a6f2e14999..8622e137d4b 100644 --- a/plugins/stylelint-no-missing-parenthesis/package.json +++ b/plugins/stylelint-no-missing-parenthesis/package.json @@ -1,19 +1,23 @@ { - "private": true, - "name": "stylelint-no-missing-parenthesis", + "name": "@spectrum-tools/stylelint-no-missing-parenthesis", "version": "1.1.0", "license": "Apache-2.0", "author": "Adobe", "main": "index.js", - "scripts": { - "prepublishOnly": "yarn test", - "test": "ava" - }, "peerDependencies": { - "stylelint": ">=15" + "stylelint": "^14.0.0 || ^15.0.0" }, "devDependencies": { - "ava": "^3.9.0", - "stylelint": "^15.10.2" - } + "ava": "^5.3.1", + "c8": "^8.0.1", + "stylelint": "^15.11.0" + }, + "keywords": [ + "css", + "fix", + "lint", + "report", + "stylelint-plugin", + "syntax" + ] } diff --git a/plugins/stylelint-no-missing-parenthesis/project.json b/plugins/stylelint-no-missing-parenthesis/project.json new file mode 100644 index 00000000000..4304f1df4ad --- /dev/null +++ b/plugins/stylelint-no-missing-parenthesis/project.json @@ -0,0 +1,14 @@ +{ + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "tags": ["tooling", "stylelint"], + "name": "stylelint-no-missing-parenthesis", + "targets": { + "lint": { + "defaultConfiguration": "plugins" + }, + "coverage": {}, + "test": { + "defaultConfiguration": "plugins" + } + } +} diff --git a/plugins/stylelint-no-missing-parenthesis/test.js b/plugins/stylelint-no-missing-parenthesis/test.js index 5e90f70ac9e..cad75223765 100644 --- a/plugins/stylelint-no-missing-parenthesis/test.js +++ b/plugins/stylelint-no-missing-parenthesis/test.js @@ -1,27 +1,42 @@ +const fs = require("fs"); +const { join } = require("path"); + const test = require("ava"); const stylelint = require("stylelint"); + const plugin = require("./index"); +const { ruleName, messages } = require("./index"); + +async function compare(_, fixtureFilePath) { + const code = readFile(`./fixtures/${fixtureFilePath}`); + return stylelint.lint({ + code, + config: { + plugins: [plugin], + rules: { + [ruleName]: true, + }, + }, + }); +} + +function readFile(filename) { + return fs.readFileSync(join(__dirname, filename), "utf8"); +} test("should throw an error for missing or extra parentheses in calc values", async (t) => { - const code = ` - .spectrum { - width: calc(100px - 10px; - } - `; - - const { results } = await stylelint.lint({ - code, - config: { - plugins: [plugin], - rules: { - "custom-rule/no-missing-parenthesis": true, - }, - }, - }); - - const warnings = results[0].warnings; - - t.is(warnings.length, 1); - t.is(warnings[0].rule, "CssSyntaxError"); - t.is(warnings[0].text, "Unclosed bracket (CssSyntaxError)"); + const { results } = await compare(t, "missing-parenthesis.css"); + + const warnings = results[0].warnings; + + t.is(warnings.length, 1); + t.is(warnings[0].rule, ruleName); + t.is(warnings[0].text, messages.expected("calc(100px - 10px")); +}); + +test(`should not throw an error for parenthesis usage`, async (t) => { + const { results } = await compare(t, "passing.css"); + + const warnings = results[0].warnings; + t.is(warnings.length, 0); }); diff --git a/plugins/stylelint-no-missing-var/README.md b/plugins/stylelint-no-missing-var/README.md index 7db0f7cd71c..de922d97716 100644 --- a/plugins/stylelint-no-missing-var/README.md +++ b/plugins/stylelint-no-missing-var/README.md @@ -8,10 +8,8 @@ This stylelint plugin will validate against all custom properties in css and lin ## Installation -``` -npm install stylelint-no-missing-var - -yarn install stylelint-no-missing-var +```sh +yarn add -D stylelint-no-missing-var ``` ## How to use diff --git a/plugins/stylelint-no-missing-var/fixtures/missing-var.css b/plugins/stylelint-no-missing-var/fixtures/missing-var.css new file mode 100644 index 00000000000..547f47e333d --- /dev/null +++ b/plugins/stylelint-no-missing-var/fixtures/missing-var.css @@ -0,0 +1,4 @@ +.spectrum-Button { + background-color: (--spectrum-well-background-color); + border-color: var(--spectrum-well-border-color); +} diff --git a/plugins/stylelint-no-missing-var/fixtures/passing.css b/plugins/stylelint-no-missing-var/fixtures/passing.css new file mode 100644 index 00000000000..b5b62bf2b25 --- /dev/null +++ b/plugins/stylelint-no-missing-var/fixtures/passing.css @@ -0,0 +1,4 @@ +.spectrum-Button { + background-color: var(--spectrum-well-background-color); + border-color: var(--spectrum-well-border-color); +} diff --git a/plugins/stylelint-no-missing-var/index.js b/plugins/stylelint-no-missing-var/index.js index 0493a81fde3..632ad562f12 100644 --- a/plugins/stylelint-no-missing-var/index.js +++ b/plugins/stylelint-no-missing-var/index.js @@ -1,20 +1,45 @@ +/*! + * Copyright 2023 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + const stylelint = require("stylelint"); -const ruleName = "custom-rule/no-missing-var"; +const ruleName = "spectrum-tools/no-missing-var"; +const messages = { + expected: (property) => `Missing 'var' before custom property "${property}"`, +}; + +const plugin = stylelint.createPlugin(ruleName, (enabled, _options, context) => { + return (root, result) => { + if (!enabled) return; -const plugin = stylelint.createPlugin(ruleName, (enabled, options) => { - return (root, result) => { - root.walkDecls((decl) => { - const value = decl.value.replace(/\s/g, ""); // Remove whitespace - const regex = /(? { + const value = decl.value.replace(/\s/g, ""); // Remove whitespace + const regex = /(?=15" + "stylelint": "^14.0.0 || ^15.0.0" }, "devDependencies": { - "ava": "^3.9.0", - "stylelint": "^15.10.2" - } + "ava": "^5.3.1", + "c8": "^8.0.1", + "stylelint": "^15.11.0" + }, + "keywords": [ + "css", + "fix", + "lint", + "properties", + "report", + "stylelint-plugin" + ] } diff --git a/plugins/stylelint-no-missing-var/project.json b/plugins/stylelint-no-missing-var/project.json new file mode 100644 index 00000000000..c0f20707ec0 --- /dev/null +++ b/plugins/stylelint-no-missing-var/project.json @@ -0,0 +1,14 @@ +{ + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "tags": ["tooling", "stylelint"], + "name": "stylelint-no-missing-var", + "targets": { + "lint": { + "defaultConfiguration": "plugins" + }, + "coverage": {}, + "test": { + "defaultConfiguration": "plugins" + } + } +} diff --git a/plugins/stylelint-no-missing-var/test.js b/plugins/stylelint-no-missing-var/test.js index d05546b69b2..e82f6fbd66f 100644 --- a/plugins/stylelint-no-missing-var/test.js +++ b/plugins/stylelint-no-missing-var/test.js @@ -1,56 +1,42 @@ +const fs = require("fs"); +const { join } = require("path"); + const test = require("ava"); const stylelint = require("stylelint"); -const plugin = require("./index"); -const ruleName = "custom-rule/no-missing-var"; +const plugin = require("./index"); +const { ruleName, messages } = require("./index"); + +async function compare(_, fixtureFilePath) { + const code = readFile(`./fixtures/${fixtureFilePath}`); + return stylelint.lint({ + code, + config: { + plugins: [plugin], + rules: { + [ruleName]: true, + }, + }, + }); +} + +function readFile(filename) { + return fs.readFileSync(join(__dirname, filename), "utf8"); +} test(`should throw an error for missing "var" before custom properties`, async (t) => { - const code = ` - .spectrum-Button { - background-color: (--spectrum-well-background-color); - border-color: var(--spectrum-well-border-color); - } - `; - - const { results } = await stylelint.lint({ - code, - config: { - plugins: [plugin], - rules: { - [ruleName]: true, - }, - }, - }); - - const warnings = results[0].warnings; - - t.is(warnings.length, 1); - t.is(warnings[0].rule, ruleName); - t.is( - warnings[0].text, - `Missing 'var' before custom property "--spectrum-well-background-color"` - ); + const { results } = await compare(t, "missing-var.css"); + + const warnings = results[0].warnings; + + t.is(warnings.length, 1); + t.is(warnings[0].rule, ruleName); + t.is(warnings[0].text, messages.expected("--spectrum-well-background-color")); }); test(`should not throw an error for "var" usage`, async (t) => { - const code = ` - .spectrum-Button { - background-color: var(--spectrum-well-background-color); - border-color: var(--spectrum-well-border-color); - } - `; - - const { results } = await stylelint.lint({ - code, - config: { - plugins: [plugin], - rules: { - [ruleName]: true, - }, - }, - }); - - const warnings = results[0].warnings; - - t.is(warnings.length, 0); + const { results } = await compare(t, "passing.css"); + + const warnings = results[0].warnings; + t.is(warnings.length, 0); }); diff --git a/plugins/stylelint-no-unknown-custom-properties/CHANGELOG.md b/plugins/stylelint-no-unknown-custom-properties/CHANGELOG.md new file mode 100644 index 00000000000..a7296b61700 --- /dev/null +++ b/plugins/stylelint-no-unknown-custom-properties/CHANGELOG.md @@ -0,0 +1,46 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + + + +## 1.2.1 + +🗓 2021-09-29 • 📝 [Commits](https://github.com/adobe/spectrum-css/compare/postcss-dropunusedvars@1.2.1-alpha.0...postcss-dropunusedvars@1.2.1) + +**Note:** Version bump only for package postcss-dropunusedvars + + + +## 1.2.1-alpha.0 + +🗓 2021-04-27 • 📝 [Commits](https://github.com/adobe/spectrum-css/compare/postcss-dropunusedvars@1.2.0...postcss-dropunusedvars@1.2.1-alpha.0) + +**Note:** Version bump only for package postcss-dropunusedvars + + + +# 1.2.0 + +🗓 2021-03-10 • 📝 [Commits](https://github.com/adobe/spectrum-css/compare/postcss-dropunusedvars@1.1.0...postcss-dropunusedvars@1.2.0) + +### ✨ Features + +- drop unused vars, even if other vars once referred to them ([772851e](https://github.com/adobe/spectrum-css/commit/772851e)) + +### 🐛 Bug fixes + +- correct PostCSS plugin names ([81ad868](https://github.com/adobe/spectrum-css/commit/81ad868)) +- correctly catch usage of fallback vars ([3bccaf5](https://github.com/adobe/spectrum-css/commit/3bccaf5)) +- don't remove vars that are ref'd by dead vars but used in props ([4030d40](https://github.com/adobe/spectrum-css/commit/4030d40)) + + + +# 1.1.0 + +🗓 2020-12-04 + +### ✨ Features + +- add postcss-dropunusedvars ([85426eb](https://github.com/adobe/spectrum-css/commit/85426eb)) diff --git a/plugins/stylelint-no-unknown-custom-properties/README.md b/plugins/stylelint-no-unknown-custom-properties/README.md new file mode 100644 index 00000000000..9b37bec8ff6 --- /dev/null +++ b/plugins/stylelint-no-unknown-custom-properties/README.md @@ -0,0 +1,31 @@ +# stylelint-no-unknown-custom-properties + +> Report on any unused variable definitions + +## Installation + +```sh +yarn add -D @spectrum-tools/stylelint-no-unknown-custom-properties +``` + +## Usage + +Assuming you have some variables defined and rule(s) that use them: + +```css +:root { + --prefix-component-background-color: blue; + --prefix-component-width: 10px; + --prefix-component-height: 10px; + --prefix-component-size: 10px; +} + +.component { + background-color: var(--prefix-component-background-color); + + width: var(--prefix-component-width); + height: var(--prefix-component-height); +} +``` + +The variables that are not used in any rule will be reported to the console. diff --git a/plugins/stylelint-no-unknown-custom-properties/fixtures/passing.css b/plugins/stylelint-no-unknown-custom-properties/fixtures/passing.css new file mode 100644 index 00000000000..03c304f030c --- /dev/null +++ b/plugins/stylelint-no-unknown-custom-properties/fixtures/passing.css @@ -0,0 +1,12 @@ +:root { + --prefix-component-background-color: blue; + --prefix-component-width: 10px; + --prefix-component-height: 10px; +} + +.component { + background-color: var(--prefix-component-background-color); + + width: var(--prefix-component-width); + height: var(--prefix-component-height); +} diff --git a/plugins/stylelint-no-unknown-custom-properties/fixtures/unknown-prop.css b/plugins/stylelint-no-unknown-custom-properties/fixtures/unknown-prop.css new file mode 100644 index 00000000000..7904a07c85d --- /dev/null +++ b/plugins/stylelint-no-unknown-custom-properties/fixtures/unknown-prop.css @@ -0,0 +1,8 @@ +.component { + --prefix-component-background-color: blue; + + background-color: var(--prefix-component-background-color); + + width: var(--prefix-component-width); + height: var(--prefix-component-height); +} diff --git a/plugins/stylelint-no-unknown-custom-properties/index.js b/plugins/stylelint-no-unknown-custom-properties/index.js new file mode 100644 index 00000000000..ac520e14c40 --- /dev/null +++ b/plugins/stylelint-no-unknown-custom-properties/index.js @@ -0,0 +1,148 @@ +/*! + * Copyright 2023 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +const path = require("path"); +const fs = require("fs"); + +const stylelint = require("stylelint"); + +const ruleName = "spectrum-tools/no-unknown-custom-properties"; +const messages = stylelint.utils.ruleMessages(ruleName, { + expected: (prop) => `Custom property '${prop}' not defined`, +}); + +const postcss = require("postcss"); +const valueParser = require("postcss-value-parser"); + +/** @type {import('stylelint').Plugin} */ +const plugin = stylelint.createPlugin(ruleName, (enabled, { ignore = [], checkDependencies = false } = {}) => { + return (root, result) => { + const validOptions = stylelint.utils.validateOptions( + result, + ruleName, + { + actual: enabled, + possible: [Boolean, null], + }, + { + actual: ignore, + possible: [String, RegExp], + }, + { + actual: checkDependencies, + possible: [Boolean], + }, + ); + + if (!validOptions) return; + + /** @type {Set} */ + const localDefinitions = new Set(); + const sharedDefinitions = new Set(); + + root.walkDecls(/^--/, ({ prop }) => { + localDefinitions.add(prop); + }); + + const sourceFile = root.source.input.file; + const parts = sourceFile ? sourceFile.split(path.sep) : []; + const rootIdx = parts.indexOf("components"); + const componentRoot = parts.slice(0, rootIdx + 2).join(path.sep); + + function fetchResolutions(depName) { + const req = require.resolve(depName, { paths: [componentRoot] }); + if (!fs.existsSync(req)) return; + + const content = fs.readFileSync(req, "utf8"); + if (!content) return; + + postcss.parse(content).walkDecls(/^--/, ({ prop }) => { + sharedDefinitions.add(prop); + }); + } + + if (checkDependencies && rootIdx > -1) { + const pkg = require(path.join(componentRoot, "package.json")); + + if (!pkg) return; + + const allDependencies = new Set([ + ...(Object.keys(pkg.peerDependencies ?? {}) ?? []), + ...(Object.keys(pkg.devDependencies ?? {}) ?? []), + ...(Object.keys(pkg.dependencies ?? {}) ?? []), + ]); + + if (allDependencies.size === 0) return; + + allDependencies.forEach((dep) => { + if (!dep.startsWith("@spectrum-css")) return; + + if (dep.endsWith("vars")) { + ["spectrum-global.css", "components/index.css"].forEach((d) => { + try { + fetchResolutions(`${dep}/dist/${d}`); + } catch (e) { + /* allow quiet failure for peer dependencies */ + } + }); + } else { + try { + fetchResolutions(dep); + } catch (e) { + /* allow quiet failure for peer dependencies */ + } + } + }); + } + + if (fs.existsSync(path.join(componentRoot, "themes/spectrum.css"))) { + const content = fs.readFileSync(path.join(componentRoot, "themes/spectrum.css"), "utf8"); + const peerRoot = postcss.parse(content); + peerRoot.walkDecls(/^--/, ({ prop }) => { + sharedDefinitions.add(prop); + }); + } + + /* Collect variable use information */ + root.walkDecls((decl) => { + // Parse value and get a list of variables used + const parsed = valueParser(decl.value); + parsed.walk((node) => { + if (node.type !== "function" || node.value !== "var") { + return; + } + const [firstNode, secondNode] = node.nodes; + + if (!firstNode) return; + if (ignore.some((regex) => regex.test(firstNode.value))) return; + if (localDefinitions.has(firstNode.value)) return; + if (sharedDefinitions.has(firstNode.value)) return; + + // Second node (div) indicates fallback exists in all cases + if (secondNode && secondNode.type === "div") return; + + return stylelint.utils.report({ + message: messages.expected, + messageArgs: [firstNode.value], + node: decl, + result, + ruleName, + }); + }); + }); + }; +}); + +module.exports.ruleName = ruleName; +module.exports.messages = messages; + +module.exports = plugin; diff --git a/plugins/stylelint-no-unknown-custom-properties/package.json b/plugins/stylelint-no-unknown-custom-properties/package.json new file mode 100644 index 00000000000..5cd78f6a312 --- /dev/null +++ b/plugins/stylelint-no-unknown-custom-properties/package.json @@ -0,0 +1,27 @@ +{ + "name": "@spectrum-tools/stylelint-no-unknown-custom-properties", + "version": "1.2.1", + "description": "Report on any unknown custom property definitions", + "license": "Apache-2.0", + "author": "Adobe", + "main": "index.js", + "dependencies": { + "postcss": "^8.4.32", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "stylelint": "^14.0.0 || ^15.0.0" + }, + "devDependencies": { + "ava": "^5.3.1", + "c8": "^8.0.1", + "stylelint": "^15.11.0" + }, + "keywords": [ + "css", + "lint", + "properties", + "report", + "stylelint-plugin" + ] +} diff --git a/plugins/stylelint-no-unknown-custom-properties/project.json b/plugins/stylelint-no-unknown-custom-properties/project.json new file mode 100644 index 00000000000..94458c0ea8d --- /dev/null +++ b/plugins/stylelint-no-unknown-custom-properties/project.json @@ -0,0 +1,14 @@ +{ + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "tags": ["tooling", "stylelint"], + "name": "stylelint-no-unknown-custom-properties", + "targets": { + "lint": { + "defaultConfiguration": "plugins" + }, + "coverage": {}, + "test": { + "defaultConfiguration": "plugins" + } + } +} diff --git a/plugins/stylelint-no-unknown-custom-properties/test.js b/plugins/stylelint-no-unknown-custom-properties/test.js new file mode 100644 index 00000000000..bc4d386a20c --- /dev/null +++ b/plugins/stylelint-no-unknown-custom-properties/test.js @@ -0,0 +1,42 @@ +const fs = require("fs"); +const { join } = require("path"); + +const test = require("ava"); +const stylelint = require("stylelint"); + +const plugin = require("./index"); +const { ruleName, messages } = require("./index"); + +async function compare(t, fixtureFilePath) { + const code = readFile(`./fixtures/${fixtureFilePath}`); + return stylelint.lint({ + code, + config: { + plugins: [plugin], + rules: { + [ruleName]: true, + }, + }, + }); +} + +function readFile(filename) { + return fs.readFileSync(join(__dirname, filename), "utf8"); +} + +test("should throw an error for unknown custom properties", async (t) => { + const { results } = await compare(t, "unknown-prop.css"); + + const warnings = results[0].warnings; + + t.is(warnings.length, 1); + t.is(warnings[0].rule, ruleName); + t.is(warnings[0].text, messages.expected("--prefix-component-size")); +}); + +test(`should not throw an error for unknown custom properties`, async (t) => { + const { results } = await compare(t, "passing.css"); + + const warnings = results[0].warnings; + t.is(warnings.length, 0); +}); diff --git a/plugins/stylelint-no-unused-custom-properties/CHANGELOG.md b/plugins/stylelint-no-unused-custom-properties/CHANGELOG.md new file mode 100644 index 00000000000..a7296b61700 --- /dev/null +++ b/plugins/stylelint-no-unused-custom-properties/CHANGELOG.md @@ -0,0 +1,46 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + + + +## 1.2.1 + +🗓 2021-09-29 • 📝 [Commits](https://github.com/adobe/spectrum-css/compare/postcss-dropunusedvars@1.2.1-alpha.0...postcss-dropunusedvars@1.2.1) + +**Note:** Version bump only for package postcss-dropunusedvars + + + +## 1.2.1-alpha.0 + +🗓 2021-04-27 • 📝 [Commits](https://github.com/adobe/spectrum-css/compare/postcss-dropunusedvars@1.2.0...postcss-dropunusedvars@1.2.1-alpha.0) + +**Note:** Version bump only for package postcss-dropunusedvars + + + +# 1.2.0 + +🗓 2021-03-10 • 📝 [Commits](https://github.com/adobe/spectrum-css/compare/postcss-dropunusedvars@1.1.0...postcss-dropunusedvars@1.2.0) + +### ✨ Features + +- drop unused vars, even if other vars once referred to them ([772851e](https://github.com/adobe/spectrum-css/commit/772851e)) + +### 🐛 Bug fixes + +- correct PostCSS plugin names ([81ad868](https://github.com/adobe/spectrum-css/commit/81ad868)) +- correctly catch usage of fallback vars ([3bccaf5](https://github.com/adobe/spectrum-css/commit/3bccaf5)) +- don't remove vars that are ref'd by dead vars but used in props ([4030d40](https://github.com/adobe/spectrum-css/commit/4030d40)) + + + +# 1.1.0 + +🗓 2020-12-04 + +### ✨ Features + +- add postcss-dropunusedvars ([85426eb](https://github.com/adobe/spectrum-css/commit/85426eb)) diff --git a/plugins/stylelint-no-unused-custom-properties/README.md b/plugins/stylelint-no-unused-custom-properties/README.md new file mode 100644 index 00000000000..53641602eed --- /dev/null +++ b/plugins/stylelint-no-unused-custom-properties/README.md @@ -0,0 +1,52 @@ +# postcss-dropunusedvars + +> Remove unused variable definitions + +## Installation + +```sh +yarn add -D postcss-dropunusedvars +``` + +## Usage + +Via the command line: + +```sh +postcss -u postcss-dropunusedvars -o dist/index.css src/index.css +``` + +Assuming you have some variables defined and rule(s) that use them: + +```css +:root { + --prefix-component-background-color: blue; + --prefix-component-width: 10px; + --prefix-component-height: 10px; + --prefix-component-size: 10px; +} + +.component { + background-color: var(--prefix-component-background-color); + + width: var(--prefix-component-width); + height: var(--prefix-component-height); +} +``` + +The variables that are not used in any rule will be removed from the output: + +```css +:root { + --prefix-component-background-color: blue; + --prefix-component-width: 10px; + --prefix-component-height: 10px; +} + +.component { + background-color: var(--prefix-component-background-color); + + width: var(--prefix-component-width); + height: var(--prefix-component-height); +} +``` diff --git a/plugins/stylelint-no-unused-custom-properties/expected/unused.css b/plugins/stylelint-no-unused-custom-properties/expected/unused.css new file mode 100644 index 00000000000..617ffa2a973 --- /dev/null +++ b/plugins/stylelint-no-unused-custom-properties/expected/unused.css @@ -0,0 +1,15 @@ +:root { + --prefix-component-background-color: blue; + --prefix-component-border-color: blue; + --prefix-component-width: 10px; + --prefix-component-height: 10px; +} + +.component { + background-color: var(--prefix-component-background-color); + + border-color: var(--other-color, var(--prefix-component-border-color)); + + width: var(--prefix-component-width); + height: var(--prefix-component-height); +} diff --git a/plugins/stylelint-no-unused-custom-properties/expected/varRefs.css b/plugins/stylelint-no-unused-custom-properties/expected/varRefs.css new file mode 100644 index 00000000000..51ed9b62054 --- /dev/null +++ b/plugins/stylelint-no-unused-custom-properties/expected/varRefs.css @@ -0,0 +1,19 @@ +:root { + --gray: gray; + --blue: blue; + --orange: orange; + --default: var(--gray); + --focus: var(--blue); +} + +.component { + background-color: var(--default); +} + +.component:focus { + background-color: var(--focus); +} + +.component:active { + background-color: var(--orange); +} diff --git a/plugins/stylelint-no-unused-custom-properties/fixtures/unused.css b/plugins/stylelint-no-unused-custom-properties/fixtures/unused.css new file mode 100644 index 00000000000..8a7078cd440 --- /dev/null +++ b/plugins/stylelint-no-unused-custom-properties/fixtures/unused.css @@ -0,0 +1,16 @@ +:root { + --prefix-component-background-color: blue; + --prefix-component-border-color: blue; + --prefix-component-width: 10px; + --prefix-component-height: 10px; + --prefix-component-size: 10px; +} + +.component { + background-color: var(--prefix-component-background-color); + + border-color: var(--other-color, var(--prefix-component-border-color)); + + width: var(--prefix-component-width); + height: var(--prefix-component-height); +} diff --git a/plugins/stylelint-no-unused-custom-properties/fixtures/varRefs.css b/plugins/stylelint-no-unused-custom-properties/fixtures/varRefs.css new file mode 100644 index 00000000000..9f234a5a831 --- /dev/null +++ b/plugins/stylelint-no-unused-custom-properties/fixtures/varRefs.css @@ -0,0 +1,22 @@ +:root { + --gray: gray; + --blue: blue; + --green: green; + --orange: orange; + --default: var(--gray); + --focus: var(--blue); + --selected: var(--green); + --active: var(--orange); +} + +.component { + background-color: var(--default); +} + +.component:focus { + background-color: var(--focus); +} + +.component:active { + background-color: var(--orange); +} diff --git a/plugins/stylelint-no-unused-custom-properties/index.js b/plugins/stylelint-no-unused-custom-properties/index.js new file mode 100644 index 00000000000..8ccab0f0ce0 --- /dev/null +++ b/plugins/stylelint-no-unused-custom-properties/index.js @@ -0,0 +1,165 @@ +/*! + * Copyright 2023 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +const stylelint = require("stylelint"); + +const ruleName = "spectrum-tools/no-unused-custom-properties"; +const messages = stylelint.utils.ruleMessages(ruleName, { + expected: (prop) => `Unused custom property ${prop} defined`, +}); + +const valueParser = require("postcss-value-parser"); + +/** @type {import('stylelint').Rule>>} */ +const plugin = stylelint.createPlugin(ruleName, (enabled, { allowList = [], ignoreList = [] } = {}, context) => { + return (root, result) => { + if (!enabled) return; + + const validOptions = stylelint.utils.validateOptions( + result, + ruleName, + { + actual: ignoreList, + possible: [String, RegExp], + }, + { + actual: allowList, + possible: [String, RegExp], + }, + ); + + if (!validOptions) return; + + const usedAnywhere = new Set(); + const usedInProps = new Set(); + const relationships = new Map(); + + function trackRelationships(decl) { + const usedInDecl = new Set(); + + // Parse value and get a list of variables used + const parsed = valueParser(decl.value); + parsed.walk((node) => { + if (node.type !== "function" || node.value !== "var" || !node.nodes.length) { + return; + } + + const varName = node.nodes[0].value; + + usedInDecl.add(varName); + usedAnywhere.add(varName); + + if (decl.prop.startsWith("--")) { + usedInProps.add(varName); + } + }); + + // Store every variable referenced by this var + if (decl.prop.startsWith("--") && usedInDecl.size > 0) { + for (let varName of usedInDecl) { + const previous = relationships.has(varName) ? relationships.get(varName) : []; + relationships.set(varName, [...new Set([...previous, decl.prop])]); + } + } + } + + /* Collect a set of all allowed passthroughs */ + const allowedPassthroughs = new Set(); + root.walkComments((comment) => { + if (!/^\s*@passthroughs?\s*(\s+start)?/g.test(comment.text)) return; + + // Look for a start or end indicator + const start = /^\s*@passthroughs?\s+start/.test(comment.text); + const end = /^\s*@passthroughs?\s+end/.test(comment.text); + + let nextLine = comment.next(); + + // If there is neither a start, nor end identifier, capture the next line + if (!start && !end && nextLine && nextLine.type === "declaration" && nextLine.prop.startsWith("--")) { + allowedPassthroughs.add(nextLine.prop); + trackRelationships(nextLine); + } + + if (!start || end) return; + + // If this comment is a start indicator, capture the declarations after it until the end indicator + while (nextLine) { + if (nextLine.type === "decl" && nextLine.prop.startsWith("--")) { + allowedPassthroughs.add(nextLine.prop); + trackRelationships(nextLine); + } else if (nextLine.type === "comment" && /^\s*@passthroughs?\s*(\s+end)?$/.test(nextLine.text)) { + break; + } + + nextLine = nextLine.next(); + } + }); + + /* Collect variable use information */ + root.walkDecls((decl) => trackRelationships(decl)); + + root.walkDecls(/^--/, (decl) => { + // Check if this variable is unused + if ( + !usedAnywhere.has(decl.prop) && + !(ignoreList.length ? ignoreList.some((regex) => regex.test(decl.prop)) : true) && + (allowList.length ? allowList.some((regex) => regex.test(decl.prop)) : true) && + !allowedPassthroughs.has(decl.prop) + ) { + if (context.fix) { + decl.remove(); + } else { + stylelint.utils.report({ + message: messages.expected, + messageArgs: [decl.prop], + node: decl, + result, + ruleName, + }); + } + + return; + } + + if (usedInProps.has(decl.prop)) return; + + // Drop a variable if everything that references it has been removed + if (!relationships.has(decl.prop)) return; + const relatives = relationships.get(decl.prop); + + // Check if everything that references this variable has been removed + const keep = relatives.reduce((keep, relatedVar) => { + if (usedAnywhere.has(relatedVar) || allowedPassthroughs.has(relatedVar)) return true; + return keep; + }, false); + + if (keep) return; + + if (context.fix) { + decl.remove(); + } else { + stylelint.utils.report({ + message: messages.expected, + messageArgs: [decl.prop], + node: decl, + result, + ruleName, + }); + } + }); + }; +}); + +module.exports.ruleName = ruleName; +module.exports.messages = messages; + +module.exports = plugin; diff --git a/plugins/stylelint-no-unused-custom-properties/package.json b/plugins/stylelint-no-unused-custom-properties/package.json new file mode 100644 index 00000000000..14af6ffda56 --- /dev/null +++ b/plugins/stylelint-no-unused-custom-properties/package.json @@ -0,0 +1,26 @@ +{ + "name": "@spectrum-tools/stylelint-no-unused-custom-properties", + "version": "1.2.1", + "description": "Report on any unused custom property definitions", + "license": "Apache-2.0", + "author": "Adobe", + "main": "index.js", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "stylelint": "^14.0.0 || ^15.0.0" + }, + "devDependencies": { + "ava": "^5.3.1", + "c8": "^8.0.1", + "stylelint": "^15.11.0" + }, + "keywords": [ + "css", + "lint", + "properties", + "report", + "stylelint-plugin" + ] +} diff --git a/plugins/stylelint-no-unused-custom-properties/project.json b/plugins/stylelint-no-unused-custom-properties/project.json new file mode 100644 index 00000000000..764ecf083ab --- /dev/null +++ b/plugins/stylelint-no-unused-custom-properties/project.json @@ -0,0 +1,14 @@ +{ + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "tags": ["tooling", "stylelint"], + "name": "stylelint-no-unused-custom-properties", + "targets": { + "lint": { + "defaultConfiguration": "plugins" + }, + "coverage": {}, + "test": { + "defaultConfiguration": "plugins" + } + } +} diff --git a/plugins/stylelint-no-unused-custom-properties/test.js b/plugins/stylelint-no-unused-custom-properties/test.js new file mode 100644 index 00000000000..2b6e0603b8a --- /dev/null +++ b/plugins/stylelint-no-unused-custom-properties/test.js @@ -0,0 +1,32 @@ +const fs = require("fs"); +const { join } = require("path"); + +const test = require("ava"); +const postcss = require("postcss"); + +const plugin = require("./index.js"); + +function compare(t, fixtureFilePath, expectedFilePath, options = {}) { + return postcss([plugin(options)]) + .process(readFile(`./fixtures/${fixtureFilePath}`), { + from: fixtureFilePath, + }) + .then((result) => { + const expected = result.css; + const actual = readFile(`./expected/${expectedFilePath}`); + t.is(expected, actual); + t.is(result.warnings().length, 0); + }); +} + +function readFile(filename) { + return fs.readFileSync(join(__dirname, filename), "utf8"); +} + +test("drop unused vars", (t) => { + return compare(t, "unused.css", "unused.css"); +}); + +test("drop unused vars, even if referenced by other vars", (t) => { + return compare(t, "varRefs.css", "varRefs.css"); +}); diff --git a/plugins/stylelint-suit-naming-pattern/CHANGELOG.md b/plugins/stylelint-suit-naming-pattern/CHANGELOG.md deleted file mode 100644 index 474f2bf551e..00000000000 --- a/plugins/stylelint-suit-naming-pattern/CHANGELOG.md +++ /dev/null @@ -1,58 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - - -#1.1.0 -🗓 -2023-06-01 - -### ✨ Features - -\*add stylelint ([#1787](https://github.com/adobe/spectrum-css/issues/1787))([a450904](https://github.com/adobe/spectrum-css/commit/a450904)) - -# 1.0.5 - -Added postcss-selector-parser to parse the css - -# 1.0.4 - -Updated regex to include the below pattern - -```css -.spectrum-ToolTip--size100 { -} -.spectrum-Switch-input[disabled] { -} -.spectrum:lang(ar) { -} -.spectrum-UIIcon-ChevronDown75 { -} -``` - -# 1.0.3 - -Updated regex to include the below pattern - -```css -.spectrum--express { -} -``` - -# 1.0.2 - -Updated regex to include the below patterns - -```css -.spectrum-ComponentName.is-selected { -} -.spectrum-ComponentName.is-selected.spectrum-ComponentName--emphasized { -} -.spectrum-ComponentName.spectrum-ComponentName--descendentName.is-selected { -} -.spectrum-ComponentName.is-selected.spectrum-ComponentName--emphasized { -} -.spectrum-ComponentName.spectrum-ComponentName--descendentName.is-selected { -} -``` diff --git a/plugins/stylelint-suit-naming-pattern/README.md b/plugins/stylelint-suit-naming-pattern/README.md deleted file mode 100644 index a02685eafd7..00000000000 --- a/plugins/stylelint-suit-naming-pattern/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# stylelint-suit-naming-pattern - -> Validates classnames on SUIT naming pattern - -(SUIT Docs)[https://github.com/suitcss/suit/blob/master/doc/naming-conventions.md] - -## Description - -Let's say you have a classname `.spectrum-Well-Component{}`. This will show a lint error because it expects the classname to follow SUIT naming convention like`.spectrum-Well-component{}` - -Valid classnames: - -```css -.spectrum { -} -.spectrum-Component { -} -.spectrum-Component-newName { -} -.spectrum-Component--state { -} -.is-focused { -} -.spectrum-ComponentName.spectrum-ComponentX { -} -.spectrum-ComponentName-descendant1.spectrum-ComponentX-descendant2 { -} -.u-camelCase { -} -``` - -Invalid classnames: - -```css -.spectrum-Component-NewName { -} -.spectrum-Component--SizeXS { -} -``` - -## Installation - -``` -npm install stylelint-suit-naming-pattern - -yarn add stylelint-suit-naming-pattern - -``` - -## How to use - -In your stylelintrc.json add stylelint-suit-naming-pattern to your plugins array and to your rules array like this: - -```js -plugins: ['stylelint-suit-naming-pattern'], -rules: { - "custom-rule/suit-naming-pattern": true, -} -``` - -## Usage - -Wrong: Throws an error here - -```css -.spectrum-Well-Component { - background-color: var(--prefix-component-background-color); -} -``` - -Correct: - -```css -.spectrum-Well-component { - background-color: var(--prefix-component-background-color); -} -``` diff --git a/plugins/stylelint-suit-naming-pattern/index.js b/plugins/stylelint-suit-naming-pattern/index.js deleted file mode 100644 index 65f8dc695d5..00000000000 --- a/plugins/stylelint-suit-naming-pattern/index.js +++ /dev/null @@ -1,50 +0,0 @@ -const stylelint = require("stylelint"); -const parser = require("postcss-selector-parser"); -const ruleName = "custom-rule/suit-naming-pattern"; - -const messages = stylelint.utils.ruleMessages(ruleName, { - wrongCapitalization: (className) => - `Component Class name "${className}" should follow the SUIT-style naming conventions with the ".spectrum" prefix.`, - wrongUtilityClassName: (className) => - `Utility Class name "${className}" should follow the SUIT-style naming conventions with the ".u-camelCase" prefix.`, -}); -const utilityClassPattern = /^u-[a-z]+[a-zA-Z0-9]+/; - -const suitClassPattern = - /^spectrum(--(?:express|light|lightest|dark|darkest|medium|large))?((-[A-Z][a-zA-Z0-9]+)([-]{1,2}((\S*\d+\S*)[a-zA-Z0-9]+|[a-z][a-zA-Z0-9-]+]*(?!\d)))?(\s|,\s)?)?$/; - -module.exports = stylelint.createPlugin(ruleName, () => { - return (root, result) => { - root.walkRules(async (rule) => { - await parser((selectors) => { - selectors.walkClasses((selectorNode) => { - const selector = selectorNode.value; - if ( - selector.startsWith("spectrum") && - !suitClassPattern.test(selector) - ) { - stylelint.utils.report({ - message: messages.wrongCapitalization(selector), - node: rule, - result, - ruleName, - }); - } else if ( - selector.startsWith("u-") && - !utilityClassPattern.test(selector) - ) { - stylelint.utils.report({ - message: messages.wrongUtilityClassName(selector), - node: rule, - result, - ruleName, - }); - } - }); - }).process(rule.selector); - }); - }; -}); - -module.exports.ruleName = ruleName; -module.exports.messages = messages; diff --git a/plugins/stylelint-suit-naming-pattern/package.json b/plugins/stylelint-suit-naming-pattern/package.json deleted file mode 100644 index ed79ae7b3d2..00000000000 --- a/plugins/stylelint-suit-naming-pattern/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "private": true, - "name": "stylelint-suit-naming-pattern", - "version": "1.1.0", - "license": "Apache-2.0", - "main": "index.js", - "scripts": { - "prepublishOnly": "yarn test", - "test": "ava" - }, - "peerDependencies": { - "stylelint": ">=15" - }, - "devDependencies": { - "ava": "^3.9.0", - "postcss-selector-parser": "^6.0.2", - "stylelint": "^15.10.2" - } -} diff --git a/plugins/stylelint-suit-naming-pattern/test.js b/plugins/stylelint-suit-naming-pattern/test.js deleted file mode 100644 index 837efb1626e..00000000000 --- a/plugins/stylelint-suit-naming-pattern/test.js +++ /dev/null @@ -1,63 +0,0 @@ -const test = require("ava"); -const stylelint = require("stylelint"); -const rule = require("./index"); - -const { ruleName, messages } = rule; - -async function runRule(code) { - const result = await stylelint.lint({ - code, - config: { - plugins: [rule], - rules: { - [ruleName]: true, - }, - }, - }); - - return result; -} - -test(`should pass valid class names`, async (t) => { - const validCode = ` - .spectrum {} - .spectrum-Component {} - .spectrum-Component-newName {} - .spectrum-Component--sizeXS {} - .spectrum-ComponentName--descendant1 {} - .spectrum-ComponentX-descendant2 {} - .spectrum--lightest {} - .spectrum-ToolTip--size100 {} - .spectrum-Switch-input {} - .spectrum-UIIcon-ChevronDown75 {} - .spectrum--express {} - .spectrum-Tooltip--top-left {} - `; - - const result = await runRule(validCode); - t.is(result.results[0].warnings.length, 0); -}); - -test(`should fail invalid class names`, async (t) => { - const invalidCode = ` - .spectrum-UIIcon-United {} - .spectrum-underlay-Under-lay {} - .spectrum-underlay-under-lay {} - .spectrum-detail--serif {} - .spectrum-Heading--Heavy {} - .spectrum-underlay-underlay {} - .spectrum-Underlay--Underlay {} - .spectrum-Underlay-Abc {} - .spectrum-Underlay--Abc {} - .spectrum-underlay--abc {} - .spectrum-anderlay--Abc {} - .spectrum-anderlay--abc {} - .spectrum-Underlay--Abc {} - .spectrum-code {} - .spectrum-code--Abc {} - `; - - const result = await runRule(invalidCode); - - t.is(result.results[0].warnings.length, 15); -}); diff --git a/stylelint.config.js b/stylelint.config.js index 447d507322d..099e0f4bc41 100644 --- a/stylelint.config.js +++ b/stylelint.config.js @@ -1,97 +1,169 @@ +const { join } = require("path"); + module.exports = { - allowEmptyInput: true, - cache: true, - defaultSeverity: "warning", - extends: ["stylelint-config-standard"], - plugins: [ - "stylelint-use-logical", - "stylelint-no-missing-parenthesis", - "stylelint-no-missing-var", - "stylelint-suit-naming-pattern" + allowEmptyInput: true, + cache: true, + defaultSeverity: "warning", + extends: ["stylelint-config-standard", "stylelint-config-clean-order"], + plugins: [ + "stylelint-header", + "stylelint-selector-bem-pattern", + "stylelint-use-logical", + "@spectrum-tools/stylelint-no-missing-parenthesis", + "@spectrum-tools/stylelint-no-missing-var", + "@spectrum-tools/stylelint-no-unused-custom-properties", + "@spectrum-tools/stylelint-no-unknown-custom-properties", + "stylelint-high-performance-animation", + ], + rules: { + "at-rule-empty-line-before": [ + "always", + { + except: ["blockless-after-blockless", "first-nested"], + ignore: ["after-comment", "first-nested"], + ignoreAtRules: ["extend"], + }, ], - rules: { - "at-rule-empty-line-before": [ - "always", - { - except: ["blockless-after-blockless", "first-nested"], - ignore: ["after-comment", "first-nested"], - ignoreAtRules: ["extend"], - }, - ], - "at-rule-no-unknown": [ - true, - { - ignoreAtRules: ["extend", "container", "each", "include", "mixin"], - }, - ], - "rule-empty-line-before": [ - "always", - { - except: ["first-nested"], - ignore: ["after-comment"], - }, - ], - "selector-attribute-quotes": null, - "block-no-empty": null, - /* Could probably dig into this further, might be useful */ - "no-descending-specificity": null, - /* Not useful at the moment */ - "no-duplicate-selectors": null, - "selector-class-pattern": null, - "declaration-empty-line-before": null, - "comment-empty-line-before": [ - "always", - { - except: ["first-nested"], - ignore: ["after-comment", "stylelint-commands"], - ignoreComments: [/^passthroughs?/], - }, - ], - "declaration-block-no-redundant-longhand-properties": null, - "custom-property-empty-line-before": null, - "value-no-vendor-prefix": [ - true, - { - disableFix: true, - severity: "warning", - }, - ], - "max-nesting-depth": [3, { severity: "warning" }], - "custom-property-pattern": [/^(spectrum|mod|highcontrast|system)/, {}], - "alpha-value-notation": "percentage", - "function-no-unknown": [ - true, - { - severity: "warning", - }, + "at-rule-no-unknown": [ + true, + { + ignoreAtRules: ["extend", "container", "each", "include", "mixin"], + }, + ], + "rule-empty-line-before": [ + "always", + { + except: ["first-nested"], + ignore: ["after-comment"], + }, + ], + "selector-attribute-quotes": null, + "block-no-empty": null, + /* Could probably dig into this further, might be useful */ + "no-descending-specificity": null, + /* Not useful at the moment */ + "no-duplicate-selectors": null, + "selector-class-pattern": null, + "declaration-empty-line-before": null, + "comment-empty-line-before": [ + "always", + { + except: ["first-nested"], + ignore: ["after-comment", "stylelint-commands"], + ignoreComments: [/^passthroughs?/], + }, + ], + "declaration-block-no-redundant-longhand-properties": null, + "custom-property-empty-line-before": null, + "value-no-vendor-prefix": [ + true, + { + disableFix: true, + severity: "warning", + }, + ], + "max-nesting-depth": [3, { severity: "warning" }], + "custom-property-pattern": [/^(spectrum|mod|highcontrast|system)/, {}], + "alpha-value-notation": "percentage", + "function-no-unknown": [ + true, + { + severity: "warning", + }, + ], + /* @todo: would like to use "modern" eventually */ + "color-function-notation": null, + "import-notation": null, + "property-no-unknown": [ + true, + { + checkPrefixed: true, + }, + ], + "declaration-block-no-duplicate-custom-properties": true, + "declaration-property-value-no-unknown": [ + true, + { + ignoreProperties: { + transform: ["/^logical/"], + }, + }, + ], + "value-keyword-case": [ + "lower", + { + camelCaseSvgKeywords: true, + }, + ], + "selector-not-notation": "complex", + "header/header": [ + join(__dirname, "COPYRIGHT"), + { + nonMatchingTolerance: 0.8, + }, + { + fix: true, + }, + ], + "csstools/use-logical": true, + /** Performance */ + // "plugin/no-low-performance-animation-properties": [true, { severity: "warning" }], + "plugin/selector-bem-pattern": [ + { + preset: "suit", + presetOptions: { namespace: "spectrum" }, + utilitySelectors: /^\.(is|u)-[A-z0-9]+$/, + componentName: /^[A-Z][A-z0-9]+$/, + }, + { + severity: "warning", + }, + ], + /** Local/custom plugins */ + "spectrum-tools/no-missing-parenthesis": true, + "spectrum-tools/no-missing-var": true, + /** @note this enables reporting of unused variables in a file */ + "spectrum-tools/no-unused-custom-properties": [ + true, + { + ignore: [/^--mod-/, /^--highcontrast-/, /^--system-/], + disableFix: true, + severity: "warning", + }, + ], + "spectrum-tools/no-unknown-custom-properties": [ + true, + { + /** @note this is a list of custom properties that are allowed to be unknown */ + ignore: [ + /^--mod-/, + /^--highcontrast-/, + /^--system-/, + /^--spectrum-(global|alias|component)-/, + /^--spectrum-animation-/, ], - /* @todo: would like to use "modern" eventually */ + checkDependencies: true, + disableFix: true, + severity: "warning", + }, + ], + }, + overrides: [ + { + files: ["components/*/themes/*.css", "tokens/**/*.css"], + rules: { + "spectrum-tools/no-unused-custom-properties": null, + "spectrum-tools/no-unknown-custom-properties": null, + }, + }, + { + files: ["site/**/*.css", "storybook/assets/*.css"], + rules: { + "custom-property-pattern": null, + "spectrum-tools/no-unused-custom-properties": null, + "spectrum-tools/no-unknown-custom-properties": null, "color-function-notation": null, - "import-notation": null, - "property-no-unknown": [ - true, - { - checkPrefixed: true, - }, - ], - "declaration-block-no-duplicate-custom-properties": true, - "declaration-property-value-no-unknown": [ - true, - { - ignoreProperties: { - transform: ["/^logical/"], - }, - }, - ], - "value-keyword-case": [ - "lower", - { - camelCaseSvgKeywords: true, - }, - ], - "selector-not-notation": "complex", - "csstools/use-logical": true, - /** Local/custom plugins */ - "custom-rule/no-missing-parenthesis": true, + }, }, + ], }; diff --git a/yarn.lock b/yarn.lock index 8b7e453b483..ae6cc726889 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1120,6 +1120,11 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + "@chromaui/addon-visual-tests@^0.0.124": version "0.0.124" resolved "https://registry.yarnpkg.com/@chromaui/addon-visual-tests/-/addon-visual-tests-0.0.124.tgz#140d0a22c4943a9213b4685837aa85720b111f1a" @@ -1322,21 +1327,41 @@ resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.2.tgz#1e0d581dbf4518cb3e939c3b863cb7180c8cedad" integrity sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA== +"@csstools/css-parser-algorithms@^2.4.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.5.0.tgz#0c03cd5418a9f404a05ff2ffcb1b69d04e8ec532" + integrity sha512-abypo6m9re3clXA00eu5syw+oaPHbJTPapu9C4pzNsJ4hdZDzushT50Zhu+iIYXgEe1CxnRMn7ngsbV+MLrlpQ== + "@csstools/css-tokenizer@^2.2.0": version "2.2.1" resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.1.tgz#9dc431c9a5f61087af626e41ac2a79cce7bb253d" integrity sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg== +"@csstools/css-tokenizer@^2.2.2": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.3.tgz#b099d543ea57b64f495915a095ead583866c50c6" + integrity sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg== + "@csstools/media-query-list-parser@^2.1.4": version "2.1.5" resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.5.tgz#94bc8b3c3fd7112a40b7bf0b483e91eba0654a0f" integrity sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ== +"@csstools/media-query-list-parser@^2.1.6": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.7.tgz#a4836e3dbd693081a30b32ce9c2a781e1be16788" + integrity sha512-lHPKJDkPUECsyAvD60joYfDmp8UERYxHGkFfyLJFTVK/ERJe0sVlIFLXU5XFxdjNDTerp5L4KeaKG+Z5S94qxQ== + "@csstools/selector-specificity@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz#798622546b63847e82389e473fd67f2707d82247" integrity sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g== +"@csstools/selector-specificity@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-3.0.1.tgz#d84597fbc0f897240c12fc0a31e492b036c70e40" + integrity sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww== + "@discoveryjs/json-ext@^0.5.3": version "0.5.7" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" @@ -1462,6 +1487,13 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + "@etchteam/storybook-addon-status@^4.2.4": version "4.2.4" resolved "https://registry.yarnpkg.com/@etchteam/storybook-addon-status/-/storybook-addon-status-4.2.4.tgz#607e0fe230f5befae8b6e6b9c566eb07c296def8" @@ -1560,7 +1592,7 @@ js-yaml "^3.13.1" resolve-from "^5.0.0" -"@istanbuljs/schema@^0.1.2": +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== @@ -1663,7 +1695,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": version "0.3.20" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== @@ -3915,7 +3947,7 @@ "@types/through" "*" rxjs "^7.2.0" -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== @@ -4107,6 +4139,11 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.6.tgz#eb26db6780c513de59bee0b869ef289ad3068711" integrity sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA== +"@types/semver@^7.3.12": + version "7.5.6" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" + integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== + "@types/semver@^7.3.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.5.tgz#deed5ab7019756c9c90ea86139106b0346223f35" @@ -4178,6 +4215,54 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@^5.10.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + "@urql/core@>=4.1.0", "@urql/core@^4.2.0": version "4.2.2" resolved "https://registry.yarnpkg.com/@urql/core/-/core-4.2.2.tgz#c2b009373cb9084bbfa8ebc0177c854a76235b84" @@ -4433,6 +4518,11 @@ acorn-walk@^8.0.0, acorn-walk@^8.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.0.tgz#2097665af50fd0cf7a2dfccd2b9368964e66540f" integrity sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA== +acorn-walk@^8.2.0: + version "8.3.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.1.tgz#2f10f5b69329d90ae18c58bf1fa8fccd8b959a43" + integrity sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw== + acorn@^3.1.0: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" @@ -4497,6 +4587,14 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +aggregate-error@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-4.0.1.tgz#25091fe1573b9e0be892aeda15c7c66a545f758e" + integrity sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w== + dependencies: + clean-stack "^4.0.0" + indent-string "^5.0.0" + ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" @@ -4650,7 +4748,7 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.0.0, ansi-styles@^6.1.0: +ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== @@ -4927,6 +5025,11 @@ arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== +arrify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-3.0.0.tgz#ccdefb8eaf2a1d2ab0da1ca2ce53118759fd46bc" + integrity sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw== + asap@^2.0.3, asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -5110,6 +5213,55 @@ ava@^3.9.0: write-file-atomic "^3.0.3" yargs "^16.2.0" +ava@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ava/-/ava-5.3.1.tgz#335737dd963b7941b90214836cea2e8de1f4d5f4" + integrity sha512-Scv9a4gMOXB6+ni4toLuhAm9KYWEjsgBglJl+kMGI5+IVDt120CCDZyB5HNU9DjmLI2t4I0GbnxGLmmRfGTJGg== + dependencies: + acorn "^8.8.2" + acorn-walk "^8.2.0" + ansi-styles "^6.2.1" + arrgv "^1.0.2" + arrify "^3.0.0" + callsites "^4.0.0" + cbor "^8.1.0" + chalk "^5.2.0" + chokidar "^3.5.3" + chunkd "^2.0.1" + ci-info "^3.8.0" + ci-parallel-vars "^1.0.1" + clean-yaml-object "^0.1.0" + cli-truncate "^3.1.0" + code-excerpt "^4.0.0" + common-path-prefix "^3.0.0" + concordance "^5.0.4" + currently-unhandled "^0.4.1" + debug "^4.3.4" + emittery "^1.0.1" + figures "^5.0.0" + globby "^13.1.4" + ignore-by-default "^2.1.0" + indent-string "^5.0.0" + is-error "^2.2.2" + is-plain-object "^5.0.0" + is-promise "^4.0.0" + matcher "^5.0.0" + mem "^9.0.2" + ms "^2.1.3" + p-event "^5.0.1" + p-map "^5.5.0" + picomatch "^2.3.1" + pkg-conf "^4.0.0" + plur "^5.1.0" + pretty-ms "^8.0.0" + resolve-cwd "^3.0.0" + stack-utils "^2.0.6" + strip-ansi "^7.0.1" + supertap "^3.0.1" + temp-dir "^3.0.0" + write-file-atomic "^5.0.1" + yargs "^17.7.2" + available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" @@ -5596,6 +5748,24 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +c8@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/c8/-/c8-8.0.1.tgz#bafd60be680e66c5530ee69f621e45b1364af9fd" + integrity sha512-EINpopxZNH1mETuI0DzRA4MZpAUH+IFiRhnmFD3vFr3vdrgxqi3VfE3KL0AIL+zDq8rC9bZqwM/VDmmoe04y7w== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@istanbuljs/schema" "^0.1.3" + find-up "^5.0.0" + foreground-child "^2.0.0" + istanbul-lib-coverage "^3.2.0" + istanbul-lib-report "^3.0.1" + istanbul-reports "^3.1.6" + rimraf "^3.0.2" + test-exclude "^6.0.0" + v8-to-istanbul "^9.0.0" + yargs "^17.7.2" + yargs-parser "^21.1.1" + cacache@^16.1.0: version "16.1.3" resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" @@ -5698,6 +5868,11 @@ callsites@^3.0.0, callsites@^3.1.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +callsites@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-4.1.0.tgz#de72b98612eed4e1e2564c952498677faa9d86c2" + integrity sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw== + camel-case@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" @@ -5779,6 +5954,13 @@ case-sensitive-paths-webpack-plugin@^2.4.0: resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== +cbor@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" + integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== + dependencies: + nofilter "^3.1.0" + center-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" @@ -5803,7 +5985,7 @@ chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1. ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@5.3.0, chalk@^5.0.0, chalk@^5.0.1, chalk@^5.3.0: +chalk@5.3.0, chalk@^5.0.0, chalk@^5.0.1, chalk@^5.2.0, chalk@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== @@ -5999,7 +6181,7 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -ci-info@^3.2.0, ci-info@^3.6.1: +ci-info@^3.2.0, ci-info@^3.6.1, ci-info@^3.8.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== @@ -6038,6 +6220,13 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +clean-stack@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-4.2.0.tgz#c464e4cde4ac789f4e0735c5d75beb49d7b30b31" + integrity sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg== + dependencies: + escape-string-regexp "5.0.0" + clean-yaml-object@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz#63fb110dc2ce1a84dc21f6d9334876d010ae8b68" @@ -6216,6 +6405,13 @@ code-excerpt@^3.0.0: dependencies: convert-to-spaces "^1.0.1" +code-excerpt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-4.0.0.tgz#2de7d46e98514385cb01f7b3b741320115f4c95e" + integrity sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA== + dependencies: + convert-to-spaces "^2.0.1" + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -6422,7 +6618,7 @@ concat-with-sourcemaps@^1.0.0: dependencies: source-map "^0.6.1" -concordance@^5.0.1: +concordance@^5.0.1, concordance@^5.0.4: version "5.0.4" resolved "https://registry.yarnpkg.com/concordance/-/concordance-5.0.4.tgz#9896073261adced72f88d60e4d56f8efc4bbbbd2" integrity sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw== @@ -6725,6 +6921,11 @@ convert-to-spaces@^1.0.1: resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" integrity sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ== +convert-to-spaces@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz#61a6c98f8aa626c16b296b862a91412a33bceb6b" + integrity sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -6835,6 +7036,16 @@ cosmiconfig@^8.0.0, cosmiconfig@^8.2.0: parse-json "^5.2.0" path-type "^4.0.0" +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" @@ -7608,6 +7819,11 @@ emittery@^0.8.0: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== +emittery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-1.0.1.tgz#e0cf36e2d7eef94dbd025969f642d57ae50a56cd" + integrity sha512-2ID6FdrMD9KDLldGesP6317G78K7km/kMcwItRtVFva7I/cSEOIaLpewaUb+YLXVwdAp3Ctfxh/V5zIl1sj7dQ== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -7704,7 +7920,7 @@ entities@~2.1.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== -env-paths@^2.2.0: +env-paths@^2.2.0, env-paths@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== @@ -7910,6 +8126,11 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== +escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -7925,12 +8146,14 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escape-string-regexp@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" - integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== +eslint-plugin-jest@^27.2.2: + version "27.6.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.6.1.tgz#5e43b07f3ca48d72e4b4fa243531e5153d9ca1dc" + integrity sha512-WEYkyVXD9NlmFBKvrkmzrC+C9yZoz5pAml2hO19PlS3spJtoiwj4p2u8spd/7zx5IvRsZsCmsoImaAvBB9X93Q== + dependencies: + "@typescript-eslint/utils" "^5.10.0" -eslint-scope@5.1.1: +eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -7938,6 +8161,11 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" +eslint-visitor-keys@^3.3.0: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -8288,6 +8516,13 @@ file-entry-cache@^7.0.0: dependencies: flat-cache "^3.1.1" +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + file-loader@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" @@ -8447,7 +8682,7 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-up@^6.3.0: +find-up@^6.0.0, find-up@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== @@ -8526,6 +8761,15 @@ flat-cache@^3.1.1: keyv "^4.5.3" rimraf "^3.0.2" +flat-cache@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.0.tgz#d12437636f83bb8a12b8f300c36fd1614e1c7224" + integrity sha512-EryKbCE/wxpxKniQlyas6PY1I9vwtF3uCBweX+N8KYTCn3Y12RTGtQAJ/bd5pl7kxUAc8v/R3Ake/N17OZiFqA== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + rimraf "^5.0.5" + flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" @@ -8578,6 +8822,14 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" +foreground-child@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^3.0.2" + foreground-child@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" @@ -9153,7 +9405,7 @@ globby@^10.0.1: merge2 "^1.2.3" slash "^3.0.0" -globby@^13.0.0, globby@^13.1.1: +globby@^13.0.0, globby@^13.1.1, globby@^13.1.4: version "13.2.2" resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== @@ -9595,6 +9847,11 @@ html-entities@^2.1.0: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + html-minifier-terser@^6.0.2: version "6.1.0" resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" @@ -9771,7 +10028,7 @@ ieee754@^1.1.13, ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore-by-default@^2.0.0: +ignore-by-default@^2.0.0, ignore-by-default@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-2.1.0.tgz#c0e0de1a99b6065bdc93315a6f728867981464db" integrity sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw== @@ -9795,6 +10052,11 @@ ignore@^5.0.4, ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +ignore@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== + immutable@^3: version "3.8.2" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" @@ -10012,7 +10274,7 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -irregular-plurals@^3.2.0: +irregular-plurals@^3.2.0, irregular-plurals@^3.3.0: version "3.5.0" resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.5.0.tgz#0835e6639aa8425bdc8b0d33d0dc4e89d9c01d2b" integrity sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ== @@ -10580,7 +10842,7 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -istanbul-lib-coverage@^3.2.0: +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== @@ -10596,6 +10858,23 @@ istanbul-lib-instrument@^5.0.4: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" +istanbul-lib-report@^3.0.0, istanbul-lib-report@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-reports@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + istextorbinary@^3.0.0: version "3.3.0" resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-3.3.0.tgz#06b1c57d948da11461bd237c00ce09e9902964f2" @@ -10753,7 +11032,7 @@ js-yaml@4.1.0, js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -js-yaml@^3.10.0, js-yaml@^3.13.1, js-yaml@^3.14.0, js-yaml@^3.4.3: +js-yaml@^3.10.0, js-yaml@^3.13.1, js-yaml@^3.14.0, js-yaml@^3.14.1, js-yaml@^3.4.3: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -10907,7 +11186,7 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" -keyv@^4.5.3: +keyv@^4.5.3, keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== @@ -11280,6 +11559,11 @@ load-json-file@^5.2.0: strip-bom "^3.0.0" type-fest "^0.3.0" +load-json-file@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-7.0.1.tgz#a3c9fde6beffb6bedb5acf104fad6bb1604e1b00" + integrity sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ== + loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" @@ -11451,7 +11735,7 @@ lodash.upperfirst@^4.3.1: resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== -lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: +lodash@>=4.17.21, lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -11571,6 +11855,13 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" @@ -11717,6 +12008,13 @@ matcher@^3.0.0: dependencies: escape-string-regexp "^4.0.0" +matcher@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-5.0.0.tgz#cd82f1c7ae7ee472a9eeaf8ec7cac45e0fe0da62" + integrity sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw== + dependencies: + escape-string-regexp "^5.0.0" + mathml-tag-names@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" @@ -11779,6 +12077,14 @@ mem@^8.0.0: map-age-cleaner "^0.1.3" mimic-fn "^3.1.0" +mem@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/mem/-/mem-9.0.2.tgz#bbc2d40be045afe30749681e8f5d554cee0c0354" + integrity sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^4.0.0" + memfs@^3.4.1, memfs@^3.4.12: version "3.6.0" resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" @@ -11816,6 +12122,11 @@ meow@^10.1.5: type-fest "^1.2.2" yargs-parser "^20.2.9" +meow@^13.0.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-13.1.0.tgz#62995b0e8c3951739fe6e0a4becdd4d0df23eb37" + integrity sha512-o5R/R3Tzxq0PJ3v3qcQJtSvSE9nKOLSAaDuuoMzDVuGTwHdccMWcYomh9Xolng2tjT6O/Y83d+0coVGof6tqmA== + meow@^8.0.0, meow@^8.1.2: version "8.1.2" resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" @@ -12193,7 +12504,7 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== -nanoid@^3.3.6: +nanoid@^3.3.6, nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== @@ -12335,6 +12646,11 @@ node-releases@^2.0.13: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== +nofilter@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== + nopt@1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" @@ -12998,6 +13314,13 @@ p-event@^4.2.0: dependencies: p-timeout "^3.1.0" +p-event@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-5.0.1.tgz#614624ec02ae7f4f13d09a721c90586184af5b0c" + integrity sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ== + dependencies: + p-timeout "^5.0.2" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -13085,6 +13408,13 @@ p-map@^3.0.0: dependencies: aggregate-error "^3.0.0" +p-map@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-5.5.0.tgz#054ca8ca778dfa4cf3f8db6638ccb5b937266715" + integrity sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg== + dependencies: + aggregate-error "^4.0.0" + p-pipe@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e" @@ -13110,6 +13440,11 @@ p-timeout@^3.1.0, p-timeout@^3.2.0: dependencies: p-finally "^1.0.0" +p-timeout@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-5.1.0.tgz#b3c691cf4415138ce2d9cfe071dba11f0fee085b" + integrity sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew== + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -13272,6 +13607,11 @@ parse-ms@^2.1.0: resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== +parse-ms@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-3.0.0.tgz#3ea24a934913345fcc3656deda72df921da3a70e" + integrity sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw== + parse-node-version@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" @@ -13541,6 +13881,14 @@ pkg-conf@^3.1.0: find-up "^3.0.0" load-json-file "^5.2.0" +pkg-conf@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-4.0.0.tgz#63ace00cbacfa94c2226aee133800802d3e3b80c" + integrity sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w== + dependencies: + find-up "^6.0.0" + load-json-file "^7.0.0" + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -13611,6 +13959,13 @@ plur@^4.0.0: dependencies: irregular-plurals "^3.2.0" +plur@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/plur/-/plur-5.1.0.tgz#bff58c9f557b9061d60d8ebf93959cf4b08594ae" + integrity sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg== + dependencies: + irregular-plurals "^3.3.0" + pluralize@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" @@ -13648,6 +14003,14 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== +postcss-bem-linter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-bem-linter/-/postcss-bem-linter-4.0.1.tgz#aca52d792a711ca2976530241532d798879c4e3b" + integrity sha512-jTG3uMo6n2YyxLBPLsRN+5R9djNJZ3mirAugvnYbZaZOwPmLb/MaQ2uql0fSdVYegjZBmX8tW5B0mfZigiXZ9Q== + dependencies: + minimatch "^3.1.2" + postcss-resolve-nested-selector "^0.1.1" + postcss-calc@^6.0.0: version "6.0.2" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-6.0.2.tgz#4d9a43e27dbbf27d095fecb021ac6896e2318337" @@ -13893,6 +14256,11 @@ postcss-safe-parser@^6.0.0: resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1" integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== +postcss-safe-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz#6273d4e5149e286db5a45bc6cf6eafcad464014a" + integrity sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg== + postcss-selector-parser@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" @@ -14023,6 +14391,15 @@ postcss@^8.4.21, postcss@^8.4.28: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.24, postcss@^8.4.32: + version "8.4.33" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" + integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" @@ -14105,6 +14482,13 @@ pretty-ms@^7.0.1: dependencies: parse-ms "^2.1.0" +pretty-ms@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-8.0.0.tgz#a35563b2a02df01e595538f86d7de54ca23194a3" + integrity sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q== + dependencies: + parse-ms "^3.0.0" + prismjs@1.25.0: version "1.25.0" resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.25.0.tgz#6f822df1bdad965734b310b315a23315cf999756" @@ -15999,7 +16383,7 @@ stack-trace@0.0.10: resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== -stack-utils@^2.0.3: +stack-utils@^2.0.3, stack-utils@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== @@ -16090,6 +16474,11 @@ string-argv@0.3.2: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== +string-similarity@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-4.0.4.tgz#42d01ab0b34660ea8a018da8f56a3309bb8b2a5b" + integrity sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ== + "string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -16186,7 +16575,7 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" -strip-ansi@^7.0.1: +strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== @@ -16292,6 +16681,13 @@ style-search@^0.1.0: resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg== +stylelint-config-clean-order@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/stylelint-config-clean-order/-/stylelint-config-clean-order-5.2.0.tgz#4462256111740d1e777515bf24d3b9805ed05e12" + integrity sha512-eAB9ftPa8txPFY2oh4NIE3DFkNzqVEBIALUZhSXP0+6CISPjZPBoOV24shjC9DgOKr7rNPY52DAXBXIBI//Mhg== + dependencies: + stylelint-order "^6.0.2" + stylelint-config-recommended@^13.0.0: version "13.0.0" resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-13.0.0.tgz#c48a358cc46b629ea01f22db60b351f703e00597" @@ -16304,12 +16700,89 @@ stylelint-config-standard@^34.0.0: dependencies: stylelint-config-recommended "^13.0.0" +stylelint-header@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stylelint-header/-/stylelint-header-1.0.0.tgz#a58f8e1995a822d8b3b1d1ceaddaf0884ece6895" + integrity sha512-1LB2SNSjaTj4doUDKbH65ic6OkfKCWML1eL6ANYeREDvq12mA7M8SIx7dAlpufEFYyzJEqBkN7A8+r/oOHAyvA== + dependencies: + string-similarity "^4.0.4" + +stylelint-high-performance-animation@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/stylelint-high-performance-animation/-/stylelint-high-performance-animation-1.10.0.tgz#2c0b67320fc6d978ee9b532d6feffc708e86979d" + integrity sha512-YzNI+E6taN8pwgaM0INazRg4tw23VA17KNMKUVdOeohpnpSyJLBnLVT9NkRcaCFLodK/67smS5VZK+Qe4Ohrvw== + dependencies: + postcss-value-parser "^4.2.0" + +stylelint-order@^6.0.2: + version "6.0.4" + resolved "https://registry.yarnpkg.com/stylelint-order/-/stylelint-order-6.0.4.tgz#3e80d876c61a98d2640de181433686f24284748b" + integrity sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA== + dependencies: + postcss "^8.4.32" + postcss-sorting "^8.0.2" + +stylelint-selector-bem-pattern@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/stylelint-selector-bem-pattern/-/stylelint-selector-bem-pattern-3.0.1.tgz#e4ddf27bacb705cac8c76b9610674ff6514d80cb" + integrity sha512-eh0tyyVyS62IOVzyi5oN0BKLJTHnolMWIqzpe0n3Wk26HxZegp/PiVKSUpK7vzVIAdAROemhypfMaH/xZorZrg== + dependencies: + eslint-plugin-jest "^27.2.2" + lodash ">=4.17.21" + postcss "^8.4.24" + postcss-bem-linter "^4.0.1" + stylelint ">=15.9.0" + stylelint-use-logical@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/stylelint-use-logical/-/stylelint-use-logical-2.1.0.tgz#4d2e58418d1a5d459beb3d51552491fab1ed22ec" integrity sha512-DN1boOPI6IMYTlu2KeQpH5hDEiCODHhd+AtXU0InO37wkWAuELiPwuv59HrTg2m9PYmqGTTO/QWdMBafYVPfew== -stylelint@^15.10.2, stylelint@^15.11.0: +stylelint@>=15.9.0: + version "16.1.0" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.1.0.tgz#d289c36b0dd344a65c55897d636b3b8b213dc908" + integrity sha512-Sh1rRV0lN1qxz/QsuuooLWsIZ/ona7NKw/fRZd6y6PyXYdD2W0EAzJ8yJcwSx4Iw/muz0CF09VZ+z4EiTAcKmg== + dependencies: + "@csstools/css-parser-algorithms" "^2.4.0" + "@csstools/css-tokenizer" "^2.2.2" + "@csstools/media-query-list-parser" "^2.1.6" + "@csstools/selector-specificity" "^3.0.1" + balanced-match "^2.0.0" + colord "^2.9.3" + cosmiconfig "^9.0.0" + css-functions-list "^3.2.1" + css-tree "^2.3.1" + debug "^4.3.4" + fast-glob "^3.3.2" + fastest-levenshtein "^1.0.16" + file-entry-cache "^8.0.0" + global-modules "^2.0.0" + globby "^11.1.0" + globjoin "^0.1.4" + html-tags "^3.3.1" + ignore "^5.3.0" + imurmurhash "^0.1.4" + is-plain-object "^5.0.0" + known-css-properties "^0.29.0" + mathml-tag-names "^2.1.3" + meow "^13.0.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.32" + postcss-resolve-nested-selector "^0.1.1" + postcss-safe-parser "^7.0.0" + postcss-selector-parser "^6.0.13" + postcss-value-parser "^4.2.0" + resolve-from "^5.0.0" + string-width "^4.2.3" + strip-ansi "^7.1.0" + supports-hyperlinks "^3.0.0" + svg-tags "^1.0.0" + table "^6.8.1" + write-file-atomic "^5.0.1" + +stylelint@^15.11.0: version "15.11.0" resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-15.11.0.tgz#3ff8466f5f5c47362bc7c8c9d382741c58bc3292" integrity sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw== @@ -16366,6 +16839,16 @@ supertap@^2.0.0: serialize-error "^7.0.1" strip-ansi "^6.0.0" +supertap@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/supertap/-/supertap-3.0.1.tgz#aa89e4522104402c6e8fe470a7d2db6dc4037c6a" + integrity sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw== + dependencies: + indent-string "^5.0.0" + js-yaml "^3.14.1" + serialize-error "^7.0.1" + strip-ansi "^7.0.1" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -16559,6 +17042,11 @@ temp-dir@^2.0.0: resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== +temp-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-3.0.0.tgz#7f147b42ee41234cc6ba3138cd8e8aa2302acffa" + integrity sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw== + temp@^0.8.4: version "0.8.4" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" @@ -16879,7 +17367,7 @@ tsconfig-paths@^4.1.2: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.13.0: +tslib@^1.13.0, tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -16889,6 +17377,13 @@ tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3 resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + tuf-js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.7.tgz#21b7ae92a9373015be77dfe0cb282a80ec3bbe43" @@ -17464,6 +17959,15 @@ v8-compile-cache@2.3.0: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== +v8-to-istanbul@^9.0.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" + integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + v8flags@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656"