From 68851267b6c64a53cd0261d2ea6c009960376dbb Mon Sep 17 00:00:00 2001 From: Josh Black Date: Mon, 10 Jun 2019 17:33:43 -0500 Subject: [PATCH] feat(eslint): add eslint-config-carbon (#2986) * feat(eslint): add eslint-config-carbon * feat(eslint): add support for vanilla config * chore(eslint): hoist eslint deps * chore(project): fix eslint violations * chore(project): add lint to ci-check * chore(eslint): add alias for returns to return * chore(project): remap return alias to returns * chore(cli): fix eslint violations * chore(project): sync yarn.lock * chore(eslint-config-carbon): sync package.json --- .eslintignore | 34 ++++++ .yarn/offline-mirror/babel-eslint-7.2.3.tgz | Bin 11595 -> 0 bytes .../eslint-config-carbon-1.0.2.tgz | Bin 12157 -> 0 bytes .../eslint-config-carbon-base-1.0.1.tgz | Bin 11046 -> 0 bytes .../eslint-plugin-jsdoc-4.8.4.tgz | Bin 54983 -> 0 bytes .../eslint-plugin-jsdoc-7.2.3.tgz | Bin 0 -> 81290 bytes package.json | 30 +++--- packages/bundler/.eslintrc | 5 + packages/bundler/src/bundler.js | 3 - packages/bundler/src/bundlers/javascript.js | 2 +- packages/bundler/src/bundlers/scss.js | 2 +- packages/bundler/src/commands/check.js | 3 - packages/bundler/src/commands/inline.js | 6 +- packages/bundler/src/commands/measure.js | 10 +- packages/bundler/src/commands/sassdoc.js | 2 +- packages/bundler/src/tools/compile.js | 6 +- packages/bundler/src/tools/sassdoc.js | 23 ++-- packages/cli/bin/carbon-cli.js | 3 +- packages/cli/src/cli.js | 2 +- packages/cli/src/commands/ci-check.js | 3 + packages/cli/src/commands/sync.js | 1 - packages/cli/src/commands/sync/npm.js | 2 +- packages/cli/src/commands/sync/package.js | 60 +++++------ .../commands/sync/remark/remark-monorepo.js | 6 +- packages/colors/__tests__/scss-test.js | 3 - packages/colors/src/rgb.js | 2 +- packages/colors/tasks/build.js | 12 +-- packages/components/.eslintrc | 32 +----- packages/components/demo/.eslintrc | 6 +- .../components/demo/js/components/RootPage.js | 22 ++-- .../components/demo/js/components/boot-nav.js | 6 +- packages/components/package.json | 7 +- packages/components/src/.eslintrc.js | 2 +- .../src/components/checkbox/checkbox.js | 2 +- .../components/code-snippet/code-snippet.js | 2 +- .../content-switcher/content-switcher.js | 6 +- .../src/components/copy-button/copy-button.js | 2 +- .../src/components/data-table/data-table.js | 2 +- .../src/components/date-picker/date-picker.js | 2 +- .../src/components/dropdown/dropdown.js | 4 +- .../components/file-uploader/file-uploader.js | 2 +- .../components/floating-menu/floating-menu.js | 10 +- .../inline-loading/inline-loading.js | 4 +- .../src/components/loading/loading.js | 4 +- .../components/src/components/modal/modal.js | 6 +- .../components/number-input/number-input.js | 2 +- .../components/overflow-menu/overflow-menu.js | 8 +- .../pagination-nav/pagination-nav.js | 2 +- .../src/components/pagination/pagination.js | 4 +- .../progress-indicator/progress-indicator.js | 12 +-- .../src/components/search/search.js | 4 +- .../structured-list/structured-list.js | 2 +- .../components/src/components/tabs/tabs.js | 6 +- .../src/components/text-area/text-area.js | 2 +- .../src/components/text-input/text-input.js | 6 +- .../src/components/tooltip/tooltip.js | 6 +- .../src/components/ui-shell/header-nav.js | 2 +- .../src/components/ui-shell/header-submenu.js | 2 +- .../ui-shell/navigation-menu-panel.js | 2 +- .../components/ui-shell/navigation-menu.js | 4 +- .../components/ui-shell/product-switcher.js | 4 +- packages/components/src/globals/js/boot.js | 2 +- .../src/globals/js/mixins/create-component.js | 2 +- .../src/globals/js/mixins/evented-state.js | 8 +- .../js/mixins/init-component-by-event.js | 2 +- .../js/mixins/init-component-by-launcher.js | 2 +- .../js/mixins/init-component-by-search.js | 2 +- .../src/globals/js/mixins/track-blur.js | 2 +- packages/components/src/globals/js/watch.js | 2 +- packages/components/tests/spec/.eslintrc.js | 2 +- packages/components/tools/ci-check.sh | 2 - packages/components/tools/templates.js | 6 +- packages/elements/tasks/build.js | 6 +- packages/elements/tasks/clean.js | 4 +- packages/eslint-config-carbon/.npmignore | 4 + packages/eslint-config-carbon/index.js | 68 ++++++++++++ packages/eslint-config-carbon/package.json | 39 +++++++ packages/eslint-config-carbon/vanilla.js | 54 ++++++++++ packages/icons-angular/src/build.js | 8 +- packages/icons-angular/src/templates.js | 4 +- packages/icons-react/src/build.js | 7 +- packages/icons-react/src/createIconStory.js | 2 +- packages/icons-react/tasks/build.js | 2 + .../src/__tests__/createFromInfo-test.js | 2 + packages/icons-vue/src/build.js | 5 +- packages/icons-vue/src/createIconStory.js | 9 -- packages/icons-vue/tasks/build.js | 2 + packages/icons/package.json | 1 - packages/icons/src/build.js | 10 +- packages/icons/src/optimize.js | 4 +- packages/icons/src/search.js | 2 +- packages/icons/tasks/build.js | 1 - packages/icons/tasks/scaffold-metadata.js | 2 + packages/react/package.json | 101 ++++++------------ .../src/components/DataTable/DataTable.js | 26 ++--- .../src/components/DataTable/state/sorting.js | 8 +- .../components/DataTable/tools/denormalize.js | 4 +- .../src/components/DataTable/tools/filter.js | 6 +- .../components/DataTable/tools/normalize.js | 6 +- .../src/components/DataTable/tools/sorting.js | 4 +- .../src/components/DatePicker/DatePicker.js | 2 +- packages/react/src/components/Icon/Icon.js | 6 +- .../src/components/ListBox/test-helpers.js | 2 +- .../components/MultiSelect/tools/sorting.js | 2 +- packages/react/src/internal/FloatingMenu.js | 2 +- .../react/src/prop-types/isRequiredOneOf.js | 4 +- packages/scss-generator/src/types/assert.js | 2 +- .../sketch/src/commands/colors/generate.js | 4 +- packages/sketch/src/commands/command.js | 1 + .../sketch/src/commands/icons/generate.js | 18 ++-- .../sketch/src/commands/themes/generate.js | 2 +- packages/sketch/src/commands/type/generate.js | 3 +- packages/sketch/src/sharedStyles/colors.js | 19 +--- packages/sketch/src/sharedStyles/themes.js | 8 +- packages/sketch/src/sharedStyles/type.js | 8 +- packages/sketch/src/tools/grouping.js | 2 +- packages/sketch/src/tools/page.js | 6 +- packages/sketch/src/tools/sharedStyles.js | 4 +- packages/test-utils/scss.js | 4 +- packages/themes/__tests__/themes-test.js | 5 +- packages/themes/src/__tests__/themes-test.js | 1 - packages/themes/src/tokens.js | 2 +- packages/themes/tasks/build.js | 6 +- packages/type/src/fluid.js | 2 +- packages/type/src/styles.js | 2 +- yarn.lock | 44 ++------ 126 files changed, 521 insertions(+), 472 deletions(-) create mode 100644 .eslintignore delete mode 100644 .yarn/offline-mirror/babel-eslint-7.2.3.tgz delete mode 100644 .yarn/offline-mirror/eslint-config-carbon-1.0.2.tgz delete mode 100644 .yarn/offline-mirror/eslint-config-carbon-base-1.0.1.tgz delete mode 100644 .yarn/offline-mirror/eslint-plugin-jsdoc-4.8.4.tgz create mode 100644 .yarn/offline-mirror/eslint-plugin-jsdoc-7.2.3.tgz create mode 100644 packages/bundler/.eslintrc create mode 100644 packages/eslint-config-carbon/.npmignore create mode 100644 packages/eslint-config-carbon/index.js create mode 100644 packages/eslint-config-carbon/package.json create mode 100644 packages/eslint-config-carbon/vanilla.js diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000000..65e84c4b6ccc --- /dev/null +++ b/.eslintignore @@ -0,0 +1,34 @@ +# Build folders +/build +packages/*/build/ +packages/*/examples/*/build/ +es +lib +dist +umd + +node_modules +packages/*/examples/* + +# Components +packages/components/demo/*.css +packages/components/demo/*.map +packages/components/demo/*.js +packages/components/demo/js/prism.js +packages/components/demo/hot +!packages/components/demo/index.js +packages/components/dist +packages/components/examples/codesandbox +packages/components/tests/a11y-results +packages/components/tests/coverage +packages/components/es +packages/components/umd +packages/components/scripts +packages/components/css +packages/components/scss +packages/components/html +packages/components/docs/js +packages/components/node_modules + +# Sketch +*.sketchplugin diff --git a/.yarn/offline-mirror/babel-eslint-7.2.3.tgz b/.yarn/offline-mirror/babel-eslint-7.2.3.tgz deleted file mode 100644 index 0380564eb21e94ab22726fa2aa54416d6f7f4b33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11595 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 W$CA45Qb`X0Pv?;94M7A6@&5qMSqF*$ diff --git a/.yarn/offline-mirror/eslint-config-carbon-1.0.2.tgz b/.yarn/offline-mirror/eslint-config-carbon-1.0.2.tgz deleted file mode 100644 index 72a275c2e471166b4f3e901ce4e01ab79578f24a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12157 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 diff --git a/.yarn/offline-mirror/eslint-config-carbon-base-1.0.1.tgz b/.yarn/offline-mirror/eslint-config-carbon-base-1.0.1.tgz deleted file mode 100644 index a5ff00d08b26c8bb4fff768f8c749d2329f90f43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11046 zcmV+>E7{Z^iwFP!000006YYKLk0VEt-+u1DqA~kH_F<}(?}rQneYjoQ3!Hc1v;4s@ zZjF5QQ0gXoNwzd|cdNhM5t;SKDzdaH4fl*Yh>)hMl4LL<9}&NJWY((--@2#t z@XhJ4|J99Ogb*dfJ^s~7mA{15dw5YI`Tegbr(6jlG-bacloN`dyEP-%UT>$fI|3`8 zOQ#BRKmPqU^7`ky`}=o$_mbXyb^k7%o_G6m7Y_Tpd+LHa`oq5S?v&oW$B%uNj;GyW zkDsIujD%j@BI?mwm1KDD4mAJ{wi*q@7huPGh>y$X2u=ez&kQ}vhEU*Xm3{V#{r``7r5 zzoh?_9Q8kwf`a~MRR5y?|5aWuhxqoK9@0nD4X6A6Tr}3JJD$?1r>{rwl$HPjdX`0(Oh|3gtb$MmPS-7!5J)9LX1U4pj%h(A!Z zQ2BxBTjiJc-wo#p{Z!+BZzq#D2%kf9Df9UvAhLu zrsMH&{NjCo`_KK~`}@;w|MZ;x$J^mN`#pS}k8TGNKmFa|<;8u4^2?FHpX}8qUW5Ms2T3|6hLh_rHC(|IHunfB%QC?|=K7-+f&_ip}@G`Q1PK_V2#_`~UrL_v?F{ zI`=qr^6oj^e@E}`?i}cqefQ1j<0If*@<6@<)zNzo_wRV|9Z)4#)gSNQeK?;%k$w5) zF+J^0=i{dbr1|>o(?dACd^r;PvYW2ELgnH7^iRKbIc6)2$)2W=axh$&tg>e;3nda~ zP8!dZ$DfQ1JpZaFyF#(xa`GVF^{iL6#e!`_)*IO#SuWo$>um@XD4l=dHCV8Ka#gj`$#%fliEC zA}`;3*L|BleSbK{)8ilM#i-H;xs9cU9&*;)c7;}9kW&#Oal&)1Om>mS9Ac0n#iXdF z-WU~K=Akn92riXg@FgC=cQV@;>-ni)EqoZ3vnR|mo0MWMN$z7{#APb2(3&XCZGaKH zKF7iVCYX3ob^hGnW00i-z2lz~{5b+{*yT^?<<*r@MUf9|AquvzpCw88W}SUHC=+3( z8I@(Ul2gJx=w;!o;3Njcqk{=*f0`iK0YZo=y>@`++;cC&Ov>;fy|@nW5sH!E6J%IN zKcOG?ryZcr;9e8VId(DU*zjXNwL==FpGqIEv$t`Tj?@O`%1y_{^%^)V1m`6v3`L?*i6q5LCPEpPbjnOeB}L2& z)~@T|%{_O8H9q!QiiA@gI4CbAvbI90K$um^$LJN2&T}2DH3Ms>^QY%Js%)X$O3PN> zD!GBVde;?7g*z`ei;;7%1d5B0wM;YtivrXN6GU#9U64(+Q84G4bJDy%)<)1TH_4{`} zAW>GBKe|ugqyV>-e|o|HCRI3*DZ$#Di;|*Lv)PC5pu(5GX2>x?~_){yxpNa^)heFB)qqSo)1f8`=L>dDYN^&Dj%+WIe|ES6u zDBJ6nd?P+9lqySbQP`=g&R8P}pd7{+Old;^rxBr<5mFgpVb&80rkzA!r$!nAxbj^F zhZ82PdSFWfSerJmwxkM7E}ObawD3!qR*d+Rq|(k9P-aq53B9OuB!*B>Ae5RUR@UJM z_xx=cd^#Aobb34Qo=+u`+D}-tdfoZ(ZQ7rD)Jcl?&u$-5>|WeCd{`TmZKAgni{NcT z870z>k{6L$>pU2}By0poD3SxTV{8B=$szzPtu(TEbRl)=<16a1x-#j7X4wX}79^3; zc}rI)Ry|3yXOspVtYj(BY*LPrIt`|eL>L|mx&|!t_3@c^z#OZ9_6+U}@4Vi>BmLs_ zZ@cI7Zr{}q*#LUq-(P8`7b|<4xkw8Soh)m2O}fO}47 zgay_C%Mut5%7R@^T#|s!Sy}FN@L^IkcXW2gFDAwom0t)UulTo2f?m-ZN@b8T38!HW zBv`M1hPyAJ8MteklVvC;GZmJ0%08Wq7?qY}MqNIF6J`dHaA*=*ahu-+~gd*ygo`8pT_ugCELy}_^t1E5w+fRuWYLng;*~{xo%}( z;7~Y5ECvU%QaMO!qV*O4y%8Fm>l8B~MP(cwtM|N!P^fJT9gvelSH4$RP|1Otl>voI z4!)}h!2?RsK0D$w2hhc7_SA^NLgOqvR$pPEq3lL(8iIwf=DsV`3Xc?qH(MQ}=GZsf zXKO{2DyLwwmB6_Y05jZ=`8Zgo&;u+w%CawL@wyG(w46q2qZD}4DqS6k1P?L-E)ooU zTp6Qa92{^BR*%!*Bzi%zur}a{M{>rK`9(`$;wO)6-DJg6%E+3ohH z+kv8%U=@G5Z-7xwCS+KH8B~NO9-ZS1?vIVaDC%TDdqr8VCP1m7@1-3Z9 zExp3wblbSUUc%4_1}r${0bP2jo%5Os5&+a`DI@_jXgQ@@i!>;!d7=}vjV)AcKXi(IHSr`S-6K+y8HE8ngnYEC6; z5td?NI#L5jjtRJOR2xQNY3D3*xGv($X^e;7m540P9dZFc$wsZ%lPc_%t1_i|Z@ra` zDtifFit>~K7;KRNRuFJeQi_2~9RM;Hj-IP6W*4EpEi)O&6i%K?Xpi;5GX_8x0D}TG zqJj}VxNH=ISzG|M2DhN5D)?L4N!}oFSB@SCF%%B!U1d$5uNc$fxoQyXNgm4MLG2a0do-pxYCNzz(aJ5ChfF>Wx$<@E9wEJZee|Q`q2BYMVy9LX(WUZIO3UuiDpNml&m6%9m!(3XIhU;pkR0>H5=Qa>exlySH3Rdpj}t!wRi0RXihVp{XBf5tdpBR|P|?cL&g*P#{wsH7Gl zCZ(Kp;0?l1bCVK)Ut%1EaVLp~l|@?+LeW4y!Wem;xktIe+3M3Jobau+FL^~HT-pRA=Bhr%} z(J$>DAzbOG!TdFlVAK@Xrf8psr?U^XquLjL(=qBdWwi>RK16r=06kYwvzSu)FT4G2 zh_Caxqt@YQzP&ban(LM4b@ncSBHaWOuT#Dl&_+$sp+Lf0RKqZEmig=xOO`1@bpl{6 zNb-t->nhU<2&x4UyPW5P`3+W5!Welhlfn)la}{=}%&Tj-F-gW7MBc)Z-cu?Xe; z9BVoWC`N0UL(~B@r&i$GauJM70K`)ygffRZRWQU5E1Jc9^Ifr%qcgkAdcwO?GIgH1 zVur zUD`wUk70m@oBXy9XBa>C4C^6w{@I0ZyK`lu(RsK)phXX=sJ2w#Wgn;>y~L;e;aElB zg9y8qwTd1S!WOix0Y2^-6!|*Tt06GDu1Dns%Y%=-F{wu zRdslsEpTU+kYS<;=(!lSf}Vh&52FXl}f3sf4u0*_balnlz16J z6gDJdd0-h{&Uule@!WCh4dZ&H6k#Z8m6If6bweTs0*RA$#!urH&dd zEYDOkYaBQqL^%Rz9lXhC$arh10H?5)XTH71MR+?J*ui52eq>rRYm>I}$QnP^Sq zFblGEf<{Y|B`gL9Sk$Qm&enQpV`1TbJcM;OeZHS5@9*bL^jZ^LHZ8*=+dE~TR(fT) zX}X0(tfU6lnS%Kg$|`Cwo+TJ~T{%#P`LO6IFEWju(q&L`TX?-ERhSw)q9Ldbo_-b? zpreyMc$&3CA2$RQlM}F~K`HLeH37RUK`$*^IGdA14(Ba}Q&Hn9 z31*PB(b?cLpk7#>8nq0|F&R%HWn3AnS88i^nDFbKcjxL^phX!h6JU#DOy}M_47r(? z*FGu3afU7Gh;Om{7bHRUMN6X&tYQ*VWx;AGtxTS)XaMV4W+TBuTgwHvIggwIz`sS= z&q!?K4z8P0AL5cDNhAeWTRBjhHWNVLDhiK^D^ssSj%D_guY-+G`_qSW+U*~IxITT< zR`wd21D8!xnLw%siOlAcSoH&+4Vu-OZLkK{coU2O9|!|!!U$=&qAQ;2Gobqc4AZFuXw3-Z-9Cc%etl_fbIyBGMY?iT zrhHYH%EP)djN!tjUL^F4~q_o2a1x z<4s4$L|caStg(iQ1x6!oy&+U9nh?oJ2?9DFl(%bpVA|@WdH5-&=efJ~gcYFq?YYaR z9-;Jae19A)OwC{9(*wAt&o!5S1Di3C!%mp)8e2gn5iT;xIF%S>5F~nmHJ3VgLInjI zD$uqgcfDWPd6*A`il(s zK0oiCKAij3F^Dk~=M3S3MHHd`++iQ8wHbZ#Aspa5$oh6}VjXv5AhgC-W_<)rX4A@< z0-r;evy!N33&)LB9_*;~!f5aY69+iVsNhjqXA)o;1{Sqv%73bJY+3ZOP1jUPJwyIe znO%LUi;qSqr31`(?>Q&lS|4&yCb@v6If83&qt{ATr@bxn08rhXF(1w`q%{UkZc@f@ z*C_Dn46=pi2fAw0f}H4Kk4<-7B~{Tf)(DkS=!n)y0%{P6fHKyBkOcaJfmf^~uF9c` z`4*sUpaqN#mn{Yr84QLE39I2V^F#^jG6(lcBq707m4YhpyjBKt+-cWzF8&G_=%-sT zkFn)8Bnm`W`v+UCs7CmSHy!y?Im<}q9z*?C9O=|!eRiKo|R@7kpOeXd6ocg ziQxd*0n{dLoyAax)kMU=GFyrA&ururZ@l|(IF+o&?%aV=JJh7p(qGzEU9%vGg3Mbw zHrCpxsKAN|4?cYP<=_;Wb zeFSGhN#((hb4h8zK=D}3S#l;5&Xogy!vgL@?n<=#u?D*@Hq37chE__*Q@JQx=4&ui zaKz3x2ULr zR$;1MmaV+K5mF&}lBEC!WN=cL0RA30=)_8EG;k!dqk08*wL8-1rgq5CwN2xWiauH2 zw3kf^i=5j$^w+;Bh6Gs&p3J||B#5T`K7h0_DTsEWkMkYh_5d0_?L%Lac9tn;W94pM{BaBK^@3>Sbl%o@vbZZi zgANrL^eSjnn+?`{0@(F|dYT9a3zTtB{7)@jsrUqb6TsPX-6vC0&aa1(JO6yRvO>BF zdhMMC%s37h#!1l3;G$D7xeA5}5Cr!rWd}+mg36Y~ac>HMZ!|CixytEq*9=BvOr`*) z0*tJ|Y#BE>I`HC!W=X++GK0-ivEi;(A>We0O0nUwHZ*K1QT9T51I`g37{-MnR!F4@ zfqpd3f{TK9Y$Z!Dl5LW|WF`{6aa)m);!GrLXhh0^fM4LKGCcc|`Agt@!OYiG12zMj zDNN@2$0Cl)d^YVxs(#Tew$e@1dQs|46JgZWG3fq~bS73MFo3xC(X-4!1{E+&fqTJR zWo@c1xKU?M1S^BneY?{!cgGSBl2AcRq=aNoC=Y;pRU#p*1?1sZcjs9T7bQII z%O37mcFb%OsE{h6REK&J!h_0?Q5aYT!Q-@n`D3`SfKH`wJP}P9=$Oi3`goJXKp|AP zfxj~cEyJK{Sa4FRobjXwKzK3uqS*l;Vb~8^fR|Yb+GAgVHfM@#gl997z}@V=tK@3D zO#9@(G;+a0;Fzd@!3WDiCAh!<;InfAPku%=hrt&;m1-NNl1f{ctW>aT7Q54lQsWPQ=z#7wNy(ndU!EVG;? z;WaA6(Q-}Ax6TB3%D z-&>fDIYkt1*3cLe4b~%pI2fQbBr2d0kN>_|`O+PR%mGR)HrxYwKe-&*2#cKnP9sr>uT#69Q+HiN3 z>LOA;OH5C~jaBrI)yZCj$>k<<*N`j1jdxw4RM9TjSw|yaTIG`>S%C+Hxm!@oQZjIY zaEXC}8@U@xzNTBO7H#h@`5x*?H!(i)+*JZ~QW{3M6Ojhaj7u~c6@vpk2G&|xFLeel zRywpE<0jwAGF|etN%4-vkgMUkW*e#_!~nvAtHy*eURb6rrNV(uO(6rQ(IG1Dom`3Y zyq?lqJe1Rh+5*^5?)e#5xgQVSzkAue>_V6KYh@Q(=KeqnBpNQ8oH05*SVUsc|BOBY zRx{Lim=na?sF+ilxrl-0yD__0F&cY+zi8nXElb3-t&VLZR#@+^3y!OkL{g;^GfKd8 zARLee7&@P%usRu7vjkQyKsmEg4!JmQsxO1rgP_1pIm5wRSiLPl_kq+P0bCZl*B>tm zj0fj4fMcs8Q-C=QV+JmgQO;>cCz*;FGL*=3))2XWj{0G4? z->9%`0KkG)I&IX!;9>V82K|1vwMQvrlbE`kS7K$!(* z2?Y-`1FWaon3zbER)@mD6t*mbxlEz-VEL!AGEqaGrn@qvy6;2iBit?%81*JQFF4@d zP>?(x-jpIu+B@_u7KQW`lrPu1*wk4IlECGnr7IMx&*6OXxL;pOLBU~U+5sqM*2B_? zR0cel5;Pkwi2dRCQY!Sj{@m~`y0feMN|!~n8yUVz8Tr2YM#o0>Da%$m=X^jWhK=^#h&rr8u>Qg`h6bM*uZ)6DWpQP1#$bD!@aMEy=CSUT zS!gG-2?kEoko)nbD|D)EQsC4kLBK=IA}S7QQ-L!B4vj<^2sOkduT});4+1G(%eY-^ zSs2{!tmzk0-F);zv-xO?S5$`iaEv(A{SmRH*G}E}=g@| zFs2pFV&!=Vt2JFSNk0EX@pVb2GsQz9$tUMz)+TsrER)IUXef!=EiX| z7d&+=W}|6x7ToG!1*cvmP;*fWM{*`o1`+7M8k&%sXu5&ez*wjvMf`;S=0m}lqZtqNHu1N?KTWU#9Sl%vF2Yys$y!PrN5zp!=)>2&J$>En49zU|!csXxe3T@3q{xWhHN zh26{MG9mP^VLQQx8|_Z3exqGJr1V z5n){dD`>DDDS0bb>Z{t5T_;DmM6$*mIzKeW=Z?o2wjaHwP5Mvtr<0sqPMv?t8G~Ox zjL#w)3OE06Ojv+-?7!6iR$&WRKBk%-`(Y^KSsvt3SNZbT{B4yfOPZz6=S|I1Qv?Qz z6(Y-WJ~5{W5HO`M4Z)dq!dfW>qj3euHP1nqAJf(I+U4WnrLm`N^DVrTmR^x_x^27@ zhRNK7l}n(-QgR*xyn$!XXbJo%cn2eYOic`~ooKmj9LmQUw&*z3l>~F7L9gN#D`jBq zvsj*9A)Uz))6bS>lGZY4qo>g9$v(~wgujjYYAIGZnubP|*^CDn8UTAZg_r{17b$=* zux*M_W}(vwAlsENbRT3~;Amm7z5JdI)Eme=`z8wukG+(;-|_ z=Y>neM{vRblT)Rl#v{TMIOPD21=#RF)(cddz(*4MV+?1@X5Qv@|^YU1%3weKk(e`=I!)(X_x6NJiY)oT0r_6y1 z;$i*rn6joY`HiuJP=F~Zc@|8Gh`g(rpvQ|u(EC0|^jOcKTJS8k@mwe&yXB%Q->=?1 zkv0$;jRX#f6a-I(;#_bpiHx99GlA~Mf|a|)iRagK{I;O#f+R9HZz)Fz3@1V1Lja^# zR(is@HCCCxZRU#O(e5$fvs~%g;fe#@VMF9#QD^P9aIa?s8-dDwTeJ@|Hw$q231&|i zI57d7K!)QGJUFlcck`vHf~K(oMT zmC$(RsRjU}DB!P;Jp#+x;wt@)R864f#asBIe`REG|-NNxsX=4m@q30%M8mr z6yQae?aIR->B8*rP|4c6mr;W)ICi2|7#waIAA*RaEK@L}nX!@sR^l-dDjAlog58#y zS)Ewv$7Xw5k5S*>FB`9I7};bk8hXfcb2~e*83REYkBz51GJ~0aD#7)}vk$-{w|LrU zvMZ2cWzW^MqR#o2y}P-iSV!pdJia-_QR1PY9jOc`De6E4H4IFS#aw=jk}IF^{2CvU z!BdA;*7k+(JIM3epD6J84?Lf!^>Wmk=8@;haU(MxasWz7vM4bL5=k=7Wspak@*wB1 zb~@~}Qw3TPK0nU8Cc+fybw+4Q7)!VpfGgvSrrcPsxMYe2KrZ-@Fn<+4(0vo?)b$AZ+g!Z$D=nBVFLV3 zEc(R^pvH%C;**KY+Ed|&12>vQc&H!+6v&K3o3V^a+b|PV?Hh_C)E~nep?D+Y>x&aORaA z;C=Uur|~}i@cGXIov2|)jW^BHKy?Ns1kRL8hG1o3AjD-Bq0@|jWs^g8QUmfw*6I%Q zS_-Ka%Y<)oqkB@wRJ|(UjoyvMZ6~%I1dLBtvI-nKubH4!Mx6*&3p0Rnh@8(arAio2 z*t~%AeA8Td!Gr|-+tsgD?>KXV4=Cp*QG9L{IBy;gCRS1>EFNT9JA63lO1NvNuxjGK zWqao>9+O=NA;@JZ$K%!bk-cyM=@!?u zPy&I=->!bW-^6Hi5M1M#L!gFrfWgeTb2LjpDzID$1r)!QAt-yL8{;ulkltc{_&^J} z?k}6L5Yy5KLy56eNaY08G?)ljR|!GEZMAs9hD)euYW4Et=gs~~1bHbJvu8Ro!6T@) z6sU7tW{NQ%B7Go{f@hjI+J1aK&0RTK^A<;?6heiWdZ^R@mShfu8)iy;Cpn%Ic8?TV zp-&&AQo$1~S1iWz0R(sbUa4C=ET$&~Joi`4<6y83F5?ML_{?<}QGC*Rl(^@B2c@ia g3LsUK@N>WV<@L+!m)9?^e^amj2l$}7=m4Go0KN1L4*&oF diff --git a/.yarn/offline-mirror/eslint-plugin-jsdoc-4.8.4.tgz b/.yarn/offline-mirror/eslint-plugin-jsdoc-4.8.4.tgz deleted file mode 100644 index 4c07d958fe2b01e6d3d7e1fa6b6e978bba65ca91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54983 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�i6>8RzhEscTitTy* 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 11', 'Firefox ESR'], }; -async function bundle(entrypoint, options, info) { +async function bundle(entrypoint, options) { reporter.info(`Bundling ${entrypoint}...`); const basename = options.name || path.basename(entrypoint, '.scss'); diff --git a/packages/bundler/src/commands/check.js b/packages/bundler/src/commands/check.js index 421d8ec40f35..7d088e3d6036 100644 --- a/packages/bundler/src/commands/check.js +++ b/packages/bundler/src/commands/check.js @@ -21,9 +21,6 @@ async function check(pattern, { ignore, cwd, list } = {}) { cwd, ignore, }); - const defaultOptions = { - includePaths: ['node_modules', '../../node_modules'], - }; reporter.info(`Compiling ${files.length} files...`); diff --git a/packages/bundler/src/commands/inline.js b/packages/bundler/src/commands/inline.js index 663ca4abb830..141b5b15fb75 100644 --- a/packages/bundler/src/commands/inline.js +++ b/packages/bundler/src/commands/inline.js @@ -50,11 +50,7 @@ async function inlineSassDependencies( ]; const inlinedDependencies = (await Promise.all( allPossibleDependencies.map(async dependency => { - const [ - packageFolder, - scssFolder, - localPackageJsonPath, - ] = await findSassModule(dependency, cwd); + const [packageFolder, scssFolder] = await findSassModule(dependency, cwd); if (packageFolder) { const dependencyOutputFolder = path.join(vendorFolder, dependency); diff --git a/packages/bundler/src/commands/measure.js b/packages/bundler/src/commands/measure.js index b124b6e6dceb..8c48147d634b 100644 --- a/packages/bundler/src/commands/measure.js +++ b/packages/bundler/src/commands/measure.js @@ -17,10 +17,7 @@ const gzipSize = require('gzip-size'); const { reporter } = require('@carbon/cli-reporter'); const compile = require('../tools/compile'); -async function measure( - pattern, - { cwd, entrypoint, monorepo = false, output, ignore = [] } -) { +async function measure(pattern, { cwd, output, ignore = [] }) { const outputFilename = 'results.json'; const outputFilepath = output ? path.join(output, outputFilename) @@ -33,9 +30,6 @@ async function measure( cwd, ignore, }); - const defaultOptions = { - includePaths: ['node_modules', '../../node_modules'], - }; const results = await Promise.all( compile(files.map(file => path.join(cwd, file))) @@ -122,7 +116,7 @@ function printResults(prevResults, results) { head: resultsHeaders.map(label => chalk.gray.yellow(label)), }); - results.forEach((result, index) => { + results.forEach(result => { const prevResult = prevResults.find(prevResult => { return ( diff --git a/packages/bundler/src/commands/sassdoc.js b/packages/bundler/src/commands/sassdoc.js index bd726eee4a80..727e51efdfdb 100644 --- a/packages/bundler/src/commands/sassdoc.js +++ b/packages/bundler/src/commands/sassdoc.js @@ -32,7 +32,7 @@ async function sassdoc(pattern, { ignore, cwd, json, output } = {}) { const jsonFile = await createJson(files); await fs.ensureDir(DOCS_DIR); await fs.writeFile(JSON_FILE, JSON.stringify(jsonFile, null, 2)); - } catch { + } catch (error) { reporter.error(`Sassdoc error: ${error}`); process.exit(1); } diff --git a/packages/bundler/src/tools/compile.js b/packages/bundler/src/tools/compile.js index b94f6722be28..f334dbca44f1 100644 --- a/packages/bundler/src/tools/compile.js +++ b/packages/bundler/src/tools/compile.js @@ -7,7 +7,6 @@ 'use strict'; -const path = require('path'); const sass = require('node-sass'); const defaultOptions = { @@ -25,6 +24,11 @@ function compile(filepaths, options) { ...options, }, (error, result) => { + if (error) { + reject(error); + return; + } + resolve({ result, filepath, diff --git a/packages/bundler/src/tools/sassdoc.js b/packages/bundler/src/tools/sassdoc.js index 1550d6082d98..5a71eea725fa 100644 --- a/packages/bundler/src/tools/sassdoc.js +++ b/packages/bundler/src/tools/sassdoc.js @@ -36,8 +36,8 @@ const slugify = title => { * Create a JSON file of documented Sass items * @see {@link http://sassdoc.com/configuration/|Sassdoc configuration} * @param {string} sourceDir - source directory - * @param {Object} config - configuration object - * @return {Object} json object + * @param {object} config - configuration object + * @returns {object} json object */ async function createJson(sourceDir, config) { config = config || {}; @@ -56,7 +56,7 @@ async function createJson(sourceDir, config) { * Remove duplicate objects in `require` and `usedBy` arrays. Array objects have * `name` and `type` properties, sometimes nested in a `context` object. * @param {Array} arr - array with potential duplicates - * @return {Array} deduped array + * @returns {Array} deduped array */ function dedupeArray(arr) { return arr.reduce( @@ -79,7 +79,7 @@ function dedupeArray(arr) { * Create a unique Sassdoc item name * @param {string} name - Sassdoc name * @param {string} type - Sassdoc type (e.g. `variable`, `mixin`) - * @return {string} unique Sassdoc item name + * @returns {string} unique Sassdoc item name */ function createUniqueName(name, type) { return `${name} [${type}]`; @@ -88,7 +88,7 @@ function createUniqueName(name, type) { /** * Create a standardized group name * @param {Array} group - Item's group - * @return {string} group name + * @returns {string} group name */ function createGroupName(group) { return !group || !group[0] || group[0] === 'undefined' ? 'general' : group[0]; @@ -98,14 +98,15 @@ function createGroupName(group) { * Create GitHub-flavored markdown anchor link * @param {string} name - anchor value * @param {string} heading - anchor link destination - * @return {string} markdown anchor + * @returns {string} markdown anchor */ function createAnchorLink(name, heading) { const anchorLink = heading .toLowerCase() .replace(/ /g, '-') - .replace(/[`~!@#$%^&*()+=<>?,./:;"'|{}\[\]\\–—]/g, '') + .replace(/[`~!@#$%^&*()+=<>?,./:;"'|{}[\]\\–—]/g, '') .replace( + // eslint-disable-next-line no-irregular-whitespace /[ 。?!,、;:“”【】()〔〕[]﹃﹄“”‘’﹁﹂—…-~《》〈〉「」]/g, '' ); @@ -116,7 +117,7 @@ function createAnchorLink(name, heading) { /** * Create markdown for Sassdoc item (function, mixin, placeholder, variable) * @param {string} item - Sassdoc item - * @return {string} item in markdown formatting + * @returns {string} item in markdown formatting */ function createMarkdownItem(item) { let str = ''; @@ -342,8 +343,8 @@ ${item.example[0].code} * Create a markdown file of documented Sass items * @see {@link http://sassdoc.com/configuration/|Sassdoc configuration} * @param {string} sourceDir - source directory - * @param {Object} config - configuration object - * @return {string} markdown + * @param {object} config - configuration object + * @returns {string} markdown */ async function createMarkdown(sourceDir, config) { config = config || {}; @@ -353,7 +354,7 @@ async function createMarkdown(sourceDir, config) { let markdownFile = ''; const documentedItems = data.filter( - (item, index) => item.access === 'public' || item.access === 'private' + item => item.access === 'public' || item.access === 'private' ); markdownFile += `# Sass API diff --git a/packages/cli/bin/carbon-cli.js b/packages/cli/bin/carbon-cli.js index 6d3ca91c3ad4..2129a876b8dd 100755 --- a/packages/cli/bin/carbon-cli.js +++ b/packages/cli/bin/carbon-cli.js @@ -7,6 +7,8 @@ * LICENSE file in the root directory of this source tree. */ +/* eslint-disable no-console */ + 'use strict'; // Inspired by Create React App @@ -20,7 +22,6 @@ process.on('unhandledRejection', error => { }); var chalk = require('chalk'); -var packageJson = require('../package.json'); var currentNodeVersion = process.versions.node; var semver = currentNodeVersion.split('.'); diff --git a/packages/cli/src/cli.js b/packages/cli/src/cli.js index 95882d84a1f6..dffe2a0129e9 100644 --- a/packages/cli/src/cli.js +++ b/packages/cli/src/cli.js @@ -12,7 +12,7 @@ const packageJson = require('../package.json'); const commands = [require('./commands/ci-check'), require('./commands/sync')]; -async function main({ argv, cwd }) { +async function main({ argv }) { cli .scriptName(packageJson.name) .version(packageJson.version) diff --git a/packages/cli/src/commands/ci-check.js b/packages/cli/src/commands/ci-check.js index 534300d753aa..f214739f6bd3 100644 --- a/packages/cli/src/commands/ci-check.js +++ b/packages/cli/src/commands/ci-check.js @@ -5,6 +5,8 @@ * LICENSE file in the root directory of this source tree. */ +/* eslint-disable no-console */ + 'use strict'; const { reporter } = require('@carbon/cli-reporter'); @@ -22,6 +24,7 @@ async function check(args, env) { }; const tasks = [ 'yarn format:diff', + 'yarn lint', `yarn bundler check --ignore '**/@(node_modules|examples|components|react)/**' 'packages/**/*.scss'`, `cross-env BABEL_ENV=test yarn test --ci --maxWorkers 2 --reporters=default --reporters=jest-junit`, `cross-env BABEL_ENV=test yarn test:e2e --ci --maxWorkers 2 --reporters=default --reporters=jest-junit`, diff --git a/packages/cli/src/commands/sync.js b/packages/cli/src/commands/sync.js index 77b59a6e4299..a67184ab2b0b 100644 --- a/packages/cli/src/commands/sync.js +++ b/packages/cli/src/commands/sync.js @@ -17,7 +17,6 @@ const tasks = { async function sync(args, env) { const { target } = args; - const { packages, root } = env; const tasksToRun = target === 'all' ? Object.keys(tasks) : [target]; for (const name of tasksToRun) { diff --git a/packages/cli/src/commands/sync/npm.js b/packages/cli/src/commands/sync/npm.js index f8e4b597e11f..ac10b31298d2 100644 --- a/packages/cli/src/commands/sync/npm.js +++ b/packages/cli/src/commands/sync/npm.js @@ -19,7 +19,7 @@ const defaultIgnorePatterns = [ function run({ packagePaths }) { return Promise.all( - packagePaths.map(async ({ packageJson, packagePath }) => { + packagePaths.map(async ({ packagePath }) => { const ignorePath = path.join(packagePath, '.npmignore'); const ignorePatterns = defaultIgnorePatterns.slice(); diff --git a/packages/cli/src/commands/sync/package.js b/packages/cli/src/commands/sync/package.js index df3b755df3c1..4f132f37e3cc 100644 --- a/packages/cli/src/commands/sync/package.js +++ b/packages/cli/src/commands/sync/package.js @@ -71,41 +71,39 @@ function sortFields(a, b) { function run({ packagePaths }) { return Promise.all( - packagePaths.map( - async ({ basename, packageJsonPath, packageJson, ...rest }) => { - packageJson.repository = `${REPO_URL_BASE}/${basename}`; - packageJson.bugs = - 'https://github.com/carbon-design-system/carbon/issues'; - packageJson.license = 'Apache-2.0'; - packageJson.publishConfig = { - access: 'public', - }; + packagePaths.map(async ({ basename, packageJsonPath, packageJson }) => { + packageJson.repository = `${REPO_URL_BASE}/${basename}`; + packageJson.bugs = + 'https://github.com/carbon-design-system/carbon/issues'; + packageJson.license = 'Apache-2.0'; + packageJson.publishConfig = { + access: 'public', + }; - if (Array.isArray(packageJson.keywords)) { - const keywordsToAdd = DEFAULT_KEYWORDS.filter(keyword => { - return packageJson.keywords.indexOf(keyword) === -1; - }); - if (keywordsToAdd.length > 0) { - packageJson.keywords = [...packageJson.keywords, ...keywordsToAdd]; - } - } else { - packageJson.keywords = DEFAULT_KEYWORDS; + if (Array.isArray(packageJson.keywords)) { + const keywordsToAdd = DEFAULT_KEYWORDS.filter(keyword => { + return packageJson.keywords.indexOf(keyword) === -1; + }); + if (keywordsToAdd.length > 0) { + packageJson.keywords = [...packageJson.keywords, ...keywordsToAdd]; } + } else { + packageJson.keywords = DEFAULT_KEYWORDS; + } - // Construct our new packageJson packageJson with sorted fields - const file = Object.keys(packageJson) - .sort(sortFields) - .reduce( - (acc, key) => ({ - ...acc, - [key]: packageJson[key], - }), - {} - ); + // Construct our new packageJson packageJson with sorted fields + const file = Object.keys(packageJson) + .sort(sortFields) + .reduce( + (acc, key) => ({ + ...acc, + [key]: packageJson[key], + }), + {} + ); - await fs.writeJson(packageJsonPath, file, { spaces: 2 }); - } - ) + await fs.writeJson(packageJsonPath, file, { spaces: 2 }); + }) ); } diff --git a/packages/cli/src/commands/sync/remark/remark-monorepo.js b/packages/cli/src/commands/sync/remark/remark-monorepo.js index 02547464db5a..dee132228d3c 100644 --- a/packages/cli/src/commands/sync/remark/remark-monorepo.js +++ b/packages/cli/src/commands/sync/remark/remark-monorepo.js @@ -10,11 +10,7 @@ const fs = require('fs-extra'); const path = require('path'); -function monorepo(options) { - const { root } = options; - const packageJsonPath = path.join(root, 'package.json'); - const packageJson = fs.readJsonSync(packageJsonPath); - +function monorepo() { async function transformer(tree, file) { const { cwd } = file; const localPackageJsonPath = path.join(cwd, 'package.json'); diff --git a/packages/colors/__tests__/scss-test.js b/packages/colors/__tests__/scss-test.js index 5299ae151e3f..30df0d17e256 100644 --- a/packages/colors/__tests__/scss-test.js +++ b/packages/colors/__tests__/scss-test.js @@ -9,10 +9,7 @@ 'use strict'; -const fs = require('fs-extra'); -const path = require('path'); const { createSassRenderer, types } = require('@carbon/test-utils/scss'); -const { colors } = require('../src/colors'); const render = createSassRenderer(__dirname); diff --git a/packages/colors/src/rgb.js b/packages/colors/src/rgb.js index ac14e1fabaf9..7e20788f821f 100644 --- a/packages/colors/src/rgb.js +++ b/packages/colors/src/rgb.js @@ -9,7 +9,7 @@ * Parse a given hexcode string into an rgba statement with the given opacity * @param {string} hexcode * @param {number} opacity - * @return {string} + * @returns {string} */ export function rgba(hexcode, opacity) { const values = [ diff --git a/packages/colors/tasks/build.js b/packages/colors/tasks/build.js index d44e70e7e50b..900bd5793304 100644 --- a/packages/colors/tasks/build.js +++ b/packages/colors/tasks/build.js @@ -5,11 +5,12 @@ * LICENSE file in the root directory of this source tree. */ +/* eslint-disable no-console */ + 'use strict'; require('core-js/features/array/flat-map'); -const { reporter } = require('@carbon/cli-reporter'); const { types: t, generate } = require('@carbon/scss-generator'); const { paramCase } = require('change-case'); const fs = require('fs-extra'); @@ -43,7 +44,6 @@ async function build() { const colorValues = Object.keys(colors).reduce((acc, key) => { const swatch = paramCase(key); const values = Object.keys(colors[key]).reduce((acc, grade) => { - const name = `${swatch}-${grade}`; const value = colors[key][grade]; return acc.concat({ swatch, @@ -71,14 +71,6 @@ async function build() { global: true, }) ); - const namespacedColorVariables = colorValues.map(({ grade, swatch, value }) => - t.Assignment({ - id: t.Identifier(`carbon--${swatch}-${grade}`), - init: t.SassColor(value), - default: true, - global: true, - }) - ); const colorMapProperties = t.SassMap({ properties: Object.keys(colors).flatMap(swatch => { const value = t.SassMap({ diff --git a/packages/components/.eslintrc b/packages/components/.eslintrc index 85fc0720475f..a33ea6060f95 100644 --- a/packages/components/.eslintrc +++ b/packages/components/.eslintrc @@ -1,33 +1,3 @@ { - "root": true, - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "script" - }, - "env": { - "node": true, - "es6": true - }, - "extends": [ - "carbon-base" - ], - "rules": { - "comma-dangle": [ - 2, - { - "arrays": "always-multiline", - "objects": "always-multiline", - "imports": "always-multiline", - "exports": "always-multiline", - "functions": "never" - } - ], - "max-len": [2, 130, 4], - "no-param-reassign": [2, { "props": false }], - "no-plusplus": 0, - "no-underscore-dangle": 0, - "prefer-rest-params": 0, - "import/no-extraneous-dependencies": [2, {"devDependencies": true}], - "import/order": 0 - } + "extends": ["eslint-config-carbon/vanilla"] } diff --git a/packages/components/demo/.eslintrc b/packages/components/demo/.eslintrc index 2bad7b4a3e04..a816e410834f 100644 --- a/packages/components/demo/.eslintrc +++ b/packages/components/demo/.eslintrc @@ -1,8 +1,12 @@ { "root": true, "extends": [ - "../src/.eslintrc.js" + "eslint-config-carbon/vanilla" ], + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "module" + }, "rules": { "import/no-extraneous-dependencies": [ 2, diff --git a/packages/components/demo/js/components/RootPage.js b/packages/components/demo/js/components/RootPage.js index dee0a1473545..9fc3b4483774 100644 --- a/packages/components/demo/js/components/RootPage.js +++ b/packages/components/demo/js/components/RootPage.js @@ -18,8 +18,8 @@ const checkStatus = response => { }; /** - * @param {Object[]} componentItems List of Fractal Component instance data. - * @returns {Object[]} List of Fractal Component instance data with the contents of all components cleared. + * @param {Array} componentItems List of Fractal Component instance data. + * @returns {Array} List of Fractal Component instance data with the contents of all components cleared. */ const clearContent = componentItems => componentItems.map(item => ({ @@ -31,10 +31,10 @@ const clearContent = componentItems => })); /** - * @param {Object[]} componentItems List of Fractal Component instance data. + * @param {Array} componentItems List of Fractal Component instance data. * @param {string} id The component ID. - * @param {Object|string} content The content. String for component content, object for variant content (keyed by variant ID). - * @returns {Object[]} + * @param {object|string} content The content. String for component content, object for variant content (keyed by variant ID). + * @returns {Array} * List of Fractal Component instance data with the content of the given component ID populated with the given content. */ const applyContent = (componentItems, id, content) => { @@ -72,8 +72,8 @@ const applyContent = (componentItems, id, content) => { }; /** - * @param {Object[]} componentItems List of Fractal Component instance data. - * @returns {Object[]} The component data with `isHidden` moved to `meta.isDefaultHidden`. + * @param {Array} componentItems List of Fractal Component instance data. + * @returns {Array} The component data with `isHidden` moved to `meta.isDefaultHidden`. */ const preserveDefaultHidden = componentItems => componentItems.map(item => { @@ -94,9 +94,9 @@ const preserveDefaultHidden = componentItems => }); /** - * @param {Object[]} componentItems List of Fractal Component instance data. + * @param {Array} componentItems List of Fractal Component instance data. * @param {boolean} isComponentsX `true` if the current style is of the experimental version. - * @returns {Object[]} The component data with `isHidden` calculated with `meta.isDefaultHidden` and `isComponentsX`. + * @returns {Array} The component data with `isHidden` calculated with `meta.isDefaultHidden` and `isComponentsX`. */ const applyComponentsX = (componentItems, isComponentsX) => componentItems.map(item => { @@ -285,7 +285,7 @@ class RootPage extends Component { /** * Handles an event from BrowserSync. - * @param {Object} evt The event. + * @param {object} evt The event. * @private */ _handleBrowserSyncEvent = evt => { @@ -296,7 +296,7 @@ class RootPage extends Component { /** * Toggles usage of experimental CSS upon user event. - * @param {Object} evt The event. + * @param {object} evt The event. * @private */ _switchExperimental = evt => { diff --git a/packages/components/demo/js/components/boot-nav.js b/packages/components/demo/js/components/boot-nav.js index 61ec431e08f4..08ed60faf190 100644 --- a/packages/components/demo/js/components/boot-nav.js +++ b/packages/components/demo/js/components/boot-nav.js @@ -24,10 +24,10 @@ const pollForBrowserSync = callback => { /** * Normalize Fractal Component instance data so the data structure can be shared with non-Fractal environment. - * @param {Object} data The Fractal Component instance data + * @param {object} data The Fractal Component instance data * @param {string} [data.notes] The notes of the component. - * @param {Object[]} [data.variants] The variants of the component. - * @returns {Object} The normalized version of the Fractal Component instance data. + * @param {Array} [data.variants] The variants of the component. + * @returns {object} The normalized version of the Fractal Component instance data. */ const normalizeComponentItem = ({ notes, variants, items = [], ...other }) => ({ ...other, diff --git a/packages/components/package.json b/packages/components/package.json index 0be47c439ef4..e259a07f243e 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -52,8 +52,6 @@ "ci-check": "sh ./tools/ci-check.sh", "dev": "gulp serve", "format:check": "prettier --check \"**/*.{css,js,md,scss}\"", - "lint": "eslint .", - "lint:staged": "eslint", "prebuild": "gulp clean", "prepublishOnly": "yarn build", "start": "node server.js", @@ -88,7 +86,6 @@ "adaro": "1.0.4", "autoprefixer": "^8.2.0", "babel-core": "^7.0.0-bridge.0", - "babel-eslint": "^7.0.0", "babel-loader": "^8.0.0", "babel-plugin-dev-expression": "^0.2.1", "babel-plugin-istanbul": "^3.0.0", @@ -107,11 +104,9 @@ "custom-event": "^1.0.0", "del": "~2.0.2", "diff": "^3.4.0", - "eslint": "^5.0.0", "eslint-config-airbnb": "^17.0.0", "eslint-config-airbnb-base": "^13.0.0", - "eslint-config-carbon": "^1.0.0", - "eslint-config-carbon-base": "^1.0.1", + "eslint-config-carbon": "10.3.0", "eslint-config-prettier": "^3.0.0", "eslint-plugin-import": "^2.14.0", "eslint-plugin-jsdoc": "^3.3.0", diff --git a/packages/components/src/.eslintrc.js b/packages/components/src/.eslintrc.js index 6587c33bec4f..68797f9c9ccd 100644 --- a/packages/components/src/.eslintrc.js +++ b/packages/components/src/.eslintrc.js @@ -15,7 +15,7 @@ module.exports = { globals: { __DEV__: true, }, - extends: ['carbon-base'], + extends: ['eslint-config-carbon/vanilla'], plugins: ['jsdoc'], rules: { 'jsdoc/check-param-names': 2, diff --git a/packages/components/src/components/checkbox/checkbox.js b/packages/components/src/components/checkbox/checkbox.js index f0409c0caf79..cdd947471f5b 100644 --- a/packages/components/src/components/checkbox/checkbox.js +++ b/packages/components/src/components/checkbox/checkbox.js @@ -206,7 +206,7 @@ class Checkbox extends mixin(createComponent, initComponentBySearch, handles) { * If `options` is specified in the constructor, {@linkcode Checkbox.create .create()}, or {@linkcode Checkbox.init .init()}, * properties in this object are overriden for the instance being create and how {@linkcode Checkbox.init .init()} works. * @member Checkbox.options - * @type {Object} + * @type {object} * @property {string} selectorInit The data attribute to find copy button UIs. * @property {string} selectorContainedCheckboxState The CSS selector to find a container of checkbox preserving checked state. * @property {string} selectorContainedCheckboxDisabled diff --git a/packages/components/src/components/code-snippet/code-snippet.js b/packages/components/src/components/code-snippet/code-snippet.js index d53b93982929..1b334c1c5d9a 100644 --- a/packages/components/src/components/code-snippet/code-snippet.js +++ b/packages/components/src/components/code-snippet/code-snippet.js @@ -76,7 +76,7 @@ class CodeSnippet extends mixin( * or {@linkcode CodeSnippet.init .init()}, * properties in this object are overriden for the instance being create and how {@linkcode CodeSnippet.init .init()} works. * @member CodeSnippet.options - * @type {Object} + * @type {object} * @property {string} selectorInit The data attribute to find code snippet UIs. */ static get options() { diff --git a/packages/components/src/components/content-switcher/content-switcher.js b/packages/components/src/components/content-switcher/content-switcher.js index a8a87853ef62..dcc4f4749988 100644 --- a/packages/components/src/components/content-switcher/content-switcher.js +++ b/packages/components/src/components/content-switcher/content-switcher.js @@ -29,7 +29,7 @@ class ContentSwitcher extends mixin( * @extends EventedState * @extends Handles * @param {HTMLElement} element The element working as a set of content switcher buttons. - * @param {Object} [options] The component options. + * @param {object} [options] The component options. * @param {string} [options.selectorButton] The CSS selector to find switcher buttons. * @param {string} [options.selectorButtonSelected] The CSS selector to find the selected switcher button. * @param {string} [options.classActive] The CSS class for switcher button's selected state. @@ -67,7 +67,7 @@ class ContentSwitcher extends mixin( /** * Internal method of {@linkcode ContentSwitcher#setActive .setActive()}, to select a content switcher button. * @private - * @param {Object} detail The detail of the event trigging this action. + * @param {object} detail The detail of the event trigging this action. * @param {HTMLElement} detail.item The button to be selected. * @param {Function} callback Callback called when change in state completes. */ @@ -155,7 +155,7 @@ class ContentSwitcher extends mixin( * {@linkcode ContentSwitcher.create .create()}, or {@linkcode ContentSwitcher.init .init()}, * properties in this object are overriden for the instance being create and how {@linkcode ContentSwitcher.init .init()} works. * @member ContentSwitcher.options - * @type {Object} + * @type {object} * @property {string} selectorInit The CSS selector to find content switcher button set. * @property {string} [selectorButton] The CSS selector to find switcher buttons. * @property {string} [selectorButtonSelected] The CSS selector to find the selected switcher button. diff --git a/packages/components/src/components/copy-button/copy-button.js b/packages/components/src/components/copy-button/copy-button.js index 84e9ee4efde1..546d987b9494 100644 --- a/packages/components/src/components/copy-button/copy-button.js +++ b/packages/components/src/components/copy-button/copy-button.js @@ -54,7 +54,7 @@ class CopyButton extends mixin( * If `options` is specified in the constructor, {@linkcode CopyBtn.create .create()}, or {@linkcode CopyBtn.init .init()}, * properties in this object are overriden for the instance being create and how {@linkcode CopyBtn.init .init()} works. * @member CopyBtn.options - * @type {Object} + * @type {object} * @property {string} selectorInit The data attribute to find copy button UIs. * @property {string} feedbackTooltip The data attribute to find feedback tooltip. * @property {string} classShowFeedback The CSS selector for showing the feedback tooltip. diff --git a/packages/components/src/components/data-table/data-table.js b/packages/components/src/components/data-table/data-table.js index fd7145abe79f..67bdce3027b8 100644 --- a/packages/components/src/components/data-table/data-table.js +++ b/packages/components/src/components/data-table/data-table.js @@ -25,7 +25,7 @@ class DataTable extends mixin( * @extends InitComponentBySearch * @extends EventedState * @param {HTMLElement} element The root element of tables - * @param {Object} [options] the... options + * @param {object} [options] the... options * @param {string} [options.selectorInit] selector initialization * @param {string} [options.selectorExpandCells] css selector for expand * @param {string} [options.expandableRow] css selector for expand diff --git a/packages/components/src/components/date-picker/date-picker.js b/packages/components/src/components/date-picker/date-picker.js index f2c505cf152a..ad3a3209dcd9 100644 --- a/packages/components/src/components/date-picker/date-picker.js +++ b/packages/components/src/components/date-picker/date-picker.js @@ -50,7 +50,7 @@ const monthToStr = (monthNumber, shorthand, locale) => locale.months[shorthand ? 'shorthand' : 'longhand'][monthNumber]; /** - * @param {Object} config Plugin configuration. + * @param {object} config Plugin configuration. * @param {boolean} [config.shorthand] `true` to use shorthand month. * @param {string} config.selectorFlatpickrMonthYearContainer The CSS selector for the container of month/year selection UI. * @param {string} config.selectorFlatpickrYearContainer The CSS selector for the container of year selection UI. diff --git a/packages/components/src/components/dropdown/dropdown.js b/packages/components/src/components/dropdown/dropdown.js index 9ca88ddb8922..5ea6b6b51031 100644 --- a/packages/components/src/components/dropdown/dropdown.js +++ b/packages/components/src/components/dropdown/dropdown.js @@ -26,7 +26,7 @@ class Dropdown extends mixin( * @extends InitComponentBySearch * @extends TrackBlur * @param {HTMLElement} element The element working as a selector. - * @param {Object} [options] The component options. + * @param {object} [options] The component options. * @param {string} [options.selectorItem] The CSS selector to find clickable areas in dropdown items. * @param {string} [options.selectorItemSelected] The CSS selector to find the clickable area in the selected dropdown item. * @param {string} [options.classSelected] The CSS class for the selected dropdown item. @@ -235,7 +235,7 @@ class Dropdown extends mixin( * If `options` is specified in the constructor, {@linkcode Dropdown.create .create()}, or {@linkcode Dropdown.init .init()}, * properties in this object are overriden for the instance being create and how {@linkcode Dropdown.init .init()} works. * @member Dropdown.options - * @type {Object} + * @type {object} * @property {string} selectorInit The CSS selector to find selectors. * @property {string} [selectorText] The CSS selector to find the element showing the selected item. * @property {string} [selectorTextInner] The CSS selector to find the element showing the selected item, used for inline mode. diff --git a/packages/components/src/components/file-uploader/file-uploader.js b/packages/components/src/components/file-uploader/file-uploader.js index aa3fbc295134..2911927cf6ac 100644 --- a/packages/components/src/components/file-uploader/file-uploader.js +++ b/packages/components/src/components/file-uploader/file-uploader.js @@ -29,7 +29,7 @@ class FileUploader extends mixin( * @extends eventedState * @extends Handles * @param {HTMLElement} element The element working as a file uploader. - * @param {Object} [options] The component options. See static options. + * @param {object} [options] The component options. See static options. */ constructor(element, options = {}) { super(element, options); diff --git a/packages/components/src/components/floating-menu/floating-menu.js b/packages/components/src/components/floating-menu/floating-menu.js index 7e32dbf3aede..dedcde6d8c32 100644 --- a/packages/components/src/components/floating-menu/floating-menu.js +++ b/packages/components/src/components/floating-menu/floating-menu.js @@ -41,7 +41,7 @@ export const DIRECTION_RIGHT = 'right'; export const DIRECTION_BOTTOM = 'bottom'; /** - * @param {Object} params The parameters. + * @param {object} params The parameters. * @param {FloatingMenu~size} params.menuSize The size of the menu. * @param {FloatingMenu~position} params.refPosition The position of the triggering element. * @param {FloatingMenu~offset} [params.offset={ left: 0, top: 0 }] The position offset of the menu. @@ -101,7 +101,7 @@ class FloatingMenu extends mixin( * @extends CreateComponent * @extends EventedShowHideState * @param {HTMLElement} element The element working as a modal dialog. - * @param {Object} [options] The component options. + * @param {object} [options] The component options. * @param {string} [options.selectorContainer] The CSS selector to find the container to put this menu in. * @param {string} [options.attribDirection] The attribute name to specify menu placement direction (top/right/bottom/left). * @param {string} [options.classShown] The CSS class for shown state, for the menu. @@ -119,7 +119,7 @@ class FloatingMenu extends mixin( * The name of the custom event telling that menu is sure hidden * without being canceled by the event handler named by `eventBeforeHidden` option (`floating-menu-beinghidden`). * @param {Element} [options.refNode] The launching element of the menu. Used for calculating the geometry of the menu. - * @param {Object} [options.offset] The offset to adjust the geometry of the menu. Should have `top`/`left` properties. + * @param {object} [options.offset] The offset to adjust the geometry of the menu. Should have `top`/`left` properties. */ constructor(element, options) { super(element, options); @@ -168,7 +168,7 @@ class FloatingMenu extends mixin( /** * @private - * @returns {Object} The menu position, with `top` and `left` properties. + * @returns {object} The menu position, with `top` and `left` properties. */ _getPos() { const { element } = this; @@ -253,7 +253,7 @@ class FloatingMenu extends mixin( * Changes the shown/hidden state. * @private * @param {string} state The new state. - * @param {Object} detail The detail of the event trigging this action. + * @param {object} detail The detail of the event trigging this action. * @param {Function} callback Callback called when change in state completes. */ _changeState(state, detail, callback) { diff --git a/packages/components/src/components/inline-loading/inline-loading.js b/packages/components/src/components/inline-loading/inline-loading.js index 5922d0aea2f1..980145aefc92 100644 --- a/packages/components/src/components/inline-loading/inline-loading.js +++ b/packages/components/src/components/inline-loading/inline-loading.js @@ -23,7 +23,7 @@ class InlineLoading extends mixin( * @extends InitComponentBySearch * @extends Handles * @param {HTMLElement} element The element working as a spinner. - * @param {Object} [options] The component options. + * @param {object} [options] The component options. * @param {string} [options.initialState] The initial state, should be `inactive`, `active` or `finished`. */ constructor(element, options) { @@ -108,7 +108,7 @@ class InlineLoading extends mixin( * or {@linkcode InlineLoading.init .init()}, * properties in this object are overriden for the instance being create and how {@linkcode InlineLoading.init .init()} works. * @member InlineLoading.options - * @type {Object} + * @type {object} * @property {string} selectorInit The CSS selector to find inline loading components. * @property {string} selectorSpinner The CSS selector to find the spinner. * @property {string} selectorFinished The CSS selector to find the "finished" icon. diff --git a/packages/components/src/components/loading/loading.js b/packages/components/src/components/loading/loading.js index 3a384abcc8fc..c242a7531702 100644 --- a/packages/components/src/components/loading/loading.js +++ b/packages/components/src/components/loading/loading.js @@ -19,7 +19,7 @@ class Loading extends mixin(createComponent, initComponentBySearch, handles) { * @extends InitComponentBySearch * @extends Handles * @param {HTMLElement} element The element working as a spinner. - * @param {Object} [options] The component options. + * @param {object} [options] The component options. * @param {boolean} [options.active] `true` if this spinner should roll. */ constructor(element, options) { @@ -117,7 +117,7 @@ class Loading extends mixin(createComponent, initComponentBySearch, handles) { * If `options` is specified in the constructor, {@linkcode Loading.create .create()}, or {@linkcode Loading.init .init()}, * properties in this object are overriden for the instance being create and how {@linkcode Loading.init .init()} works. * @member Loading.options - * @type {Object} + * @type {object} * @property {string} selectorInit The CSS selector to find spinners. */ static get options() { diff --git a/packages/components/src/components/modal/modal.js b/packages/components/src/components/modal/modal.js index 04cc19f9184c..712494a53d08 100644 --- a/packages/components/src/components/modal/modal.js +++ b/packages/components/src/components/modal/modal.js @@ -27,7 +27,7 @@ class Modal extends mixin( * @extends EventedShowHideState * @extends Handles * @param {HTMLElement} element The element working as a modal dialog. - * @param {Object} [options] The component options. + * @param {object} [options] The component options. * @param {string} [options.classVisible] The CSS class for the visible state. * @param {string} [options.eventBeforeShown] * The name of the custom event fired before this modal is shown. @@ -88,7 +88,7 @@ class Modal extends mixin( * Changes the shown/hidden state. * @private * @param {string} state The new state. - * @param {Object} detail The detail data to be included in the event that will be fired. + * @param {object} detail The detail data to be included in the event that will be fired. * @param {Function} callback Callback called when change in state completes. */ _changeState(state, detail, callback) { @@ -198,7 +198,7 @@ class Modal extends mixin( * If `options` is specified in the constructor, {@linkcode Modal.create .create()}, or {@linkcode Modal.init .init()}, * properties in this object are overriden for the instance being create and how {@linkcode Modal.init .init()} works. * @member Modal.options - * @type {Object} + * @type {object} * @property {string} selectorInit The CSS class to find modal dialogs. * @property {string} [selectorModalClose] The selector to find elements that close the modal. * @property {string} [selectorPrimaryFocus] The CSS selector to determine the element to put focus when modal gets open. diff --git a/packages/components/src/components/number-input/number-input.js b/packages/components/src/components/number-input/number-input.js index 4bc9deafa125..3978fe3f3358 100644 --- a/packages/components/src/components/number-input/number-input.js +++ b/packages/components/src/components/number-input/number-input.js @@ -76,7 +76,7 @@ class NumberInput extends mixin( * {@linkcode NumberInput.create .create()}, or {@linkcode NumberInput.init .init()}, * properties in this object are overriden for the instance being create and how {@linkcode NumberInput.init .init()} works. * @member NumberInput.options - * @type {Object} + * @type {object} * @property {string} selectorInit The CSS selector to find number input UIs. * @property {string} [selectorInput] The CSS selector to find the `` element. */ diff --git a/packages/components/src/components/overflow-menu/overflow-menu.js b/packages/components/src/components/overflow-menu/overflow-menu.js index bcd08f421c7f..8292c3f7c5e5 100644 --- a/packages/components/src/components/overflow-menu/overflow-menu.js +++ b/packages/components/src/components/overflow-menu/overflow-menu.js @@ -104,13 +104,13 @@ class OverflowMenu extends mixin( * @extends InitComponentBySearch * @extends Handles * @param {HTMLElement} element The element working as a modal dialog. - * @param {Object} [options] The component options. + * @param {object} [options] The component options. * @param {string} [options.selectorOptionMenu] The CSS selector to find the menu. * @param {string} [options.classShown] The CSS class for the shown state, for the trigger UI. * @param {string} [options.classMenuShown] The CSS class for the shown state, for the menu. * @param {string} [options.classMenuFlip] The CSS class for the flipped state of the menu. - * @param {Object} [options.objMenuOffset] The offset locating the menu for the non-flipped state. - * @param {Object} [options.objMenuOffsetFlip] The offset locating the menu for the flipped state. + * @param {object} [options.objMenuOffset] The offset locating the menu for the non-flipped state. + * @param {object} [options.objMenuOffsetFlip] The offset locating the menu for the flipped state. */ constructor(element, options) { super(element, options); @@ -137,7 +137,7 @@ class OverflowMenu extends mixin( /** * Changes the shown/hidden state. * @param {string} state The new state. - * @param {Object} detail The detail of the event trigging this action. + * @param {object} detail The detail of the event trigging this action. * @param {Function} callback Callback called when change in state completes. */ changeState(state, detail, callback) { diff --git a/packages/components/src/components/pagination-nav/pagination-nav.js b/packages/components/src/components/pagination-nav/pagination-nav.js index d9605d8f99fc..f9c0d6a4358d 100644 --- a/packages/components/src/components/pagination-nav/pagination-nav.js +++ b/packages/components/src/components/pagination-nav/pagination-nav.js @@ -187,7 +187,7 @@ class PaginationNav extends mixin( * or {@linkcode PaginationNav.init .init()}, * properties in this object are overriden for the instance being create and how {@linkcode PaginationNav.init .init()} works. * @member PaginationNav.options - * @type {Object} + * @type {object} * @property {string} selectorInit The data attribute to find pagination nav. * @property {string} selectorPageElement The data attribute to find page element. * @property {string} selectorPageButton The data attribute to find page interactive element. diff --git a/packages/components/src/components/pagination/pagination.js b/packages/components/src/components/pagination/pagination.js index 29e30f2d8bca..9f4dbcf3fdd4 100644 --- a/packages/components/src/components/pagination/pagination.js +++ b/packages/components/src/components/pagination/pagination.js @@ -21,7 +21,7 @@ class Pagination extends mixin( * @extends CreateComponent * @extends InitComponentBySearch * @param {HTMLElement} element The element working as a pagination component. - * @param {Object} [options] The component options. + * @param {object} [options] The component options. * @property {string} [selectorInit] The CSS selector to find pagination components. * @property {string} [selectorItemsPerPageInput] * The CSS selector to find the input that determines the number of items per page. @@ -85,7 +85,7 @@ class Pagination extends mixin( /** * Dispatches a custom event * @param {string} evtName name of the event to be dispatched. - * @param {Object} detail contains the original event and any other necessary details. + * @param {object} detail contains the original event and any other necessary details. */ _emitEvent = (evtName, detail) => { const event = new CustomEvent(`${evtName}`, { diff --git a/packages/components/src/components/progress-indicator/progress-indicator.js b/packages/components/src/components/progress-indicator/progress-indicator.js index 739fd0f1deec..1829b9ab99dc 100644 --- a/packages/components/src/components/progress-indicator/progress-indicator.js +++ b/packages/components/src/components/progress-indicator/progress-indicator.js @@ -18,7 +18,7 @@ class ProgressIndicator extends mixin(createComponent, initComponentBySearch) { * @extends CreateComponent * @extends InitComponentBySearch * @param {HTMLElement} element The element representing the ProgressIndicator. - * @param {Object} [options] The component options. + * @param {object} [options] The component options. * @property {string} [options.selectorStepElement] The CSS selector to find step elements. * @property {string} [options.selectorCurrent] The CSS selector to find the current step element. * @property {string} [options.selectorIncomplete] The CSS class to find incomplete step elements. @@ -115,10 +115,10 @@ class ProgressIndicator extends mixin(createComponent, initComponentBySearch) { /** * Update step with correct inline SVG and className - * @param {Object} args - * @param {Object} [args.element] target element - * @param {Object} [args.className] new className - * @param {Object} [args.html] new inline SVG to insert + * @param {object} args + * @param {object} [args.element] target element + * @param {object} [args.className] new className + * @param {object} [args.html] new inline SVG to insert */ _updateStep(args) { const { element, className, html } = args; @@ -194,7 +194,7 @@ class ProgressIndicator extends mixin(createComponent, initComponentBySearch) { * {@linkcode ProgressIndicator.create .create()}, or {@linkcode ProgressIndicator.init .init()}, * properties in this object are overriden for the instance being created. * @member ProgressIndicator.options - * @type {Object} + * @type {object} * @property {string} selectorInit The CSS selector to find content switcher button set. * @property {string} [selectorStepElement] The CSS selector to find step elements. * @property {string} [selectorCurrent] The CSS selector to find the current step element. diff --git a/packages/components/src/components/search/search.js b/packages/components/src/components/search/search.js index cd83d421b22b..b431f0c249f1 100644 --- a/packages/components/src/components/search/search.js +++ b/packages/components/src/components/search/search.js @@ -23,7 +23,7 @@ class Search extends mixin(createComponent, initComponentBySearch, handles) { * @extends InitComponentBySearch * @extends Handles * @param {HTMLElement} element The element working as the search component. - * @param {Object} [options] The component options + * @param {object} [options] The component options * @property {string} [options.selectorInit] * The selector to find search UIs with options. * @property {string} [options.selectorSearchView] @@ -101,7 +101,7 @@ class Search extends mixin(createComponent, initComponentBySearch, handles) { * properties in this object are overriden for the instance being created * and how {@linkcode Search.init .init()} works. * @member Search.options - * @type {Object} + * @type {object} * @property {string} [options.selectorInit] * The selector to find search UIs with options. * @property {string} [options.selectorSearchView] diff --git a/packages/components/src/components/structured-list/structured-list.js b/packages/components/src/components/structured-list/structured-list.js index b74d23a61f56..9fafc3eb8701 100644 --- a/packages/components/src/components/structured-list/structured-list.js +++ b/packages/components/src/components/structured-list/structured-list.js @@ -26,7 +26,7 @@ class StructuredList extends mixin( * @extends InitComponentBySearch * @extends Handles * @param {HTMLElement} element The root element of tables - * @param {Object} [options] the... options + * @param {object} [options] the... options * @param {string} [options.selectorInit] selector initialization * @param {string} [options.selectorRow] css selector for selected row */ diff --git a/packages/components/src/components/tabs/tabs.js b/packages/components/src/components/tabs/tabs.js index b01f85c78262..e0d754836664 100644 --- a/packages/components/src/components/tabs/tabs.js +++ b/packages/components/src/components/tabs/tabs.js @@ -17,7 +17,7 @@ class Tab extends ContentSwitcher { * Container of tabs. * @extends ContentSwitcher * @param {HTMLElement} element The element working as a container of tabs. - * @param {Object} [options] The component options. + * @param {object} [options] The component options. * @param {string} [options.selectorMenu] The CSS selector to find the drop down menu used in narrow mode. * @param {string} [options.selectorTrigger] The CSS selector to find the button to open the drop down menu used in narrow mode. * @param {string} [options.selectorTriggerText] @@ -57,7 +57,7 @@ class Tab extends ContentSwitcher { /** * Internal method of {@linkcode Tab#setActive .setActive()}, to select a tab item. * @private - * @param {Object} detail The detail of the event trigging this action. + * @param {object} detail The detail of the event trigging this action. * @param {HTMLElement} detail.item The tab item to be selected. * @param {Function} callback Callback called when change in state completes. */ @@ -197,7 +197,7 @@ class Tab extends ContentSwitcher { * If `options` is specified in the constructor, {@linkcode ContentSwitcher.create .create()}, or {@linkcode Tab.init .init()}, * properties in this object are overriden for the instance being create and how {@linkcode Tab.init .init()} works. * @member Tab.options - * @type {Object} + * @type {object} * @property {string} selectorInit The CSS selector to find tab containers. * @property {string} [selectorMenu] The CSS selector to find the drop down menu used in narrow mode. * @property {string} [selectorTrigger] The CSS selector to find the button to open the drop down menu used in narrow mode. diff --git a/packages/components/src/components/text-area/text-area.js b/packages/components/src/components/text-area/text-area.js index 9bbc135ee6b7..b04044529486 100644 --- a/packages/components/src/components/text-area/text-area.js +++ b/packages/components/src/components/text-area/text-area.js @@ -38,7 +38,7 @@ export default class TextArea extends mixin( /** * Updates the character counter - * @param {Object} obj - The elements that can change in the component + * @param {object} obj - The elements that can change in the component * @param {HTMLElement} obj.element - The textarea element * @param {HTMLElement} obj.length - The length of the textarea value */ diff --git a/packages/components/src/components/text-input/text-input.js b/packages/components/src/components/text-input/text-input.js index 087b1668e31a..cfc4b4bd0a4a 100644 --- a/packages/components/src/components/text-input/text-input.js +++ b/packages/components/src/components/text-input/text-input.js @@ -50,7 +50,7 @@ export default class TextInput extends mixin( /** * Updates the character counter - * @param {Object} obj - The elements that can change in the component + * @param {object} obj - The elements that can change in the component * @param {HTMLElement} obj.element - The element functioning as a text field * @param {HTMLElement} obj.length - The length of the text field value */ @@ -62,7 +62,7 @@ export default class TextInput extends mixin( /** * - * @param {Object} obj - Object containing selectors and visibility status + * @param {object} obj - Object containing selectors and visibility status * @param {HTMLElement} obj.iconVisibilityOn - The element functioning as * the SVG icon for visibility on * @param {HTMLElement} obj.iconVisibilityOff - The element functioning as @@ -96,7 +96,7 @@ export default class TextInput extends mixin( /** * Toggles the visibility of the password in the input field and changes the * SVG icon indicating password visibility - * @param {Object} obj - The elements that can change in the component + * @param {object} obj - The elements that can change in the component * @param {HTMLElement} obj.element - The element functioning as a text field * @param {HTMLElement} obj.button - The button toggling password visibility */ diff --git a/packages/components/src/components/tooltip/tooltip.js b/packages/components/src/components/tooltip/tooltip.js index 7cc9d61f1380..61b76e78093d 100644 --- a/packages/components/src/components/tooltip/tooltip.js +++ b/packages/components/src/components/tooltip/tooltip.js @@ -124,7 +124,7 @@ class Tooltip extends mixin( /** * Changes the shown/hidden state. * @param {string} state The new state. - * @param {Object} detail The detail of the event trigging this action. + * @param {object} detail The detail of the event trigging this action. * @param {Function} callback Callback called when change in state completes. // */ changeState(state, detail, callback) { @@ -187,11 +187,11 @@ class Tooltip extends mixin( /** * Handles click/focus events. - * @param {Object} params The parameters. + * @param {object} params The parameters. * @param {Element} params.relatedTarget The element that focus went to. (For `blur` event) * @param {string} params.type The event type triggering this method. * @param {boolean} params.hadContextMenu - * @param {Object} params.details The event details. + * @param {object} params.details The event details. * @private */ _handleClick({ relatedTarget, type, hadContextMenu, details }) { diff --git a/packages/components/src/components/ui-shell/header-nav.js b/packages/components/src/components/ui-shell/header-nav.js index 9aed19e840ac..0932864292b9 100644 --- a/packages/components/src/components/ui-shell/header-nav.js +++ b/packages/components/src/components/ui-shell/header-nav.js @@ -90,7 +90,7 @@ export default class HeaderNav extends mixin( * properties in this object are overriden for the instance being create and * how {@linkcode HeaderNav.init .init()} works. * @member HeaderNav.options - * @type {Object} + * @type {object} * @property {string} selectorInit The data attribute to find side navs. */ static get options() { diff --git a/packages/components/src/components/ui-shell/header-submenu.js b/packages/components/src/components/ui-shell/header-submenu.js index ef06da212623..ee8e91e9731a 100644 --- a/packages/components/src/components/ui-shell/header-submenu.js +++ b/packages/components/src/components/ui-shell/header-submenu.js @@ -280,7 +280,7 @@ export default class HeaderSubmenu extends mixin( * properties in this object are overriden for the instance being create and * how {@linkcode HeaderSubmenu.init .init()} works. * @member HeaderSubmenu.options - * @type {Object} + * @type {object} * @property {string} selectorInit The data attribute to find side navs. */ static get options() { diff --git a/packages/components/src/components/ui-shell/navigation-menu-panel.js b/packages/components/src/components/ui-shell/navigation-menu-panel.js index f7d7ba0aa23e..dc90f9bb0b4e 100644 --- a/packages/components/src/components/ui-shell/navigation-menu-panel.js +++ b/packages/components/src/components/ui-shell/navigation-menu-panel.js @@ -83,7 +83,7 @@ export default class NavigationMenuPanel extends mixin( * properties in this object are overriden for the instance being create and * how {@linkcode NavigationMenuPanel.init .init()} works. * @member NavigationMenuPanel.options - * @type {Object} + * @type {object} * @property {string} selectorInit The CSS class to find popup navs. * @property {string} attribInitTarget The attribute name in the launcher buttons to find target popup nav. * @property {string[]} initEventNames The events that the component will handles diff --git a/packages/components/src/components/ui-shell/navigation-menu.js b/packages/components/src/components/ui-shell/navigation-menu.js index d0affc366ca5..c4664aabf3bf 100644 --- a/packages/components/src/components/ui-shell/navigation-menu.js +++ b/packages/components/src/components/ui-shell/navigation-menu.js @@ -15,7 +15,7 @@ export default class NavigationMenu extends NavigationMenuPanel { * A navigation menu * @extends NavigationMenuPanel * @param {HTMLElement} element The element working as a selector. - * @param {Object} [options] The component options. + * @param {object} [options] The component options. * @param {string} [options.selectorInit] The CSS class to find navigation * menus. * @param {string} [options.attribInitTarget] The attribute name in the @@ -239,7 +239,7 @@ export default class NavigationMenu extends NavigationMenuPanel { * properties in this object are overriden for the instance being create and * how {@linkcode NavigationMenu.init .init()} works. * @member NavigationMenu.options - * @type {Object} + * @type {object} * @property {string} selectorInit The CSS class to find navigation menus. * @property {string} attribInitTarget The attribute name in the * launcher buttons to find target navigation menu. diff --git a/packages/components/src/components/ui-shell/product-switcher.js b/packages/components/src/components/ui-shell/product-switcher.js index 26dbdd60cac6..3585451ff692 100644 --- a/packages/components/src/components/ui-shell/product-switcher.js +++ b/packages/components/src/components/ui-shell/product-switcher.js @@ -8,7 +8,7 @@ export default class ProductSwitcher extends NavigationMenuPanel { * A navigation menu * @extends NavigationMenuPanel * @param {HTMLElement} element The element working as a selector. - * @param {Object} [options] The component options. + * @param {object} [options] The component options. * @param {string} [options.selectorInit] The CSS class to find product * switchers * @param {string} [options.attribInitTarget] The attribute name in the @@ -171,7 +171,7 @@ export default class ProductSwitcher extends NavigationMenuPanel { * properties in this object are overriden for the instance being create and * how {@linkcode ProductSwitcher.init .init()} works. * @member ProductSwitcher.options - * @type {Object} + * @type {object} * @property {string} selectorInit The CSS class to find popup navs. * @property {string} attribInitTarget The attribute name in the * launcher buttons to find target popup nav. diff --git a/packages/components/src/globals/js/boot.js b/packages/components/src/globals/js/boot.js index cb2c77f3483f..444409cb04b0 100644 --- a/packages/components/src/globals/js/boot.js +++ b/packages/components/src/globals/js/boot.js @@ -39,7 +39,7 @@ const init = () => { /** * Replaces the list of components to initialize. - * @param {Object} componentsToReplaceWith The new list of components. + * @param {object} componentsToReplaceWith The new list of components. */ export const setComponents = componentsToReplaceWith => { components = componentsToReplaceWith; diff --git a/packages/components/src/globals/js/mixins/create-component.js b/packages/components/src/globals/js/mixins/create-component.js index 9b5dce79ac68..49c487c44c07 100644 --- a/packages/components/src/globals/js/mixins/create-component.js +++ b/packages/components/src/globals/js/mixins/create-component.js @@ -20,7 +20,7 @@ export default function(ToMix) { * and registers this component't instance associated to an element. * @implements Handle * @param {HTMLElement} element The element working as this component. - * @param {Object} [options] The component options. + * @param {object} [options] The component options. */ constructor(element, options = {}) { super(element, options); diff --git a/packages/components/src/globals/js/mixins/evented-state.js b/packages/components/src/globals/js/mixins/evented-state.js index b6d3639fc43f..91c2cadf3df6 100644 --- a/packages/components/src/globals/js/mixins/evented-state.js +++ b/packages/components/src/globals/js/mixins/evented-state.js @@ -11,11 +11,11 @@ export default function(ToMix) { * @class EventedState */ class EventedState extends ToMix { - // eslint-disable-next-line jsdoc/check-param-names + /* eslint-disable jsdoc/check-param-names */ /** * The internal implementation for {@link EventedState#changeState `.changeState()`}, performing actual change in state. * @param {string} [state] The new state. Can be an omitted, which means toggling. - * @param {Object} [detail] + * @param {object} [detail] * The object that should be put to event details that is fired before/after changing state. * Can have a `group` property, which specifies what state to be changed. * @param {EventedState~changeStateCallback} callback The callback called once changing state is finished or is canceled. @@ -27,11 +27,10 @@ export default function(ToMix) { ); } - // eslint-disable-next-line jsdoc/check-param-names /** * Changes the state of this component. * @param {string} [state] The new state. Can be an omitted, which means toggling. - * @param {Object} [detail] + * @param {object} [detail] * The object that should be put to event details that is fired before/after changing state. * Can have a `group` property, which specifies what state to be changed. * @param {EventedState~changeStateCallback} [callback] The callback called once changing state is finished or is canceled. @@ -102,6 +101,7 @@ export default function(ToMix) { }); } } + /* eslint-enable jsdoc/check-param-names */ /** * Tests if change in state should happen or not. diff --git a/packages/components/src/globals/js/mixins/init-component-by-event.js b/packages/components/src/globals/js/mixins/init-component-by-event.js index a6e75f41dcdf..a57545555a2f 100644 --- a/packages/components/src/globals/js/mixins/init-component-by-event.js +++ b/packages/components/src/globals/js/mixins/init-component-by-event.js @@ -25,7 +25,7 @@ export default function(ToMix) { * If the given element indicates that it's an component of this class, instantiates it. * Otherwise, instantiates this component by clicking on this component in the given node. * @param {Node} target The DOM node to instantiate this component in. Should be a document or an element. - * @param {Object} [options] The component options. + * @param {object} [options] The component options. * @param {string} [options.selectorInit] The CSS selector to find this component. * @returns {Handle} The handle to remove the event listener to handle clicking. */ diff --git a/packages/components/src/globals/js/mixins/init-component-by-launcher.js b/packages/components/src/globals/js/mixins/init-component-by-launcher.js index 895ffb10f2c3..5a05cc72441a 100644 --- a/packages/components/src/globals/js/mixins/init-component-by-launcher.js +++ b/packages/components/src/globals/js/mixins/init-component-by-launcher.js @@ -26,7 +26,7 @@ export default function(ToMix) { * Otherwise, instantiates this component by clicking on launcher buttons * (buttons with attribute that `options.attribInitTarget` points to) of this component in the given node. * @param {Node} target The DOM node to instantiate this component in. Should be a document or an element. - * @param {Object} [options] The component options. + * @param {object} [options] The component options. * @param {string} [options.selectorInit] The CSS selector to find this component. * @param {string} [options.attribInitTarget] The attribute name in the launcher buttons to find target component. * @returns {Handle} The handle to remove the event listener to handle clicking. diff --git a/packages/components/src/globals/js/mixins/init-component-by-search.js b/packages/components/src/globals/js/mixins/init-component-by-search.js index 9dd26d0cacc8..6c5098a3c7a6 100644 --- a/packages/components/src/globals/js/mixins/init-component-by-search.js +++ b/packages/components/src/globals/js/mixins/init-component-by-search.js @@ -16,7 +16,7 @@ export default function(ToMix) { * If the given element indicates that it's an component of this class, instantiates it. * Otherwise, instantiates components by searching for components in the given node. * @param {Node} target The DOM node to instantiate components in. Should be a document or an element. - * @param {Object} [options] The component options. + * @param {object} [options] The component options. * @param {boolean} [options.selectorInit] The CSS selector to find components. */ static init(target = document, options = {}) { diff --git a/packages/components/src/globals/js/mixins/track-blur.js b/packages/components/src/globals/js/mixins/track-blur.js index 151dde7e3699..55bd8b385cc9 100644 --- a/packages/components/src/globals/js/mixins/track-blur.js +++ b/packages/components/src/globals/js/mixins/track-blur.js @@ -14,7 +14,7 @@ function trackBlur(ToMix) { * Mix-in class to add an handler for losing focus. * @extends Handles * @param {HTMLElement} element The element working as this component. - * @param {Object} [options] The component options. + * @param {object} [options] The component options. */ constructor(element, options) { super(element, options); diff --git a/packages/components/src/globals/js/watch.js b/packages/components/src/globals/js/watch.js index 35660ef23716..bdf62c73bb33 100644 --- a/packages/components/src/globals/js/watch.js +++ b/packages/components/src/globals/js/watch.js @@ -51,7 +51,7 @@ const createAndReleaseComponentsUponDOMMutation = ( /** * Automatically instantiates/destroys components in the given element, by watching for DOM additions/removals. * @param {Node} target The DOM node to instantiate components in. Should be a document or an element. - * @param {Object} [options] The component options. + * @param {object} [options] The component options. * @returns {Handle} The handle to stop watching. */ export default function(target = document, options = {}) { diff --git a/packages/components/tests/spec/.eslintrc.js b/packages/components/tests/spec/.eslintrc.js index 8852467f77a2..dd6a81ce800d 100644 --- a/packages/components/tests/spec/.eslintrc.js +++ b/packages/components/tests/spec/.eslintrc.js @@ -13,7 +13,7 @@ module.exports = { browser: true, es6: true, }, - extends: ['carbon-base'], + extends: ['eslint-config-carbon/vanilla'], globals: { jasmine: true, describe: true, diff --git a/packages/components/tools/ci-check.sh b/packages/components/tools/ci-check.sh index 7bc2e3d0b6d4..3a72f2fa1265 100755 --- a/packages/components/tools/ci-check.sh +++ b/packages/components/tools/ci-check.sh @@ -3,8 +3,6 @@ set -e yarn build -yarn lint -yarn format:check yarn test:unit -- --browser ChromeHeadless_Travis --browser Firefox if [[ -n "$RUN_EACH" ]]; then find tests/spec -name "*.js" ! -name left-nav_spec.js -print0 | xargs -0 -n 1 -P 1 yarn test:unit -- -d -f; fi if [[ -n "$AAT_TOKEN" ]]; then yarn test:a11y; fi diff --git a/packages/components/tools/templates.js b/packages/components/tools/templates.js index e8e3533c690c..88eeaeeb7f9b 100644 --- a/packages/components/tools/templates.js +++ b/packages/components/tools/templates.js @@ -91,7 +91,7 @@ const loadContents = glob => const cache = { /** - * @returns {Promise} The promise that is resolved with the content cache. + * @returns {Promise} The promise that is resolved with the content cache. */ get() { if (!this.promiseCache) { @@ -123,10 +123,10 @@ const cache = { }; /** - * @param {Object} [options] The options. + * @param {object} [options] The options. * @param {string} [options.layout] The default Handlebars template name to lay out stuffs. `false` to force empty layout. * @param {boolean} [options.concat] Setting `true` here returns rendered contents all concatenated, instead of returning a map. - * @param {Object} [options.layoutContext] Additional Handlebars rendering context for layout template. + * @param {object} [options.layoutContext] Additional Handlebars rendering context for layout template. * @param {string} [handle] * The internal component name seen in Fractal. * Can be of a component or of a variant, or left empty. diff --git a/packages/elements/tasks/build.js b/packages/elements/tasks/build.js index fe4b2c00496f..043dec4fd0f4 100644 --- a/packages/elements/tasks/build.js +++ b/packages/elements/tasks/build.js @@ -5,6 +5,8 @@ * LICENSE file in the root directory of this source tree. */ +/* eslint-disable no-console */ + 'use strict'; const fs = require('fs-extra'); @@ -22,7 +24,7 @@ const dependencies = Object.keys(packageJson.dependencies).map(key => { async function build() { // Copy scss folders over await Promise.all( - dependencies.map(async ([dependency, dependencyPath]) => { + dependencies.map(async ([_dependency, dependencyPath]) => { const scssFolder = path.join(dependencyPath, 'scss'); if (!(await fs.pathExists(scssFolder))) { return; @@ -64,7 +66,7 @@ async function build() { // @carbon/packagename // @carbon/package-name // Where the package name is the captured group in `match` - from: /\@carbon\/(\w+[-\w]*)\/scss/g, + from: /@carbon\/(\w+[-\w]*)\/scss/g, to(_, match) { return `${relativeImportPath}/${match}`; }, diff --git a/packages/elements/tasks/clean.js b/packages/elements/tasks/clean.js index 5e64636fa864..2be2143771a5 100644 --- a/packages/elements/tasks/clean.js +++ b/packages/elements/tasks/clean.js @@ -5,6 +5,8 @@ * LICENSE file in the root directory of this source tree. */ +/* eslint-disable no-console */ + 'use strict'; const fs = require('fs-extra'); @@ -19,7 +21,7 @@ const dependencies = Object.keys(packageJson.dependencies).map(key => { async function clean() { await Promise.all( - dependencies.map(([dependency, dependencyPath]) => { + dependencies.map(([_dependency, dependencyPath]) => { return fs.remove(path.join(BUNDLE_DIR, path.basename(dependencyPath))); }) ); diff --git a/packages/eslint-config-carbon/.npmignore b/packages/eslint-config-carbon/.npmignore new file mode 100644 index 000000000000..81ba1598b971 --- /dev/null +++ b/packages/eslint-config-carbon/.npmignore @@ -0,0 +1,4 @@ +**/__mocks__/** +**/__tests__/** +**/examples/** +**/tasks/** \ No newline at end of file diff --git a/packages/eslint-config-carbon/index.js b/packages/eslint-config-carbon/index.js new file mode 100644 index 000000000000..7e1e56e7d1a1 --- /dev/null +++ b/packages/eslint-config-carbon/index.js @@ -0,0 +1,68 @@ +/** + * Copyright IBM Corp. 2018, 2018 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +module.exports = { + parser: 'babel-eslint', + extends: ['eslint:recommended', 'plugin:jsx-a11y/recommended'], + plugins: ['react', 'jsdoc', 'jsx-a11y'], + rules: { + // Handle cases where we are destructuring but may not be using the initial + // variables + 'no-unused-vars': [ + 'error', + { + args: 'after-used', + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + }, + ], + 'react/jsx-uses-vars': 1, + 'react/jsx-uses-react': 1, + 'react/no-find-dom-node': 1, + 'react/no-typos': 2, + 'jsdoc/check-param-names': 2, + 'jsdoc/check-tag-names': 2, + 'jsdoc/check-types': 2, + 'jsx-a11y/no-static-element-interactions': 1, + 'jsx-a11y/no-noninteractive-element-interactions': 1, + 'jsx-a11y/click-events-have-key-events': 1, + 'jsx-a11y/anchor-is-valid': 1, + 'jsx-a11y/interactive-supports-focus': 1, + 'jsx-a11y/label-has-for': [ + 1, + { + components: ['Label'], + required: { + some: ['nesting', 'id'], + }, + allowChildren: true, + }, + ], + }, + env: { + node: true, + browser: true, + es6: true, + jest: true, + jasmine: true, + }, + globals: { + __DEV__: true, + }, + settings: { + jsdoc: { + tagNamePreference: { + augments: 'extends', + }, + }, + react: { + version: 'detect', + }, + }, +}; diff --git a/packages/eslint-config-carbon/package.json b/packages/eslint-config-carbon/package.json new file mode 100644 index 000000000000..1f8f0aea5171 --- /dev/null +++ b/packages/eslint-config-carbon/package.json @@ -0,0 +1,39 @@ +{ + "name": "eslint-config-carbon", + "private": true, + "version": "10.3.0", + "license": "Apache-2.0", + "main": "index.js", + "repository": "https://github.com/carbon-design-system/carbon/tree/master/packages/eslint-config-carbon", + "bugs": "https://github.com/carbon-design-system/carbon/issues", + "keywords": [ + "ibm", + "carbon", + "carbon-design-system", + "components", + "react" + ], + "publishConfig": { + "access": "public" + }, + "peerDependencies": { + "eslint": "^5.16.0", + "eslint-config-airbnb": "^17.0.0", + "eslint-config-airbnb-base": "^13.0.0", + "eslint-config-prettier": "^3.0.0", + "eslint-plugin-import": "^2.14.0", + "eslint-plugin-jsdoc": "^7.2.3", + "eslint-plugin-jsx-a11y": "^6.2.1", + "eslint-plugin-react": "^7.13.0", + "eslint-restricted-globals": "^0.1.0" + }, + "dependencies": { + "babel-eslint": "^10.0.1" + }, + "devDependencies": { + "eslint": "^5.16.0", + "eslint-plugin-jsdoc": "^7.2.3", + "eslint-plugin-jsx-a11y": "^6.2.1", + "eslint-plugin-react": "^7.13.0" + } +} diff --git a/packages/eslint-config-carbon/vanilla.js b/packages/eslint-config-carbon/vanilla.js new file mode 100644 index 000000000000..bb2820ab1cf7 --- /dev/null +++ b/packages/eslint-config-carbon/vanilla.js @@ -0,0 +1,54 @@ +/** + * Copyright IBM Corp. 2018, 2018 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +module.exports = { + parser: 'babel-eslint', + parserOptions: { + ecmaVersion: 6, + sourceType: 'script', + }, + env: { + browser: true, + node: true, + es6: true, + }, + extends: ['airbnb-base', 'prettier'], + plugins: ['prettier'], + rules: { + 'prettier/prettier': [ + 'error', + { + singleQuote: true, + trailingComma: 'es5', + }, + ], + 'max-len': [2, 130, 4], + 'no-param-reassign': [ + 2, + { + props: false, + }, + ], + 'no-plusplus': 0, + 'no-underscore-dangle': 0, + 'prefer-rest-params': 0, + 'comma-dangle': [ + 2, + { + arrays: 'always-multiline', + objects: 'always-multiline', + imports: 'always-multiline', + exports: 'always-multiline', + functions: 'never', + }, + ], + 'import/no-extraneous-dependencies': [2, { devDependencies: true }], + 'import/order': 0, + }, +}; diff --git a/packages/icons-angular/src/build.js b/packages/icons-angular/src/build.js index 04b4c748fe1a..b687dd640cb4 100644 --- a/packages/icons-angular/src/build.js +++ b/packages/icons-angular/src/build.js @@ -9,15 +9,11 @@ const icons = require('@carbon/icons/meta.json'); const { toString } = require('@carbon/icon-helpers'); const { reporter } = require('@carbon/cli-reporter'); const fs = require('fs-extra'); -const { join, dirname } = require('path'); +const { dirname } = require('path'); const { param } = require('change-case'); const ngc = require('@angular/compiler-cli/src/main'); const { rollup } = require('rollup'); -const { - componentTemplate, - moduleTemplate, - storyTemplate, -} = require('./templates'); +const { componentTemplate, storyTemplate } = require('./templates'); const clean = require('./clean'); const paths = require('./paths'); diff --git a/packages/icons-angular/src/templates.js b/packages/icons-angular/src/templates.js index 168637b11d15..8d8b083e099d 100644 --- a/packages/icons-angular/src/templates.js +++ b/packages/icons-angular/src/templates.js @@ -97,9 +97,9 @@ export class ${className}Directive implements AfterViewInit { const title = document.createElement("title"); title.textContent = attributes.title; ${className}Directive.titleIdCounter++; - title.setAttribute("id", \`${iconName}-\$\{${className}Directive.titleIdCounter\}\`); + title.setAttribute("id", \`${iconName}-$\{${className}Directive.titleIdCounter}\`); svg.appendChild(title); - svg.setAttribute("aria-labelledby", \`${iconName}-\$\{${className}Directive.titleIdCounter\}\`); + svg.setAttribute("aria-labelledby", \`${iconName}-$\{${className}Directive.titleIdCounter}\`); } } } diff --git a/packages/icons-react/src/build.js b/packages/icons-react/src/build.js index a0ccbefbaa60..54755cab64f6 100644 --- a/packages/icons-react/src/build.js +++ b/packages/icons-react/src/build.js @@ -13,17 +13,13 @@ const fs = require('fs-extra'); const path = require('path'); const { rollup } = require('rollup'); const virtual = require('rollup-plugin-virtual'); -const { - createModuleFromInfo, - createEntrypointFromMeta, -} = require('./createFromInfo'); +const { createModuleFromInfo } = require('./createFromInfo'); const createIconStory = require('./createIconStory'); const STORYBOOK_DIR = path.resolve(__dirname, '../examples/storybook/stories'); async function build({ cwd }) { reporter.info(`Building components for ${meta.length} icons...`); - const ESM_DIR = path.join(cwd, 'es'); const BUNDLE_FORMATS = [ { format: 'esm', @@ -40,7 +36,6 @@ async function build({ cwd }) { ]; reporter.info('Building ESM and bundle sources...'); - const babel = require('@babel/core'); await Promise.all( meta.map(async info => { diff --git a/packages/icons-react/src/createIconStory.js b/packages/icons-react/src/createIconStory.js index fc435f855ad8..3ad9a51dfcd7 100644 --- a/packages/icons-react/src/createIconStory.js +++ b/packages/icons-react/src/createIconStory.js @@ -17,7 +17,7 @@ const prettierOptions = { }; function createIconStory(info) { - const { descriptor, moduleName, outputOptions } = info; + const { moduleName, outputOptions } = info; const source = ` import React from 'react'; import { storiesOf } from '@storybook/react'; diff --git a/packages/icons-react/tasks/build.js b/packages/icons-react/tasks/build.js index 6ca3a4045281..86bebe51679f 100644 --- a/packages/icons-react/tasks/build.js +++ b/packages/icons-react/tasks/build.js @@ -5,6 +5,8 @@ * LICENSE file in the root directory of this source tree. */ +/* eslint-disable no-console */ + 'use strict'; const path = require('path'); diff --git a/packages/icons-vue/src/__tests__/createFromInfo-test.js b/packages/icons-vue/src/__tests__/createFromInfo-test.js index 5a34ca0cb178..c8e8fa7d6d30 100644 --- a/packages/icons-vue/src/__tests__/createFromInfo-test.js +++ b/packages/icons-vue/src/__tests__/createFromInfo-test.js @@ -7,6 +7,8 @@ * @jest-environment jsdom */ +/* eslint-disable no-console */ + 'use strict'; const Module = require('module'); diff --git a/packages/icons-vue/src/build.js b/packages/icons-vue/src/build.js index ed3146db9596..6707ac6ac2ea 100644 --- a/packages/icons-vue/src/build.js +++ b/packages/icons-vue/src/build.js @@ -12,10 +12,7 @@ const meta = require('@carbon/icons/meta.json'); const fs = require('fs-extra'); const path = require('path'); const { rollup } = require('rollup'); -const { - createEntrypointFromMeta, - createModuleFromInfo, -} = require('./createFromInfo'); +const { createModuleFromInfo } = require('./createFromInfo'); const createIconStory = require('./createIconStory'); const STORYBOOK_DIR = path.resolve(__dirname, '../examples/storybook/stories'); diff --git a/packages/icons-vue/src/createIconStory.js b/packages/icons-vue/src/createIconStory.js index dc93d494cf67..906d0c877dec 100644 --- a/packages/icons-vue/src/createIconStory.js +++ b/packages/icons-vue/src/createIconStory.js @@ -7,15 +7,6 @@ 'use strict'; -const prettier = require('prettier'); - -const prettierOptions = { - parser: 'babylon', - printWidth: 80, - singleQuote: true, - trailingComma: 'es5', -}; - function createIconStory(info) { const { moduleName, outputOptions } = info; return `import { storiesOf } from '@storybook/vue'; diff --git a/packages/icons-vue/tasks/build.js b/packages/icons-vue/tasks/build.js index d12f72a5ff65..54b67caa12e8 100644 --- a/packages/icons-vue/tasks/build.js +++ b/packages/icons-vue/tasks/build.js @@ -5,6 +5,8 @@ * LICENSE file in the root directory of this source tree. */ +/* eslint-disable no-console */ + 'use strict'; const path = require('path'); diff --git a/packages/icons/package.json b/packages/icons/package.json index 38e2d93a052c..1294d24a86dc 100644 --- a/packages/icons/package.json +++ b/packages/icons/package.json @@ -34,7 +34,6 @@ "devDependencies": { "@carbon/cli-reporter": "10.2.0", "change-case": "^3.0.2", - "del": "^3.0.0", "js-yaml": "^3.12.1", "klaw-sync": "^6.0.0", "memfs": "^2.14.0", diff --git a/packages/icons/src/build.js b/packages/icons/src/build.js index ec968937fe2a..1b62b55cc8d8 100644 --- a/packages/icons/src/build.js +++ b/packages/icons/src/build.js @@ -9,7 +9,6 @@ const { reporter } = require('@carbon/cli-reporter'); const { pascal } = require('change-case'); -const del = require('del'); const fs = require('fs-extra'); const path = require('path'); const prettier = require('prettier'); @@ -60,7 +59,7 @@ async function build(source, { cwd } = {}) { // Build up icon index. Useful for looking up size info for a particular icon. const index = optimized.reduce((acc, icon) => { - const { basename, prefix, size } = icon; + const { basename, prefix } = icon; const key = getIndexName(basename, prefix); if (acc[key]) { return { @@ -103,7 +102,7 @@ async function build(source, { cwd } = {}) { reporter.info('Building JavaScript modules...'); const output = await flatMapAsync(files, async file => { - const { basename, descriptor, moduleName, prefix, size, source } = file; + const { basename, moduleName, prefix, size, source } = file; const formattedPrefix = prefix.filter(step => isNaN(step)); const moduleFolder = path.join(esmFolder, ...formattedPrefix, basename); const jsFilepath = path.join( @@ -140,7 +139,6 @@ async function build(source, { cwd } = {}) { }); reporter.info('Building module entrypoints...'); - const moduleNames = files.map(file => file.moduleName); const entrypoint = prettier.format( files.reduce((acc, file) => { const { moduleName, descriptor } = file; @@ -234,7 +232,7 @@ function createIconSource(file, descriptor) { } async function createDescriptorFromFile(file) { - const { basename, size, optimized, original, prefix } = file; + const { basename, size, optimized, original } = file; const info = await parse(optimized.data, basename); const descriptor = { ...info, @@ -264,7 +262,7 @@ async function createDescriptorFromFile(file) { }; } -function getIndexName(basename, prefix, size) { +function getIndexName(basename, prefix) { return prefix .filter(part => isNaN(part)) .concat(basename) diff --git a/packages/icons/src/optimize.js b/packages/icons/src/optimize.js index 057397f175b6..3e84daf026ce 100644 --- a/packages/icons/src/optimize.js +++ b/packages/icons/src/optimize.js @@ -22,7 +22,7 @@ async function optimize(folder, { cwd, buildDir = `${cwd}/svg` } = {}) { reporter.info(`Optimizing ${files.length} icons...`); const optimized = await flatMapAsync(files, async file => { - const { filepath, basename, size, prefix } = file; + const { filepath } = file; const source = await fs.readFile(filepath); const optimized = await svgo.optimize(source, { path: filepath, @@ -37,7 +37,7 @@ async function optimize(folder, { cwd, buildDir = `${cwd}/svg` } = {}) { await Promise.all( optimized.map(async file => { - const { filename, prefix, optimized, size, source } = file; + const { filename, prefix, optimized } = file; const outputDir = path.join(buildDir, ...prefix); const target = path.join(outputDir, filename); diff --git a/packages/icons/src/search.js b/packages/icons/src/search.js index 489fc1f13cd1..07c71bfcb7dd 100644 --- a/packages/icons/src/search.js +++ b/packages/icons/src/search.js @@ -51,7 +51,7 @@ async function search(directory) { const files = await _search(directory); const prefixed = files.map(file => { - const { filepath, size } = file; + const { filepath } = file; const dirname = path.dirname(filepath); const prefix = path .relative(directory, dirname) diff --git a/packages/icons/tasks/build.js b/packages/icons/tasks/build.js index bea42f299c3a..8d9b3e2505f8 100644 --- a/packages/icons/tasks/build.js +++ b/packages/icons/tasks/build.js @@ -8,7 +8,6 @@ 'use strict'; const build = require('../src/build'); -const search = require('../src/search'); const { SVG_DIR } = require('../src/paths'); build(SVG_DIR, { cwd: process.cwd() }).catch(error => { diff --git a/packages/icons/tasks/scaffold-metadata.js b/packages/icons/tasks/scaffold-metadata.js index 9eadaf0e68d3..4152aed40f2d 100644 --- a/packages/icons/tasks/scaffold-metadata.js +++ b/packages/icons/tasks/scaffold-metadata.js @@ -5,6 +5,8 @@ * LICENSE file in the root directory of this source tree. */ +/* eslint-disable no-console */ + 'use strict'; const { sentenceCase } = require('change-case'); diff --git a/packages/react/package.json b/packages/react/package.json index fb987428b216..9ffd0e7cdb34 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -26,12 +26,10 @@ "scripts": { "build": "yarn clean && node scripts/build.js", "build-storybook": "build-storybook", - "ci-check": "yarn lint && yarn test --runInBand && yarn test-ssr", + "ci-check": "yarn test-ssr", "clean": "rimraf es lib umd storybook-static", "contributors:add": "all-contributors add", "contributors:generate": "all-contributors generate", - "lint": "eslint src", - "lint:staged": "eslint", "prepublish": "yarn build", "semantic-release": "semantic-release", "start": "yarn storybook", @@ -82,7 +80,6 @@ "@storybook/react": "^5.1.3", "all-contributors-cli": "^5.2.1", "babel-core": "^7.0.0-bridge.0", - "babel-eslint": "^10.0.1", "babel-jest": "^23.6.0", "babel-loader": "^8.0.4", "babel-plugin-dev-expression": "^0.2.1", @@ -99,10 +96,6 @@ "enzyme": "^3.9.0", "enzyme-adapter-react-16": "^1.12.1", "enzyme-to-json": "^3.3.5", - "eslint": "^5.16.0", - "eslint-plugin-jsdoc": "^4.8.3", - "eslint-plugin-jsx-a11y": "^6.2.1", - "eslint-plugin-react": "^7.12.4", "gzip-size": "^5.0.0", "jest": "^24.0.0", "jest-circus": "^24.0.0", @@ -134,67 +127,6 @@ "whatwg-fetch": "^2.0.3" }, "sideEffects": false, - "eslintConfig": { - "parser": "babel-eslint", - "extends": [ - "eslint:recommended", - "plugin:jsx-a11y/recommended" - ], - "plugins": [ - "react", - "jsdoc", - "jsx-a11y" - ], - "rules": { - "react/jsx-uses-vars": 1, - "react/jsx-uses-react": 1, - "react/no-find-dom-node": 1, - "react/no-typos": 2, - "jsdoc/check-param-names": 2, - "jsdoc/check-tag-names": 2, - "jsdoc/check-types": 2, - "jsx-a11y/no-static-element-interactions": 1, - "jsx-a11y/no-noninteractive-element-interactions": 1, - "jsx-a11y/click-events-have-key-events": 1, - "jsx-a11y/anchor-is-valid": 1, - "jsx-a11y/interactive-supports-focus": 1, - "jsx-a11y/label-has-for": [ - 1, - { - "components": [ - "Label" - ], - "required": { - "some": [ - "nesting", - "id" - ] - }, - "allowChildren": true - } - ] - }, - "env": { - "node": true, - "browser": true, - "es6": true, - "jest": true, - "jasmine": true - }, - "globals": { - "__DEV__": true - }, - "settings": { - "jsdoc": { - "tagNamePreference": { - "augments": "extends" - } - }, - "react": { - "version": "detect" - } - } - }, "babel": { "presets": [ "./scripts/env", @@ -252,5 +184,34 @@ "enzyme-to-json/serializer" ] }, - "bundleSizeThreshold": 120000 + "contributors": [ + { + "name": "Brian Han", + "email": "bthan@us.ibm.com" + }, + { + "name": "Aziz Punjani", + "email": "punjani@us.ibm.com" + }, + { + "name": "Mari Johannessen", + "email": "mjohannessen@us.ibm.com" + }, + { + "name": "TJ Egan", + "email": "twegan@us.ibm.com" + }, + { + "name": "Ian Fleming", + "email": "ianfleming@us.ibm.com" + }, + { + "name": "Chris Dhanaraj", + "email": "chrisdhanaraj@us.ibm.com" + } + ], + "bundleSizeThreshold": 120000, + "release": { + "branch": "master" + } } diff --git a/packages/react/src/components/DataTable/DataTable.js b/packages/react/src/components/DataTable/DataTable.js index 914abcd3b5aa..0eb9d38c7884 100644 --- a/packages/react/src/components/DataTable/DataTable.js +++ b/packages/react/src/components/DataTable/DataTable.js @@ -156,10 +156,10 @@ export default class DataTable extends React.Component { * Get the props associated with the given header. Mostly used for adding in * sorting behavior. * - * @param {Object} config + * @param {object} config * @param {string} config.header the header we want the props for * @param {Function} config.onClick a custom click handler for the header - * @returns {Object} + * @returns {object} */ getHeaderProps = ({ header, @@ -191,9 +191,9 @@ export default class DataTable extends React.Component { /** * Get the props associated with the given expand header. * - * @param {Object} config + * @param {object} config * @param {Function} config.onClick a custom click handler for the expand header - * @returns {Object} + * @returns {object} */ getExpandHeaderProps = ({ onClick, ...rest } = {}) => { const { translateWithId: t } = this.props; @@ -222,7 +222,7 @@ export default class DataTable extends React.Component { * Decorate consumer's `onClick` event handler with sort parameters * * @param {Function} onClick - * @param {Object} sortParams + * @param {object} sortParams * @returns {Function} */ handleOnHeaderClick = (onClick, sortParams) => { @@ -233,7 +233,7 @@ export default class DataTable extends React.Component { * Decorate consumer's `onClick` event handler with sort parameters * * @param {Function} onClick - * @param {Object} expandParams + * @param {object} expandParams * @returns {Function} */ handleOnExpandHeaderClick = (onClick, expandParams) => { @@ -243,10 +243,10 @@ export default class DataTable extends React.Component { /** * Get the props associated with the given row. Mostly used for expansion. * - * @param {Object} config - * @param {Object} config.row the row we want the props for + * @param {object} config + * @param {object} config.row the row we want the props for * @param {Function} config.onClick a custom click handler for the header - * @returns {Object} + * @returns {object} */ getRowProps = ({ row, onClick, ...rest }) => { const { translateWithId: t } = this.props; @@ -271,8 +271,8 @@ export default class DataTable extends React.Component { * applicable. Most often used to indicate selection status of the table or * for a specific row. * - * @param {Object} [row] an optional row that we want to access the props for - * @returns {Object} + * @param {object} [row] an optional row that we want to access the props for + * @returns {object} */ getSelectionProps = ({ onClick, row, ...rest } = {}) => { const { translateWithId: t } = this.props; @@ -370,8 +370,8 @@ export default class DataTable extends React.Component { /** * Helper for toggling all selected items in a state. Does not call * setState, so use it when setting state. - * @param {Object} initialState - * @returns {Object} object to put into this.setState (use spread operator) + * @param {object} initialState + * @returns {object} object to put into this.setState (use spread operator) */ setAllSelectedState = (initialState, isSelected) => { const { rowIds } = initialState; diff --git a/packages/react/src/components/DataTable/state/sorting.js b/packages/react/src/components/DataTable/state/sorting.js index 961f6af406bd..bc675b5942b6 100644 --- a/packages/react/src/components/DataTable/state/sorting.js +++ b/packages/react/src/components/DataTable/state/sorting.js @@ -66,19 +66,19 @@ export const getNextSortState = (props, state, { key }) => { * Derive the set of sorted state fields from props and state for the given * header key and sortDirection * - * @param {Object} props + * @param {object} props * @param {string} props.locale The current locale * @param {Function} props.sortRows Method to handle sorting a collection of * rows - * @param {Object} state + * @param {object} state * @param {Array} state.rowIds Array of row ids - * @param {Object} state.cellsById Lookup object for cells by id + * @param {object} state.cellsById Lookup object for cells by id * @param {Array} state.initialRowOrder Initial row order for the * current set of rows * @param {string} key The key for the given header we are derving the * sorted state for * @param {string} sortDirection The sortState that we want to order by - * @returns {Object} + * @returns {object} */ export const getSortedState = (props, state, key, sortDirection) => { const { rowIds, cellsById, initialRowOrder } = state; diff --git a/packages/react/src/components/DataTable/tools/denormalize.js b/packages/react/src/components/DataTable/tools/denormalize.js index 3df825e5314b..ed61b3c7d363 100644 --- a/packages/react/src/components/DataTable/tools/denormalize.js +++ b/packages/react/src/components/DataTable/tools/denormalize.js @@ -16,8 +16,8 @@ * cell info. * * @param {Array} rowIds array of row ids in the table - * @param {Object} rowsById object containing lookups for rows by id - * @param {Object} cellsById object containing lookups for cells by id + * @param {object} rowsById object containing lookups for rows by id + * @param {object} cellsById object containing lookups for cells by id */ const denormalize = (rowIds, rowsById, cellsById) => { return rowIds.map(id => ({ diff --git a/packages/react/src/components/DataTable/tools/filter.js b/packages/react/src/components/DataTable/tools/filter.js index 866b471e8e5e..3253c26c91a7 100644 --- a/packages/react/src/components/DataTable/tools/filter.js +++ b/packages/react/src/components/DataTable/tools/filter.js @@ -13,10 +13,10 @@ import { getCellId } from './cells'; * individual cell values for a row. Then, we go through each cell value and see * if any of them includes the given inputValue. * - * @param {Object} config + * @param {object} config * @param {Array} config.rowIds array of all the row ids in the table - * @param {Array} config.headers - * @param {Object} config.cellsById object containing a map of cell id to cell + * @param {Array} config.headers + * @param {object} config.cellsById object containing a map of cell id to cell * @param {string} config.inputValue the current input value in the Table Search * @returns {Array} rowIds */ diff --git a/packages/react/src/components/DataTable/tools/normalize.js b/packages/react/src/components/DataTable/tools/normalize.js index f269f7669ffc..a2cb3f5d82d7 100644 --- a/packages/react/src/components/DataTable/tools/normalize.js +++ b/packages/react/src/components/DataTable/tools/normalize.js @@ -10,9 +10,9 @@ import { getCellId } from './cells'; /** * Normalize a collection of rows with the given headers. * - * @param {Array} rows - * @param {Array} headers - * @returns {Object} + * @param {Array} rows + * @param {Array} headers + * @returns {object} */ const normalize = (rows, headers, prevState = {}) => { const { rowsById: prevRowsByIds } = prevState; diff --git a/packages/react/src/components/DataTable/tools/sorting.js b/packages/react/src/components/DataTable/tools/sorting.js index 13b6faedf047..ddbd4b5b9f6c 100644 --- a/packages/react/src/components/DataTable/tools/sorting.js +++ b/packages/react/src/components/DataTable/tools/sorting.js @@ -51,9 +51,9 @@ export const compareStrings = (a, b, locale = 'en') => { * into our local `compareStrings` method, including the locale where * appropriate. * - * @param {Object} config + * @param {object} config * @param {Array[string]} config.rowIds array of all the row ids in the table - * @param {Object} config.cellsById object containing a mapping of cell id to + * @param {object} config.cellsById object containing a mapping of cell id to * cell * @param {string} config.direction the sort direction used to determine the * order the comparison is called in diff --git a/packages/react/src/components/DatePicker/DatePicker.js b/packages/react/src/components/DatePicker/DatePicker.js index 766915d16231..a1d7f3fff586 100644 --- a/packages/react/src/components/DatePicker/DatePicker.js +++ b/packages/react/src/components/DatePicker/DatePicker.js @@ -38,7 +38,7 @@ const monthToStr = (monthNumber, shorthand, locale) => locale.months[shorthand ? 'shorthand' : 'longhand'][monthNumber]; /** - * @param {Object} config Plugin configuration. + * @param {object} config Plugin configuration. * @param {boolean} [config.shorthand] `true` to use shorthand month. * @param {string} config.selectorFlatpickrMonthYearContainer The CSS selector for the container of month/year selection UI. * @param {string} config.selectorFlatpickrYearContainer The CSS selector for the container of year selection UI. diff --git a/packages/react/src/components/Icon/Icon.js b/packages/react/src/components/Icon/Icon.js index 9579d637a1c6..c0914bc10a6a 100644 --- a/packages/react/src/components/Icon/Icon.js +++ b/packages/react/src/components/Icon/Icon.js @@ -19,7 +19,7 @@ let iconsList = icons; /** * Returns a single icon Object * @param {string} name - "name" property of icon - * @param {Object} [iconsObj=icons] - JSON Array of Objects + * @param {object} [iconsObj=icons] - JSON Array of Objects * @example * // Returns a single icon Object * this.findIcon('copy-code', icons.json); @@ -40,7 +40,7 @@ export function findIcon(name, iconsObj = iconsList) { * Sets the icons list object from `carbon-icons`. * Doing so instead of having this module directly import `carbon-icons` * avoids the icons list being included in applications' bundles if only limited set of icons is in use. - * @param {Object} list The icons list from `carbon-icons`. + * @param {object} list The icons list from `carbon-icons`. */ export function setIconsList(list) { iconsList = list; @@ -59,7 +59,7 @@ export function getSvgData(iconName) { } /** - * @param {Object} svgData - JSON Object for an SVG icon + * @param {object} svgData - JSON Object for an SVG icon * @returns {ReactElement} Elements/Nodes for SVG * @example * // Returns SVG elements diff --git a/packages/react/src/components/ListBox/test-helpers.js b/packages/react/src/components/ListBox/test-helpers.js index e8da984b6d20..77813316f53e 100644 --- a/packages/react/src/components/ListBox/test-helpers.js +++ b/packages/react/src/components/ListBox/test-helpers.js @@ -83,7 +83,7 @@ export const generateCustomItem = index => ({ * Returns an Array filled by values generated by the `generator` function * @param {number} amount Number of elements to generate * - * @returns {Array} Array of objects generated by `generator` + * @returns {Array} Array of objects generated by `generator` */ export const generateItems = (amount, generator) => Array(amount) diff --git a/packages/react/src/components/MultiSelect/tools/sorting.js b/packages/react/src/components/MultiSelect/tools/sorting.js index 0fbc6fc0749c..a07d520b3a9a 100644 --- a/packages/react/src/components/MultiSelect/tools/sorting.js +++ b/packages/react/src/components/MultiSelect/tools/sorting.js @@ -11,7 +11,7 @@ * * @param {string} itemA * @param {string} itemB - * @param {Object} options + * @param {object} options * @param {string} options.locale * @returns {number} */ diff --git a/packages/react/src/internal/FloatingMenu.js b/packages/react/src/internal/FloatingMenu.js index 45d2b8716080..f26fc10a551a 100644 --- a/packages/react/src/internal/FloatingMenu.js +++ b/packages/react/src/internal/FloatingMenu.js @@ -61,7 +61,7 @@ const hasChangeInOffset = (oldMenuOffset = {}, menuOffset = {}) => { }; /** - * @param {Object} params The parameters. + * @param {object} params The parameters. * @param {FloatingMenu~size} params.menuSize The size of the menu. * @param {FloatingMenu~position} params.refPosition The position of the triggering element. * @param {FloatingMenu~offset} [params.offset={ left: 0, top: 0 }] The position offset of the menu. diff --git a/packages/react/src/prop-types/isRequiredOneOf.js b/packages/react/src/prop-types/isRequiredOneOf.js index 8137cbaf9f47..ebf41475389d 100644 --- a/packages/react/src/prop-types/isRequiredOneOf.js +++ b/packages/react/src/prop-types/isRequiredOneOf.js @@ -6,8 +6,8 @@ */ /** - * @param {Object} propTypes The list of type checkers, keyed by prop names. - * @returns {Object} + * @param {object} propTypes The list of type checkers, keyed by prop names. + * @returns {object} * The new prop type checkers that checks if one of the given props exist, * in addition to the original type checkings. */ diff --git a/packages/scss-generator/src/types/assert.js b/packages/scss-generator/src/types/assert.js index 6882c381052b..1e220ad933c1 100644 --- a/packages/scss-generator/src/types/assert.js +++ b/packages/scss-generator/src/types/assert.js @@ -15,7 +15,7 @@ function assertAny() { function assertDefined(node) { if (!node) { - throw new Error(`Expected type ${type} to be defined`); + throw new Error(`Expected node of type ${node.type} to be defined`); } } diff --git a/packages/sketch/src/commands/colors/generate.js b/packages/sketch/src/commands/colors/generate.js index 01668bb5da31..1b640aef7f73 100644 --- a/packages/sketch/src/commands/colors/generate.js +++ b/packages/sketch/src/commands/colors/generate.js @@ -24,7 +24,7 @@ export function generate() { sharedStyles, sharedStyle => { const { name } = sharedStyle; - const [category, swatch, grade] = name.split('/'); + const [_category, swatch] = name.split('/'); switch (swatch) { case 'black': case 'white': @@ -50,7 +50,7 @@ export function generate() { Y_OFFSET = Y_OFFSET + ARTBOARD_HEIGHT + ARTBOARD_MARGIN; const swatches = groupByKey(colors, sharedStyle => { - const [category, swatch, grade] = sharedStyle.name.split('/'); + const [_category, swatch] = sharedStyle.name.split('/'); return swatch; }); diff --git a/packages/sketch/src/commands/command.js b/packages/sketch/src/commands/command.js index bf0857ca1256..b262dcc840f7 100644 --- a/packages/sketch/src/commands/command.js +++ b/packages/sketch/src/commands/command.js @@ -21,6 +21,7 @@ export function command(name, fn) { sketch.UI.message('Done! 🎉'); if (process.env.NODE_ENV === 'development') { + // eslint-disable-next-line no-console console.log(`[Carbon Elements] ${name}: Done in ${Date.now() - start}ms`); } } diff --git a/packages/sketch/src/commands/icons/generate.js b/packages/sketch/src/commands/icons/generate.js index cd8b08d6e9d6..b1be84ab728a 100644 --- a/packages/sketch/src/commands/icons/generate.js +++ b/packages/sketch/src/commands/icons/generate.js @@ -5,16 +5,10 @@ * LICENSE file in the root directory of this source tree. */ +/* global MSSVGImporter, NSString, NSUTF8StringEncoding */ + import { toString } from '@carbon/icon-helpers'; -import React from 'react'; -import { - Document, - Group, - Rectangle, - Shape, - Style, - SymbolMaster, -} from 'sketch/dom'; +import { Document, Rectangle, Shape, SymbolMaster } from 'sketch/dom'; import { command } from '../command'; import { syncColorStyles } from '../../sharedStyles/colors'; import { groupByKey } from '../../tools/grouping'; @@ -184,7 +178,7 @@ export function generate() { /** * Normalize a collection of icons by their basename * @param {Array} icons - * @return {Object} + * @returns {object} */ function normalize(icons) { // Collect all icons and group them by their base names. The value of the @@ -221,8 +215,8 @@ function sortBySize(a, b) { * Reference: * https://github.com/airbnb/react-sketchapp/blob/aa3070556c47883974edbc7f78978c421a8199f7/src/jsonUtils/sketchImpl/makeSvgLayer.js#L12 * - * @param {Object} svg - * @return {Layer} + * @param {object} svg + * @returns {Layer} */ function createSVGLayer(svg) { const svgString = NSString.stringWithString(toString(svg)); diff --git a/packages/sketch/src/commands/themes/generate.js b/packages/sketch/src/commands/themes/generate.js index af39a312f2af..f2babd282296 100644 --- a/packages/sketch/src/commands/themes/generate.js +++ b/packages/sketch/src/commands/themes/generate.js @@ -24,7 +24,7 @@ export function generate() { const sharedStyles = syncThemeColorStyles(document); const tokens = groupByKey(sharedStyles, sharedStyle => { - const [category, token] = sharedStyle.name.split('/'); + const [_category, token] = sharedStyle.name.split('/'); return token.trim(); }); diff --git a/packages/sketch/src/commands/type/generate.js b/packages/sketch/src/commands/type/generate.js index 781b89342de2..ef9230b25b56 100644 --- a/packages/sketch/src/commands/type/generate.js +++ b/packages/sketch/src/commands/type/generate.js @@ -5,7 +5,6 @@ * LICENSE file in the root directory of this source tree. */ -import sketch from 'sketch'; import { Document, Rectangle, Text } from 'sketch/dom'; import { command } from '../command'; import { findOrCreatePage, selectPage } from '../../tools/page'; @@ -24,7 +23,7 @@ export function generate() { let Y_OFFSET = 0; for (const sharedStyle of sharedStyles) { - const layer = new Text({ + new Text({ name: sharedStyle.name, frame: new Rectangle(0, Y_OFFSET, TEXT_LAYER_WIDTH, TEXT_LAYER_HEIGHT), style: sharedStyle.style, diff --git a/packages/sketch/src/sharedStyles/colors.js b/packages/sketch/src/sharedStyles/colors.js index e0c15f930630..a7d0454b6810 100644 --- a/packages/sketch/src/sharedStyles/colors.js +++ b/packages/sketch/src/sharedStyles/colors.js @@ -7,23 +7,12 @@ import { colors } from '@carbon/colors'; import { formatTokenName } from '@carbon/themes'; -import { SharedStyle, Style } from 'sketch/dom'; +import { Style } from 'sketch/dom'; import { syncSharedStyle } from '../tools/sharedStyles'; // We separate out certain colors that are not a part of the primary swatches // that we need to render const { black, white, orange, yellow, ...swatches } = colors; -const colorNames = Object.keys(colors); - -// Color names in JavaScript will be camelCase, so we need to map them over to -// the token name. For example: `warmGray` becomes `warm-gray` -const formattedSwatchNames = colorNames.reduce( - (acc, key, i) => ({ - ...acc, - [formatTokenName(key)]: colorNames[i], - }), - {} -); // We need to build up our expected shared styles from code to diff with what // currently exists in the document. For this case, we'll use the shared style @@ -51,7 +40,7 @@ expectedSharedStyles[formatSharedStyleName('yellow')] = yellow['20']; /** * Sync color shared styles to the given document and return the result * @param {Document} document - * @return {Array} + * @returns {Array} */ export function syncColorStyles(document) { const { sharedLayerStyles } = document; @@ -96,7 +85,7 @@ export function syncColorStyles(document) { * name for the swatch and an optional grade. * @param {string} name * @param {string?} grade - * @return {string} + * @returns {string} */ function formatSharedStyleName(name, grade) { return ['color', name, grade].filter(Boolean).join('/'); @@ -107,7 +96,7 @@ function formatSharedStyleName(name, grade) { * @param {Document} document * @param {string} name * @param {string} value - * @return {SharedStyle} + * @returns {SharedStyle} */ function syncColorStyle(document, name, value) { return syncSharedStyle(document, name, { diff --git a/packages/sketch/src/sharedStyles/themes.js b/packages/sketch/src/sharedStyles/themes.js index 6f8bb2151e12..2f26e1ddaf15 100644 --- a/packages/sketch/src/sharedStyles/themes.js +++ b/packages/sketch/src/sharedStyles/themes.js @@ -7,13 +7,13 @@ import { white, g10, g90, g100, formatTokenName } from '@carbon/themes'; import color from 'color-string'; -import { SharedStyle, Style } from 'sketch/dom'; +import { Style } from 'sketch/dom'; import { syncSharedStyle } from '../tools/sharedStyles'; /** * Sync theme color shared styles to the given document and return the result * @param {Document} document - * @return {Array} + * @returns {Array} */ export function syncThemeColorStyles(document) { const themes = { @@ -67,7 +67,7 @@ export function syncThemeColorStyles(document) { * @param {Document} document * @param {string} name * @param {string} value - * @return {SharedStyle} + * @returns {SharedStyle} */ function syncColorStyle(document, name, value) { return syncSharedStyle(document, name, { @@ -86,7 +86,7 @@ const keywords = ['ui']; * Transform a formatted token name back to its JavaScript value to look up the * expected value for a token from code * @param {string} token - * @return {string} + * @returns {string} */ function formatSymbolName(token) { const parts = token.split('-'); diff --git a/packages/sketch/src/sharedStyles/type.js b/packages/sketch/src/sharedStyles/type.js index dc466f344fa0..96d80c7f5846 100644 --- a/packages/sketch/src/sharedStyles/type.js +++ b/packages/sketch/src/sharedStyles/type.js @@ -27,7 +27,7 @@ const expressiveTokens = new Set(['display', 'quotation', 'expressive']); /** * Sync text shared styles to the given document and return the result * @param {Document} document - * @return {Array} + * @returns {Array} */ export function syncTextStyles(document) { return Object.keys(styles) @@ -58,7 +58,7 @@ export function syncTextStyles(document) { /** * Format the given token to a value for a shared style name * @param {string} token - * @return {string} + * @returns {string} */ function formatSharedStyleName(token) { const parts = formatTokenName(token).split('-'); @@ -77,8 +77,8 @@ function formatSharedStyleName(token) { /** * Convert a given token and its style to a format used by Sketch * @param {string} token - * @param {Object} style - * @return {Object} + * @param {object} style + * @returns {object} */ function convertTypeStyle(token, style) { const fontSize = parseFloat(style.fontSize, 10) * 16; diff --git a/packages/sketch/src/tools/grouping.js b/packages/sketch/src/tools/grouping.js index c606e730cfb8..bd053901dd55 100644 --- a/packages/sketch/src/tools/grouping.js +++ b/packages/sketch/src/tools/grouping.js @@ -12,7 +12,7 @@ * * @param {Array} collection * @param {Function} sorter - * @return {Array} + * @returns {Array} * @example * const array = [1, 2, 3, 4]; * const { even, odd } = groupByKey(array, number => { diff --git a/packages/sketch/src/tools/page.js b/packages/sketch/src/tools/page.js index 17f902482b12..de3b7b19d49f 100644 --- a/packages/sketch/src/tools/page.js +++ b/packages/sketch/src/tools/page.js @@ -5,13 +5,13 @@ * LICENSE file in the root directory of this source tree. */ -import { Document, Page } from 'sketch/dom'; +import { Page } from 'sketch/dom'; /** * Find or create a page for the given document context and page name * @param {Document} document * @param {string} name - * @return {Page} + * @returns {Page} */ export function findOrCreatePage(document, name) { const [page] = document.pages.filter(page => page.name === name); @@ -29,7 +29,7 @@ export function findOrCreatePage(document, name) { /** * Select the given page, making it the active page in the document * @param {Page} page - * @return {Page} + * @returns {Page} */ export function selectPage(page) { page.selected = true; diff --git a/packages/sketch/src/tools/sharedStyles.js b/packages/sketch/src/tools/sharedStyles.js index 498ea6f96170..d47677045658 100644 --- a/packages/sketch/src/tools/sharedStyles.js +++ b/packages/sketch/src/tools/sharedStyles.js @@ -11,9 +11,9 @@ import { SharedStyle } from 'sketch/dom'; * Sync a shared style within a document. * @param {Document} document * @param {string} name - * @param {Object} style + * @param {object} style * @param {StyleType?} styleType - * @return {SharedStyle} + * @returns {SharedStyle} */ export function syncSharedStyle( document, diff --git a/packages/test-utils/scss.js b/packages/test-utils/scss.js index b7213d50b193..5bcf33147865 100644 --- a/packages/test-utils/scss.js +++ b/packages/test-utils/scss.js @@ -27,7 +27,7 @@ function sassAsync(options) { * Create an importer for sass with the given `cwd`. This importer will try and * mimic the default sass resolution algorithm * @param {string} cwd - * @return {Function} + * @returns {Function} */ function createImporter(cwd) { return (url, prev, done) => { @@ -62,7 +62,7 @@ function createImporter(cwd) { * is useful so that we can resolve sass files relative to the test file. * @param {string} cwd * @param {string} initialData - optional string to prefix each render call - * @return {Function} + * @returns {Function} */ function createSassRenderer(cwd, initialData = '') { const importer = createImporter(cwd); diff --git a/packages/themes/__tests__/themes-test.js b/packages/themes/__tests__/themes-test.js index 1d32993a5c10..e9fb7f2082d0 100644 --- a/packages/themes/__tests__/themes-test.js +++ b/packages/themes/__tests__/themes-test.js @@ -10,7 +10,6 @@ 'use strict'; const { convert, createSassRenderer } = require('@carbon/test-utils/scss'); -const path = require('path'); const { formatTokenName, themes, tokens } = require('../src'); const render = createSassRenderer(__dirname); @@ -74,14 +73,14 @@ $t: test(mixin-exists(carbon--theme)); return [variable, themes[key].interactive01, test]; }); const tests = themeTests - .map(([variable, expectedColor, test]) => test) + .map(([_variable, _expectedColor, test]) => test) .join('\n'); const { calls } = await render(` @import '../scss/themes'; ${tests} `); - themeTests.forEach(([variable, expectedColor], i) => { + themeTests.forEach(([_variable, expectedColor], i) => { expect(convert(calls[i][0])).toBe(expectedColor); }); }); diff --git a/packages/themes/src/__tests__/themes-test.js b/packages/themes/src/__tests__/themes-test.js index 3c4bbf33f23f..ab6a1241e9c7 100644 --- a/packages/themes/src/__tests__/themes-test.js +++ b/packages/themes/src/__tests__/themes-test.js @@ -7,7 +7,6 @@ * @jest-environment node */ -const path = require('path'); const { themes, tokens } = require('../'); describe('themes', () => { diff --git a/packages/themes/src/tokens.js b/packages/themes/src/tokens.js index ff4ac2a015ef..c6bb3d0db4ac 100644 --- a/packages/themes/src/tokens.js +++ b/packages/themes/src/tokens.js @@ -99,7 +99,7 @@ const numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; /** * Format a given token into the format expected in CSS/SCSS-based projects. * @param {string} token - * @return {string} + * @returns {string} */ export function formatTokenName(token) { let string = ''; diff --git a/packages/themes/tasks/build.js b/packages/themes/tasks/build.js index 3e431a4ee29f..4937f9be2738 100644 --- a/packages/themes/tasks/build.js +++ b/packages/themes/tasks/build.js @@ -5,6 +5,8 @@ * LICENSE file in the root directory of this source tree. */ +/* eslint-disable no-console */ + 'use strict'; require('core-js/features/array/flat-map'); @@ -197,8 +199,8 @@ build().catch(error => { /** * Transform token names to formats expected by Sassdoc for descriptions and * aliases - * @param {Object} - token metadata - * @return {Object} token metadata + * @param {object} metadata - token metadata + * @returns {object} token metadata */ function transformMetadata(metadata) { const namesRegEx = new RegExp( diff --git a/packages/type/src/fluid.js b/packages/type/src/fluid.js index 53fea7c2c068..76b2fec2bb1d 100644 --- a/packages/type/src/fluid.js +++ b/packages/type/src/fluid.js @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. */ -import { breakpoint as bp, breakpoints, rem } from '@carbon/layout'; +import { breakpoint as bp, breakpoints } from '@carbon/layout'; const breakpointNames = Object.keys(breakpoints); diff --git a/packages/type/src/styles.js b/packages/type/src/styles.js index 976ff179be44..cfe27b8e9b74 100644 --- a/packages/type/src/styles.js +++ b/packages/type/src/styles.js @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. */ -import { breakpoint, breakpoints, px, rem } from '@carbon/layout'; +import { px, rem } from '@carbon/layout'; import { fluid } from './fluid'; import { fontWeights } from './fontWeight'; import { scale } from './scale'; diff --git a/yarn.lock b/yarn.lock index 2ada0cbe5ea2..5255ad457c77 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4271,15 +4271,6 @@ babel-eslint@^10.0.1: eslint-scope "3.7.1" eslint-visitor-keys "^1.0.0" -babel-eslint@^7.0.0: - version "7.2.3" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827" - dependencies: - babel-code-frame "^6.22.0" - babel-traverse "^6.23.1" - babel-types "^6.23.0" - babylon "^6.17.0" - babel-generator@^6.18.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" @@ -4747,7 +4738,7 @@ babel-template@^6.16.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.26.0: +babel-traverse@^6.18.0, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" dependencies: @@ -4761,7 +4752,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.26.0: invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.18.0, babel-types@^6.23.0, babel-types@^6.26.0: +babel-types@^6.18.0, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: @@ -4774,7 +4765,7 @@ babylon@7.0.0-beta.19: version "7.0.0-beta.19" resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.19.tgz#e928c7e807e970e0536b078ab3e0c48f9e052503" -babylon@^6.17.0, babylon@^6.18.0: +babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -8270,16 +8261,6 @@ eslint-config-airbnb@^17.0.0: object.assign "^4.1.0" object.entries "^1.0.4" -eslint-config-carbon-base@^1.0.0, eslint-config-carbon-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/eslint-config-carbon-base/-/eslint-config-carbon-base-1.0.1.tgz#3cc3a930202889be4d2bf6bb223eea7c3dda389a" - -eslint-config-carbon@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/eslint-config-carbon/-/eslint-config-carbon-1.0.2.tgz#4af1cefb679d4c88bb1bff5159d692d903d55df2" - dependencies: - eslint-config-carbon-base "^1.0.0" - eslint-config-prettier@^3.0.0: version "3.6.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-3.6.0.tgz#8ca3ffac4bd6eeef623a0651f9d754900e3ec217" @@ -8329,10 +8310,10 @@ eslint-plugin-jsdoc@^3.3.0: jsdoctypeparser "^2.0.0-alpha-8" lodash "^4.17.11" -eslint-plugin-jsdoc@^4.8.3: - version "4.8.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-4.8.4.tgz#31f413c8a31fe656881398d8920b381bfdfac618" - integrity sha512-VDP+BI2hWpKNNdsJDSPofSQ9q7jGLgWbDMI0LzOeEcfsTjSS7jQtHDUuVLQ5E+OV2MPyQPk/3lnVcHfStXk5yA== +eslint-plugin-jsdoc@^7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-7.2.3.tgz#04d21890cdadf33290f865b27f2f901f1321aa42" + integrity sha512-233HUc5ftIlmswaNmck++gkoW2iubcDDbM4KCzTHaawJFODuTNriDmZyKm8+7GgNnnwlkrE0mmD4TCzrdMTnsA== dependencies: comment-parser "^0.5.4" jsdoctypeparser "3.1.0" @@ -8359,7 +8340,7 @@ eslint-plugin-prettier@^2.3.1: fast-diff "^1.1.1" jest-docblock "^21.0.0" -eslint-plugin-react@^7.11.0, eslint-plugin-react@^7.12.4: +eslint-plugin-react@^7.11.0, eslint-plugin-react@^7.13.0: version "7.13.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.13.0.tgz#bc13fd7101de67996ea51b33873cd9dc2b7e5758" integrity sha512-uA5LrHylu8lW/eAH3bEQe9YdzpPaFd9yAJTwTi/i/BKTD7j6aQMKVAdGM/ML72zD6womuSK7EiGtMKuK06lWjQ== @@ -8440,7 +8421,7 @@ eslint@^2.7.0: text-table "~0.2.0" user-home "^2.0.0" -eslint@^5.0.0, eslint@^5.16.0: +eslint@^5.16.0: version "5.16.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== @@ -16471,7 +16452,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^1.16.4: +prettier@^1.16.4, prettier@^1.18.2: version "1.18.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== @@ -16481,11 +16462,6 @@ prettier@^1.17.0: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.17.1.tgz#ed64b4e93e370cb8a25b9ef7fef3e4fd1c0995db" integrity sha512-TzGRNvuUSmPgwivDqkZ9tM/qTGW9hqDKWOE9YHiyQdixlKbv7kvEqsmDPrcHJTKwthU774TQwZXVtaQ/mMsvjg== -prettier@^1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" - integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== - pretty-error@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3"