diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000..861b6974 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,31 @@ +version: 2.1 + +executors: + node-docker-executor: + docker: + - image: cimg/node:18.20.4-browsers + working_directory: ~/project + +jobs: + # Job to publish to npm + npm-publish: + executor: node-docker-executor + steps: + - checkout + - run: + name: Install dependencies + command: yarn install + - run: + name: Set Up npm Credentials + command: | + echo "//registry.npmjs.org/:_authToken=$NPM_AUTH_TOKEN" > ~/.npmrc + - run: + name: Publish to npm + command: | + npm publish + +workflows: + version: 2 + publish: + jobs: + - npm-publish \ No newline at end of file diff --git a/.gitignore b/.gitignore index 12cddb2a..f51c73fb 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ # IDE .vscode +.idea # Lib /dist diff --git a/README.md b/README.md index f9323dab..fccda73b 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ -# @modusbox/react-components +# @pm4ml/react-components A collection of React components for the frontend apps.

-To install the module run `yarn add @modusbox/react-components`. +To install the module run `yarn add @pm4ml/react-components`. -Documentation is available at [https://modusintegration.github.io/react-components](https://modusintegration.github.io/react-components) +Documentation is available at [https://github.com/pm4ml/react-components](https://github.com/pm4ml/react-components) ### Development diff --git a/package.json b/package.json index c0b047db..502d64e8 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,19 @@ { - "name": "@modusbox/react-components", - "version": "0.1.9", + "name": "@pm4ml/react-components", + "version": "0.1.10", "main": "lib/index.js", "author": "Ivan Annovazzi ", "module": "lib/index.esm.js", - "license": "MIT", + "license": "Apache-2.0", "types": "lib/index.d.ts", "files": [ "lib" ], + "publishConfig": { + "access": "public" + }, "dependencies": { - "@modusbox/ts-utils": "^0.0.4", + "@pm4ml/ts-utils": "^0.0.6", "babel-plugin-react-docgen": "^4.2.1", "bootstrap-icons": "^1.5.0", "date-fns": "^2.21.3", @@ -56,12 +59,12 @@ "prettier": "^2.2.1", "prettier-eslint": "^12.0.0", "prettier-eslint-cli": "^5.0.1", - "rollup": "^2.45.2", + "rollup": "2.79.2", "rollup-plugin-copy": "^3.4.0", "rollup-plugin-peer-deps-external": "^2.2.4", "rollup-plugin-sass": "^1.2.2", "rollup-plugin-terser": "^7.0.2", - "rollup-plugin-typescript2": "^0.30.0", + "rollup-plugin-typescript2": "^0.36.0", "sass": "^1.34.0", "sass-loader": "10", "storybook": "6.3.7", diff --git a/src/README.md b/src/README.md index 86bd3887..f60c4e09 100644 --- a/src/README.md +++ b/src/README.md @@ -1,10 +1,10 @@ -# @modusbox/react-components +# @pm4ml/react-components A collection of Typescript utilities for the frontend apps. ### Installation -To install the module simply run `yarn add @modusbox/react-components`. +To install the module simply run `yarn add @pm4ml/react-components`. ### Importing the styles @@ -16,7 +16,7 @@ The library allows to import the single bundled CSS file or to extend the SCSS s #### CSS All you need to do is to import the styles by including the `index.css`: ```ts -import '@modusbox/react-components/lib/index.css'; +import '@pm4ml/react-components/lib/index.css'; ``` #### SCSS @@ -30,7 +30,7 @@ You need to create your own SCSS file and import the `index.scss` from there: colors.$primary: #f00; // import the scss -@import 'node_modules/@modusbox/react-components/lib/index.scss'; +@import 'node_modules/@pm4ml/react-components/lib/index.scss'; ``` diff --git a/src/components/FileUploader/FileUploader.tsx b/src/components/FileUploader/FileUploader.tsx index 8c8bd279..b1230672 100644 --- a/src/components/FileUploader/FileUploader.tsx +++ b/src/components/FileUploader/FileUploader.tsx @@ -1,7 +1,7 @@ import React from "react"; import classnames from "classnames"; -import readFileAsText from "@modusbox/ts-utils/lib/file/readFileAsText"; -import readFileAsBase64 from "@modusbox/ts-utils/lib/file/readFileAsBase64"; +import readFileAsText from "@pm4ml/ts-utils/lib/file/readFileAsText"; +import readFileAsBase64 from "@pm4ml/ts-utils/lib/file/readFileAsBase64"; import Field, { Loader, Placeholder, InvalidIcon } from "components/Field"; import FolderPlusIcon from "bootstrap-icons/icons/folder-plus.svg"; import TrashIcon from "bootstrap-icons/icons/trash.svg"; diff --git a/src/docs/components/ValidationForm/index.tsx b/src/docs/components/ValidationForm/index.tsx index 555bc408..fa850f07 100644 --- a/src/docs/components/ValidationForm/index.tsx +++ b/src/docs/components/ValidationForm/index.tsx @@ -5,7 +5,7 @@ import { createValidation, vd, toValidationResult, -} from "@modusbox/ts-utils/lib/validation"; +} from "@pm4ml/ts-utils/lib/validation"; const formValidation = { name: createValidation([vd.maxLength(10)]), diff --git a/src/docs/guidelines/HowToInstall.stories.mdx b/src/docs/guidelines/HowToInstall.stories.mdx index cce94b4c..5ac8b6d4 100644 --- a/src/docs/guidelines/HowToInstall.stories.mdx +++ b/src/docs/guidelines/HowToInstall.stories.mdx @@ -8,12 +8,12 @@ Install the library as npm module in your project: - using yarn ```bash -yarn add @modusbox/react-components +yarn add @pm4ml/react-components ``` - Using npm ```bash -npm i @modusbox/react-components +npm i @pm4ml/react-components ``` **Note**: This library is built using `React 17` - while it should be retro compatible, it's suggested to use a modern version of React to avoid problems. \ No newline at end of file diff --git a/src/docs/guidelines/HowToStyle.stories.mdx b/src/docs/guidelines/HowToStyle.stories.mdx index 0f84f0d0..0264a732 100644 --- a/src/docs/guidelines/HowToStyle.stories.mdx +++ b/src/docs/guidelines/HowToStyle.stories.mdx @@ -20,10 +20,10 @@ The easiest and most powerful way is to use SCSS. You can import variables and themes and use them with minimal effort, without worrying about anything else. -Simply import the entrypoint `@modusbox/react-components/lib/index.scss` and you are ready to go. +Simply import the entrypoint `@pm4ml/react-components/lib/index.scss` and you are ready to go. ```css -@import "@modusbox/react-components/lib/index.scss"; +@import "@pm4ml/react-components/lib/index.scss"; .box { background: colors.$primary; @@ -43,7 +43,7 @@ Import the CSS bundle ```tsx // component file .js, .jsx, .ts, .tsx -import "@modusbox/react-components/lib/index.css"; +import "@pm4ml/react-components/lib/index.css"; ``` Use the variable in your stylesheet diff --git a/src/docs/guidelines/HowToUse.stories.mdx b/src/docs/guidelines/HowToUse.stories.mdx index f714eeb5..cfd1b071 100644 --- a/src/docs/guidelines/HowToUse.stories.mdx +++ b/src/docs/guidelines/HowToUse.stories.mdx @@ -9,10 +9,10 @@ import ThemeForm from 'docs/components/ThemeForm'; ## Usage -First import the components you need in your modules from `@modusbox/react-components` module: +First import the components you need in your modules from `@pm4ml/react-components` module: ```tsx -import { Row, Button, Checkbox } from '@modusbox/react-components'; +import { Row, Button, Checkbox } from '@pm4ml/react-components'; ``` then you can just se them as regular React components: diff --git a/src/docs/guidelines/UsingTheVariables.stories.mdx b/src/docs/guidelines/UsingTheVariables.stories.mdx index a5545eae..451456dc 100644 --- a/src/docs/guidelines/UsingTheVariables.stories.mdx +++ b/src/docs/guidelines/UsingTheVariables.stories.mdx @@ -12,7 +12,7 @@ First, import the scss module and pass variables to it: ```css /* override.scss */ -@use "@modusbox/react-components/lib/scss/base/colors" with(colors.$primary: #f00); +@use "@pm4ml/react-components/lib/scss/base/colors" with(colors.$primary: #f00); ``` diff --git a/src/hocs/withValidation/ValidationCard.tsx b/src/hocs/withValidation/ValidationCard.tsx index 73835142..57f8576e 100644 --- a/src/hocs/withValidation/ValidationCard.tsx +++ b/src/hocs/withValidation/ValidationCard.tsx @@ -1,7 +1,7 @@ import classnames from "classnames"; import Row from "components/Flexbox/Row"; import Icon from "components/Icon"; -import { ValidationMessage } from "@modusbox/ts-utils/lib/validation"; +import { ValidationMessage } from "@pm4ml/ts-utils/lib/validation"; import Check from "bootstrap-icons/icons/check.svg"; import X from "bootstrap-icons/icons/x.svg"; import "./ValidationCard.scss"; diff --git a/src/hocs/withValidation/index.tsx b/src/hocs/withValidation/index.tsx index ae155783..002ca975 100644 --- a/src/hocs/withValidation/index.tsx +++ b/src/hocs/withValidation/index.tsx @@ -1,6 +1,6 @@ import React from "react"; import Tooltip from "components/Tooltip"; -import { ValidationResult } from "@modusbox/ts-utils/lib/validation"; +import { ValidationResult } from "@pm4ml/ts-utils/lib/validation"; import ValidationCard from "./ValidationCard"; interface BaseProps { diff --git a/yarn.lock b/yarn.lock index 299b843b..5e36cc6d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1747,13 +1747,6 @@ resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== -"@modusbox/ts-utils@^0.0.4": - version "0.0.4" - resolved "https://registry.yarnpkg.com/@modusbox/ts-utils/-/ts-utils-0.0.4.tgz#3f60f61066576cc07dff35adfc5a754d9cdc63f6" - integrity sha512-bC6MZ1Do0w0bJyy1A/g9/beJplunWbuGvtthd2Y69JlI0xM4ObihA6/VcVzdJfV/f0rsLz5lh7BXJS/FXojGUg== - dependencies: - lodash "^4.17.21" - "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -1796,6 +1789,13 @@ mkdirp "^1.0.4" rimraf "^3.0.2" +"@pm4ml/ts-utils@^0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@pm4ml/ts-utils/-/ts-utils-0.0.6.tgz#3727b2d6ccc5f665aa5b2a62e6f78bbef014de59" + integrity sha512-LmvaiY5xnmPzh/qTPFpSvINaSKBUBOa2smI0WJ8Z3ig9Z2gldPLO0SKaj6jAFjs5PM1sdk+AwZ6lOnq5gzv7HA== + dependencies: + lodash "^4.17.21" + "@pmmmwh/react-refresh-webpack-plugin@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz#1eec460596d200c0236bf195b078a5d1df89b766" @@ -1865,10 +1865,10 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@rollup/pluginutils@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.1.0.tgz#0dcc61c780e39257554feb7f77207dceca13c838" - integrity sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ== +"@rollup/pluginutils@^4.1.2": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" + integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== dependencies: estree-walker "^2.0.1" picomatch "^2.2.2" @@ -6744,6 +6744,15 @@ find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" +find-cache-dir@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + find-root@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" @@ -6908,15 +6917,6 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" -fs-extra@8.1.0, fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" @@ -6928,6 +6928,24 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^9.0.0, fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -6978,6 +6996,11 @@ fsevents@^2.1.2, fsevents@~2.3.1: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -7089,8 +7112,6 @@ getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" github-slugger@^1.0.0: version "1.3.0" @@ -11757,7 +11778,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.20.0, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.5.0: +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.5.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -11873,16 +11894,16 @@ rollup-plugin-terser@^7.0.2: serialize-javascript "^4.0.0" terser "^5.0.0" -rollup-plugin-typescript2@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.30.0.tgz#1cc99ac2309bf4b9d0a3ebdbc2002aecd56083d3" - integrity sha512-NUFszIQyhgDdhRS9ya/VEmsnpTe+GERDMmFo0Y+kf8ds51Xy57nPNGglJY+W6x1vcouA7Au7nsTgsLFj2I0PxQ== +rollup-plugin-typescript2@^0.36.0: + version "0.36.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.36.0.tgz#309564eb70d710412f5901344ca92045e180ed53" + integrity sha512-NB2CSQDxSe9+Oe2ahZbf+B4bh7pHwjV5L+RSYpCu7Q5ROuN94F9b6ioWwKfz3ueL3KTtmX4o2MUH2cgHDIEUsw== dependencies: - "@rollup/pluginutils" "^4.1.0" - find-cache-dir "^3.3.1" - fs-extra "8.1.0" - resolve "1.20.0" - tslib "2.1.0" + "@rollup/pluginutils" "^4.1.2" + find-cache-dir "^3.3.2" + fs-extra "^10.0.0" + semver "^7.5.4" + tslib "^2.6.2" "rollup-pluginutils@>= 1.3.1", rollup-pluginutils@^2.8.2: version "2.8.2" @@ -11891,12 +11912,12 @@ rollup-plugin-typescript2@^0.30.0: dependencies: estree-walker "^0.6.1" -rollup@^2.45.2: - version "2.46.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.46.0.tgz#8cacf89d2ee31a34755f1af40a665168f592b829" - integrity sha512-qPGoUBNl+Z8uNu0z7pD3WPTABWRbcOwIrO/5ccDJzmrtzn0LVf6Lj91+L5CcWhXl6iWf23FQ6m8Jkl2CmN1O7Q== +rollup@2.79.2: + version "2.79.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.2.tgz#f150e4a5db4b121a21a747d762f701e5e9f49090" + integrity sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ== optionalDependencies: - fsevents "~2.3.1" + fsevents "~2.3.2" rsvp@^4.8.4: version "4.8.5" @@ -12096,6 +12117,11 @@ semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: dependencies: lru-cache "^6.0.0" +semver@^7.5.4: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -13237,11 +13263,6 @@ tsconfig-paths@^3.9.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" - integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== - tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -13252,6 +13273,11 @@ tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== +tslib@^2.6.2: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + tsutils@^3.17.1: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"