diff --git a/.yarn/cache/@babel-code-frame-npm-7.18.6-25229a7e34-195e2be317.zip b/.yarn/cache/@babel-code-frame-npm-7.18.6-25229a7e34-195e2be317.zip deleted file mode 100644 index c03a5083d..000000000 Binary files a/.yarn/cache/@babel-code-frame-npm-7.18.6-25229a7e34-195e2be317.zip and /dev/null differ diff --git a/.yarn/cache/@babel-code-frame-npm-7.21.4-5db83e65be-e5390e6ec1.zip b/.yarn/cache/@babel-code-frame-npm-7.21.4-5db83e65be-e5390e6ec1.zip new file mode 100644 index 000000000..06ffff590 Binary files /dev/null and b/.yarn/cache/@babel-code-frame-npm-7.21.4-5db83e65be-e5390e6ec1.zip differ diff --git a/.yarn/cache/@babel-compat-data-npm-7.21.0-8983856f86-dbf632c532.zip b/.yarn/cache/@babel-compat-data-npm-7.21.4-6e6abd0eab-5f8b98c66f.zip similarity index 91% rename from .yarn/cache/@babel-compat-data-npm-7.21.0-8983856f86-dbf632c532.zip rename to .yarn/cache/@babel-compat-data-npm-7.21.4-6e6abd0eab-5f8b98c66f.zip index 951182f25..4ebc4141a 100644 Binary files a/.yarn/cache/@babel-compat-data-npm-7.21.0-8983856f86-dbf632c532.zip and b/.yarn/cache/@babel-compat-data-npm-7.21.4-6e6abd0eab-5f8b98c66f.zip differ diff --git a/.yarn/cache/@babel-core-npm-7.21.3-625d9d4efe-bef25fbea9.zip b/.yarn/cache/@babel-core-npm-7.21.4-04ac4d28a7-a3beebb2cc.zip similarity index 88% rename from .yarn/cache/@babel-core-npm-7.21.3-625d9d4efe-bef25fbea9.zip rename to .yarn/cache/@babel-core-npm-7.21.4-04ac4d28a7-a3beebb2cc.zip index e73f83696..ed51c55b7 100644 Binary files a/.yarn/cache/@babel-core-npm-7.21.3-625d9d4efe-bef25fbea9.zip and b/.yarn/cache/@babel-core-npm-7.21.4-04ac4d28a7-a3beebb2cc.zip differ diff --git a/.yarn/cache/@babel-generator-npm-7.21.3-176ee60a78-be6bb5a32a.zip b/.yarn/cache/@babel-generator-npm-7.21.4-4ab6c9c2f0-9ffbb526a5.zip similarity index 82% rename from .yarn/cache/@babel-generator-npm-7.21.3-176ee60a78-be6bb5a32a.zip rename to .yarn/cache/@babel-generator-npm-7.21.4-4ab6c9c2f0-9ffbb526a5.zip index 530486864..016bba651 100644 Binary files a/.yarn/cache/@babel-generator-npm-7.21.3-176ee60a78-be6bb5a32a.zip and b/.yarn/cache/@babel-generator-npm-7.21.4-4ab6c9c2f0-9ffbb526a5.zip differ diff --git a/.yarn/cache/@babel-helper-compilation-targets-npm-7.20.7-fbd2fdfc71-8c32c873ba.zip b/.yarn/cache/@babel-helper-compilation-targets-npm-7.20.7-fbd2fdfc71-8c32c873ba.zip deleted file mode 100644 index d27b0fa5d..000000000 Binary files a/.yarn/cache/@babel-helper-compilation-targets-npm-7.20.7-fbd2fdfc71-8c32c873ba.zip and /dev/null differ diff --git a/.yarn/cache/@babel-helper-compilation-targets-npm-7.21.4-0264973d6a-bf9c7d3e7e.zip b/.yarn/cache/@babel-helper-compilation-targets-npm-7.21.4-0264973d6a-bf9c7d3e7e.zip new file mode 100644 index 000000000..98d873a36 Binary files /dev/null and b/.yarn/cache/@babel-helper-compilation-targets-npm-7.21.4-0264973d6a-bf9c7d3e7e.zip differ diff --git a/.yarn/cache/@babel-helper-create-class-features-plugin-npm-7.21.0-b18dd6fe4a-3e781d91d1.zip b/.yarn/cache/@babel-helper-create-class-features-plugin-npm-7.21.0-b18dd6fe4a-3e781d91d1.zip deleted file mode 100644 index 4c06a04bc..000000000 Binary files a/.yarn/cache/@babel-helper-create-class-features-plugin-npm-7.21.0-b18dd6fe4a-3e781d91d1.zip and /dev/null differ diff --git a/.yarn/cache/@babel-helper-create-class-features-plugin-npm-7.21.4-37a2dec525-9123ca80a4.zip b/.yarn/cache/@babel-helper-create-class-features-plugin-npm-7.21.4-37a2dec525-9123ca80a4.zip new file mode 100644 index 000000000..ebdc02569 Binary files /dev/null and b/.yarn/cache/@babel-helper-create-class-features-plugin-npm-7.21.4-37a2dec525-9123ca80a4.zip differ diff --git a/.yarn/cache/@babel-helper-create-regexp-features-plugin-npm-7.21.0-9ba0fedaa5-63a6396a4e.zip b/.yarn/cache/@babel-helper-create-regexp-features-plugin-npm-7.21.0-9ba0fedaa5-63a6396a4e.zip deleted file mode 100644 index ce5009450..000000000 Binary files a/.yarn/cache/@babel-helper-create-regexp-features-plugin-npm-7.21.0-9ba0fedaa5-63a6396a4e.zip and /dev/null differ diff --git a/.yarn/cache/@babel-helper-create-regexp-features-plugin-npm-7.21.4-27f1863397-78334865db.zip b/.yarn/cache/@babel-helper-create-regexp-features-plugin-npm-7.21.4-27f1863397-78334865db.zip new file mode 100644 index 000000000..5b6b1be71 Binary files /dev/null and b/.yarn/cache/@babel-helper-create-regexp-features-plugin-npm-7.21.4-27f1863397-78334865db.zip differ diff --git a/.yarn/cache/@babel-helper-module-imports-npm-7.18.6-1031faa864-f393f8a3b3.zip b/.yarn/cache/@babel-helper-module-imports-npm-7.18.6-1031faa864-f393f8a3b3.zip deleted file mode 100644 index 976aaef14..000000000 Binary files a/.yarn/cache/@babel-helper-module-imports-npm-7.18.6-1031faa864-f393f8a3b3.zip and /dev/null differ diff --git a/.yarn/cache/@babel-helper-module-imports-npm-7.21.4-e4cd6b4e21-bd330a2eda.zip b/.yarn/cache/@babel-helper-module-imports-npm-7.21.4-e4cd6b4e21-bd330a2eda.zip new file mode 100644 index 000000000..97cab9364 Binary files /dev/null and b/.yarn/cache/@babel-helper-module-imports-npm-7.21.4-e4cd6b4e21-bd330a2eda.zip differ diff --git a/.yarn/cache/@babel-parser-npm-7.21.3-0ad17a2817-a71e6456a1.zip b/.yarn/cache/@babel-parser-npm-7.21.3-0ad17a2817-a71e6456a1.zip deleted file mode 100644 index 303337c35..000000000 Binary files a/.yarn/cache/@babel-parser-npm-7.21.3-0ad17a2817-a71e6456a1.zip and /dev/null differ diff --git a/.yarn/cache/@babel-parser-npm-7.21.4-edab9c197b-de610ecd1b.zip b/.yarn/cache/@babel-parser-npm-7.21.4-edab9c197b-de610ecd1b.zip new file mode 100644 index 000000000..e8b26bfda Binary files /dev/null and b/.yarn/cache/@babel-parser-npm-7.21.4-edab9c197b-de610ecd1b.zip differ diff --git a/.yarn/cache/@babel-plugin-syntax-jsx-npm-7.18.6-3e378d5f11-6d37ea9729.zip b/.yarn/cache/@babel-plugin-syntax-jsx-npm-7.18.6-3e378d5f11-6d37ea9729.zip deleted file mode 100644 index 74e94e66e..000000000 Binary files a/.yarn/cache/@babel-plugin-syntax-jsx-npm-7.18.6-3e378d5f11-6d37ea9729.zip and /dev/null differ diff --git a/.yarn/cache/@babel-plugin-syntax-jsx-npm-7.21.4-52d55c7a43-bb7309402a.zip b/.yarn/cache/@babel-plugin-syntax-jsx-npm-7.21.4-52d55c7a43-bb7309402a.zip new file mode 100644 index 000000000..b56ee6dfc Binary files /dev/null and b/.yarn/cache/@babel-plugin-syntax-jsx-npm-7.21.4-52d55c7a43-bb7309402a.zip differ diff --git a/.yarn/cache/@babel-plugin-syntax-typescript-npm-7.20.0-21fa6329fe-6189c0b5c3.zip b/.yarn/cache/@babel-plugin-syntax-typescript-npm-7.20.0-21fa6329fe-6189c0b5c3.zip deleted file mode 100644 index 681583351..000000000 Binary files a/.yarn/cache/@babel-plugin-syntax-typescript-npm-7.20.0-21fa6329fe-6189c0b5c3.zip and /dev/null differ diff --git a/.yarn/cache/@babel-plugin-syntax-typescript-npm-7.21.4-bcb1097f7e-a59ce2477b.zip b/.yarn/cache/@babel-plugin-syntax-typescript-npm-7.21.4-bcb1097f7e-a59ce2477b.zip new file mode 100644 index 000000000..996cb8c37 Binary files /dev/null and b/.yarn/cache/@babel-plugin-syntax-typescript-npm-7.21.4-bcb1097f7e-a59ce2477b.zip differ diff --git a/.yarn/cache/@babel-plugin-transform-runtime-npm-7.21.0-d8026c827b-6c9d655bef.zip b/.yarn/cache/@babel-plugin-transform-runtime-npm-7.21.0-d8026c827b-6c9d655bef.zip deleted file mode 100644 index fdb2a2d71..000000000 Binary files a/.yarn/cache/@babel-plugin-transform-runtime-npm-7.21.0-d8026c827b-6c9d655bef.zip and /dev/null differ diff --git a/.yarn/cache/@babel-plugin-transform-runtime-npm-7.21.4-ff444b8bf1-7e2e6b0d6f.zip b/.yarn/cache/@babel-plugin-transform-runtime-npm-7.21.4-ff444b8bf1-7e2e6b0d6f.zip new file mode 100644 index 000000000..d6b21f055 Binary files /dev/null and b/.yarn/cache/@babel-plugin-transform-runtime-npm-7.21.4-ff444b8bf1-7e2e6b0d6f.zip differ diff --git a/.yarn/cache/@babel-preset-env-npm-7.20.2-dc79b8dadc-ece2d7e9c7.zip b/.yarn/cache/@babel-preset-env-npm-7.20.2-dc79b8dadc-ece2d7e9c7.zip deleted file mode 100644 index 523e26398..000000000 Binary files a/.yarn/cache/@babel-preset-env-npm-7.20.2-dc79b8dadc-ece2d7e9c7.zip and /dev/null differ diff --git a/.yarn/cache/@babel-preset-env-npm-7.21.4-7df9608121-1e328674c4.zip b/.yarn/cache/@babel-preset-env-npm-7.21.4-7df9608121-1e328674c4.zip new file mode 100644 index 000000000..f0661bfad Binary files /dev/null and b/.yarn/cache/@babel-preset-env-npm-7.21.4-7df9608121-1e328674c4.zip differ diff --git a/.yarn/cache/@babel-preset-typescript-npm-7.21.0-6711194f4c-6e1f4d7294.zip b/.yarn/cache/@babel-preset-typescript-npm-7.21.0-6711194f4c-6e1f4d7294.zip deleted file mode 100644 index 43638ff7a..000000000 Binary files a/.yarn/cache/@babel-preset-typescript-npm-7.21.0-6711194f4c-6e1f4d7294.zip and /dev/null differ diff --git a/.yarn/cache/@babel-preset-typescript-npm-7.21.4-281692be04-83b2f2bf7b.zip b/.yarn/cache/@babel-preset-typescript-npm-7.21.4-281692be04-83b2f2bf7b.zip new file mode 100644 index 000000000..6bd288f74 Binary files /dev/null and b/.yarn/cache/@babel-preset-typescript-npm-7.21.4-281692be04-83b2f2bf7b.zip differ diff --git a/.yarn/cache/@babel-traverse-npm-7.21.3-b3b3d9c94e-0af5bcd47a.zip b/.yarn/cache/@babel-traverse-npm-7.21.4-0fc91c1e5e-f22f067c2d.zip similarity index 91% rename from .yarn/cache/@babel-traverse-npm-7.21.3-b3b3d9c94e-0af5bcd47a.zip rename to .yarn/cache/@babel-traverse-npm-7.21.4-0fc91c1e5e-f22f067c2d.zip index 91ea437c1..88a3b2f7c 100644 Binary files a/.yarn/cache/@babel-traverse-npm-7.21.3-b3b3d9c94e-0af5bcd47a.zip and b/.yarn/cache/@babel-traverse-npm-7.21.4-0fc91c1e5e-f22f067c2d.zip differ diff --git a/.yarn/cache/@babel-types-npm-7.21.3-2a27aede05-b750274718.zip b/.yarn/cache/@babel-types-npm-7.21.4-ee756f419d-587bc55a91.zip similarity index 99% rename from .yarn/cache/@babel-types-npm-7.21.3-2a27aede05-b750274718.zip rename to .yarn/cache/@babel-types-npm-7.21.4-ee756f419d-587bc55a91.zip index a38e09000..cfe65adf9 100644 Binary files a/.yarn/cache/@babel-types-npm-7.21.3-2a27aede05-b750274718.zip and b/.yarn/cache/@babel-types-npm-7.21.4-ee756f419d-587bc55a91.zip differ diff --git a/.yarn/cache/@eslint-community-regexpp-npm-4.4.1-44c7391499-db97d8d08e.zip b/.yarn/cache/@eslint-community-regexpp-npm-4.4.1-44c7391499-db97d8d08e.zip deleted file mode 100644 index 7399004e8..000000000 Binary files a/.yarn/cache/@eslint-community-regexpp-npm-4.4.1-44c7391499-db97d8d08e.zip and /dev/null differ diff --git a/.yarn/cache/@eslint-community-regexpp-npm-4.5.0-ee069447ee-99c0133594.zip b/.yarn/cache/@eslint-community-regexpp-npm-4.5.0-ee069447ee-99c0133594.zip new file mode 100644 index 000000000..5ad573a28 Binary files /dev/null and b/.yarn/cache/@eslint-community-regexpp-npm-4.5.0-ee069447ee-99c0133594.zip differ diff --git a/.yarn/cache/@hutson-parse-repository-url-npm-3.0.2-ae5ef1b671-39992c5f18.zip b/.yarn/cache/@hutson-parse-repository-url-npm-3.0.2-ae5ef1b671-39992c5f18.zip deleted file mode 100644 index 62c9ed24d..000000000 Binary files a/.yarn/cache/@hutson-parse-repository-url-npm-3.0.2-ae5ef1b671-39992c5f18.zip and /dev/null differ diff --git a/.yarn/cache/@types-conventional-changelog-config-spec-npm-2.1.2-cab42aaf21-2a5bf822d6.zip b/.yarn/cache/@types-conventional-changelog-config-spec-npm-2.1.2-cab42aaf21-2a5bf822d6.zip deleted file mode 100644 index fc0d8bb2a..000000000 Binary files a/.yarn/cache/@types-conventional-changelog-config-spec-npm-2.1.2-cab42aaf21-2a5bf822d6.zip and /dev/null differ diff --git a/.yarn/cache/@types-conventional-changelog-core-npm-4.2.1-8006ee76bd-bd8557c1cb.zip b/.yarn/cache/@types-conventional-changelog-core-npm-4.2.1-8006ee76bd-bd8557c1cb.zip deleted file mode 100644 index 984947f0b..000000000 Binary files a/.yarn/cache/@types-conventional-changelog-core-npm-4.2.1-8006ee76bd-bd8557c1cb.zip and /dev/null differ diff --git a/.yarn/cache/@types-conventional-changelog-npm-3.1.1-ea1bab2ff4-9278f6603f.zip b/.yarn/cache/@types-conventional-changelog-npm-3.1.1-ea1bab2ff4-9278f6603f.zip deleted file mode 100644 index 56dac333a..000000000 Binary files a/.yarn/cache/@types-conventional-changelog-npm-3.1.1-ea1bab2ff4-9278f6603f.zip and /dev/null differ diff --git a/.yarn/cache/@types-conventional-changelog-writer-npm-4.0.2-6948cdb713-e992a0847f.zip b/.yarn/cache/@types-conventional-changelog-writer-npm-4.0.2-6948cdb713-e992a0847f.zip deleted file mode 100644 index c53243ebf..000000000 Binary files a/.yarn/cache/@types-conventional-changelog-writer-npm-4.0.2-6948cdb713-e992a0847f.zip and /dev/null differ diff --git a/.yarn/cache/@types-conventional-commits-parser-npm-3.0.3-59e5d7b43d-d40c068538.zip b/.yarn/cache/@types-conventional-commits-parser-npm-3.0.3-59e5d7b43d-d40c068538.zip deleted file mode 100644 index 352bef38d..000000000 Binary files a/.yarn/cache/@types-conventional-commits-parser-npm-3.0.3-59e5d7b43d-d40c068538.zip and /dev/null differ diff --git a/.yarn/cache/@types-conventional-recommended-bump-npm-6.1.0-be55f272c7-123c0d7a3b.zip b/.yarn/cache/@types-conventional-recommended-bump-npm-6.1.0-be55f272c7-123c0d7a3b.zip deleted file mode 100644 index a5a7e079b..000000000 Binary files a/.yarn/cache/@types-conventional-recommended-bump-npm-6.1.0-be55f272c7-123c0d7a3b.zip and /dev/null differ diff --git a/.yarn/cache/@types-git-raw-commits-npm-2.0.1-917977ae5e-b5d41433a5.zip b/.yarn/cache/@types-git-raw-commits-npm-2.0.1-917977ae5e-b5d41433a5.zip deleted file mode 100644 index c2a0753a3..000000000 Binary files a/.yarn/cache/@types-git-raw-commits-npm-2.0.1-917977ae5e-b5d41433a5.zip and /dev/null differ diff --git a/.yarn/cache/@types-glob-npm-8.1.0-bdb9d0520c-9101f3a906.zip b/.yarn/cache/@types-glob-npm-8.1.0-bdb9d0520c-9101f3a906.zip deleted file mode 100644 index b5de23088..000000000 Binary files a/.yarn/cache/@types-glob-npm-8.1.0-bdb9d0520c-9101f3a906.zip and /dev/null differ diff --git a/.yarn/cache/@types-inquirer-npm-8.2.6-07ead6189e-d09c3b6bbf.zip b/.yarn/cache/@types-inquirer-npm-8.2.6-07ead6189e-d09c3b6bbf.zip deleted file mode 100644 index 5e5424e63..000000000 Binary files a/.yarn/cache/@types-inquirer-npm-8.2.6-07ead6189e-d09c3b6bbf.zip and /dev/null differ diff --git a/.yarn/cache/@types-minimatch-npm-5.1.2-aab9c394d3-0391a28286.zip b/.yarn/cache/@types-minimatch-npm-5.1.2-aab9c394d3-0391a28286.zip deleted file mode 100644 index 2d74ccef4..000000000 Binary files a/.yarn/cache/@types-minimatch-npm-5.1.2-aab9c394d3-0391a28286.zip and /dev/null differ diff --git a/.yarn/cache/@types-mock-fs-npm-4.13.1-b37c9b92f6-a5fcf8212d.zip b/.yarn/cache/@types-mock-fs-npm-4.13.1-b37c9b92f6-a5fcf8212d.zip new file mode 100644 index 000000000..3bcf5248b Binary files /dev/null and b/.yarn/cache/@types-mock-fs-npm-4.13.1-b37c9b92f6-a5fcf8212d.zip differ diff --git a/.yarn/cache/@types-node-npm-18.15.10-93118095ab-9aeae0b683.zip b/.yarn/cache/@types-node-npm-18.15.10-93118095ab-9aeae0b683.zip deleted file mode 100644 index 39350f3e8..000000000 Binary files a/.yarn/cache/@types-node-npm-18.15.10-93118095ab-9aeae0b683.zip and /dev/null differ diff --git a/.yarn/cache/@types-rimraf-npm-3.0.2-dd6eb5de99-b47fa302f4.zip b/.yarn/cache/@types-rimraf-npm-3.0.2-dd6eb5de99-b47fa302f4.zip deleted file mode 100644 index 5cf59c270..000000000 Binary files a/.yarn/cache/@types-rimraf-npm-3.0.2-dd6eb5de99-b47fa302f4.zip and /dev/null differ diff --git a/.yarn/cache/@types-standard-version-npm-7.0.1-4e85e139f3-ad0828b410.zip b/.yarn/cache/@types-standard-version-npm-7.0.1-4e85e139f3-ad0828b410.zip deleted file mode 100644 index 8ef90bb7c..000000000 Binary files a/.yarn/cache/@types-standard-version-npm-7.0.1-4e85e139f3-ad0828b410.zip and /dev/null differ diff --git a/.yarn/cache/@types-through-npm-0.0.30-59be01cca3-9578470db0.zip b/.yarn/cache/@types-through-npm-0.0.30-59be01cca3-9578470db0.zip deleted file mode 100644 index 08576a61b..000000000 Binary files a/.yarn/cache/@types-through-npm-0.0.30-59be01cca3-9578470db0.zip and /dev/null differ diff --git a/.yarn/cache/@types-tmp-npm-0.2.3-ca9c2eba00-0ca45e99b3.zip b/.yarn/cache/@types-tmp-npm-0.2.3-ca9c2eba00-0ca45e99b3.zip deleted file mode 100644 index 9c7627211..000000000 Binary files a/.yarn/cache/@types-tmp-npm-0.2.3-ca9c2eba00-0ca45e99b3.zip and /dev/null differ diff --git a/.yarn/cache/@types-yargs-npm-17.0.23-d0f4cf320c-c5f787d7a9.zip b/.yarn/cache/@types-yargs-npm-17.0.23-d0f4cf320c-c5f787d7a9.zip deleted file mode 100644 index ef29010e2..000000000 Binary files a/.yarn/cache/@types-yargs-npm-17.0.23-d0f4cf320c-c5f787d7a9.zip and /dev/null differ diff --git a/.yarn/cache/@types-yargs-npm-17.0.24-b034cf1d8b-5f3ac4dc4f.zip b/.yarn/cache/@types-yargs-npm-17.0.24-b034cf1d8b-5f3ac4dc4f.zip new file mode 100644 index 000000000..d6fd86839 Binary files /dev/null and b/.yarn/cache/@types-yargs-npm-17.0.24-b034cf1d8b-5f3ac4dc4f.zip differ diff --git a/.yarn/cache/@typescript-eslint-scope-manager-npm-5.56.0-f5f24b45c0-bacac255ee.zip b/.yarn/cache/@typescript-eslint-scope-manager-npm-5.56.0-f5f24b45c0-bacac255ee.zip deleted file mode 100644 index 3b0060222..000000000 Binary files a/.yarn/cache/@typescript-eslint-scope-manager-npm-5.56.0-f5f24b45c0-bacac255ee.zip and /dev/null differ diff --git a/.yarn/cache/@typescript-eslint-types-npm-5.56.0-f7e39d206e-82ca11553b.zip b/.yarn/cache/@typescript-eslint-types-npm-5.56.0-f7e39d206e-82ca11553b.zip deleted file mode 100644 index 4609541ef..000000000 Binary files a/.yarn/cache/@typescript-eslint-types-npm-5.56.0-f7e39d206e-82ca11553b.zip and /dev/null differ diff --git a/.yarn/cache/@typescript-eslint-typescript-estree-npm-5.56.0-c74b2e9f75-ec3e852017.zip b/.yarn/cache/@typescript-eslint-typescript-estree-npm-5.56.0-c74b2e9f75-ec3e852017.zip deleted file mode 100644 index 583ce5190..000000000 Binary files a/.yarn/cache/@typescript-eslint-typescript-estree-npm-5.56.0-c74b2e9f75-ec3e852017.zip and /dev/null differ diff --git a/.yarn/cache/@typescript-eslint-utils-npm-5.56.0-d8f371a93c-413e8d4bf7.zip b/.yarn/cache/@typescript-eslint-utils-npm-5.56.0-d8f371a93c-413e8d4bf7.zip deleted file mode 100644 index 2abf4f411..000000000 Binary files a/.yarn/cache/@typescript-eslint-utils-npm-5.56.0-d8f371a93c-413e8d4bf7.zip and /dev/null differ diff --git a/.yarn/cache/@typescript-eslint-visitor-keys-npm-5.56.0-877326733f-568fda4013.zip b/.yarn/cache/@typescript-eslint-visitor-keys-npm-5.56.0-877326733f-568fda4013.zip deleted file mode 100644 index f71499ea6..000000000 Binary files a/.yarn/cache/@typescript-eslint-visitor-keys-npm-5.56.0-877326733f-568fda4013.zip and /dev/null differ diff --git a/.yarn/cache/@yarnpkg-parsers-npm-3.0.0-rc.40-3400cb3f6b-64df0d8dad.zip b/.yarn/cache/@yarnpkg-parsers-npm-3.0.0-rc.42-ee17ab0275-147216f53d.zip similarity index 99% rename from .yarn/cache/@yarnpkg-parsers-npm-3.0.0-rc.40-3400cb3f6b-64df0d8dad.zip rename to .yarn/cache/@yarnpkg-parsers-npm-3.0.0-rc.42-ee17ab0275-147216f53d.zip index 9672a01ba..b56579cfb 100644 Binary files a/.yarn/cache/@yarnpkg-parsers-npm-3.0.0-rc.40-3400cb3f6b-64df0d8dad.zip and b/.yarn/cache/@yarnpkg-parsers-npm-3.0.0-rc.42-ee17ab0275-147216f53d.zip differ diff --git a/.yarn/cache/add-stream-npm-1.0.0-a5a0c0498c-3e9e8b0b8f.zip b/.yarn/cache/add-stream-npm-1.0.0-a5a0c0498c-3e9e8b0b8f.zip deleted file mode 100644 index a013e55da..000000000 Binary files a/.yarn/cache/add-stream-npm-1.0.0-a5a0c0498c-3e9e8b0b8f.zip and /dev/null differ diff --git a/.yarn/cache/caniuse-lite-npm-1.0.30001470-8c845308eb-14ce3cf17c.zip b/.yarn/cache/caniuse-lite-npm-1.0.30001470-8c845308eb-14ce3cf17c.zip deleted file mode 100644 index ebe19734e..000000000 Binary files a/.yarn/cache/caniuse-lite-npm-1.0.30001470-8c845308eb-14ce3cf17c.zip and /dev/null differ diff --git a/.yarn/cache/caniuse-lite-npm-1.0.30001473-956b0afe61-007ad17463.zip b/.yarn/cache/caniuse-lite-npm-1.0.30001473-956b0afe61-007ad17463.zip new file mode 100644 index 000000000..0ecda318a Binary files /dev/null and b/.yarn/cache/caniuse-lite-npm-1.0.30001473-956b0afe61-007ad17463.zip differ diff --git a/.yarn/cache/concat-stream-npm-2.0.0-8bb2ad5aa0-d7f75d48f0.zip b/.yarn/cache/concat-stream-npm-2.0.0-8bb2ad5aa0-d7f75d48f0.zip deleted file mode 100644 index 4f602256b..000000000 Binary files a/.yarn/cache/concat-stream-npm-2.0.0-8bb2ad5aa0-d7f75d48f0.zip and /dev/null differ diff --git a/.yarn/cache/conventional-changelog-atom-npm-2.0.8-ab61571c15-12ecbd928f.zip b/.yarn/cache/conventional-changelog-atom-npm-2.0.8-ab61571c15-12ecbd928f.zip deleted file mode 100644 index a71b898e3..000000000 Binary files a/.yarn/cache/conventional-changelog-atom-npm-2.0.8-ab61571c15-12ecbd928f.zip and /dev/null differ diff --git a/.yarn/cache/conventional-changelog-codemirror-npm-2.0.8-342d72f6a3-cf331db40c.zip b/.yarn/cache/conventional-changelog-codemirror-npm-2.0.8-342d72f6a3-cf331db40c.zip deleted file mode 100644 index cc1ff892a..000000000 Binary files a/.yarn/cache/conventional-changelog-codemirror-npm-2.0.8-342d72f6a3-cf331db40c.zip and /dev/null differ diff --git a/.yarn/cache/conventional-changelog-conventionalcommits-npm-4.6.3-8a4923dc62-7b8e8a21eb.zip b/.yarn/cache/conventional-changelog-conventionalcommits-npm-4.6.3-8a4923dc62-7b8e8a21eb.zip deleted file mode 100644 index fa3cd5dc5..000000000 Binary files a/.yarn/cache/conventional-changelog-conventionalcommits-npm-4.6.3-8a4923dc62-7b8e8a21eb.zip and /dev/null differ diff --git a/.yarn/cache/conventional-changelog-core-npm-4.2.4-3507358941-56d5194040.zip b/.yarn/cache/conventional-changelog-core-npm-4.2.4-3507358941-56d5194040.zip deleted file mode 100644 index ef22121cb..000000000 Binary files a/.yarn/cache/conventional-changelog-core-npm-4.2.4-3507358941-56d5194040.zip and /dev/null differ diff --git a/.yarn/cache/conventional-changelog-ember-npm-2.0.9-2276834930-30c7bd48ce.zip b/.yarn/cache/conventional-changelog-ember-npm-2.0.9-2276834930-30c7bd48ce.zip deleted file mode 100644 index e3e7b8fec..000000000 Binary files a/.yarn/cache/conventional-changelog-ember-npm-2.0.9-2276834930-30c7bd48ce.zip and /dev/null differ diff --git a/.yarn/cache/conventional-changelog-eslint-npm-3.0.9-62c523a901-402ae73a8c.zip b/.yarn/cache/conventional-changelog-eslint-npm-3.0.9-62c523a901-402ae73a8c.zip deleted file mode 100644 index dab4bec71..000000000 Binary files a/.yarn/cache/conventional-changelog-eslint-npm-3.0.9-62c523a901-402ae73a8c.zip and /dev/null differ diff --git a/.yarn/cache/conventional-changelog-express-npm-2.0.6-8a37ff0369-c139fa9878.zip b/.yarn/cache/conventional-changelog-express-npm-2.0.6-8a37ff0369-c139fa9878.zip deleted file mode 100644 index 5cbb3f0bc..000000000 Binary files a/.yarn/cache/conventional-changelog-express-npm-2.0.6-8a37ff0369-c139fa9878.zip and /dev/null differ diff --git a/.yarn/cache/conventional-changelog-jquery-npm-3.0.11-d4ff10c6e2-df1145467c.zip b/.yarn/cache/conventional-changelog-jquery-npm-3.0.11-d4ff10c6e2-df1145467c.zip deleted file mode 100644 index 7e7d068c7..000000000 Binary files a/.yarn/cache/conventional-changelog-jquery-npm-3.0.11-d4ff10c6e2-df1145467c.zip and /dev/null differ diff --git a/.yarn/cache/conventional-changelog-jshint-npm-2.0.9-ef6b791bee-ec96144b75.zip b/.yarn/cache/conventional-changelog-jshint-npm-2.0.9-ef6b791bee-ec96144b75.zip deleted file mode 100644 index 47404f8d2..000000000 Binary files a/.yarn/cache/conventional-changelog-jshint-npm-2.0.9-ef6b791bee-ec96144b75.zip and /dev/null differ diff --git a/.yarn/cache/conventional-changelog-npm-3.1.25-dfc69e696b-1ea1837812.zip b/.yarn/cache/conventional-changelog-npm-3.1.25-dfc69e696b-1ea1837812.zip deleted file mode 100644 index 2c79e8f71..000000000 Binary files a/.yarn/cache/conventional-changelog-npm-3.1.25-dfc69e696b-1ea1837812.zip and /dev/null differ diff --git a/.yarn/cache/conventional-changelog-preset-loader-npm-2.3.4-a907f2e49a-23a889b7fc.zip b/.yarn/cache/conventional-changelog-preset-loader-npm-2.3.4-a907f2e49a-23a889b7fc.zip deleted file mode 100644 index 52e52b15f..000000000 Binary files a/.yarn/cache/conventional-changelog-preset-loader-npm-2.3.4-a907f2e49a-23a889b7fc.zip and /dev/null differ diff --git a/.yarn/cache/conventional-changelog-writer-npm-5.0.1-c7d8f4132f-5c0129db44.zip b/.yarn/cache/conventional-changelog-writer-npm-5.0.1-c7d8f4132f-5c0129db44.zip deleted file mode 100644 index 6815919f1..000000000 Binary files a/.yarn/cache/conventional-changelog-writer-npm-5.0.1-c7d8f4132f-5c0129db44.zip and /dev/null differ diff --git a/.yarn/cache/conventional-commits-filter-npm-2.0.7-8762ee3bfa-feb567f680.zip b/.yarn/cache/conventional-commits-filter-npm-2.0.7-8762ee3bfa-feb567f680.zip deleted file mode 100644 index 4d90d61f5..000000000 Binary files a/.yarn/cache/conventional-commits-filter-npm-2.0.7-8762ee3bfa-feb567f680.zip and /dev/null differ diff --git a/.yarn/cache/conventional-recommended-bump-npm-6.1.0-18a6db0ce9-da1d7a5f3b.zip b/.yarn/cache/conventional-recommended-bump-npm-6.1.0-18a6db0ce9-da1d7a5f3b.zip deleted file mode 100644 index 54f20a448..000000000 Binary files a/.yarn/cache/conventional-recommended-bump-npm-6.1.0-18a6db0ce9-da1d7a5f3b.zip and /dev/null differ diff --git a/.yarn/cache/core-util-is-npm-1.0.3-ca74b76c90-9de8597363.zip b/.yarn/cache/core-util-is-npm-1.0.3-ca74b76c90-9de8597363.zip deleted file mode 100644 index 2c844fee1..000000000 Binary files a/.yarn/cache/core-util-is-npm-1.0.3-ca74b76c90-9de8597363.zip and /dev/null differ diff --git a/.yarn/cache/dateformat-npm-3.0.3-ed02e5ddbd-ca4911148a.zip b/.yarn/cache/dateformat-npm-3.0.3-ed02e5ddbd-ca4911148a.zip deleted file mode 100644 index 5747aa694..000000000 Binary files a/.yarn/cache/dateformat-npm-3.0.3-ed02e5ddbd-ca4911148a.zip and /dev/null differ diff --git a/.yarn/cache/detect-indent-npm-6.1.0-d8c441ff7a-ab953a73c7.zip b/.yarn/cache/detect-indent-npm-6.1.0-d8c441ff7a-ab953a73c7.zip deleted file mode 100644 index 2cdbdeaed..000000000 Binary files a/.yarn/cache/detect-indent-npm-6.1.0-d8c441ff7a-ab953a73c7.zip and /dev/null differ diff --git a/.yarn/cache/electron-to-chromium-npm-1.4.340-accc68e032-b7ffa64814.zip b/.yarn/cache/electron-to-chromium-npm-1.4.348-e0e0cb2814-662491cd39.zip similarity index 65% rename from .yarn/cache/electron-to-chromium-npm-1.4.340-accc68e032-b7ffa64814.zip rename to .yarn/cache/electron-to-chromium-npm-1.4.348-e0e0cb2814-662491cd39.zip index b37c003ff..387f4737c 100644 Binary files a/.yarn/cache/electron-to-chromium-npm-1.4.340-accc68e032-b7ffa64814.zip and b/.yarn/cache/electron-to-chromium-npm-1.4.348-e0e0cb2814-662491cd39.zip differ diff --git a/.yarn/cache/eslint-visitor-keys-npm-3.3.0-d329af7c8c-d59e68a7c5.zip b/.yarn/cache/eslint-visitor-keys-npm-3.3.0-d329af7c8c-d59e68a7c5.zip deleted file mode 100644 index a46738b25..000000000 Binary files a/.yarn/cache/eslint-visitor-keys-npm-3.3.0-d329af7c8c-d59e68a7c5.zip and /dev/null differ diff --git a/.yarn/cache/find-up-npm-2.1.0-9f6cb1765c-43284fe4da.zip b/.yarn/cache/find-up-npm-2.1.0-9f6cb1765c-43284fe4da.zip deleted file mode 100644 index 6b2c2d9da..000000000 Binary files a/.yarn/cache/find-up-npm-2.1.0-9f6cb1765c-43284fe4da.zip and /dev/null differ diff --git a/.yarn/cache/fs-monkey-npm-1.0.3-c1ea1ab781-cf50804833.zip b/.yarn/cache/fs-monkey-npm-1.0.3-c1ea1ab781-cf50804833.zip new file mode 100644 index 000000000..446f26e57 Binary files /dev/null and b/.yarn/cache/fs-monkey-npm-1.0.3-c1ea1ab781-cf50804833.zip differ diff --git a/.yarn/cache/get-pkg-repo-npm-4.2.1-b1cd052cb4-5abf169137.zip b/.yarn/cache/get-pkg-repo-npm-4.2.1-b1cd052cb4-5abf169137.zip deleted file mode 100644 index bb0c9ba6e..000000000 Binary files a/.yarn/cache/get-pkg-repo-npm-4.2.1-b1cd052cb4-5abf169137.zip and /dev/null differ diff --git a/.yarn/cache/git-remote-origin-url-npm-2.0.0-319debe0d1-85263a09c0.zip b/.yarn/cache/git-remote-origin-url-npm-2.0.0-319debe0d1-85263a09c0.zip deleted file mode 100644 index dff9fcc5a..000000000 Binary files a/.yarn/cache/git-remote-origin-url-npm-2.0.0-319debe0d1-85263a09c0.zip and /dev/null differ diff --git a/.yarn/cache/git-semver-tags-npm-4.1.1-93b9747811-e16d02a515.zip b/.yarn/cache/git-semver-tags-npm-4.1.1-93b9747811-e16d02a515.zip deleted file mode 100644 index db19674f1..000000000 Binary files a/.yarn/cache/git-semver-tags-npm-4.1.1-93b9747811-e16d02a515.zip and /dev/null differ diff --git a/.yarn/cache/gitconfiglocal-npm-1.0.0-905970379d-e6d2764c15.zip b/.yarn/cache/gitconfiglocal-npm-1.0.0-905970379d-e6d2764c15.zip deleted file mode 100644 index f7f126903..000000000 Binary files a/.yarn/cache/gitconfiglocal-npm-1.0.0-905970379d-e6d2764c15.zip and /dev/null differ diff --git a/.yarn/cache/handlebars-npm-4.7.7-a9ccfabf80-1e79a43f5e.zip b/.yarn/cache/handlebars-npm-4.7.7-a9ccfabf80-1e79a43f5e.zip deleted file mode 100644 index 3b4e09926..000000000 Binary files a/.yarn/cache/handlebars-npm-4.7.7-a9ccfabf80-1e79a43f5e.zip and /dev/null differ diff --git a/.yarn/cache/inquirer-npm-8.2.5-ffce7548f9-f13ee4c444.zip b/.yarn/cache/inquirer-npm-8.2.5-ffce7548f9-f13ee4c444.zip deleted file mode 100644 index 31c387a43..000000000 Binary files a/.yarn/cache/inquirer-npm-8.2.5-ffce7548f9-f13ee4c444.zip and /dev/null differ diff --git a/.yarn/cache/isarray-npm-1.0.0-db4f547720-f032df8e02.zip b/.yarn/cache/isarray-npm-1.0.0-db4f547720-f032df8e02.zip deleted file mode 100644 index 67c393dc1..000000000 Binary files a/.yarn/cache/isarray-npm-1.0.0-db4f547720-f032df8e02.zip and /dev/null differ diff --git a/.yarn/cache/json-parse-better-errors-npm-1.0.2-7f37637d19-ff2b5ba2a7.zip b/.yarn/cache/json-parse-better-errors-npm-1.0.2-7f37637d19-ff2b5ba2a7.zip deleted file mode 100644 index 3892f1687..000000000 Binary files a/.yarn/cache/json-parse-better-errors-npm-1.0.2-7f37637d19-ff2b5ba2a7.zip and /dev/null differ diff --git a/.yarn/cache/json-stringify-safe-npm-5.0.1-064ddd6ab4-48ec0adad5.zip b/.yarn/cache/json-stringify-safe-npm-5.0.1-064ddd6ab4-48ec0adad5.zip deleted file mode 100644 index bda01edf7..000000000 Binary files a/.yarn/cache/json-stringify-safe-npm-5.0.1-064ddd6ab4-48ec0adad5.zip and /dev/null differ diff --git a/.yarn/cache/load-json-file-npm-4.0.0-c9f09d85eb-8f5d6d93ba.zip b/.yarn/cache/load-json-file-npm-4.0.0-c9f09d85eb-8f5d6d93ba.zip deleted file mode 100644 index 48ad7d381..000000000 Binary files a/.yarn/cache/load-json-file-npm-4.0.0-c9f09d85eb-8f5d6d93ba.zip and /dev/null differ diff --git a/.yarn/cache/locate-path-npm-2.0.0-673d28b0ea-02d581edbb.zip b/.yarn/cache/locate-path-npm-2.0.0-673d28b0ea-02d581edbb.zip deleted file mode 100644 index 0841fd1c1..000000000 Binary files a/.yarn/cache/locate-path-npm-2.0.0-673d28b0ea-02d581edbb.zip and /dev/null differ diff --git a/.yarn/cache/lodash.ismatch-npm-4.4.0-e538fd6c3d-a393917578.zip b/.yarn/cache/lodash.ismatch-npm-4.4.0-e538fd6c3d-a393917578.zip deleted file mode 100644 index 223a6692b..000000000 Binary files a/.yarn/cache/lodash.ismatch-npm-4.4.0-e538fd6c3d-a393917578.zip and /dev/null differ diff --git a/.yarn/cache/memfs-npm-3.4.13-1b82431d2d-3f9717d6f0.zip b/.yarn/cache/memfs-npm-3.4.13-1b82431d2d-3f9717d6f0.zip new file mode 100644 index 000000000..550ce33e0 Binary files /dev/null and b/.yarn/cache/memfs-npm-3.4.13-1b82431d2d-3f9717d6f0.zip differ diff --git a/.yarn/cache/modify-values-npm-1.0.1-9b2377e166-8296610c60.zip b/.yarn/cache/modify-values-npm-1.0.1-9b2377e166-8296610c60.zip deleted file mode 100644 index 759e1f53d..000000000 Binary files a/.yarn/cache/modify-values-npm-1.0.1-9b2377e166-8296610c60.zip and /dev/null differ diff --git a/.yarn/cache/neo-async-npm-2.6.2-75d6902586-deac9f8d00.zip b/.yarn/cache/neo-async-npm-2.6.2-75d6902586-deac9f8d00.zip deleted file mode 100644 index cbf9a7699..000000000 Binary files a/.yarn/cache/neo-async-npm-2.6.2-75d6902586-deac9f8d00.zip and /dev/null differ diff --git a/.yarn/cache/p-limit-npm-1.3.0-fdb471d864-281c1c0b8c.zip b/.yarn/cache/p-limit-npm-1.3.0-fdb471d864-281c1c0b8c.zip deleted file mode 100644 index 96906babd..000000000 Binary files a/.yarn/cache/p-limit-npm-1.3.0-fdb471d864-281c1c0b8c.zip and /dev/null differ diff --git a/.yarn/cache/p-locate-npm-2.0.0-3a2ee263dd-e2dceb9b49.zip b/.yarn/cache/p-locate-npm-2.0.0-3a2ee263dd-e2dceb9b49.zip deleted file mode 100644 index f6f9f09b9..000000000 Binary files a/.yarn/cache/p-locate-npm-2.0.0-3a2ee263dd-e2dceb9b49.zip and /dev/null differ diff --git a/.yarn/cache/p-try-npm-1.0.0-7373139e40-3b5303f77e.zip b/.yarn/cache/p-try-npm-1.0.0-7373139e40-3b5303f77e.zip deleted file mode 100644 index e12bd247e..000000000 Binary files a/.yarn/cache/p-try-npm-1.0.0-7373139e40-3b5303f77e.zip and /dev/null differ diff --git a/.yarn/cache/parse-json-npm-4.0.0-a6f7771010-0fe227d410.zip b/.yarn/cache/parse-json-npm-4.0.0-a6f7771010-0fe227d410.zip deleted file mode 100644 index 4832780ee..000000000 Binary files a/.yarn/cache/parse-json-npm-4.0.0-a6f7771010-0fe227d410.zip and /dev/null differ diff --git a/.yarn/cache/path-exists-npm-3.0.0-e80371aa68-96e92643aa.zip b/.yarn/cache/path-exists-npm-3.0.0-e80371aa68-96e92643aa.zip deleted file mode 100644 index bdaa46fd3..000000000 Binary files a/.yarn/cache/path-exists-npm-3.0.0-e80371aa68-96e92643aa.zip and /dev/null differ diff --git a/.yarn/cache/path-type-npm-3.0.0-252361a0eb-735b35e256.zip b/.yarn/cache/path-type-npm-3.0.0-252361a0eb-735b35e256.zip deleted file mode 100644 index 3a59d9b0e..000000000 Binary files a/.yarn/cache/path-type-npm-3.0.0-252361a0eb-735b35e256.zip and /dev/null differ diff --git a/.yarn/cache/pify-npm-2.3.0-8b63310934-9503aaeaf4.zip b/.yarn/cache/pify-npm-2.3.0-8b63310934-9503aaeaf4.zip deleted file mode 100644 index 4cbc70a0a..000000000 Binary files a/.yarn/cache/pify-npm-2.3.0-8b63310934-9503aaeaf4.zip and /dev/null differ diff --git a/.yarn/cache/pify-npm-3.0.0-679ee405c8-6cdcbc3567.zip b/.yarn/cache/pify-npm-3.0.0-679ee405c8-6cdcbc3567.zip deleted file mode 100644 index 95bf84187..000000000 Binary files a/.yarn/cache/pify-npm-3.0.0-679ee405c8-6cdcbc3567.zip and /dev/null differ diff --git a/.yarn/cache/process-nextick-args-npm-2.0.1-b8d7971609-1d38588e52.zip b/.yarn/cache/process-nextick-args-npm-2.0.1-b8d7971609-1d38588e52.zip deleted file mode 100644 index 33fadfd3e..000000000 Binary files a/.yarn/cache/process-nextick-args-npm-2.0.1-b8d7971609-1d38588e52.zip and /dev/null differ diff --git a/.yarn/cache/read-pkg-npm-3.0.0-41471436cb-398903ebae.zip b/.yarn/cache/read-pkg-npm-3.0.0-41471436cb-398903ebae.zip deleted file mode 100644 index e0a22aff7..000000000 Binary files a/.yarn/cache/read-pkg-npm-3.0.0-41471436cb-398903ebae.zip and /dev/null differ diff --git a/.yarn/cache/read-pkg-up-npm-3.0.0-3d7faf047f-16175573f2.zip b/.yarn/cache/read-pkg-up-npm-3.0.0-3d7faf047f-16175573f2.zip deleted file mode 100644 index f1f0a309a..000000000 Binary files a/.yarn/cache/read-pkg-up-npm-3.0.0-3d7faf047f-16175573f2.zip and /dev/null differ diff --git a/.yarn/cache/readable-stream-npm-2.3.8-67a94c2cb1-6564546703.zip b/.yarn/cache/readable-stream-npm-2.3.8-67a94c2cb1-6564546703.zip deleted file mode 100644 index e52c545b6..000000000 Binary files a/.yarn/cache/readable-stream-npm-2.3.8-67a94c2cb1-6564546703.zip and /dev/null differ diff --git a/.yarn/cache/safe-buffer-npm-5.1.2-c27fedf6c4-f2f1f7943c.zip b/.yarn/cache/safe-buffer-npm-5.1.2-c27fedf6c4-f2f1f7943c.zip deleted file mode 100644 index 53c2813c6..000000000 Binary files a/.yarn/cache/safe-buffer-npm-5.1.2-c27fedf6c4-f2f1f7943c.zip and /dev/null differ diff --git a/.yarn/cache/split-npm-1.0.1-88871d88a2-12f4554a57.zip b/.yarn/cache/split-npm-1.0.1-88871d88a2-12f4554a57.zip deleted file mode 100644 index b2109d88c..000000000 Binary files a/.yarn/cache/split-npm-1.0.1-88871d88a2-12f4554a57.zip and /dev/null differ diff --git a/.yarn/cache/string_decoder-npm-1.1.1-e46a6c1353-9ab7e56f9d.zip b/.yarn/cache/string_decoder-npm-1.1.1-e46a6c1353-9ab7e56f9d.zip deleted file mode 100644 index 8f86a62f8..000000000 Binary files a/.yarn/cache/string_decoder-npm-1.1.1-e46a6c1353-9ab7e56f9d.zip and /dev/null differ diff --git a/.yarn/cache/through2-npm-2.0.5-77d90f13cd-beb0f338aa.zip b/.yarn/cache/through2-npm-2.0.5-77d90f13cd-beb0f338aa.zip deleted file mode 100644 index 984ead670..000000000 Binary files a/.yarn/cache/through2-npm-2.0.5-77d90f13cd-beb0f338aa.zip and /dev/null differ diff --git a/.yarn/cache/tsconfig-paths-npm-4.1.2-7a84ac2b29-3d9151ecea.zip b/.yarn/cache/tsconfig-paths-npm-4.1.2-7a84ac2b29-3d9151ecea.zip deleted file mode 100644 index 0473e3969..000000000 Binary files a/.yarn/cache/tsconfig-paths-npm-4.1.2-7a84ac2b29-3d9151ecea.zip and /dev/null differ diff --git a/.yarn/cache/tsconfig-paths-npm-4.2.0-ac1edf8677-28c5f7bbbc.zip b/.yarn/cache/tsconfig-paths-npm-4.2.0-ac1edf8677-28c5f7bbbc.zip new file mode 100644 index 000000000..0d3418a2b Binary files /dev/null and b/.yarn/cache/tsconfig-paths-npm-4.2.0-ac1edf8677-28c5f7bbbc.zip differ diff --git a/.yarn/cache/typedarray-npm-0.0.6-37638b2241-33b39f3d0e.zip b/.yarn/cache/typedarray-npm-0.0.6-37638b2241-33b39f3d0e.zip deleted file mode 100644 index d03674ea2..000000000 Binary files a/.yarn/cache/typedarray-npm-0.0.6-37638b2241-33b39f3d0e.zip and /dev/null differ diff --git a/.yarn/cache/typescript-npm-5.0.2-66dd4bd4f0-bef1dcd166.zip b/.yarn/cache/typescript-npm-5.0.3-84e500d967-3cce0576d2.zip similarity index 60% rename from .yarn/cache/typescript-npm-5.0.2-66dd4bd4f0-bef1dcd166.zip rename to .yarn/cache/typescript-npm-5.0.3-84e500d967-3cce0576d2.zip index a26e99bef..8913532b2 100644 Binary files a/.yarn/cache/typescript-npm-5.0.2-66dd4bd4f0-bef1dcd166.zip and b/.yarn/cache/typescript-npm-5.0.3-84e500d967-3cce0576d2.zip differ diff --git a/.yarn/cache/typescript-patch-772e75d75e-b63cb742fb.zip b/.yarn/cache/typescript-patch-3de7333024-5580367025.zip similarity index 58% rename from .yarn/cache/typescript-patch-772e75d75e-b63cb742fb.zip rename to .yarn/cache/typescript-patch-3de7333024-5580367025.zip index 3118b9712..eb3c10330 100644 Binary files a/.yarn/cache/typescript-patch-772e75d75e-b63cb742fb.zip and b/.yarn/cache/typescript-patch-3de7333024-5580367025.zip differ diff --git a/.yarn/cache/uglify-js-npm-3.17.4-58d4ab56aa-7b3897df38.zip b/.yarn/cache/uglify-js-npm-3.17.4-58d4ab56aa-7b3897df38.zip deleted file mode 100644 index c3d1c955c..000000000 Binary files a/.yarn/cache/uglify-js-npm-3.17.4-58d4ab56aa-7b3897df38.zip and /dev/null differ diff --git a/.yarn/cache/wordwrap-npm-1.0.0-ae57a645e8-2a44b27881.zip b/.yarn/cache/wordwrap-npm-1.0.0-ae57a645e8-2a44b27881.zip deleted file mode 100644 index 5463df0bf..000000000 Binary files a/.yarn/cache/wordwrap-npm-1.0.0-ae57a645e8-2a44b27881.zip and /dev/null differ diff --git a/.yarn/cache/xtend-npm-4.0.2-7f2375736e-ac5dfa738b.zip b/.yarn/cache/xtend-npm-4.0.2-7f2375736e-ac5dfa738b.zip deleted file mode 100644 index 1090c6863..000000000 Binary files a/.yarn/cache/xtend-npm-4.0.2-7f2375736e-ac5dfa738b.zip and /dev/null differ diff --git a/.yarn/cache/yargs-npm-16.2.0-547873d425-b14afbb51e.zip b/.yarn/cache/yargs-npm-16.2.0-547873d425-b14afbb51e.zip deleted file mode 100644 index d11c27d51..000000000 Binary files a/.yarn/cache/yargs-npm-16.2.0-547873d425-b14afbb51e.zip and /dev/null differ diff --git a/.yarn/cache/zod-npm-3.20.2-faa0b46f24-04172f7e93.zip b/.yarn/cache/zod-npm-3.20.2-faa0b46f24-04172f7e93.zip new file mode 100644 index 000000000..4c5f09a88 Binary files /dev/null and b/.yarn/cache/zod-npm-3.20.2-faa0b46f24-04172f7e93.zip differ diff --git a/package.json b/package.json index c7dfcfb5f..a3f045925 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "@nrwl/nx-plugin": "15.9.2", "@nrwl/workspace": "15.9.2", "@types/jest": "29.5.0", + "@types/mock-fs": "^4.13.1", "@types/node": "^18.0.0", "@typescript-eslint/eslint-plugin": "5.57.0", "@typescript-eslint/parser": "5.57.0", @@ -51,6 +52,7 @@ "husky": "^8.0.0", "jest": "29.5.0", "jest-extended": "^3.0.0", + "memfs": "^3.4.13", "ngx-deploy-npm": "^5.0.0", "nx": "15.9.2", "prettier": "2.8.7", diff --git a/packages/semver/CHANGELOG.md b/packages/semver/CHANGELOG.md index eaa360ea6..6190f4975 100644 --- a/packages/semver/CHANGELOG.md +++ b/packages/semver/CHANGELOG.md @@ -4,1051 +4,754 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/s ## [2.30.1](https://github.com/jscutlery/semver/compare/semver-2.30.0...semver-2.30.1) (2023-02-10) - ### Bug Fixes -* provide dryRun flag to post targets ([bb70cd9](https://github.com/jscutlery/semver/commit/bb70cd902fefe9603d8e94b268d86e478fd3a916)) - - +- provide dryRun flag to post targets ([bb70cd9](https://github.com/jscutlery/semver/commit/bb70cd902fefe9603d8e94b268d86e478fd3a916)) # [2.30.0](https://github.com/jscutlery/semver/compare/semver-2.29.3...semver-2.30.0) (2023-02-07) - ### Bug Fixes -* 📦 bump dependency rxjs to v7.8.0 ([cc7eb91](https://github.com/jscutlery/semver/commit/cc7eb91782ec5e5af5a1db2a2e18e98a6f05aa36)) - +- 📦 bump dependency rxjs to v7.8.0 ([cc7eb91](https://github.com/jscutlery/semver/commit/cc7eb91782ec5e5af5a1db2a2e18e98a6f05aa36)) ### Features -* **semver:** add option to generate release notes since previous tag ([c272c39](https://github.com/jscutlery/semver/commit/c272c39d3a16bba4253f3376d83d05ec753e974a)) - - +- **semver:** add option to generate release notes since previous tag ([c272c39](https://github.com/jscutlery/semver/commit/c272c39d3a16bba4253f3376d83d05ec753e974a)) ## [2.29.3](https://github.com/jscutlery/semver/compare/semver-2.29.2...semver-2.29.3) (2022-12-15) - ### Bug Fixes -* **semver:** 🐞 fix --preset schema ([6763eaa](https://github.com/jscutlery/semver/commit/6763eaa9d578c012e696113fdecdf7709328af14)) - - +- **semver:** 🐞 fix --preset schema ([6763eaa](https://github.com/jscutlery/semver/commit/6763eaa9d578c012e696113fdecdf7709328af14)) ## [2.29.2](https://github.com/jscutlery/semver/compare/semver-2.29.1...semver-2.29.2) (2022-12-08) - ### Bug Fixes -* version tagPrefix for dependencies not propagated [#624](https://github.com/jscutlery/semver/issues/624) ([1656f65](https://github.com/jscutlery/semver/commit/1656f6575317688b35e2ed0e71fc046b57d7d92a)) - - +- version tagPrefix for dependencies not propagated [#624](https://github.com/jscutlery/semver/issues/624) ([1656f65](https://github.com/jscutlery/semver/commit/1656f6575317688b35e2ed0e71fc046b57d7d92a)) ## [2.29.1](https://github.com/jscutlery/semver/compare/semver-2.29.0...semver-2.29.1) (2022-12-08) - ### Bug Fixes -* 📦 bump dependency rxjs to v7.6.0 ([f5ee12b](https://github.com/jscutlery/semver/commit/f5ee12b8e5c2d63b2769aff290fbc218c08e9aba)) -* **semver:** 🐞 add missing chalk dependency ([0644d0b](https://github.com/jscutlery/semver/commit/0644d0bbcdb420ec2b4273a1acad636c38949d24)), closes [#623](https://github.com/jscutlery/semver/issues/623) - - +- 📦 bump dependency rxjs to v7.6.0 ([f5ee12b](https://github.com/jscutlery/semver/commit/f5ee12b8e5c2d63b2769aff290fbc218c08e9aba)) +- **semver:** 🐞 add missing chalk dependency ([0644d0b](https://github.com/jscutlery/semver/commit/0644d0bbcdb420ec2b4273a1acad636c38949d24)), closes [#623](https://github.com/jscutlery/semver/issues/623) # [2.29.0](https://github.com/jscutlery/semver/compare/semver-2.28.0...semver-2.29.0) (2022-11-17) - ### Features -* add support for standalone projects without root config ([#603](https://github.com/jscutlery/semver/issues/603)) ([f8855b7](https://github.com/jscutlery/semver/commit/f8855b77dd2b6b1943cbe3340e5f14bb298f6272)) - - +- add support for standalone projects without root config ([#603](https://github.com/jscutlery/semver/issues/603)) ([f8855b7](https://github.com/jscutlery/semver/commit/f8855b77dd2b6b1943cbe3340e5f14bb298f6272)) # [2.28.0](https://github.com/jscutlery/semver/compare/semver-2.27.2...semver-2.28.0) (2022-11-14) - ### Bug Fixes -* **semver:** 🐞 upgrade devkit to v15 ([cbe3cf7](https://github.com/jscutlery/semver/commit/cbe3cf74d89a1c271d87c9669d04160f24f7a2c3)), closes [#616](https://github.com/jscutlery/semver/issues/616) - +- **semver:** 🐞 upgrade devkit to v15 ([cbe3cf7](https://github.com/jscutlery/semver/commit/cbe3cf74d89a1c271d87c9669d04160f24f7a2c3)), closes [#616](https://github.com/jscutlery/semver/issues/616) ### Features -* **semver:** drop standard-version + all conventional-changelog config ([bf84d5f](https://github.com/jscutlery/semver/commit/bf84d5fe804db638719b6dcfb75f1fc47b9319ac)) - - +- **semver:** drop standard-version + all conventional-changelog config ([bf84d5f](https://github.com/jscutlery/semver/commit/bf84d5fe804db638719b6dcfb75f1fc47b9319ac)) ## [2.27.2](https://github.com/jscutlery/semver/compare/semver-2.27.1...semver-2.27.2) (2022-10-29) - ### Bug Fixes -* 📦 bump dependency inquirer to v8.2.5 ([1b6410f](https://github.com/jscutlery/semver/commit/1b6410f45fa163aec9e7e5d40293b0777124b689)) -* 📦 bump dependency rxjs to v7.5.7 ([a7d7791](https://github.com/jscutlery/semver/commit/a7d7791324ad442d4034505409c2252f4e403cf6)) -* **semver:** get release version if no matching prerelease tag exists ([084de3b](https://github.com/jscutlery/semver/commit/084de3b1a5ce7b74ff01f57ff2b74e785847848c)) - - +- 📦 bump dependency inquirer to v8.2.5 ([1b6410f](https://github.com/jscutlery/semver/commit/1b6410f45fa163aec9e7e5d40293b0777124b689)) +- 📦 bump dependency rxjs to v7.5.7 ([a7d7791](https://github.com/jscutlery/semver/commit/a7d7791324ad442d4034505409c2252f4e403cf6)) +- **semver:** get release version if no matching prerelease tag exists ([084de3b](https://github.com/jscutlery/semver/commit/084de3b1a5ce7b74ff01f57ff2b74e785847848c)) ## [2.27.1](https://github.com/jscutlery/semver/compare/semver-2.27.0...semver-2.27.1) (2022-09-24) - ### Bug Fixes -* **semver:** deal with unrelated histories ([#593](https://github.com/jscutlery/semver/issues/593)) ([#594](https://github.com/jscutlery/semver/issues/594)) ([188ed4c](https://github.com/jscutlery/semver/commit/188ed4c1e7511dbfdce207b497045b4c74394316)) - - +- **semver:** deal with unrelated histories ([#593](https://github.com/jscutlery/semver/issues/593)) ([#594](https://github.com/jscutlery/semver/issues/594)) ([188ed4c](https://github.com/jscutlery/semver/commit/188ed4c1e7511dbfdce207b497045b4c74394316)) # [2.27.0](https://github.com/jscutlery/semver/compare/semver-2.26.0...semver-2.27.0) (2022-09-05) - ### Bug Fixes -* **semver:** allow usage of different preids with prerelease ([67fec01](https://github.com/jscutlery/semver/commit/67fec0157327ff32bb3a5436a8b2657b2c11f198)) - +- **semver:** allow usage of different preids with prerelease ([67fec01](https://github.com/jscutlery/semver/commit/67fec0157327ff32bb3a5436a8b2657b2c11f198)) ### Features -* **semver:** ignore merge commits by default ([#583](https://github.com/jscutlery/semver/issues/583)) ([b86f5de](https://github.com/jscutlery/semver/commit/b86f5de9a28834f1bec394d175896b842435be46)) - - +- **semver:** ignore merge commits by default ([#583](https://github.com/jscutlery/semver/issues/583)) ([b86f5de](https://github.com/jscutlery/semver/commit/b86f5de9a28834f1bec394d175896b842435be46)) # [2.26.0](https://github.com/jscutlery/semver/compare/semver-2.25.3...semver-2.26.0) (2022-08-03) - ### Bug Fixes -* 📦 bump dependency rxjs to v7.5.6 ([3147a7a](https://github.com/jscutlery/semver/commit/3147a7a302baa24c9f649acb98394744cd758430)) - +- 📦 bump dependency rxjs to v7.5.6 ([3147a7a](https://github.com/jscutlery/semver/commit/3147a7a302baa24c9f649acb98394744cd758430)) ### Features -* **semver:** ✅ add option to skip committing changes on version bump ([0533977](https://github.com/jscutlery/semver/commit/053397771a838938dc9b203573ec53b397d232b4)) - - +- **semver:** ✅ add option to skip committing changes on version bump ([0533977](https://github.com/jscutlery/semver/commit/053397771a838938dc9b203573ec53b397d232b4)) ## [2.25.3](https://github.com/jscutlery/semver/compare/semver-2.25.2...semver-2.25.3) (2022-06-13) - ### Bug Fixes -* **semver:** 🐞 preserve indentation in `package.json` files ([e8b830a](https://github.com/jscutlery/semver/commit/e8b830a65ccbe146a38b68d7501cbcf743cf5b6a)), closes [#531](https://github.com/jscutlery/semver/issues/531) -* **semver:** 📌 pin detect-indent version to 6.1.0 ([90ff483](https://github.com/jscutlery/semver/commit/90ff483271859c2f14383ecf5f2f932f71ccb904)) - - +- **semver:** 🐞 preserve indentation in `package.json` files ([e8b830a](https://github.com/jscutlery/semver/commit/e8b830a65ccbe146a38b68d7501cbcf743cf5b6a)), closes [#531](https://github.com/jscutlery/semver/issues/531) +- **semver:** 📌 pin detect-indent version to 6.1.0 ([90ff483](https://github.com/jscutlery/semver/commit/90ff483271859c2f14383ecf5f2f932f71ccb904)) ## [2.25.2](https://github.com/jscutlery/semver/compare/semver-2.25.1...semver-2.25.2) (2022-06-06) - ### Bug Fixes -* **semver:** fix handling of non-object arrays in options ([dbd7758](https://github.com/jscutlery/semver/commit/dbd7758c51a4affdda84d06e9e1983b758d59163)) - - +- **semver:** fix handling of non-object arrays in options ([dbd7758](https://github.com/jscutlery/semver/commit/dbd7758c51a4affdda84d06e9e1983b758d59163)) ## [2.25.1](https://github.com/jscutlery/semver/compare/semver-2.25.0...semver-2.25.1) (2022-06-03) - ### Bug Fixes -* **semver:** invalid delimiter for asset ([4f43113](https://github.com/jscutlery/semver/commit/4f43113d778f543827e424bf66d1d446a3266e77)) - - +- **semver:** invalid delimiter for asset ([4f43113](https://github.com/jscutlery/semver/commit/4f43113d778f543827e424bf66d1d446a3266e77)) # [2.25.0](https://github.com/jscutlery/semver/compare/semver-2.24.2...semver-2.25.0) (2022-06-02) - ### Features -* **semver:** nested options template strings ([08221df](https://github.com/jscutlery/semver/commit/08221dfa846f9b33b327ba8872a15eda76cca688)) - - +- **semver:** nested options template strings ([08221df](https://github.com/jscutlery/semver/commit/08221dfa846f9b33b327ba8872a15eda76cca688)) ## [2.24.2](https://github.com/jscutlery/semver/compare/semver-2.24.1...semver-2.24.2) (2022-05-29) - ### Bug Fixes -* **semver:** 🐞 format `package.json` with trailing newline ([4c175fd](https://github.com/jscutlery/semver/commit/4c175fd8d5d7c400ee17ab77f3a59a370343ff6e)), closes [#510](https://github.com/jscutlery/semver/issues/510) - - +- **semver:** 🐞 format `package.json` with trailing newline ([4c175fd](https://github.com/jscutlery/semver/commit/4c175fd8d5d7c400ee17ab77f3a59a370343ff6e)), closes [#510](https://github.com/jscutlery/semver/issues/510) ## [2.24.1](https://github.com/jscutlery/semver/compare/semver-2.24.0...semver-2.24.1) (2022-05-27) - ### Bug Fixes -* version workspace now stages all changes together ([588b028](https://github.com/jscutlery/semver/commit/588b028863e046cf8fe157352d9858b6b5d22ae9)) -* version workspace now stages all changes together ([ece3c07](https://github.com/jscutlery/semver/commit/ece3c07ce074b72060c25e419c76a8e495890206)) - - +- version workspace now stages all changes together ([588b028](https://github.com/jscutlery/semver/commit/588b028863e046cf8fe157352d9858b6b5d22ae9)) +- version workspace now stages all changes together ([ece3c07](https://github.com/jscutlery/semver/commit/ece3c07ce074b72060c25e419c76a8e495890206)) # [2.24.0](https://github.com/jscutlery/semver/compare/semver-2.23.4...semver-2.24.0) (2022-05-26) - ### Bug Fixes -* 📦 bump dependency standard-version to v9.5.0 ([4e4f3f6](https://github.com/jscutlery/semver/commit/4e4f3f6a2c4408a342985f465cc1522e085f84e1)) -* **semver:** 🐞 bump @commitlint/* to v17.0.0 ([2d72467](https://github.com/jscutlery/semver/commit/2d72467f542dc026241114bf3a36e54b234010d5)) -* **semver:** 🐞 bump husky to v8.0.0 ([4dd3867](https://github.com/jscutlery/semver/commit/4dd386703c197252b0bc40b7b7ff4e22525c605f)) - +- 📦 bump dependency standard-version to v9.5.0 ([4e4f3f6](https://github.com/jscutlery/semver/commit/4e4f3f6a2c4408a342985f465cc1522e085f84e1)) +- **semver:** 🐞 bump @commitlint/\* to v17.0.0 ([2d72467](https://github.com/jscutlery/semver/commit/2d72467f542dc026241114bf3a36e54b234010d5)) +- **semver:** 🐞 bump husky to v8.0.0 ([4dd3867](https://github.com/jscutlery/semver/commit/4dd386703c197252b0bc40b7b7ff4e22525c605f)) ### Features -* add supportSkipReleaseLabel option ([b38d8a9](https://github.com/jscutlery/semver/commit/b38d8a91259ce43f978627b322616ed62f74aa99)) - - +- add supportSkipReleaseLabel option ([b38d8a9](https://github.com/jscutlery/semver/commit/b38d8a91259ce43f978627b322616ed62f74aa99)) ## [2.23.4](https://github.com/jscutlery/semver/compare/semver-2.23.3...semver-2.23.4) (2022-05-08) - ### Bug Fixes -* **semver:** 🐞 set `@nrwl/devkit` as peer dep ([9e6447c](https://github.com/jscutlery/semver/commit/9e6447c3de46d64d36ec5305d848febf1d4c82bb)) -* **semver:** 🐞 use caret for `@nrwl/devkit` dep ([dbe9000](https://github.com/jscutlery/semver/commit/dbe9000747021d85ff1b71e640c85eaab632be02)) -* **semver:** commit order in sync workspaces ([462a2a7](https://github.com/jscutlery/semver/commit/462a2a7cec6b0d6afa078da5e326428f61dc3f27)) - - +- **semver:** 🐞 set `@nrwl/devkit` as peer dep ([9e6447c](https://github.com/jscutlery/semver/commit/9e6447c3de46d64d36ec5305d848febf1d4c82bb)) +- **semver:** 🐞 use caret for `@nrwl/devkit` dep ([dbe9000](https://github.com/jscutlery/semver/commit/dbe9000747021d85ff1b71e640c85eaab632be02)) +- **semver:** commit order in sync workspaces ([462a2a7](https://github.com/jscutlery/semver/commit/462a2a7cec6b0d6afa078da5e326428f61dc3f27)) ## [2.23.3](https://github.com/jscutlery/semver/compare/semver-2.23.2...semver-2.23.3) (2022-04-29) - ### Bug Fixes -* 📦 dependency inquirer to v8.2.4 ([e64ae62](https://github.com/jscutlery/semver/commit/e64ae62063c3ba39f1d0ae0d0f462d797c7af839)) -* **semver:** 🐞 fix dryRun mode ([0dd4366](https://github.com/jscutlery/semver/commit/0dd4366e6e0e65a6f5ee59ba22b2a0bef961ac44)), closes [#497](https://github.com/jscutlery/semver/issues/497) - - +- 📦 dependency inquirer to v8.2.4 ([e64ae62](https://github.com/jscutlery/semver/commit/e64ae62063c3ba39f1d0ae0d0f462d797c7af839)) +- **semver:** 🐞 fix dryRun mode ([0dd4366](https://github.com/jscutlery/semver/commit/0dd4366e6e0e65a6f5ee59ba22b2a0bef961ac44)), closes [#497](https://github.com/jscutlery/semver/issues/497) ## [2.23.2](https://github.com/jscutlery/semver/compare/semver-2.23.1...semver-2.23.2) (2022-04-28) - ### Bug Fixes -* **semver:** 🐞 ensure tasks are executed sequentially ([367670c](https://github.com/jscutlery/semver/commit/367670c52206ed98e8f5510f2ae4be0ca875c356)) - - +- **semver:** 🐞 ensure tasks are executed sequentially ([367670c](https://github.com/jscutlery/semver/commit/367670c52206ed98e8f5510f2ae4be0ca875c356)) ## [2.23.1](https://github.com/jscutlery/semver/compare/semver-2.23.0...semver-2.23.1) (2022-04-28) - ### Bug Fixes -* **semver:** 🐞 correctly push tag ([b87289b](https://github.com/jscutlery/semver/commit/b87289b522d5303f9aeaa7938cd6a10608af13fc)) - - +- **semver:** 🐞 correctly push tag ([b87289b](https://github.com/jscutlery/semver/commit/b87289b522d5303f9aeaa7938cd6a10608af13fc)) # [2.23.0](https://github.com/jscutlery/semver/compare/semver-2.22.0...semver-2.23.0) (2022-04-28) - ### Bug Fixes -* 📦 dependency inquirer to v8.2.3 ([ad78db0](https://github.com/jscutlery/semver/commit/ad78db0c6c7f56d0e1a0ae741035b586238c4f52)) -* **semver:** 🐞 bump @nrwl/devkit to 14.0.3 ([123c7ff](https://github.com/jscutlery/semver/commit/123c7ff423821a05a899de9243fb2ccefd93ed79)) -* **semver:** 🐞 bump commitlint monorepo to v16.2.4 ([49cb396](https://github.com/jscutlery/semver/commit/49cb396cd86d6f90c18f01a118a217798cfc677e)) -* **semver:** 🐞 ensure push occurs before post-targets ([681fded](https://github.com/jscutlery/semver/commit/681fdede986a3a464b2478ad7706d6493a745dcf)) -* **semver:** 🐞 use str#trim to remove line breaks ([812601b](https://github.com/jscutlery/semver/commit/812601b5635df7549d379863830f6d7d9190a068)) - +- 📦 dependency inquirer to v8.2.3 ([ad78db0](https://github.com/jscutlery/semver/commit/ad78db0c6c7f56d0e1a0ae741035b586238c4f52)) +- **semver:** 🐞 bump @nrwl/devkit to 14.0.3 ([123c7ff](https://github.com/jscutlery/semver/commit/123c7ff423821a05a899de9243fb2ccefd93ed79)) +- **semver:** 🐞 bump commitlint monorepo to v16.2.4 ([49cb396](https://github.com/jscutlery/semver/commit/49cb396cd86d6f90c18f01a118a217798cfc677e)) +- **semver:** 🐞 ensure push occurs before post-targets ([681fded](https://github.com/jscutlery/semver/commit/681fdede986a3a464b2478ad7706d6493a745dcf)) +- **semver:** 🐞 use str#trim to remove line breaks ([812601b](https://github.com/jscutlery/semver/commit/812601b5635df7549d379863830f6d7d9190a068)) ### Features -* **semver:** ✅ gracefully handle tag already exists error ([73071cf](https://github.com/jscutlery/semver/commit/73071cf205c85083894ea51cccb6b2a7b8266f14)), closes [#473](https://github.com/jscutlery/semver/issues/473) -* **semver:** ✅ improve logging ([7a5fb85](https://github.com/jscutlery/semver/commit/7a5fb8504280abea697a75ade962315a1531454f)), closes [#326](https://github.com/jscutlery/semver/issues/326) - - +- **semver:** ✅ gracefully handle tag already exists error ([73071cf](https://github.com/jscutlery/semver/commit/73071cf205c85083894ea51cccb6b2a7b8266f14)), closes [#473](https://github.com/jscutlery/semver/issues/473) +- **semver:** ✅ improve logging ([7a5fb85](https://github.com/jscutlery/semver/commit/7a5fb8504280abea697a75ade962315a1531454f)), closes [#326](https://github.com/jscutlery/semver/issues/326) # [2.22.0](https://github.com/jscutlery/semver/compare/semver-2.21.6...semver-2.22.0) (2022-04-14) - ### Bug Fixes -* **semver:** 🐞 declare `@nrwl/workspace` as peer dep ([76d2d01](https://github.com/jscutlery/semver/commit/76d2d01d15e5184cfa5307b4448ddbbad00b4906)) -* **semver:** 🐞 use project graph fn from devkit ([729fc7f](https://github.com/jscutlery/semver/commit/729fc7fe384700fdb5b2c5dd204defda9d68b076)) - +- **semver:** 🐞 declare `@nrwl/workspace` as peer dep ([76d2d01](https://github.com/jscutlery/semver/commit/76d2d01d15e5184cfa5307b4448ddbbad00b4906)) +- **semver:** 🐞 use project graph fn from devkit ([729fc7f](https://github.com/jscutlery/semver/commit/729fc7fe384700fdb5b2c5dd204defda9d68b076)) ### Features -* **semver:** allow empty releases ([fe75568](https://github.com/jscutlery/semver/commit/fe755680222d393d558fa57686a181483c235ad8)), closes [#477](https://github.com/jscutlery/semver/issues/477) - - +- **semver:** allow empty releases ([fe75568](https://github.com/jscutlery/semver/commit/fe755680222d393d558fa57686a181483c235ad8)), closes [#477](https://github.com/jscutlery/semver/issues/477) ## [2.21.6](https://github.com/jscutlery/semver/compare/semver-2.21.5...semver-2.21.6) (2022-04-01) - - ## [2.21.5](https://github.com/jscutlery/semver/compare/semver-2.21.4...semver-2.21.5) (2022-03-30) - - ## [2.21.4](https://github.com/jscutlery/semver/compare/semver-2.21.3...semver-2.21.4) (2022-03-25) - - ## [2.21.3](https://github.com/jscutlery/semver/compare/semver-2.21.2...semver-2.21.3) (2022-03-18) - - ## [2.21.2](https://github.com/jscutlery/semver/compare/semver-2.21.1...semver-2.21.2) (2022-03-18) - - ## [2.21.1](https://github.com/jscutlery/semver/compare/semver-2.21.0...semver-2.21.1) (2022-03-18) - ### Bug Fixes -* **semver:** 🐞 support Nx 13.9.2 ([a757b30](https://github.com/jscutlery/semver/commit/a757b3073ac29cc67b9b69f89ec78e07028a4fc8)), closes [#467](https://github.com/jscutlery/semver/issues/467) -* **semver:** 🐞 use type list for `x-prompt` preset ([d8b1da2](https://github.com/jscutlery/semver/commit/d8b1da24ea55d3818bcdbfa5ae8ddf9ab040045c)) - - +- **semver:** 🐞 support Nx 13.9.2 ([a757b30](https://github.com/jscutlery/semver/commit/a757b3073ac29cc67b9b69f89ec78e07028a4fc8)), closes [#467](https://github.com/jscutlery/semver/issues/467) +- **semver:** 🐞 use type list for `x-prompt` preset ([d8b1da2](https://github.com/jscutlery/semver/commit/d8b1da24ea55d3818bcdbfa5ae8ddf9ab040045c)) # [2.21.0](https://github.com/jscutlery/semver/compare/semver-2.20.1...semver-2.21.0) (2022-03-17) - ### Features -* **semver:** ✅ add support for `--preset` option ([1b9635a](https://github.com/jscutlery/semver/commit/1b9635a50a89662c0fd557f4ff6d819529c4d9b8)), closes [#457](https://github.com/jscutlery/semver/issues/457) - - +- **semver:** ✅ add support for `--preset` option ([1b9635a](https://github.com/jscutlery/semver/commit/1b9635a50a89662c0fd557f4ff6d819529c4d9b8)), closes [#457](https://github.com/jscutlery/semver/issues/457) ## [2.20.1](https://github.com/jscutlery/semver/compare/semver-2.20.0...semver-2.20.1) (2022-03-07) - - # [2.20.0](https://github.com/jscutlery/semver/compare/semver-2.19.4...semver-2.20.0) (2022-02-28) - ### Features -* **semver:** add gitlab releases executor ([0e41f7d](https://github.com/jscutlery/semver/commit/0e41f7da44780c79a65100da23e9411ab6c9e826)) - - +- **semver:** add gitlab releases executor ([0e41f7d](https://github.com/jscutlery/semver/commit/0e41f7da44780c79a65100da23e9411ab6c9e826)) ## [2.19.4](https://github.com/jscutlery/semver/compare/semver-2.19.3...semver-2.19.4) (2022-02-24) - ### Bug Fixes -* **semver:** 🐞 bump `@commitlint/*` deps ([4cd0d70](https://github.com/jscutlery/semver/commit/4cd0d7008b2acb2b9c8beb56bb9795f7919ff6f0)) -* **semver:** 🐞 fatal pathspec `undefined` ([02634b9](https://github.com/jscutlery/semver/commit/02634b9f055f6b81aa0aef14a8a64f9f031f82ad)), closes [#449](https://github.com/jscutlery/semver/issues/449) - - +- **semver:** 🐞 bump `@commitlint/*` deps ([4cd0d70](https://github.com/jscutlery/semver/commit/4cd0d7008b2acb2b9c8beb56bb9795f7919ff6f0)) +- **semver:** 🐞 fatal pathspec `undefined` ([02634b9](https://github.com/jscutlery/semver/commit/02634b9f055f6b81aa0aef14a8a64f9f031f82ad)), closes [#449](https://github.com/jscutlery/semver/issues/449) ## [2.19.3](https://github.com/jscutlery/semver/compare/semver-2.19.2...semver-2.19.3) (2022-02-18) - ### Bug Fixes -* **semver:** sync versioning when `skipProjectChangelog` ([#446](https://github.com/jscutlery/semver/issues/446)) ([b0cdc58](https://github.com/jscutlery/semver/commit/b0cdc58c2fa9aae4f68afb1fcc965928fa78572d)), closes [#408](https://github.com/jscutlery/semver/issues/408) - - +- **semver:** sync versioning when `skipProjectChangelog` ([#446](https://github.com/jscutlery/semver/issues/446)) ([b0cdc58](https://github.com/jscutlery/semver/commit/b0cdc58c2fa9aae4f68afb1fcc965928fa78572d)), closes [#408](https://github.com/jscutlery/semver/issues/408) ## [2.19.2](https://github.com/jscutlery/semver/compare/semver-2.19.1...semver-2.19.2) (2022-02-17) - ### Bug Fixes -* **semver:** 🐞 add `--tagPrefix` + deprecate `--versionTagPrefix` ([6c22e4c](https://github.com/jscutlery/semver/commit/6c22e4cdaf95a212b1ace12b93dd18cbb991340f)) -* **semver:** 🐞 deprecate `--syncVersions` ([65e5910](https://github.com/jscutlery/semver/commit/65e5910222a2256a28dfae8b862f822804919431)) - - +- **semver:** 🐞 add `--tagPrefix` + deprecate `--versionTagPrefix` ([6c22e4c](https://github.com/jscutlery/semver/commit/6c22e4cdaf95a212b1ace12b93dd18cbb991340f)) +- **semver:** 🐞 deprecate `--syncVersions` ([65e5910](https://github.com/jscutlery/semver/commit/65e5910222a2256a28dfae8b862f822804919431)) ## [2.19.1](https://github.com/jscutlery/semver/compare/semver-2.19.0...semver-2.19.1) (2022-02-17) - ### Bug Fixes -* **semver:** 🐞 correctly grab deps git refs ([94d3fe3](https://github.com/jscutlery/semver/commit/94d3fe337e4a2cda53cbb754fb3699bf140c2e38)) - - +- **semver:** 🐞 correctly grab deps git refs ([94d3fe3](https://github.com/jscutlery/semver/commit/94d3fe337e4a2cda53cbb754fb3699bf140c2e38)) # [2.19.0](https://github.com/jscutlery/semver/compare/semver-2.18.2...semver-2.19.0) (2022-02-17) - ### Bug Fixes -* **semver:** 🐞 forward `--skipProjectChangelog` in independent mode ([85909de](https://github.com/jscutlery/semver/commit/85909dea90a2cf56e8cc4f2cf9e3f4f459cb8853)) - +- **semver:** 🐞 forward `--skipProjectChangelog` in independent mode ([85909de](https://github.com/jscutlery/semver/commit/85909dea90a2cf56e8cc4f2cf9e3f4f459cb8853)) ### Features -* **semver:** log dependency updates with `--trackDeps` ([#445](https://github.com/jscutlery/semver/issues/445)) ([44a2e54](https://github.com/jscutlery/semver/commit/44a2e545ee7fbb8549301dc830fd5df4f09bfb5c)) - - +- **semver:** log dependency updates with `--trackDeps` ([#445](https://github.com/jscutlery/semver/issues/445)) ([44a2e54](https://github.com/jscutlery/semver/commit/44a2e545ee7fbb8549301dc830fd5df4f09bfb5c)) ## [2.18.2](https://github.com/jscutlery/semver/compare/semver-2.18.1...semver-2.18.2) (2022-02-16) - ### Bug Fixes -* **semver:** 🐞 support `--trackDeps` for Nx < 13 ([bd7ce83](https://github.com/jscutlery/semver/commit/bd7ce8358d4d12078b09e45aa910fc4c66663c19)), closes [#443](https://github.com/jscutlery/semver/issues/443) - - +- **semver:** 🐞 support `--trackDeps` for Nx < 13 ([bd7ce83](https://github.com/jscutlery/semver/commit/bd7ce8358d4d12078b09e45aa910fc4c66663c19)), closes [#443](https://github.com/jscutlery/semver/issues/443) ## [2.18.1](https://github.com/jscutlery/semver/compare/semver-2.18.0...semver-2.18.1) (2022-02-08) - - # [2.18.0](https://github.com/jscutlery/semver/compare/semver-2.17.6...semver-2.18.0) (2022-01-31) - ### Features -* **semver:** filter out prerelease tags if trying to release ([c508323](https://github.com/jscutlery/semver/commit/c50832318df61769fda76df2b29cedbc7a150791)) - - +- **semver:** filter out prerelease tags if trying to release ([c508323](https://github.com/jscutlery/semver/commit/c50832318df61769fda76df2b29cedbc7a150791)) ## [2.17.6](https://github.com/jscutlery/semver/compare/semver-2.17.5...semver-2.17.6) (2022-01-25) - ### Bug Fixes -* **semver:** typo on `notesFile` schema option ([dff85db](https://github.com/jscutlery/semver/commit/dff85dba7690d0182f3ff481a076ef20af09e2e0)) - - +- **semver:** typo on `notesFile` schema option ([dff85db](https://github.com/jscutlery/semver/commit/dff85dba7690d0182f3ff481a076ef20af09e2e0)) ## [2.17.5](https://github.com/jscutlery/semver/compare/semver-2.17.4...semver-2.17.5) (2022-01-10) - ### Bug Fixes -* **semver:** 🐞 use `--skipProjectChangelog` with independent mode ([293af06](https://github.com/jscutlery/semver/commit/293af06958d806bcb5f467f7e499ef237599507e)) - - +- **semver:** 🐞 use `--skipProjectChangelog` with independent mode ([293af06](https://github.com/jscutlery/semver/commit/293af06958d806bcb5f467f7e499ef237599507e)) ## [2.17.4](https://github.com/jscutlery/semver/compare/semver-2.17.3...semver-2.17.4) (2022-01-09) - ### Bug Fixes -* **semver:** 🐞 calculate notes from root changelog ([2f26cad](https://github.com/jscutlery/semver/commit/2f26cade3bdd677c85db0336e2dc5b2f320e03d8)) - - +- **semver:** 🐞 calculate notes from root changelog ([2f26cad](https://github.com/jscutlery/semver/commit/2f26cade3bdd677c85db0336e2dc5b2f320e03d8)) ## [2.17.3](https://github.com/jscutlery/semver/compare/semver-2.17.2...semver-2.17.3) (2021-12-30) - ### Bug Fixes -* **semver:** 🐞 bump `@commitlint/*` deps ([5f0a4f5](https://github.com/jscutlery/semver/commit/5f0a4f547d7800b6ed19d4956e3beb646bd3dae1)) -* **semver:** 🐞 fix `gh` CLI error handling ([3d87938](https://github.com/jscutlery/semver/commit/3d87938adb7b546cdc341e1fc112187851726255)) - - +- **semver:** 🐞 bump `@commitlint/*` deps ([5f0a4f5](https://github.com/jscutlery/semver/commit/5f0a4f547d7800b6ed19d4956e3beb646bd3dae1)) +- **semver:** 🐞 fix `gh` CLI error handling ([3d87938](https://github.com/jscutlery/semver/commit/3d87938adb7b546cdc341e1fc112187851726255)) ## [2.17.2](https://github.com/jscutlery/semver/compare/semver-2.17.1...semver-2.17.2) (2021-12-29) - ### Bug Fixes -* **semver:** 🐞 log `gh` CLI errors ([871a039](https://github.com/jscutlery/semver/commit/871a03982f7c70c5b15cb09b038a7573b71be572)) -* **semver:** 🐞 rename `--branch` to `--target` ([ca1c539](https://github.com/jscutlery/semver/commit/ca1c539e888d3bbb334038d888ba905dfc5e282c)) - - +- **semver:** 🐞 log `gh` CLI errors ([871a039](https://github.com/jscutlery/semver/commit/871a03982f7c70c5b15cb09b038a7573b71be572)) +- **semver:** 🐞 rename `--branch` to `--target` ([ca1c539](https://github.com/jscutlery/semver/commit/ca1c539e888d3bbb334038d888ba905dfc5e282c)) ## [2.17.1](https://github.com/jscutlery/semver/compare/semver-2.17.0...semver-2.17.1) (2021-12-29) - ### Reverts -* ⚙️ debug github executor ([925760d](https://github.com/jscutlery/semver/commit/925760d37ab270430177682507449c38582a78c0)) - - +- ⚙️ debug github executor ([925760d](https://github.com/jscutlery/semver/commit/925760d37ab270430177682507449c38582a78c0)) # [2.17.0](https://github.com/jscutlery/semver/compare/semver-2.16.1...semver-2.17.0) (2021-12-29) - ### Bug Fixes -* **semver:** 🐞 correctly run `gh` command ([63346e7](https://github.com/jscutlery/semver/commit/63346e7c3e05527b8631107c6ab29bcf983550e9)) - +- **semver:** 🐞 correctly run `gh` command ([63346e7](https://github.com/jscutlery/semver/commit/63346e7c3e05527b8631107c6ab29bcf983550e9)) ### Features -* **semver:** ✅ add `--generate-notes` option ([6824a12](https://github.com/jscutlery/semver/commit/6824a12219f78d45a81a84a178f032916f874b71)) - - +- **semver:** ✅ add `--generate-notes` option ([6824a12](https://github.com/jscutlery/semver/commit/6824a12219f78d45a81a84a178f032916f874b71)) ## [2.16.1](https://github.com/jscutlery/semver/compare/semver-2.16.0...semver-2.16.1) (2021-12-28) - ### Bug Fixes -* **semver:** 🐞 use `execFile` for command execution ([b51903b](https://github.com/jscutlery/semver/commit/b51903b246ed1f4876448abd1a0d3ebe64843f2c)), closes [#350](https://github.com/jscutlery/semver/issues/350) - - +- **semver:** 🐞 use `execFile` for command execution ([b51903b](https://github.com/jscutlery/semver/commit/b51903b246ed1f4876448abd1a0d3ebe64843f2c)), closes [#350](https://github.com/jscutlery/semver/issues/350) # [2.16.0](https://github.com/jscutlery/semver/compare/semver-2.15.0...semver-2.16.0) (2021-12-27) - ### Features -* **semver:** ✅ configure default `--commitMessageFormat` ([6388bc7](https://github.com/jscutlery/semver/commit/6388bc7e793a9b878a5623c7c2220fc028691f47)) - - +- **semver:** ✅ configure default `--commitMessageFormat` ([6388bc7](https://github.com/jscutlery/semver/commit/6388bc7e793a9b878a5623c7c2220fc028691f47)) # [2.15.0](https://github.com/jscutlery/semver/compare/semver-2.14.4...semver-2.15.0) (2021-12-05) - ### Features -* **semver:** ✅ provide relative notes to post targets ([3f523f1](https://github.com/jscutlery/semver/commit/3f523f1a45f8ebe0d8428b1feb28501d9628dd8d)) - - +- **semver:** ✅ provide relative notes to post targets ([3f523f1](https://github.com/jscutlery/semver/commit/3f523f1a45f8ebe0d8428b1feb28501d9628dd8d)) ## [2.14.4](https://github.com/jscutlery/semver/compare/semver-2.14.3...semver-2.14.4) (2021-12-05) - - ## [2.14.3](https://github.com/jscutlery/semver/compare/semver-2.14.2...semver-2.14.3) (2021-11-29) - ### Bug Fixes -* **semver:** 🐞 add log when push succeed ([bdf7abf](https://github.com/jscutlery/semver/commit/bdf7abf8e231f9d3c83a50877cc1180abc4fb7ae)) -* **semver:** 🐞 fallback to default commit message format ([5bdc696](https://github.com/jscutlery/semver/commit/5bdc6964f8f41cd70ce6ca1a90d37553c13f01a8)) - - +- **semver:** 🐞 add log when push succeed ([bdf7abf](https://github.com/jscutlery/semver/commit/bdf7abf8e231f9d3c83a50877cc1180abc4fb7ae)) +- **semver:** 🐞 fallback to default commit message format ([5bdc696](https://github.com/jscutlery/semver/commit/5bdc6964f8f41cd70ce6ca1a90d37553c13f01a8)) ## [2.14.2](https://github.com/jscutlery/semver/compare/semver-2.14.1...semver-2.14.2) (2021-11-29) - - ## [2.14.1](https://github.com/jscutlery/semver/compare/semver-2.14.0...semver-2.14.1) (2021-11-29) - - # [2.14.0](https://github.com/jscutlery/semver/compare/semver-2.13.3...semver-2.14.0) (2021-11-28) - ### Bug Fixes -* **semver:** 🐞 correctly forward `--no-verify` ([50ec0ed](https://github.com/jscutlery/semver/commit/50ec0ed5b153213a623102285865a1694db3f258)) - +- **semver:** 🐞 correctly forward `--no-verify` ([50ec0ed](https://github.com/jscutlery/semver/commit/50ec0ed5b153213a623102285865a1694db3f258)) ### Features -* **semver:** ✅ add `--commitMessageFormat` option ([b8e9674](https://github.com/jscutlery/semver/commit/b8e9674c257594f31e744cae6cf6a35af40f1a3b)) - - +- **semver:** ✅ add `--commitMessageFormat` option ([b8e9674](https://github.com/jscutlery/semver/commit/b8e9674c257594f31e744cae6cf6a35af40f1a3b)) ## [2.13.3](https://github.com/jscutlery/semver/compare/semver-2.13.2...semver-2.13.3) (2021-11-22) - ### Bug Fixes -* **semver:** handle post target executor errors ([c4282a0](https://github.com/jscutlery/semver/commit/c4282a07e5e6a68edf53e9a19a8c8fc69d082ce5)) - - +- **semver:** handle post target executor errors ([c4282a0](https://github.com/jscutlery/semver/commit/c4282a07e5e6a68edf53e9a19a8c8fc69d082ce5)) ## [2.13.2](https://github.com/jscutlery/semver/compare/semver-2.13.1...semver-2.13.2) (2021-11-21) - ### Bug Fixes -* **semver:** bump [@commitlint](https://github.com/commitlint) deps + remove config-conventional ([0cf6d9b](https://github.com/jscutlery/semver/commit/0cf6d9bcae761e394d5436622df473b87d06705b)) -* **semver:** remove commitizen from install generator ([2a9b731](https://github.com/jscutlery/semver/commit/2a9b7314569a04be69719e14b2f1a809420cc16c)) - - +- **semver:** bump [@commitlint](https://github.com/commitlint) deps + remove config-conventional ([0cf6d9b](https://github.com/jscutlery/semver/commit/0cf6d9bcae761e394d5436622df473b87d06705b)) +- **semver:** remove commitizen from install generator ([2a9b731](https://github.com/jscutlery/semver/commit/2a9b7314569a04be69719e14b2f1a809420cc16c)) ## [2.13.1](https://github.com/jscutlery/semver/compare/semver-2.13.0...semver-2.13.1) (2021-11-11) - ### Bug Fixes -* **semver:** write commitlint config into json ([#383](https://github.com/jscutlery/semver/issues/383)) ([f4013fd](https://github.com/jscutlery/semver/commit/f4013fd3d25fb9999d55db3e087550c33f16b225)) - - +- **semver:** write commitlint config into json ([#383](https://github.com/jscutlery/semver/issues/383)) ([f4013fd](https://github.com/jscutlery/semver/commit/f4013fd3d25fb9999d55db3e087550c33f16b225)) # [2.13.0](https://github.com/jscutlery/semver/compare/semver-2.12.0...semver-2.13.0) (2021-11-04) - ### Features -* **semver:** follow `@commitlint/config-angular` rules ([71f3fed](https://github.com/jscutlery/semver/commit/71f3fedf49f26b47da9e28fae56dfe11540ecd06)) - - +- **semver:** follow `@commitlint/config-angular` rules ([71f3fed](https://github.com/jscutlery/semver/commit/71f3fedf49f26b47da9e28fae56dfe11540ecd06)) # [2.12.0](https://github.com/jscutlery/semver/compare/semver-2.11.5...semver-2.12.0) (2021-11-04) - ### Features -* **semver:** add `--baseBranch` option to install generator ([0aa8626](https://github.com/jscutlery/semver/commit/0aa8626cdd4d4ad4f8764f197f48f55a53532fcc)) - - +- **semver:** add `--baseBranch` option to install generator ([0aa8626](https://github.com/jscutlery/semver/commit/0aa8626cdd4d4ad4f8764f197f48f55a53532fcc)) ## [2.11.5](https://github.com/jscutlery/semver/compare/semver-2.11.4...semver-2.11.5) (2021-10-30) - - ## [2.11.4](https://github.com/jscutlery/semver/compare/semver-2.11.3...semver-2.11.4) (2021-10-30) - ### Bug Fixes -* **github:** use correct property type ([#370](https://github.com/jscutlery/semver/issues/370)) ([0e67599](https://github.com/jscutlery/semver/commit/0e67599e369555e4181bb7055f9e1181e3baeaf1)) - - +- **github:** use correct property type ([#370](https://github.com/jscutlery/semver/issues/370)) ([0e67599](https://github.com/jscutlery/semver/commit/0e67599e369555e4181bb7055f9e1181e3baeaf1)) ## [2.11.3](https://github.com/jscutlery/semver/compare/semver-2.11.2...semver-2.11.3) (2021-10-30) - ### Bug Fixes -* **semver:** bump project graph version ([#369](https://github.com/jscutlery/semver/issues/369)) ([69dd708](https://github.com/jscutlery/semver/commit/69dd708725b2bdd6ec8c3526d304fbf5cf8d220b)) - - +- **semver:** bump project graph version ([#369](https://github.com/jscutlery/semver/issues/369)) ([69dd708](https://github.com/jscutlery/semver/commit/69dd708725b2bdd6ec8c3526d304fbf5cf8d220b)) ## [2.11.2](https://github.com/jscutlery/semver/compare/semver-2.11.1...semver-2.11.2) (2021-10-29) - - ## [2.11.1](https://github.com/jscutlery/semver/compare/semver-2.11.0...semver-2.11.1) (2021-10-29) - ### Bug Fixes -* **semver:** 🐞 ensure projects option is defined ([#362](https://github.com/jscutlery/semver/issues/362)) ([51bac25](https://github.com/jscutlery/semver/commit/51bac25c7cec865dbd9125a7740d8f845166cfef)) - - +- **semver:** 🐞 ensure projects option is defined ([#362](https://github.com/jscutlery/semver/issues/362)) ([51bac25](https://github.com/jscutlery/semver/commit/51bac25c7cec865dbd9125a7740d8f845166cfef)) # [2.11.0](https://github.com/jscutlery/semver/compare/semver-2.10.0...semver-2.11.0) (2021-10-25) - ### Bug Fixes -* :label: Adde shim for standard-lib deep imports ([c66acbf](https://github.com/jscutlery/semver/commit/c66acbf1058e01b9c2e27f38d4469ec767e5fdeb)), closes [#324](https://github.com/jscutlery/semver/issues/324) -* :label: Fixed types ([d31ccfe](https://github.com/jscutlery/semver/commit/d31ccfe301970aa111667779644427448250fb52)), closes [#324](https://github.com/jscutlery/semver/issues/324) -* :label: Fixed types and operators ([b1ec423](https://github.com/jscutlery/semver/commit/b1ec4238b8db55f75d11522ce104c8955c7e3b7c)), closes [#324](https://github.com/jscutlery/semver/issues/324) -* :label: Fixed types and operators ([5f87262](https://github.com/jscutlery/semver/commit/5f87262239488564ef00163f5aef2d6150d47628)), closes [#324](https://github.com/jscutlery/semver/issues/324) -* :label: Fixed typescript strict issues and deprecations ([c38a38e](https://github.com/jscutlery/semver/commit/c38a38ee13f0e9c883152b2b08ed961573c29c58)), closes [#342](https://github.com/jscutlery/semver/issues/342) -* :package: Added dep to rxjs 7 to semver ([d937eda](https://github.com/jscutlery/semver/commit/d937eda553d629afb745dd1c77ddff0e1b08a977)), closes [#324](https://github.com/jscutlery/semver/issues/324) -* :wrench: Added missing types and use esModuleInterop ([f5d2b03](https://github.com/jscutlery/semver/commit/f5d2b0308d7b51e68cbe75bd7434a9850982b8a1)), closes [#324](https://github.com/jscutlery/semver/issues/324) -* changing the --track-deps option to only increment a patch ([a27e76e](https://github.com/jscutlery/semver/commit/a27e76e7a408537ed1410a1322851f9d9379eef3)) -* cleaning up a merge issue ([ca98d55](https://github.com/jscutlery/semver/commit/ca98d554200bcce4c5e3cc85f43c9a683c1b3d06)) -* cleaning up after a rebase ([7e4fa79](https://github.com/jscutlery/semver/commit/7e4fa790bcb0125ac08933a7fe742682d6b5ef4d)) -* fixing a messed up merge of the version schema ([4d02faf](https://github.com/jscutlery/semver/commit/4d02faf149a9bb14c92b8e16e1203815aa21fdad)) -* fixing a rebase issue ([75c37ca](https://github.com/jscutlery/semver/commit/75c37ca619b4bef0ec4369600c58bf2a943253ab)) -* **semver:** bump dependencies ([12468de](https://github.com/jscutlery/semver/commit/12468dea3e5a9b18968e33b5d50af4ff4576f898)) -* **semver:** bump generator deps ([e1c9052](https://github.com/jscutlery/semver/commit/e1c90522ede345cb316aa4b88e0f25f9a7c68e9b)) -* **semver:** changing the --use-deps option to --track-deps ([f909d5e](https://github.com/jscutlery/semver/commit/f909d5ed052ca3743dd22b69799229465e0eea5b)) -* **semver:** fixing some linting issues ([c6c29de](https://github.com/jscutlery/semver/commit/c6c29de14f706dd9a48823722c73906d44942cc8)) -* **semver:** fixing some linting issues ([27af0f8](https://github.com/jscutlery/semver/commit/27af0f842ca26bad5c4ac4f5db0eb209eaa0048c)) -* **semver:** making --track-deps only read one dependency deep ([62468eb](https://github.com/jscutlery/semver/commit/62468eb296a57b3be2bfc143f068c42a6d41daa6)) -* **semver:** resolve boolean arguments correctly ([bbd55dd](https://github.com/jscutlery/semver/commit/bbd55dd139d0afe9c1951e2d5988871b53303573)), closes [#353](https://github.com/jscutlery/semver/issues/353) -* **semver:** Switching to using project graph functions directly, instead of the CLI. ([dedde3f](https://github.com/jscutlery/semver/commit/dedde3f5c90c65df4c27dcf16dd619d8be36fc2c)) - - -### Features - -* :heavy_plus_sign: Added types and config entries ([b22875e](https://github.com/jscutlery/semver/commit/b22875ebd9c94e2ce23d94f2252c90499b7715d7)), closes [#342](https://github.com/jscutlery/semver/issues/342) -* **github:** ✅ add missing options to github executor ([603ac25](https://github.com/jscutlery/semver/commit/603ac25737fde7f0fcd006ced8afd13293683779)) -* **github:** ✅ add missing options to github executor ([bfb466d](https://github.com/jscutlery/semver/commit/bfb466de466b3940eb4f50e02ed76176fb785761)) -* **github:** ✅ add test for missing github executor ([7480e1e](https://github.com/jscutlery/semver/commit/7480e1e022e6f5c73444c56e0e4014b078c31e6a)) -* **semver:** Adding in a `--use-deps` flag to include dependencies when calculating the version bump ([7d9e4c9](https://github.com/jscutlery/semver/commit/7d9e4c9a2e50cbe4dbd77fe7e6a77ba2a2946351)) -* **semver:** Adding in a `--use-deps` flag to include dependencies when calculating the version bump ([8f23095](https://github.com/jscutlery/semver/commit/8f23095aae6e40b5b8fd4400dcfae660ee4015ad)) - - +- :label: Adde shim for standard-lib deep imports ([c66acbf](https://github.com/jscutlery/semver/commit/c66acbf1058e01b9c2e27f38d4469ec767e5fdeb)), closes [#324](https://github.com/jscutlery/semver/issues/324) +- :label: Fixed types ([d31ccfe](https://github.com/jscutlery/semver/commit/d31ccfe301970aa111667779644427448250fb52)), closes [#324](https://github.com/jscutlery/semver/issues/324) +- :label: Fixed types and operators ([b1ec423](https://github.com/jscutlery/semver/commit/b1ec4238b8db55f75d11522ce104c8955c7e3b7c)), closes [#324](https://github.com/jscutlery/semver/issues/324) +- :label: Fixed types and operators ([5f87262](https://github.com/jscutlery/semver/commit/5f87262239488564ef00163f5aef2d6150d47628)), closes [#324](https://github.com/jscutlery/semver/issues/324) +- :label: Fixed typescript strict issues and deprecations ([c38a38e](https://github.com/jscutlery/semver/commit/c38a38ee13f0e9c883152b2b08ed961573c29c58)), closes [#342](https://github.com/jscutlery/semver/issues/342) +- :package: Added dep to rxjs 7 to semver ([d937eda](https://github.com/jscutlery/semver/commit/d937eda553d629afb745dd1c77ddff0e1b08a977)), closes [#324](https://github.com/jscutlery/semver/issues/324) +- :wrench: Added missing types and use esModuleInterop ([f5d2b03](https://github.com/jscutlery/semver/commit/f5d2b0308d7b51e68cbe75bd7434a9850982b8a1)), closes [#324](https://github.com/jscutlery/semver/issues/324) +- changing the --track-deps option to only increment a patch ([a27e76e](https://github.com/jscutlery/semver/commit/a27e76e7a408537ed1410a1322851f9d9379eef3)) +- cleaning up a merge issue ([ca98d55](https://github.com/jscutlery/semver/commit/ca98d554200bcce4c5e3cc85f43c9a683c1b3d06)) +- cleaning up after a rebase ([7e4fa79](https://github.com/jscutlery/semver/commit/7e4fa790bcb0125ac08933a7fe742682d6b5ef4d)) +- fixing a messed up merge of the version schema ([4d02faf](https://github.com/jscutlery/semver/commit/4d02faf149a9bb14c92b8e16e1203815aa21fdad)) +- fixing a rebase issue ([75c37ca](https://github.com/jscutlery/semver/commit/75c37ca619b4bef0ec4369600c58bf2a943253ab)) +- **semver:** bump dependencies ([12468de](https://github.com/jscutlery/semver/commit/12468dea3e5a9b18968e33b5d50af4ff4576f898)) +- **semver:** bump generator deps ([e1c9052](https://github.com/jscutlery/semver/commit/e1c90522ede345cb316aa4b88e0f25f9a7c68e9b)) +- **semver:** changing the --use-deps option to --track-deps ([f909d5e](https://github.com/jscutlery/semver/commit/f909d5ed052ca3743dd22b69799229465e0eea5b)) +- **semver:** fixing some linting issues ([c6c29de](https://github.com/jscutlery/semver/commit/c6c29de14f706dd9a48823722c73906d44942cc8)) +- **semver:** fixing some linting issues ([27af0f8](https://github.com/jscutlery/semver/commit/27af0f842ca26bad5c4ac4f5db0eb209eaa0048c)) +- **semver:** making --track-deps only read one dependency deep ([62468eb](https://github.com/jscutlery/semver/commit/62468eb296a57b3be2bfc143f068c42a6d41daa6)) +- **semver:** resolve boolean arguments correctly ([bbd55dd](https://github.com/jscutlery/semver/commit/bbd55dd139d0afe9c1951e2d5988871b53303573)), closes [#353](https://github.com/jscutlery/semver/issues/353) +- **semver:** Switching to using project graph functions directly, instead of the CLI. ([dedde3f](https://github.com/jscutlery/semver/commit/dedde3f5c90c65df4c27dcf16dd619d8be36fc2c)) + +### Features + +- :heavy_plus_sign: Added types and config entries ([b22875e](https://github.com/jscutlery/semver/commit/b22875ebd9c94e2ce23d94f2252c90499b7715d7)), closes [#342](https://github.com/jscutlery/semver/issues/342) +- **github:** ✅ add missing options to github executor ([603ac25](https://github.com/jscutlery/semver/commit/603ac25737fde7f0fcd006ced8afd13293683779)) +- **github:** ✅ add missing options to github executor ([bfb466d](https://github.com/jscutlery/semver/commit/bfb466de466b3940eb4f50e02ed76176fb785761)) +- **github:** ✅ add test for missing github executor ([7480e1e](https://github.com/jscutlery/semver/commit/7480e1e022e6f5c73444c56e0e4014b078c31e6a)) +- **semver:** Adding in a `--use-deps` flag to include dependencies when calculating the version bump ([7d9e4c9](https://github.com/jscutlery/semver/commit/7d9e4c9a2e50cbe4dbd77fe7e6a77ba2a2946351)) +- **semver:** Adding in a `--use-deps` flag to include dependencies when calculating the version bump ([8f23095](https://github.com/jscutlery/semver/commit/8f23095aae6e40b5b8fd4400dcfae660ee4015ad)) # [2.10.0](https://github.com/jscutlery/nx-plugin-semver/compare/semver-2.9.0...semver-2.10.0) (2021-10-07) - ### Features -* **github:** ✅ add `--notes` and `--notesFile` support ([68ef734](https://github.com/jscutlery/nx-plugin-semver/commit/68ef7340a2c0c6263c7d19f666d38aa3d9f3b2cf)) - - +- **github:** ✅ add `--notes` and `--notesFile` support ([68ef734](https://github.com/jscutlery/nx-plugin-semver/commit/68ef7340a2c0c6263c7d19f666d38aa3d9f3b2cf)) # [2.9.0](https://github.com/jscutlery/nx-plugin-semver/compare/semver-2.8.1...semver-2.9.0) (2021-10-06) - ### Bug Fixes -* **github:** 🐞 handle files and error correctly ([08cc021](https://github.com/jscutlery/nx-plugin-semver/commit/08cc0214a49e8afef694048786c3b555e8c8d85b)) -* **semver:** 🐞 forward valid version to post targets ([e5b15be](https://github.com/jscutlery/nx-plugin-semver/commit/e5b15be73f915920e8c57e21c2fe11d95169f4b0)) -* **semver:** 🐞 handle post-targets SchemaError ([09ffbae](https://github.com/jscutlery/nx-plugin-semver/commit/09ffbaeb7120b5e519f299fec74f9a20138c5a74)) -* **semver:** 🐞 resolve post target correctly ([b209832](https://github.com/jscutlery/nx-plugin-semver/commit/b209832235a1281141ff72d462f0377b31abadea)) -* **semver:** 🐞 use default export for version builder ([f334900](https://github.com/jscutlery/nx-plugin-semver/commit/f334900ad6902a4da76b643dc959333868f7be9a)) -* **semver:** 🐞 use only string schema ([304f16c](https://github.com/jscutlery/nx-plugin-semver/commit/304f16cd1fa93f989bb3021a1ef0dd84856b23b1)) -* use standalone projects ([22476c4](https://github.com/jscutlery/nx-plugin-semver/commit/22476c4ab52668fa200454df4b8e20abed893595)), closes [#320](https://github.com/jscutlery/nx-plugin-semver/issues/320) - +- **github:** 🐞 handle files and error correctly ([08cc021](https://github.com/jscutlery/nx-plugin-semver/commit/08cc0214a49e8afef694048786c3b555e8c8d85b)) +- **semver:** 🐞 forward valid version to post targets ([e5b15be](https://github.com/jscutlery/nx-plugin-semver/commit/e5b15be73f915920e8c57e21c2fe11d95169f4b0)) +- **semver:** 🐞 handle post-targets SchemaError ([09ffbae](https://github.com/jscutlery/nx-plugin-semver/commit/09ffbaeb7120b5e519f299fec74f9a20138c5a74)) +- **semver:** 🐞 resolve post target correctly ([b209832](https://github.com/jscutlery/nx-plugin-semver/commit/b209832235a1281141ff72d462f0377b31abadea)) +- **semver:** 🐞 use default export for version builder ([f334900](https://github.com/jscutlery/nx-plugin-semver/commit/f334900ad6902a4da76b643dc959333868f7be9a)) +- **semver:** 🐞 use only string schema ([304f16c](https://github.com/jscutlery/nx-plugin-semver/commit/304f16cd1fa93f989bb3021a1ef0dd84856b23b1)) +- use standalone projects ([22476c4](https://github.com/jscutlery/nx-plugin-semver/commit/22476c4ab52668fa200454df4b8e20abed893595)), closes [#320](https://github.com/jscutlery/nx-plugin-semver/issues/320) ### Features -* **github:** ✅ add `@jscutlery/semver:github` executor ([637758b](https://github.com/jscutlery/nx-plugin-semver/commit/637758beebe2eeb829c35465955423f0f0b3e526)) -* **github:** ✅ support branch argument ([d38b048](https://github.com/jscutlery/nx-plugin-semver/commit/d38b048748118e0ee3e1c865ed96a816027a88e1)) -* **github:** ✅ support files argument ([8a86aa0](https://github.com/jscutlery/nx-plugin-semver/commit/8a86aa0343f99be455816eec276200f108a94b7c)) -* **semver:** ✅ add `postTargets` option ([#167](https://github.com/jscutlery/nx-plugin-semver/issues/167)) ([133ef71](https://github.com/jscutlery/nx-plugin-semver/commit/133ef717edb7d269e77eb0e4459e9fff7f160f46)) -* **semver:** ✅ resolve `tag` property ([102021b](https://github.com/jscutlery/nx-plugin-semver/commit/102021b440a13587691236036f26e75c4be69f89)) - - +- **github:** ✅ add `@jscutlery/semver:github` executor ([637758b](https://github.com/jscutlery/nx-plugin-semver/commit/637758beebe2eeb829c35465955423f0f0b3e526)) +- **github:** ✅ support branch argument ([d38b048](https://github.com/jscutlery/nx-plugin-semver/commit/d38b048748118e0ee3e1c865ed96a816027a88e1)) +- **github:** ✅ support files argument ([8a86aa0](https://github.com/jscutlery/nx-plugin-semver/commit/8a86aa0343f99be455816eec276200f108a94b7c)) +- **semver:** ✅ add `postTargets` option ([#167](https://github.com/jscutlery/nx-plugin-semver/issues/167)) ([133ef71](https://github.com/jscutlery/nx-plugin-semver/commit/133ef717edb7d269e77eb0e4459e9fff7f160f46)) +- **semver:** ✅ resolve `tag` property ([102021b](https://github.com/jscutlery/nx-plugin-semver/commit/102021b440a13587691236036f26e75c4be69f89)) ## [2.8.1](https://github.com/jscutlery/nx-plugin-semver/compare/semver-2.8.0...semver-2.8.1) (2021-10-01) - ### Bug Fixes -* **semver:** 🐞 add --releaseAs argument ([ec20b09](https://github.com/jscutlery/nx-plugin-semver/commit/ec20b094dc361dd931a485072d50f1d3f84c0f3c)), closes [#236](https://github.com/jscutlery/nx-plugin-semver/issues/236) [#218](https://github.com/jscutlery/nx-plugin-semver/issues/218) - - +- **semver:** 🐞 add --releaseAs argument ([ec20b09](https://github.com/jscutlery/nx-plugin-semver/commit/ec20b094dc361dd931a485072d50f1d3f84c0f3c)), closes [#236](https://github.com/jscutlery/nx-plugin-semver/issues/236) [#218](https://github.com/jscutlery/nx-plugin-semver/issues/218) # [2.8.0](https://github.com/jscutlery/semver/compare/semver-2.7.1...semver-2.8.0) (2021-09-17) - ### Bug Fixes -* **semver:** 🐞 support Angular CLI workspace definition ([416d6bb](https://github.com/jscutlery/semver/commit/416d6bbfd0331a3ff9d5faaa6e0dd8b573a71cdd)), closes [discussion#6955](https://github.com/nrwl/nx/discussions/6955#discussioncomment-1341893) +- **semver:** 🐞 support Angular CLI workspace definition ([416d6bb](https://github.com/jscutlery/semver/commit/416d6bbfd0331a3ff9d5faaa6e0dd8b573a71cdd)), closes [discussion#6955](https://github.com/nrwl/nx/discussions/6955#discussioncomment-1341893) ### Features -* **semver:** ✅ bump install generator dependencies ([9de8f17](https://github.com/jscutlery/semver/commit/9de8f17cda699ebc58a4bb4b89a3b2f61071fa5f)) - - +- **semver:** ✅ bump install generator dependencies ([9de8f17](https://github.com/jscutlery/semver/commit/9de8f17cda699ebc58a4bb4b89a3b2f61071fa5f)) ## [2.7.1](https://github.com/jscutlery/semver/compare/semver-2.7.0...semver-2.7.1) (2021-09-15) - ### Bug Fixes -* **semver:** 🐞 handle child process error gracefully ([23dfee6](https://github.com/jscutlery/semver/commit/23dfee60665e2ccfa9de3b4f495341d4cfdc7fa7)), closes [#196](https://github.com/jscutlery/semver/issues/196) -* **semver:** 🐞 update migration target ([6a22938](https://github.com/jscutlery/semver/commit/6a22938e40b954fe2a49b1c85dc549c19cd79108)) - - +- **semver:** 🐞 handle child process error gracefully ([23dfee6](https://github.com/jscutlery/semver/commit/23dfee60665e2ccfa9de3b4f495341d4cfdc7fa7)), closes [#196](https://github.com/jscutlery/semver/issues/196) +- **semver:** 🐞 update migration target ([6a22938](https://github.com/jscutlery/semver/commit/6a22938e40b954fe2a49b1c85dc549c19cd79108)) # [2.7.0](https://github.com/jscutlery/semver/compare/semver-2.6.0...semver-2.7.0) (2021-09-07) - ### Bug Fixes -* **semver:** 🐞 install generator fails when .husky folder exists ([ac9556c](https://github.com/jscutlery/semver/commit/ac9556c442ea83d6bdd514285531b64042c5ccdb)) - +- **semver:** 🐞 install generator fails when .husky folder exists ([ac9556c](https://github.com/jscutlery/semver/commit/ac9556c442ea83d6bdd514285531b64042c5ccdb)) ### Features -* **semver:** ✔️ use undefined as default value of versionTagPrefix ([7cbafb2](https://github.com/jscutlery/semver/commit/7cbafb2d80be267d49d625f28681857bbfe40cd7)) - - +- **semver:** ✔️ use undefined as default value of versionTagPrefix ([7cbafb2](https://github.com/jscutlery/semver/commit/7cbafb2d80be267d49d625f28681857bbfe40cd7)) # [2.6.0](https://github.com/jscutlery/semver/compare/semver-2.5.0...semver-2.6.0) (2021-08-09) - ### Bug Fixes -* **semver:** 🐞 add `@nrwl/schematics` dependency ([3382473](https://github.com/jscutlery/semver/commit/3382473fefbf173b19f861d9cf2851db1bb5151c)) -* **semver:** 🐞 add missing schema cli property ([9006e26](https://github.com/jscutlery/semver/commit/9006e26e52cfccde837e0676f96ad3bb6868e02e)) -* **semver:** 🐞 ensure package install after fs commited ([72b44b7](https://github.com/jscutlery/semver/commit/72b44b74b38476639bdf25f99470dc63274e7649)) - +- **semver:** 🐞 add `@nrwl/schematics` dependency ([3382473](https://github.com/jscutlery/semver/commit/3382473fefbf173b19f861d9cf2851db1bb5151c)) +- **semver:** 🐞 add missing schema cli property ([9006e26](https://github.com/jscutlery/semver/commit/9006e26e52cfccde837e0676f96ad3bb6868e02e)) +- **semver:** 🐞 ensure package install after fs commited ([72b44b7](https://github.com/jscutlery/semver/commit/72b44b74b38476639bdf25f99470dc63274e7649)) ### Features -* **semver:** add custom tag prefix implementation ([4bc45e3](https://github.com/jscutlery/semver/commit/4bc45e3e98b106eb0deb6ef32711895656a4c665)) -* **semver:** add tag template string support ([91dec48](https://github.com/jscutlery/semver/commit/91dec484aa6221b429588bfd753c399881801f61)) - - +- **semver:** add custom tag prefix implementation ([4bc45e3](https://github.com/jscutlery/semver/commit/4bc45e3e98b106eb0deb6ef32711895656a4c665)) +- **semver:** add tag template string support ([91dec48](https://github.com/jscutlery/semver/commit/91dec484aa6221b429588bfd753c399881801f61)) # [2.5.0](https://github.com/jscutlery/semver/compare/semver-2.4.0...semver-2.5.0) (2021-08-05) - ### Bug Fixes -* 📦 update dependency @angular-devkit/build-angular to v12 ([52792a6](https://github.com/jscutlery/semver/commit/52792a6369caac9f4084b8d2c41514a15015a027)) - - +- 📦 update dependency @angular-devkit/build-angular to v12 ([52792a6](https://github.com/jscutlery/semver/commit/52792a6369caac9f4084b8d2c41514a15015a027)) # [2.4.0](https://github.com/jscutlery/semver/compare/semver-2.3.1...semver-2.4.0) (2021-07-07) - ### Features -* ✅ handle extracted project's configuration ([#230](https://github.com/jscutlery/semver/issues/230)) ([924347a](https://github.com/jscutlery/semver/commit/924347aeea24a50e3e31633c7ddeafe2e0cae4ba)) - - +- ✅ handle extracted project's configuration ([#230](https://github.com/jscutlery/semver/issues/230)) ([924347a](https://github.com/jscutlery/semver/commit/924347aeea24a50e3e31633c7ddeafe2e0cae4ba)) ## [2.3.1](https://github.com/jscutlery/semver/compare/semver-2.3.0...semver-2.3.1) (2021-06-08) - ### Bug Fixes -* **ng-add:** only allow read write and execution from owner ([41b7b30](https://github.com/jscutlery/semver/commit/41b7b3044d2188ced3fddfbf5fbd9b3bd7b0a703)) -* 📦 update dependency @angular-devkit/build-angular to v0.1102.14 ([c16d0fa](https://github.com/jscutlery/semver/commit/c16d0fa53e141d7c2067e20d4cec959d468a433b)) -* **ng-add:** fix id schema property warning ([5d67597](https://github.com/jscutlery/semver/commit/5d6759739003f354b3d2c180dcc2f343e8232ee8)) - - +- **ng-add:** only allow read write and execution from owner ([41b7b30](https://github.com/jscutlery/semver/commit/41b7b3044d2188ced3fddfbf5fbd9b3bd7b0a703)) +- 📦 update dependency @angular-devkit/build-angular to v0.1102.14 ([c16d0fa](https://github.com/jscutlery/semver/commit/c16d0fa53e141d7c2067e20d4cec959d468a433b)) +- **ng-add:** fix id schema property warning ([5d67597](https://github.com/jscutlery/semver/commit/5d6759739003f354b3d2c180dcc2f343e8232ee8)) # [2.3.0](https://github.com/jscutlery/semver/compare/semver-2.2.1...semver-2.3.0) (2021-06-03) - ### Bug Fixes -* **ng-add:** execute prepare ([43ada7c](https://github.com/jscutlery/semver/commit/43ada7c7d33712fd5d461f1629b676fab91aead9)) -* **ng-add:** fix wrong code ([4b814c6](https://github.com/jscutlery/semver/commit/4b814c688010a3f7ddf7f487faa145d63f933566)) -* **ng-add:** update husky file check ([de1754e](https://github.com/jscutlery/semver/commit/de1754e647aa3674dc655a16bfff601e1b079664)) - +- **ng-add:** execute prepare ([43ada7c](https://github.com/jscutlery/semver/commit/43ada7c7d33712fd5d461f1629b676fab91aead9)) +- **ng-add:** fix wrong code ([4b814c6](https://github.com/jscutlery/semver/commit/4b814c688010a3f7ddf7f487faa145d63f933566)) +- **ng-add:** update husky file check ([de1754e](https://github.com/jscutlery/semver/commit/de1754e647aa3674dc655a16bfff601e1b079664)) ### Features -* **ng-add:** add commitizen ([8c1d996](https://github.com/jscutlery/semver/commit/8c1d996e773a23bb8db0e27e95ae6d26a30b9637)) -* **ng-add:** add commitlint ([741f76c](https://github.com/jscutlery/semver/commit/741f76c02eb8152217cfd1a89d4cd6d2f6453b31)) -* **ng-add:** add husky ([4f5c202](https://github.com/jscutlery/semver/commit/4f5c202bae39d2bf5dd88b0d281e3b9ddd490d04)) -* **ng-add:** add new options to enforce CC ([4621059](https://github.com/jscutlery/semver/commit/4621059e689a139abcfa70a7f71a10ea32cdf46a)) -* **ng-add:** check husky config before create ([bf3590d](https://github.com/jscutlery/semver/commit/bf3590d9b2cbf251c47ee4a8cce1a49955b56dbb)) -* **ng-add:** make commit-msg executable ([fbcb930](https://github.com/jscutlery/semver/commit/fbcb9308d300347e2fda36e37622992ccb928e63)) -* **ng-add:** remove uneeded code ([496ec3e](https://github.com/jscutlery/semver/commit/496ec3e89a525aaafbae7c90b50ab70e0f4fff11)) -* **ng-add:** update behavior and code cleanup ([d8eb821](https://github.com/jscutlery/semver/commit/d8eb821800e8f9245eaf859d7afc2e6ce206e3d2)) - - +- **ng-add:** add commitizen ([8c1d996](https://github.com/jscutlery/semver/commit/8c1d996e773a23bb8db0e27e95ae6d26a30b9637)) +- **ng-add:** add commitlint ([741f76c](https://github.com/jscutlery/semver/commit/741f76c02eb8152217cfd1a89d4cd6d2f6453b31)) +- **ng-add:** add husky ([4f5c202](https://github.com/jscutlery/semver/commit/4f5c202bae39d2bf5dd88b0d281e3b9ddd490d04)) +- **ng-add:** add new options to enforce CC ([4621059](https://github.com/jscutlery/semver/commit/4621059e689a139abcfa70a7f71a10ea32cdf46a)) +- **ng-add:** check husky config before create ([bf3590d](https://github.com/jscutlery/semver/commit/bf3590d9b2cbf251c47ee4a8cce1a49955b56dbb)) +- **ng-add:** make commit-msg executable ([fbcb930](https://github.com/jscutlery/semver/commit/fbcb9308d300347e2fda36e37622992ccb928e63)) +- **ng-add:** remove uneeded code ([496ec3e](https://github.com/jscutlery/semver/commit/496ec3e89a525aaafbae7c90b50ab70e0f4fff11)) +- **ng-add:** update behavior and code cleanup ([d8eb821](https://github.com/jscutlery/semver/commit/d8eb821800e8f9245eaf859d7afc2e6ce206e3d2)) ## [2.2.1](https://github.com/jscutlery/semver/compare/semver-2.2.0...semver-2.2.1) (2021-05-17) - ### Bug Fixes -* **semver:** 🐞 fix $schema ref ([009c230](https://github.com/jscutlery/semver/commit/009c2307e33c0d64464b4c9061ef6a1c8faef736)) - - +- **semver:** 🐞 fix $schema ref ([009c230](https://github.com/jscutlery/semver/commit/009c2307e33c0d64464b4c9061ef6a1c8faef736)) # [2.2.0](https://github.com/jscutlery/semver/compare/semver-2.1.0...semver-2.2.0) (2021-05-16) - ### Bug Fixes -* **semver:** 🐞 fix json schema id conflict issue ([eeef6f8](https://github.com/jscutlery/semver/commit/eeef6f8b95daf19ead7a9cb3aea2cfae0ea56ed1)) -* 📦 update dependency @angular-devkit/build-angular to v0.1102.10 ([39f7559](https://github.com/jscutlery/semver/commit/39f7559f0ee8a5105f8e4e8ba778dc8edde58c66)) -* 📦 update dependency @angular-devkit/build-angular to v0.1102.11 ([4f8855c](https://github.com/jscutlery/semver/commit/4f8855c8d96bac79902392ba9bf690c05c17a373)) -* 📦 update dependency @angular-devkit/build-angular to v0.1102.12 ([635a32d](https://github.com/jscutlery/semver/commit/635a32d6ee32a9b099f7cd0a0f9f8374c2aef1a5)) -* 📦 update dependency @angular-devkit/build-angular to v0.1102.13 ([8b7418f](https://github.com/jscutlery/semver/commit/8b7418f78905f0474738a19743f9af9d57649767)) -* 📦 update dependency @angular-devkit/build-angular to v0.1102.9 ([f652491](https://github.com/jscutlery/semver/commit/f652491d520c4936668d1e246d7c482bc226aaee)) -* 📦 update dependency inquirer to v8 ([f07f21d](https://github.com/jscutlery/semver/commit/f07f21d8cfaa7d66f27e33dbe3b80922087a9ed4)) - +- **semver:** 🐞 fix json schema id conflict issue ([eeef6f8](https://github.com/jscutlery/semver/commit/eeef6f8b95daf19ead7a9cb3aea2cfae0ea56ed1)) +- 📦 update dependency @angular-devkit/build-angular to v0.1102.10 ([39f7559](https://github.com/jscutlery/semver/commit/39f7559f0ee8a5105f8e4e8ba778dc8edde58c66)) +- 📦 update dependency @angular-devkit/build-angular to v0.1102.11 ([4f8855c](https://github.com/jscutlery/semver/commit/4f8855c8d96bac79902392ba9bf690c05c17a373)) +- 📦 update dependency @angular-devkit/build-angular to v0.1102.12 ([635a32d](https://github.com/jscutlery/semver/commit/635a32d6ee32a9b099f7cd0a0f9f8374c2aef1a5)) +- 📦 update dependency @angular-devkit/build-angular to v0.1102.13 ([8b7418f](https://github.com/jscutlery/semver/commit/8b7418f78905f0474738a19743f9af9d57649767)) +- 📦 update dependency @angular-devkit/build-angular to v0.1102.9 ([f652491](https://github.com/jscutlery/semver/commit/f652491d520c4936668d1e246d7c482bc226aaee)) +- 📦 update dependency inquirer to v8 ([f07f21d](https://github.com/jscutlery/semver/commit/f07f21d8cfaa7d66f27e33dbe3b80922087a9ed4)) ### Features -* ✅ add changelog header option ([205851b](https://github.com/jscutlery/semver/commit/205851bce9f457423de58e36d164ea3b2a60c63d)) - - +- ✅ add changelog header option ([205851b](https://github.com/jscutlery/semver/commit/205851bce9f457423de58e36d164ea3b2a60c63d)) # [2.1.0](https://github.com/jscutlery/semver/compare/semver-2.0.0...semver-2.1.0) (2021-04-15) - ### Features -* ✅ when --version option is used, bump even if no changes ([074dc2d](https://github.com/jscutlery/semver/commit/074dc2d02e522556d22ba71b23af3dc99a1a39db)), closes [#151](https://github.com/jscutlery/semver/issues/151) - - +- ✅ when --version option is used, bump even if no changes ([074dc2d](https://github.com/jscutlery/semver/commit/074dc2d02e522556d22ba71b23af3dc99a1a39db)), closes [#151](https://github.com/jscutlery/semver/issues/151) # [2.0.0](https://github.com/jscutlery/semver/compare/semver-1.4.0...semver-2.0.0) (2021-04-13) - ### Bug Fixes -* 📦 update dependency @angular-devkit/build-angular to v0.1102.8 ([5493164](https://github.com/jscutlery/semver/commit/5493164d9322e43b4acaf2b5bd937d479db53f9a)) - +- 📦 update dependency @angular-devkit/build-angular to v0.1102.8 ([5493164](https://github.com/jscutlery/semver/commit/5493164d9322e43b4acaf2b5bd937d479db53f9a)) ### Features -* ✅ add --skip-project-changelog option ([5bd57f9](https://github.com/jscutlery/semver/commit/5bd57f96f83c624d96f81a291b74a9f19c744cf5)) -* ✅ refactor --root-changelog option to --skip-root-changelog ([2fa3c9b](https://github.com/jscutlery/semver/commit/2fa3c9b3122e663a2e6120afc409436536c6a9cf)) - +- ✅ add --skip-project-changelog option ([5bd57f9](https://github.com/jscutlery/semver/commit/5bd57f96f83c624d96f81a291b74a9f19c744cf5)) +- ✅ refactor --root-changelog option to --skip-root-changelog ([2fa3c9b](https://github.com/jscutlery/semver/commit/2fa3c9b3122e663a2e6120afc409436536c6a9cf)) ### BREAKING CHANGES -* removed --root-changelog option in favor of --skip-root-changelog - - +- removed --root-changelog option in favor of --skip-root-changelog # [1.4.0](https://github.com/jscutlery/semver/compare/semver-1.3.1...semver-1.4.0) (2021-04-08) - ### Bug Fixes -* 🐞 don't silently fail when error is an object ([0e8199d](https://github.com/jscutlery/semver/commit/0e8199de0f4890309930659e402f7145545689e8)) -* 🐞 exec Git add only once to avoid file lock ([4dfce73](https://github.com/jscutlery/semver/commit/4dfce73b399f404e1b568595e4af8d452a672a1c)) -* 🐞 release since first commit if no version found (resolve [#102](https://github.com/jscutlery/semver/issues/102)) ([f882009](https://github.com/jscutlery/semver/commit/f882009dfc93a18f29ca23d95767c9ba250c31b0)) -* 📦 update dependency @angular-devkit/build-angular to v0.1101.4 ([bbe6d07](https://github.com/jscutlery/semver/commit/bbe6d07d62891cc8e7dca7ae2886bbfd9b8f92da)) -* 📦 update dependency @angular-devkit/build-angular to v0.1102.0 ([cd7af9d](https://github.com/jscutlery/semver/commit/cd7af9dfd408c721fd8f325cff7573cc48bb7821)) -* 📦 update dependency @angular-devkit/build-angular to v0.1102.1 ([c5a0fd5](https://github.com/jscutlery/semver/commit/c5a0fd558e2ecd48d514df5d55305878540e5a18)) -* 📦 update dependency @angular-devkit/build-angular to v0.1102.2 ([a2bccc7](https://github.com/jscutlery/semver/commit/a2bccc75ed70a4e5e71f1d7d23bda80d07b55d44)) -* 📦 update dependency @angular-devkit/build-angular to v0.1102.3 ([121ab29](https://github.com/jscutlery/semver/commit/121ab295cb984f7e52b81473184f844f5fd123f6)) -* 📦 update dependency @angular-devkit/build-angular to v0.1102.4 ([1484ff7](https://github.com/jscutlery/semver/commit/1484ff733ee7075fd2d4edb242c037ba3bff9001)) -* 📦 update dependency @angular-devkit/build-angular to v0.1102.5 ([b1b5e85](https://github.com/jscutlery/semver/commit/b1b5e85ad602f6306477b1d62f6eb94e849697b0)) -* 📦 update dependency @angular-devkit/build-angular to v0.1102.6 ([817572d](https://github.com/jscutlery/semver/commit/817572de0870325a61c2b6cfadf8cfed13a87c49)) -* 📦 update dependency @angular-devkit/build-angular to v0.1102.7 ([4b20593](https://github.com/jscutlery/semver/commit/4b2059355e08db6980626ebd5eac4993980f6b5d)) - +- 🐞 don't silently fail when error is an object ([0e8199d](https://github.com/jscutlery/semver/commit/0e8199de0f4890309930659e402f7145545689e8)) +- 🐞 exec Git add only once to avoid file lock ([4dfce73](https://github.com/jscutlery/semver/commit/4dfce73b399f404e1b568595e4af8d452a672a1c)) +- 🐞 release since first commit if no version found (resolve [#102](https://github.com/jscutlery/semver/issues/102)) ([f882009](https://github.com/jscutlery/semver/commit/f882009dfc93a18f29ca23d95767c9ba250c31b0)) +- 📦 update dependency @angular-devkit/build-angular to v0.1101.4 ([bbe6d07](https://github.com/jscutlery/semver/commit/bbe6d07d62891cc8e7dca7ae2886bbfd9b8f92da)) +- 📦 update dependency @angular-devkit/build-angular to v0.1102.0 ([cd7af9d](https://github.com/jscutlery/semver/commit/cd7af9dfd408c721fd8f325cff7573cc48bb7821)) +- 📦 update dependency @angular-devkit/build-angular to v0.1102.1 ([c5a0fd5](https://github.com/jscutlery/semver/commit/c5a0fd558e2ecd48d514df5d55305878540e5a18)) +- 📦 update dependency @angular-devkit/build-angular to v0.1102.2 ([a2bccc7](https://github.com/jscutlery/semver/commit/a2bccc75ed70a4e5e71f1d7d23bda80d07b55d44)) +- 📦 update dependency @angular-devkit/build-angular to v0.1102.3 ([121ab29](https://github.com/jscutlery/semver/commit/121ab295cb984f7e52b81473184f844f5fd123f6)) +- 📦 update dependency @angular-devkit/build-angular to v0.1102.4 ([1484ff7](https://github.com/jscutlery/semver/commit/1484ff733ee7075fd2d4edb242c037ba3bff9001)) +- 📦 update dependency @angular-devkit/build-angular to v0.1102.5 ([b1b5e85](https://github.com/jscutlery/semver/commit/b1b5e85ad602f6306477b1d62f6eb94e849697b0)) +- 📦 update dependency @angular-devkit/build-angular to v0.1102.6 ([817572d](https://github.com/jscutlery/semver/commit/817572de0870325a61c2b6cfadf8cfed13a87c49)) +- 📦 update dependency @angular-devkit/build-angular to v0.1102.7 ([4b20593](https://github.com/jscutlery/semver/commit/4b2059355e08db6980626ebd5eac4993980f6b5d)) ### Features -* ✅ bump version explicitly through parameters ([69aec3d](https://github.com/jscutlery/semver/commit/69aec3d47b048359089fee13fc4fe911850e5465)), closes [#56](https://github.com/jscutlery/semver/issues/56) - - +- ✅ bump version explicitly through parameters ([69aec3d](https://github.com/jscutlery/semver/commit/69aec3d47b048359089fee13fc4fe911850e5465)), closes [#56](https://github.com/jscutlery/semver/issues/56) ## [1.3.1](https://github.com/jscutlery/semver/compare/semver-1.3.0...semver-1.3.1) (2021-02-02) - ### Bug Fixes -* 🐞 don't crash when `workspace.json` is not found ([49d3789](https://github.com/jscutlery/semver/commit/49d3789a1961a590c194229938676f4d8e576929)), closes [#64](https://github.com/jscutlery/semver/issues/64) -* 📦 update dependency @angular-devkit/build-angular to v0.1101.2 ([65e3951](https://github.com/jscutlery/semver/commit/65e3951027c398ec34d497ed47b559f6c02cdc76)) - - +- 🐞 don't crash when `workspace.json` is not found ([49d3789](https://github.com/jscutlery/semver/commit/49d3789a1961a590c194229938676f4d8e576929)), closes [#64](https://github.com/jscutlery/semver/issues/64) +- 📦 update dependency @angular-devkit/build-angular to v0.1101.2 ([65e3951](https://github.com/jscutlery/semver/commit/65e3951027c398ec34d497ed47b559f6c02cdc76)) # [1.3.0](https://github.com/jscutlery/semver/compare/semver-1.2.0...semver-1.3.0) (2021-01-29) - ### Features -* ✅ parallelize changelogs generation ([de6418a](https://github.com/jscutlery/semver/commit/de6418a4f143a5414cbca17e6e0fcc484eb5eae6)) - - +- ✅ parallelize changelogs generation ([de6418a](https://github.com/jscutlery/semver/commit/de6418a4f143a5414cbca17e6e0fcc484eb5eae6)) # [1.2.0](https://github.com/jscutlery/semver/compare/semver-1.1.0...semver-1.2.0) (2021-01-28) - ### Bug Fixes -* 🐞 first release now bumps ([c0970b9](https://github.com/jscutlery/semver/commit/c0970b9601bb819def1fc51fcce8f1e66a3ae199)), closes [#42](https://github.com/jscutlery/semver/issues/42) -* 📦 update dependency @angular-devkit/build-angular to v0.1100.7 ([b66532b](https://github.com/jscutlery/semver/commit/b66532beeb9391c97a141e9f5090f88931e36c1e)) -* 📦 update dependency @angular-devkit/build-angular to v0.1101.0 ([7a7f5f9](https://github.com/jscutlery/semver/commit/7a7f5f989c5ed7fc7641654b53fa8daf43dfa6ab)) -* 📦 update dependency @angular-devkit/build-angular to v0.1101.1 ([4ca7056](https://github.com/jscutlery/semver/commit/4ca70566d4d58b7f4277f44d83424c84a78f7998)) - +- 🐞 first release now bumps ([c0970b9](https://github.com/jscutlery/semver/commit/c0970b9601bb819def1fc51fcce8f1e66a3ae199)), closes [#42](https://github.com/jscutlery/semver/issues/42) +- 📦 update dependency @angular-devkit/build-angular to v0.1100.7 ([b66532b](https://github.com/jscutlery/semver/commit/b66532beeb9391c97a141e9f5090f88931e36c1e)) +- 📦 update dependency @angular-devkit/build-angular to v0.1101.0 ([7a7f5f9](https://github.com/jscutlery/semver/commit/7a7f5f989c5ed7fc7641654b53fa8daf43dfa6ab)) +- 📦 update dependency @angular-devkit/build-angular to v0.1101.1 ([4ca7056](https://github.com/jscutlery/semver/commit/4ca70566d4d58b7f4277f44d83424c84a78f7998)) ### Features -* ✅ bump only if project or workspace has changes since last release ([622513b](https://github.com/jscutlery/semver/commit/622513b1305127c9dbe49e2a459c69dcefa7069d)), closes [#35](https://github.com/jscutlery/semver/issues/35) -* ✅ generate sub-changelogs in sync mode ([14a9b3c](https://github.com/jscutlery/semver/commit/14a9b3caf9288b4eac04602f3cc1d4917cbf9020)), closes [#42](https://github.com/jscutlery/semver/issues/42) -* ✅ inform when release is interrupted if no changes ([1c798a8](https://github.com/jscutlery/semver/commit/1c798a81875178481f3f56c8c5f8b3aa1e7fa364)) - - +- ✅ bump only if project or workspace has changes since last release ([622513b](https://github.com/jscutlery/semver/commit/622513b1305127c9dbe49e2a459c69dcefa7069d)), closes [#35](https://github.com/jscutlery/semver/issues/35) +- ✅ generate sub-changelogs in sync mode ([14a9b3c](https://github.com/jscutlery/semver/commit/14a9b3caf9288b4eac04602f3cc1d4917cbf9020)), closes [#42](https://github.com/jscutlery/semver/issues/42) +- ✅ inform when release is interrupted if no changes ([1c798a8](https://github.com/jscutlery/semver/commit/1c798a81875178481f3f56c8c5f8b3aa1e7fa364)) # [1.1.0](https://github.com/jscutlery/semver/compare/semver-1.0.0...semver-1.1.0) (2021-01-08) - ### Bug Fixes -* 📦 update dependency @angular-devkit/build-angular to v0.1100.6 ([0515ab0](https://github.com/jscutlery/semver/commit/0515ab0cff27cc2cedb77c607d855bd55fa14861)) - +- 📦 update dependency @angular-devkit/build-angular to v0.1100.6 ([0515ab0](https://github.com/jscutlery/semver/commit/0515ab0cff27cc2cedb77c607d855bd55fa14861)) ### Features -* ✅ autodetect first release, remove related option ([a9b7107](https://github.com/jscutlery/semver/commit/a9b7107b978024707ff14debc8c9c2991f17ab1a)), closes [#1](https://github.com/jscutlery/semver/issues/1) - - +- ✅ autodetect first release, remove related option ([a9b7107](https://github.com/jscutlery/semver/commit/a9b7107b978024707ff14debc8c9c2991f17ab1a)), closes [#1](https://github.com/jscutlery/semver/issues/1) # [1.0.0](https://github.com/jscutlery/semver/compare/semver-0.4.0...semver-1.0.0) (2021-01-04) - ### Features -* ✅ add `-` separator after prefix ([c871d1f](https://github.com/jscutlery/semver/commit/c871d1f728a5f5a69723303e37a533841e202432)) - +- ✅ add `-` separator after prefix ([c871d1f](https://github.com/jscutlery/semver/commit/c871d1f728a5f5a69723303e37a533841e202432)) ### BREAKING CHANGES -* this will break the changelog without renaming the last tag as standard-version will not be able to find the last tag - - +- this will break the changelog without renaming the last tag as standard-version will not be able to find the last tag # 0.4.0 (2021-01-04) - ### Bug Fixes -* 🐞 add tag prefix in independent mode ([e690d37](https://github.com/jscutlery/semver/commit/e690d3710fe1e463379cb61dc65a857b422fc504)), closes [#34](https://github.com/jscutlery/semver/issues/34) -* 🐞 don't add workspace to nx.json with independent versions ([bbab0a7](https://github.com/jscutlery/semver/commit/bbab0a76fbfd4fe421abb96e166a5d6408a41b81)) -* **builder:** 🐞 add @angular-devkit/build-angular dependency ([ab5c208](https://github.com/jscutlery/semver/commit/ab5c208e71e8bced7301a6b8c0bea7c7a5d17029)) -* **builder:** 🐞 resolve workspace definition ([c4bf6b2](https://github.com/jscutlery/semver/commit/c4bf6b239a2ea7bbd0279f31a78d68bb0782eba7)) -* 🐞 builder schema and error handling ([99bb560](https://github.com/jscutlery/semver/commit/99bb56058195c70d89f6c789cae5351df0b6118a)) -* 🐞 do not push with --dry-run ([8b40a04](https://github.com/jscutlery/semver/commit/8b40a048452ed9d6cb5cdc6816882133a5aa08cf)) -* 🐞 normalize options ([248b75e](https://github.com/jscutlery/semver/commit/248b75e86e31995d3bcb6f7349da7743f22093e8)) - +- 🐞 add tag prefix in independent mode ([e690d37](https://github.com/jscutlery/semver/commit/e690d3710fe1e463379cb61dc65a857b422fc504)), closes [#34](https://github.com/jscutlery/semver/issues/34) +- 🐞 don't add workspace to nx.json with independent versions ([bbab0a7](https://github.com/jscutlery/semver/commit/bbab0a76fbfd4fe421abb96e166a5d6408a41b81)) +- **builder:** 🐞 add @angular-devkit/build-angular dependency ([ab5c208](https://github.com/jscutlery/semver/commit/ab5c208e71e8bced7301a6b8c0bea7c7a5d17029)) +- **builder:** 🐞 resolve workspace definition ([c4bf6b2](https://github.com/jscutlery/semver/commit/c4bf6b239a2ea7bbd0279f31a78d68bb0782eba7)) +- 🐞 builder schema and error handling ([99bb560](https://github.com/jscutlery/semver/commit/99bb56058195c70d89f6c789cae5351df0b6118a)) +- 🐞 do not push with --dry-run ([8b40a04](https://github.com/jscutlery/semver/commit/8b40a048452ed9d6cb5cdc6816882133a5aa08cf)) +- 🐞 normalize options ([248b75e](https://github.com/jscutlery/semver/commit/248b75e86e31995d3bcb6f7349da7743f22093e8)) ### Features -* **ng-add:** ✅ add --projects option override ([69851fb](https://github.com/jscutlery/semver/commit/69851fb61084e08a35e0d648585b71ca4970023f)), closes [#36](https://github.com/jscutlery/semver/issues/36) -* ✅ prompt user for syncing versions ([4de371a](https://github.com/jscutlery/semver/commit/4de371a8d2d6d39d2436ec82f43b5af01c82b8ee)) -* **ng-add:** ✅ add ng-add schematic ([2db99eb](https://github.com/jscutlery/semver/commit/2db99eba9b3fbdf354fff2e95c89e6830f68be06)) -* **ng-add:** ✅ add target if independent versions ([2be6140](https://github.com/jscutlery/semver/commit/2be6140c620076e519c569b3a88970b47f47277a)) -* **ng-add:** ✅ add workspace project if --sync-versions enabled ([bfa177f](https://github.com/jscutlery/semver/commit/bfa177f0cd2d4159fbe38645561a6d807aaa78bb)) -* **ng-add:** ✅ add workspace project to Nx config ([c4cf38f](https://github.com/jscutlery/semver/commit/c4cf38f32cb3a6c37db915a2760259fe0bea3b26)) -* **ng-add:** ✅ set independent versions by default ([95ff736](https://github.com/jscutlery/semver/commit/95ff7364b5861c9cc9b83e37ebd2559f8f94561b)) -* ✅ add --sync-versions option ([2fdf2c3](https://github.com/jscutlery/semver/commit/2fdf2c3b0ff3288e18cdbd3a64b200ae45c05512)), closes [#5](https://github.com/jscutlery/semver/issues/5) -* ✅ add `--push` option ([2dc9aa6](https://github.com/jscutlery/semver/commit/2dc9aa6ee2cd90d2f1d5de14b32ff344fc303de0)) -* ✅ add version builder ([30509e7](https://github.com/jscutlery/semver/commit/30509e7153cb524060407b89fd6ef615a939254b)) -* ✅ apply no-verify to push too ([b0f3c76](https://github.com/jscutlery/semver/commit/b0f3c767986635812f81239fcad495e92e80eaea)) -* ✅ fallback to angular.json if workspace.json is not found ([2b0ab57](https://github.com/jscutlery/semver/commit/2b0ab57dc55f14af952b20f55b7a0f0dd6261b42)) -* ✅ use angular preset ([67312bf](https://github.com/jscutlery/semver/commit/67312bf19e24f8731c22be1944bf5bdb2aff65e4)) - - +- **ng-add:** ✅ add --projects option override ([69851fb](https://github.com/jscutlery/semver/commit/69851fb61084e08a35e0d648585b71ca4970023f)), closes [#36](https://github.com/jscutlery/semver/issues/36) +- ✅ prompt user for syncing versions ([4de371a](https://github.com/jscutlery/semver/commit/4de371a8d2d6d39d2436ec82f43b5af01c82b8ee)) +- **ng-add:** ✅ add ng-add schematic ([2db99eb](https://github.com/jscutlery/semver/commit/2db99eba9b3fbdf354fff2e95c89e6830f68be06)) +- **ng-add:** ✅ add target if independent versions ([2be6140](https://github.com/jscutlery/semver/commit/2be6140c620076e519c569b3a88970b47f47277a)) +- **ng-add:** ✅ add workspace project if --sync-versions enabled ([bfa177f](https://github.com/jscutlery/semver/commit/bfa177f0cd2d4159fbe38645561a6d807aaa78bb)) +- **ng-add:** ✅ add workspace project to Nx config ([c4cf38f](https://github.com/jscutlery/semver/commit/c4cf38f32cb3a6c37db915a2760259fe0bea3b26)) +- **ng-add:** ✅ set independent versions by default ([95ff736](https://github.com/jscutlery/semver/commit/95ff7364b5861c9cc9b83e37ebd2559f8f94561b)) +- ✅ add --sync-versions option ([2fdf2c3](https://github.com/jscutlery/semver/commit/2fdf2c3b0ff3288e18cdbd3a64b200ae45c05512)), closes [#5](https://github.com/jscutlery/semver/issues/5) +- ✅ add `--push` option ([2dc9aa6](https://github.com/jscutlery/semver/commit/2dc9aa6ee2cd90d2f1d5de14b32ff344fc303de0)) +- ✅ add version builder ([30509e7](https://github.com/jscutlery/semver/commit/30509e7153cb524060407b89fd6ef615a939254b)) +- ✅ apply no-verify to push too ([b0f3c76](https://github.com/jscutlery/semver/commit/b0f3c767986635812f81239fcad495e92e80eaea)) +- ✅ fallback to angular.json if workspace.json is not found ([2b0ab57](https://github.com/jscutlery/semver/commit/2b0ab57dc55f14af952b20f55b7a0f0dd6261b42)) +- ✅ use angular preset ([67312bf](https://github.com/jscutlery/semver/commit/67312bf19e24f8731c22be1944bf5bdb2aff65e4)) # [0.3.0](https://github.com/jscutlery/semver/compare/v0.2.1...v0.3.0) (2020-12-31) - ### Bug Fixes -* 🐞 add tag prefix in independent mode ([e690d37](https://github.com/jscutlery/semver/commit/e690d3710fe1e463379cb61dc65a857b422fc504)), closes [#34](https://github.com/jscutlery/semver/issues/34) - +- 🐞 add tag prefix in independent mode ([e690d37](https://github.com/jscutlery/semver/commit/e690d3710fe1e463379cb61dc65a857b422fc504)), closes [#34](https://github.com/jscutlery/semver/issues/34) ### Features -* ✅ prompt user for syncing versions ([4de371a](https://github.com/jscutlery/semver/commit/4de371a8d2d6d39d2436ec82f43b5af01c82b8ee)) - - +- ✅ prompt user for syncing versions ([4de371a](https://github.com/jscutlery/semver/commit/4de371a8d2d6d39d2436ec82f43b5af01c82b8ee)) ## [0.2.1](https://github.com/jscutlery/semver/compare/v0.2.0...v0.2.1) (2020-12-28) - ### Bug Fixes -* 🐞 don't add workspace to nx.json with independent versions ([bbab0a7](https://github.com/jscutlery/semver/commit/bbab0a76fbfd4fe421abb96e166a5d6408a41b81)) - - +- 🐞 don't add workspace to nx.json with independent versions ([bbab0a7](https://github.com/jscutlery/semver/commit/bbab0a76fbfd4fe421abb96e166a5d6408a41b81)) # [0.2.0](https://github.com/jscutlery/semver/compare/v0.1.1...v0.2.0) (2020-12-28) - ### Bug Fixes -* **builder:** 🐞 add @angular-devkit/build-angular dependency ([ab5c208](https://github.com/jscutlery/semver/commit/ab5c208e71e8bced7301a6b8c0bea7c7a5d17029)) -* **builder:** 🐞 resolve workspace definition ([c4bf6b2](https://github.com/jscutlery/semver/commit/c4bf6b239a2ea7bbd0279f31a78d68bb0782eba7)) - +- **builder:** 🐞 add @angular-devkit/build-angular dependency ([ab5c208](https://github.com/jscutlery/semver/commit/ab5c208e71e8bced7301a6b8c0bea7c7a5d17029)) +- **builder:** 🐞 resolve workspace definition ([c4bf6b2](https://github.com/jscutlery/semver/commit/c4bf6b239a2ea7bbd0279f31a78d68bb0782eba7)) ### Features -* **ng-add:** ✅ add ng-add schematic ([2db99eb](https://github.com/jscutlery/semver/commit/2db99eba9b3fbdf354fff2e95c89e6830f68be06)) -* **ng-add:** ✅ add target if independent versions ([2be6140](https://github.com/jscutlery/semver/commit/2be6140c620076e519c569b3a88970b47f47277a)) -* **ng-add:** ✅ add workspace project if --sync-versions enabled ([bfa177f](https://github.com/jscutlery/semver/commit/bfa177f0cd2d4159fbe38645561a6d807aaa78bb)) -* **ng-add:** ✅ add workspace project to Nx config ([c4cf38f](https://github.com/jscutlery/semver/commit/c4cf38f32cb3a6c37db915a2760259fe0bea3b26)) -* **ng-add:** ✅ set independent versions by default ([95ff736](https://github.com/jscutlery/semver/commit/95ff7364b5861c9cc9b83e37ebd2559f8f94561b)) -* ✅ add --sync-versions option ([2fdf2c3](https://github.com/jscutlery/semver/commit/2fdf2c3b0ff3288e18cdbd3a64b200ae45c05512)), closes [#5](https://github.com/jscutlery/semver/issues/5) -* ✅ fallback to angular.json if workspace.json is not found ([2b0ab57](https://github.com/jscutlery/semver/commit/2b0ab57dc55f14af952b20f55b7a0f0dd6261b42)) - - +- **ng-add:** ✅ add ng-add schematic ([2db99eb](https://github.com/jscutlery/semver/commit/2db99eba9b3fbdf354fff2e95c89e6830f68be06)) +- **ng-add:** ✅ add target if independent versions ([2be6140](https://github.com/jscutlery/semver/commit/2be6140c620076e519c569b3a88970b47f47277a)) +- **ng-add:** ✅ add workspace project if --sync-versions enabled ([bfa177f](https://github.com/jscutlery/semver/commit/bfa177f0cd2d4159fbe38645561a6d807aaa78bb)) +- **ng-add:** ✅ add workspace project to Nx config ([c4cf38f](https://github.com/jscutlery/semver/commit/c4cf38f32cb3a6c37db915a2760259fe0bea3b26)) +- **ng-add:** ✅ set independent versions by default ([95ff736](https://github.com/jscutlery/semver/commit/95ff7364b5861c9cc9b83e37ebd2559f8f94561b)) +- ✅ add --sync-versions option ([2fdf2c3](https://github.com/jscutlery/semver/commit/2fdf2c3b0ff3288e18cdbd3a64b200ae45c05512)), closes [#5](https://github.com/jscutlery/semver/issues/5) +- ✅ fallback to angular.json if workspace.json is not found ([2b0ab57](https://github.com/jscutlery/semver/commit/2b0ab57dc55f14af952b20f55b7a0f0dd6261b42)) ## [0.1.1](https://github.com/jscutlery/semver/compare/v0.1.0...v0.1.1) (2020-12-05) - ### Bug Fixes -* 🐞 builder schema and error handling ([99bb560](https://github.com/jscutlery/semver/commit/99bb56058195c70d89f6c789cae5351df0b6118a)) - - +- 🐞 builder schema and error handling ([99bb560](https://github.com/jscutlery/semver/commit/99bb56058195c70d89f6c789cae5351df0b6118a)) # [0.1.0](https://github.com/jscutlery/semver/compare/v0.0.1...v0.1.0) (2020-12-05) - ### Bug Fixes -* 🐞 do not push with --dry-run ([8b40a04](https://github.com/jscutlery/semver/commit/8b40a048452ed9d6cb5cdc6816882133a5aa08cf)) -* 🐞 normalize options ([248b75e](https://github.com/jscutlery/semver/commit/248b75e86e31995d3bcb6f7349da7743f22093e8)) - +- 🐞 do not push with --dry-run ([8b40a04](https://github.com/jscutlery/semver/commit/8b40a048452ed9d6cb5cdc6816882133a5aa08cf)) +- 🐞 normalize options ([248b75e](https://github.com/jscutlery/semver/commit/248b75e86e31995d3bcb6f7349da7743f22093e8)) ### Features -* ✅ add `--push` option ([2dc9aa6](https://github.com/jscutlery/semver/commit/2dc9aa6ee2cd90d2f1d5de14b32ff344fc303de0)) -* ✅ apply no-verify to push too ([b0f3c76](https://github.com/jscutlery/semver/commit/b0f3c767986635812f81239fcad495e92e80eaea)) -* ✅ use angular preset ([67312bf](https://github.com/jscutlery/semver/commit/67312bf19e24f8731c22be1944bf5bdb2aff65e4)) - - +- ✅ add `--push` option ([2dc9aa6](https://github.com/jscutlery/semver/commit/2dc9aa6ee2cd90d2f1d5de14b32ff344fc303de0)) +- ✅ apply no-verify to push too ([b0f3c76](https://github.com/jscutlery/semver/commit/b0f3c767986635812f81239fcad495e92e80eaea)) +- ✅ use angular preset ([67312bf](https://github.com/jscutlery/semver/commit/67312bf19e24f8731c22be1944bf5bdb2aff65e4)) ### 0.0.1 (2020-12-04) - ### Features -* ✅ add version builder ([30509e7](https://github.com/jscutlery/semver/commit/30509e7153cb524060407b89fd6ef615a939254b)) +- ✅ add version builder ([30509e7](https://github.com/jscutlery/semver/commit/30509e7153cb524060407b89fd6ef615a939254b)) diff --git a/packages/semver/builders.json b/packages/semver/builders.json deleted file mode 100644 index cd6f98d82..000000000 --- a/packages/semver/builders.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "executors": { - "version": { - "implementation": "./src/executors/version", - "schema": "./src/executors/version/schema.json", - "description": "Automate versioning and CHANGELOG generation." - }, - "github": { - "implementation": "./src/executors/github/executor", - "schema": "./src/executors/github/schema.json", - "description": "github executor" - }, - "gitlab": { - "implementation": "./src/executors/gitlab/executor", - "schema": "./src/executors/gitlab/schema.json", - "description": "gitlab executor" - } - }, - "builders": { - "version": { - "implementation": "./src/executors/version/compat", - "schema": "./src/executors/version/schema.json", - "description": "Automate versioning and CHANGELOG generation." - }, - "github": { - "implementation": "./src/executors/github/compat", - "schema": "./src/executors/github/schema.json", - "description": "github executor" - }, - "gitlab": { - "implementation": "./src/executors/gitlab/compat", - "schema": "./src/executors/gitlab/schema.json", - "description": "gitlab executor" - } - } -} diff --git a/packages/semver/migrations.json b/packages/semver/migrations.json deleted file mode 100644 index 858caa185..000000000 --- a/packages/semver/migrations.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "schematics": { - "migration-2-0-0": { - "version": "2.0.0", - "description": "Update @jscutlery/semver to version 2.0.0", - "factory": "./src/migrations/update-2-0-0/compat" - } - }, - "generators": { - "migration-2-0-0": { - "version": "2.0.0", - "description": "Update @jscutlery/semver to version 2.0.0", - "factory": "./src/migrations/update-2-0-0", - "cli": "nx" - } - } -} diff --git a/packages/semver/package.json b/packages/semver/package.json index ba7ee472e..66a59048e 100644 --- a/packages/semver/package.json +++ b/packages/semver/package.json @@ -23,20 +23,6 @@ "@nrwl/devkit": "^15.0.0" }, "dependencies": { - "chalk": "4.1.2", - "conventional-changelog": "^3.1.25", - "conventional-recommended-bump": "^6.1.0", - "detect-indent": "6.1.0", - "inquirer": "8.2.5", - "rxjs": "7.8.0" - }, - "devDependencies": { - "@types/conventional-changelog": "^3.1.1", - "@types/conventional-recommended-bump": "6.1.0", - "@types/inquirer": "8.2.6", - "@types/rimraf": "3.0.2", - "@types/semver": "7.3.13", - "@types/standard-version": "7.0.1", - "@types/tmp": "0.2.3" + "zod": "3.20.2" } } diff --git a/packages/semver/src/executors/common/exec.spec.ts b/packages/semver/src/executors/common/exec.spec.ts deleted file mode 100644 index 9c57ba399..000000000 --- a/packages/semver/src/executors/common/exec.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { lastValueFrom } from 'rxjs'; -import { exec } from './exec'; - -describe(exec.name, () => { - it('should exec and return stdout', (done) => { - const observer = { - next: jest.fn(), - }; - - exec('node', ['--version']).subscribe({ - next: observer.next, - error: done.fail, - complete: () => { - expect(observer.next).toBeCalledTimes(1); - expect(observer.next).toBeCalledWith(expect.stringContaining('v')); - done(); - }, - }); - }); - - it('should handle failure and return stderr', async () => { - await expect(lastValueFrom(exec('exit', ['1']))).rejects.toThrowError(); - }); -}); diff --git a/packages/semver/src/executors/common/exec.ts b/packages/semver/src/executors/common/exec.ts deleted file mode 100644 index 64fa42440..000000000 --- a/packages/semver/src/executors/common/exec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { execFile, type ChildProcess } from 'child_process'; -import { Observable, type Subscriber } from 'rxjs'; - -export function exec(cmd: string, args: string[] = []): Observable { - return new Observable((subscriber: Subscriber) => { - const process = execFile(cmd, args, (error, stdout, stderr) => { - if (error) { - subscriber.error(new Error(stderr)); - return; - } - - subscriber.next(stdout); - subscriber.complete(); - }); - - const _removeEvents = _listenExitEvent(() => subscriber.complete()); - - return () => { - _killProcess(process); - _removeEvents(); - }; - }); -} - -function _killProcess(process: ChildProcess): void { - if (process.stdout) { - process.stdout.removeAllListeners(); - } - - if (process.stderr) { - process.stderr.removeAllListeners(); - } - - process.removeAllListeners(); - process.kill('SIGKILL'); -} - -function _listenExitEvent( - fn: (signal: number) => void, - events: NodeJS.Signals[] = ['SIGINT', 'SIGBREAK'] -): () => void { - events.forEach((name) => process.on(name, fn)); - process.on('exit', fn); - - return () => { - events.forEach((name) => process.off(name, fn)); - process.off('exit', fn); - }; -} diff --git a/packages/semver/src/executors/github/README.md b/packages/semver/src/executors/github/README.md deleted file mode 100644 index d15ebe15f..000000000 --- a/packages/semver/src/executors/github/README.md +++ /dev/null @@ -1,93 +0,0 @@ -## @jscutlery/semver:github - -An executor for creating GitHub Releases. - -### Requirements - -This executor requires the [GitHub CLI](https://cli.github.com/manual/installation) to be installed on your machine. - -### Usage - -#### Run manually - -Publish the `v1.0.0` release: - -``` -nx run my-project:github --tag v1.0.0 [...options] -``` - -#### Configuration using post-targets (recommended) - -This executor aims to be used with [post-targets](https://github.com/jscutlery/semver#post-targets): - -```json -{ - "targets": { - "version": { - "executor": "@jscutlery/semver:version", - "options": { - "postTargets": ["my-project:github"] - } - }, - "github": { - "executor": "@jscutlery/semver:github", - "options": { - "tag": "${tag}", - "notesFile": "./libs/my-project/CHANGELOG.md" - } - } - } -} -``` - -##### Only include new notes - -Rather than using the entire changelog on every release as your notes you can use the `notes` context provided by `@jscutlery/semver:version` to only include the new changes: - -```json -{ - "targets": { - "version": { - "executor": "@jscutlery/semver:version", - "options": { - "postTargets": ["my-project:github"] - } - }, - "github": { - "executor": "@jscutlery/semver:github", - "options": { - "tag": "${tag}", - "notes": "${notes}" - } - } - } -} -``` - -#### Available Options - -| name | type | default | description | -| -------------------------- | ---------- | ----------- | --------------------------------------------------------------- | -| **`--tag`** | `string` | `undefined` | attach the release to the specified tag | -| **`--target`** | `string` | `main` | target branch or full commit SHA (default: main branch) | -| **`--files`** | `string[]` | `undefined` | a list of asset files may be given to upload to the new release | -| **`--notes`** | `string` | `undefined` | release notes | -| **`--notesFile`** | `string` | `undefined` | read release notes from file | -| **`--draft`** | `boolean` | `undefined` | save the release as a draft instead of publishing | -| **`--title`** | `string` | `undefined` | release title | -| **`--prerelease`** | `boolean` | `undefined` | mark the release as a prerelease | -| **`--discussionCategory`** | `string` | `undefined` | start a discussion of the specified category | -| **`--repo`** | `string` | `undefined` | select another repository using the [HOST/]OWNER/REPO format | -| **`--generateNotes`** | `boolean` | `undefined` | automatically generate title and notes for the release | -| **`--notesStartTag`** | `string` | `undefined` | tag to use as the starting point for generating release notes | - -#### CI/CD - -To make this executor work in your GitHub workflows you should provide the `GITHUB_TOKEN` environment variable. - -```yml -- name: Version - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: npx nx affected --target=version -``` diff --git a/packages/semver/src/executors/github/compat.ts b/packages/semver/src/executors/github/compat.ts deleted file mode 100644 index 1b98fc740..000000000 --- a/packages/semver/src/executors/github/compat.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { convertNxExecutor } from '@nrwl/devkit'; - -import runExecutor from './executor'; - -export default convertNxExecutor(runExecutor); diff --git a/packages/semver/src/executors/github/executor.spec.ts b/packages/semver/src/executors/github/executor.spec.ts deleted file mode 100644 index 1ba0eddd3..000000000 --- a/packages/semver/src/executors/github/executor.spec.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { logger } from '@nrwl/devkit'; -import { of, throwError } from 'rxjs'; - -import { exec } from '../common/exec'; -import executor from './executor'; - -import type { GithubExecutorSchema } from './schema'; - -jest.mock('../common/exec'); - -const options: GithubExecutorSchema = { - tag: 'v1.0.0', -}; - -describe('@jscutlery/semver:github', () => { - const mockExec = exec as jest.Mock; - - beforeEach(() => { - mockExec.mockImplementation(() => { - return of({ - stdout: 'success', - }); - }); - }); - - it('create release with specified --tag', async () => { - const output = await executor(options); - - expect(mockExec).toBeCalledWith( - 'gh', - expect.arrayContaining(['release', 'create', 'v1.0.0']) - ); - expect(output.success).toBe(true); - }); - - it('create release with specified --files', async () => { - const output = await executor({ ...options, files: ['./dist/package'] }); - - expect(mockExec).toBeCalledWith( - 'gh', - expect.arrayContaining(['./dist/package']) - ); - expect(output.success).toBe(true); - }); - - it('create release with specified --target', async () => { - const output = await executor({ ...options, target: 'master' }); - - expect(mockExec).toBeCalledWith( - 'gh', - expect.arrayContaining(['--target', 'master']) - ); - expect(output.success).toBe(true); - }); - - it('create release with specified --notes', async () => { - const output = await executor({ ...options, notes: 'add feature' }); - - expect(mockExec).toBeCalledWith( - 'gh', - expect.arrayContaining(['--notes', 'add feature']) - ); - expect(output.success).toBe(true); - }); - - it('create release with specified --notesFile', async () => { - const output = await executor({ - ...options, - notesFile: 'libs/my-lib/CHANGELOG.md', - }); - - expect(mockExec).toBeCalledWith( - 'gh', - expect.arrayContaining(['--notes-file', 'libs/my-lib/CHANGELOG.md']) - ); - expect(output.success).toBe(true); - }); - - it('create release with specified --draft', async () => { - const output = await executor({ ...options, draft: true }); - - expect(mockExec).toBeCalledWith('gh', expect.arrayContaining(['--draft'])); - expect(output.success).toBe(true); - }); - - it('create release with specified --title', async () => { - const output = await executor({ ...options, title: 'Title for release' }); - - expect(mockExec).toBeCalledWith( - 'gh', - expect.arrayContaining(['--title', 'Title for release']) - ); - expect(output.success).toBe(true); - }); - - it('create release with specified --prerelease', async () => { - const output = await executor({ ...options, prerelease: true }); - - expect(mockExec).toBeCalledWith( - 'gh', - expect.arrayContaining(['--prerelease']) - ); - expect(output.success).toBe(true); - }); - - it('create release with specified --discussion-category', async () => { - const output = await executor({ - ...options, - discussionCategory: 'General', - }); - - expect(mockExec).toBeCalledWith( - 'gh', - expect.arrayContaining(['--discussion-category', 'General']) - ); - expect(output.success).toBe(true); - }); - - it('create release with specified --repo', async () => { - const output = await executor({ ...options, repo: 'repo:MYORG/REPO' }); - - expect(mockExec).toBeCalledWith( - 'gh', - expect.arrayContaining(['--repo', 'repo:MYORG/REPO']) - ); - expect(output.success).toBe(true); - }); - - it('handle gh CLI errors', async () => { - mockExec.mockImplementation(() => { - return throwError(() => ({ - stderr: 'something went wrong', - })); - }); - jest.spyOn(logger, 'error').mockImplementation(); - - const output = await executor(options); - - expect(logger.error).toBeCalled(); - expect(output.success).toBe(false); - }); -}); diff --git a/packages/semver/src/executors/github/executor.ts b/packages/semver/src/executors/github/executor.ts deleted file mode 100644 index 14d13f55e..000000000 --- a/packages/semver/src/executors/github/executor.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { logger } from '@nrwl/devkit'; -import { lastValueFrom, of } from 'rxjs'; -import { catchError, mapTo } from 'rxjs/operators'; -import { exec } from '../common/exec'; -import type { GithubExecutorSchema } from './schema'; - -export default async function runExecutor({ - tag, - files, - notes, - notesFile, - target, - draft, - title, - prerelease, - discussionCategory, - repo, - generateNotes, - notesStartTag, -}: GithubExecutorSchema) { - const createRelease$ = exec('gh', [ - 'release', - 'create', - tag, - ...(files ? files : []), - ...(notes ? ['--notes', notes] : []), - ...(notesFile ? ['--notes-file', notesFile] : []), - ...(target ? ['--target', target] : []), - ...(draft ? ['--draft'] : []), - ...(title ? ['--title', title] : []), - ...(prerelease ? ['--prerelease'] : []), - ...(discussionCategory - ? [`--discussion-category`, discussionCategory] - : []), - ...(repo ? [`--repo`, repo] : []), - ...(generateNotes ? [`--generate-notes`] : []), - ...(notesStartTag ? [`--notes-start-tag`, notesStartTag] : []), - ]).pipe( - mapTo({ success: true }), - catchError((response) => { - logger.error(response); - return of({ success: false }); - }) - ); - - return lastValueFrom(createRelease$); -} diff --git a/packages/semver/src/executors/github/schema.d.ts b/packages/semver/src/executors/github/schema.d.ts deleted file mode 100644 index 149645982..000000000 --- a/packages/semver/src/executors/github/schema.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -export interface GithubExecutorSchema { - tag: string; - target?: string; - files?: string[]; - notes?: string; - notesFile?: string; - draft?: boolean; - title?: string; - prerelease?: boolean; - discussionCategory?: string; - repo?: string; - generateNotes?: boolean; - notesStartTag?: string; -} diff --git a/packages/semver/src/executors/github/schema.json b/packages/semver/src/executors/github/schema.json deleted file mode 100644 index 326bd384c..000000000 --- a/packages/semver/src/executors/github/schema.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "version": 2, - "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", - "cli": "nx", - "title": "@jscutlery/semver:github", - "description": "", - "type": "object", - "properties": { - "tag": { - "type": "string", - "description": "Create a new release from given tag." - }, - "target": { - "type": "string", - "description": "Target branch or full commit SHA (default: main branch)." - }, - "files": { - "type": "array", - "description": "A list of asset files may be given to upload to the new release." - }, - "notes": { - "type": "string", - "description": "Release notes." - }, - "notesFile": { - "type": "string", - "description": "Read release notes from file." - }, - "draft": { - "type": "boolean", - "description": "Save the release as a draft instead of publishing it" - }, - "title": { - "type": "string", - "description": "Release title" - }, - "prerelease": { - "type": "boolean", - "description": "Mark the release as a prerelease" - }, - "discussion-category": { - "type": "string", - "description": "Start a discussion of the specified category" - }, - "repo": { - "type": "string", - "description": "Select another repository using the [HOST/]OWNER/REPO format" - }, - "generateNotes": { - "type": "boolean", - "description": "Automatically generate title and notes for the release" - }, - "notesStartTag": { - "type": "string", - "description": "Tag to use as the starting point for generating release notes" - } - }, - "required": ["tag"] -} diff --git a/packages/semver/src/executors/gitlab/README.md b/packages/semver/src/executors/gitlab/README.md deleted file mode 100644 index 88ac6ae66..000000000 --- a/packages/semver/src/executors/gitlab/README.md +++ /dev/null @@ -1,53 +0,0 @@ -## @jscutlery/semver:gitlab - -An executor for creating GitLab Releases. - -### Requirements - -This executor requires the [GitLab Release CLI](https://gitlab.com/gitlab-org/release-cli/) to be installed on your machine. - -### Usage - -#### Run manually - -Publish the `v1.0.0` release: - -``` -nx run my-project:gitlab --tag v1.0.0 [...options] -``` - -#### Configuration using post-targets (recommended) - -This executor aims to be used with [post-targets](https://github.com/jscutlery/semver#post-targets): - -```json -{ - "targets": { - "version": { - "executor": "@jscutlery/semver:version", - "options": { - "postTargets": ["my-project:gitlab"] - } - }, - "gitlab": { - "executor": "@jscutlery/semver:gitlab", - "options": { - "tag": "${tag}", - "description": "${notes}" - } - } - } -} -``` - -#### Available Options - -| name | type | default | description | -| ------------------- | ---------- | ---------------- | ---------------------------------------------------- | -| **`--tag`** | `string` | `$CI_COMMIT_TAG` | attach the release to the specified tag | -| **`--name`** | `string` | `undefined` | name of the release | -| **`--assets`** | `string[]` | `undefined` | a list of assets to attach new release | -| **`--description`** | `string` | `undefined` | release notes | -| **`--releasedAt`** | `string` | `undefined` | timestamp which the release will happen/has happened | -| **`--ref`** | `boolean` | `$CI_COMMIT_SHA` | commit SHA, another tag name, or a branch name | -| **`--milestones`** | `string[]` | `undefined` | list of milestones to associate the release with | diff --git a/packages/semver/src/executors/gitlab/compat.ts b/packages/semver/src/executors/gitlab/compat.ts deleted file mode 100644 index 1b98fc740..000000000 --- a/packages/semver/src/executors/gitlab/compat.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { convertNxExecutor } from '@nrwl/devkit'; - -import runExecutor from './executor'; - -export default convertNxExecutor(runExecutor); diff --git a/packages/semver/src/executors/gitlab/executor.spec.ts b/packages/semver/src/executors/gitlab/executor.spec.ts deleted file mode 100644 index e6e834127..000000000 --- a/packages/semver/src/executors/gitlab/executor.spec.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { logger } from '@nrwl/devkit'; -import { of, throwError } from 'rxjs'; - -import { exec } from '../common/exec'; -import executor from './executor'; - -import type { GitLabReleaseSchema } from './schema'; - -jest.mock('../common/exec'); - -const options: GitLabReleaseSchema = { - tag: 'v1.0.0', -}; - -describe('@jscutlery/semver:gitlab', () => { - const mockExec = exec as jest.Mock; - - beforeEach(() => { - mockExec.mockImplementation(() => { - return of({ - stdout: 'success', - }); - }); - }); - - it('create release with specified --tag', async () => { - const output = await executor(options); - - expect(mockExec).toBeCalledWith( - 'release-cli', - expect.arrayContaining(['create', '--tag-name', 'v1.0.0']) - ); - expect(output.success).toBe(true); - }); - - it('create release with specified --assets', async () => { - const output = await executor({ - ...options, - assets: [{ name: 'asset1', url: './dist/package' }], - }); - - expect(mockExec).toBeCalledWith( - 'release-cli', - expect.arrayContaining([ - '--assets-link', '{"name": "asset1", "url": "./dist/package"}', - ]) - ); - expect(output.success).toBe(true); - }); - - it('create release with specified --ref', async () => { - const output = await executor({ ...options, ref: 'master' }); - - expect(mockExec).toBeCalledWith( - 'release-cli', - expect.arrayContaining(['--ref', 'master']) - ); - expect(output.success).toBe(true); - }); - - it('create release with specified --description', async () => { - const output = await executor({ ...options, description: 'add feature' }); - - expect(mockExec).toBeCalledWith( - 'release-cli', - expect.arrayContaining(['--description', 'add feature']) - ); - expect(output.success).toBe(true); - }); - - it('create release with specified --name', async () => { - const output = await executor({ ...options, name: 'Title for release' }); - - expect(mockExec).toBeCalledWith( - 'release-cli', - expect.arrayContaining(['--name', 'Title for release']) - ); - expect(output.success).toBe(true); - }); - - it('create release with specified --milestones', async () => { - const output = await executor({ - ...options, - milestones: ['v1.0.0'], - }); - - expect(mockExec).toBeCalledWith( - 'release-cli', - expect.arrayContaining(['--milestone', 'v1.0.0']) - ); - expect(output.success).toBe(true); - }); - - it('create release with specified --releasedAt', async () => { - const output = await executor({ ...options, releasedAt: 'XYZ' }); - - expect(mockExec).toBeCalledWith( - 'release-cli', - expect.arrayContaining(['--released-at', 'XYZ']) - ); - expect(output.success).toBe(true); - }); - - it('handle release CLI errors', async () => { - mockExec.mockImplementation(() => { - return throwError(() => ({ - stderr: 'something went wrong', - })); - }); - jest.spyOn(logger, 'error').mockImplementation(); - - const output = await executor(options); - - expect(logger.error).toBeCalled(); - expect(output.success).toBe(false); - }); -}); diff --git a/packages/semver/src/executors/gitlab/executor.ts b/packages/semver/src/executors/gitlab/executor.ts deleted file mode 100644 index f2ebb88d2..000000000 --- a/packages/semver/src/executors/gitlab/executor.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { logger } from '@nrwl/devkit'; -import { lastValueFrom, of } from 'rxjs'; -import { catchError, mapTo } from 'rxjs/operators'; -import { exec } from '../common/exec'; -import type { GitLabReleaseSchema } from './schema'; - -export default async function runExecutor({ - tag, - ref, - assets, - description, - milestones, - name, - releasedAt, -}: GitLabReleaseSchema) { - const createRelease$ = exec('release-cli', [ - 'create', - ...['--tag-name', tag], - ...(name ? ['--name', name] : []), - ...(description ? ['--description', description] : []), - ...(milestones - ? milestones.map((milestone) => ['--milestone', milestone]).flat() - : []), - ...(releasedAt ? ['--released-at', releasedAt] : []), - ...(ref ? ['--ref', ref] : []), - ...(assets - ? assets.map( - (asset) => - ['--assets-link', `{"name": "${asset.name}", "url": "${asset.url}"}`] - ).flat() - : []), - ]).pipe( - mapTo({ success: true }), - catchError((response) => { - logger.error(response); - return of({ success: false }); - }) - ); - - return lastValueFrom(createRelease$); -} diff --git a/packages/semver/src/executors/gitlab/schema.d.ts b/packages/semver/src/executors/gitlab/schema.d.ts deleted file mode 100644 index beaa7daaa..000000000 --- a/packages/semver/src/executors/gitlab/schema.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -export interface GitLabReleaseSchema { - tag: string; - ref?: string; - assets?: Asset[]; - description?: string; - name?: string; - milestones?: string[]; - releasedAt?: string; -} - -export interface Asset { - name: string; - url: string; -} diff --git a/packages/semver/src/executors/gitlab/schema.json b/packages/semver/src/executors/gitlab/schema.json deleted file mode 100644 index 2e9b50818..000000000 --- a/packages/semver/src/executors/gitlab/schema.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "version": 2, - "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", - "cli": "nx", - "title": "@jscutlery/semver:gitlab", - "description": "", - "type": "object", - "properties": { - "tag": { - "type": "string", - "description": "The tag the release will be created from [$CI_COMMIT_TAG]" - }, - "ref": { - "type": "string", - "description": "If tag_name doesn’t exist, the release will be created from ref; it can be a commit SHA, another tag name, or a branch name [$CI_COMMIT_SHA]" - }, - "assets": { - "type": "array", - "items": { - "type": "object", - "properties": { - "url": { - "type": "string", - "description": "URL of the asset." - }, - "name": { - "type": "string", - "description": "Name of the asset." - } - } - }, - "description": "JSON string representation of an asset link (or an array of asset links)" - }, - "description": { - "type": "string", - "description": "The description of the release; you can use Markdown. A file can be used to read the description contents, must exist inside the working directory; if it contains any whitespace, it will be treated as a string" - }, - "releasedAt": { - "type": "string", - "description": "The date when the release will be/was ready; defaults to the current time; expected in ISO 8601 format (2019-03-15T08:00:00Z)" - }, - "name": { - "type": "string", - "description": "The release name" - }, - "milestone": { - "type": "array", - "description": "List of the titles of each milestone the release is associated with (e.g. --milestone v1.0 --milestone v1.0-rc); each milestone needs to exist" - } - }, - "required": ["tag"] -} diff --git a/packages/semver/src/executors/version/compat.ts b/packages/semver/src/executors/version/compat.ts deleted file mode 100644 index 6f8b76e24..000000000 --- a/packages/semver/src/executors/version/compat.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { convertNxExecutor } from '@nrwl/devkit'; - -import version from './'; - -export default convertNxExecutor(version); diff --git a/packages/semver/src/executors/version/index.e2e.spec.ts b/packages/semver/src/executors/version/index.e2e.spec.ts deleted file mode 100644 index b8607b7d9..000000000 --- a/packages/semver/src/executors/version/index.e2e.spec.ts +++ /dev/null @@ -1,1499 +0,0 @@ -import { createProjectGraphAsync, ExecutorContext } from '@nrwl/devkit'; -import { fileExists } from '@nrwl/nx-plugin/testing'; -import { execSync } from 'child_process'; -import { existsSync, readFileSync } from 'fs'; -import { resolve } from 'path'; -import { lastValueFrom } from 'rxjs'; -import version from './'; -import type { VersionBuilderSchema } from './schema'; -import { - createFakeContext, - setupTestingWorkspace, - type TestingWorkspace, -} from './testing'; -import { readFile } from './utils/filesystem'; -import { getProjectDependencies } from './utils/get-project-dependencies'; -import { readPackageJson } from './utils/project'; - -jest.mock('@nrwl/devkit'); - -describe('@jscutlery/semver:version', () => { - const defaultBuilderOptions: VersionBuilderSchema = { - dryRun: false, - noVerify: false, - trackDeps: false, - push: false, - remote: 'origin', - baseBranch: 'main', - skipRootChangelog: false, - syncVersions: false, - skipCommitTypes: [], - - postTargets: [], - preset: 'angular', - commitMessageFormat: 'chore(${projectName}): release version ${version}', - }; - - const additionalProjects = [ - { - project: 'a', - projectRoot: 'packages/a', - }, - { - project: 'b', - projectRoot: 'packages/b', - }, - { - project: 'c', - projectRoot: 'packages/c', - }, - { - project: 'd', - projectRoot: 'libs/d', - }, - { - project: 'e', - projectRoot: 'libs/e', - }, - ]; - - const commonWorkspaceFiles: [string, string][] = [ - ['package.json', JSON.stringify({ version: '0.0.0' }, null, 2)], - - ['packages/a/.gitkeep', ''], - /* "a" has a package.json */ - ['packages/a/package.json', JSON.stringify({ version: '0.0.0' }, null, 4)], - /* but "b" doesn't. */ - ['packages/b/.gitkeep', ''], - ['packages/c/.gitkeep', ''], - /* "c" has a package.json */ - ['packages/c/package.json', JSON.stringify({ version: '0.0.0' })], - ['libs/d/.gitkeep', ''], - ['libs/e/.gitkeep', ''], - ]; - - let result: { success: boolean }; - let testingWorkspace: TestingWorkspace; - - beforeAll(() => { - jest.spyOn(console, 'warn').mockImplementation(); - jest.spyOn(console, 'info').mockImplementation(); - }); - - afterAll(() => (console.info as jest.Mock).mockRestore()); - - describe('package "a" with (--syncVersions=false)', () => { - beforeAll(async () => { - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - - /* Commit changes. */ - commitChanges(); - - /* Run builder. */ - result = await version( - defaultBuilderOptions, - createFakeContext({ - project: 'a', - projectRoot: resolve(testingWorkspace.root, 'packages/a'), - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - }); - - afterAll(() => testingWorkspace.tearDown()); - - it('should return success', () => { - expect(result).toEqual({ success: true }); - }); - - it('should commit all changes', () => { - expect(uncommitedChanges()).toHaveLength(0); - }); - - it('should not bump root package.json', async () => { - expect((await lastValueFrom(readPackageJson('.'))).version).toEqual( - '0.0.0' - ); - }); - - it(`should bump a's package.json`, async () => { - expect( - (await lastValueFrom(readPackageJson('packages/a'))).version - ).toEqual('0.1.0'); - }); - - it('should not generate root changelog', () => { - expect(fileExists('CHANGELOG.md')).toBe(false); - }); - - it(`should generate "a"'s changelog`, async () => { - expect(readFileSync('packages/a/CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Changelog - -This file was generated.* - -# 0.1.0 \\(.*\\) - - -### Features - -\\* \\*\\*a:\\*\\* 🚀 new feature .* - - -### Performance Improvements - -\\* \\*\\*a:\\*\\* ⚡ improve quickness .* -$`) - ); - }); - }); - - describe('package "b" with (--syncVersions=false)', () => { - beforeAll(async () => { - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - - /* Commit changes. */ - commitChanges(); - - /* Run builder. */ - result = await version( - defaultBuilderOptions, - createFakeContext({ - project: 'b', - projectRoot: resolve(testingWorkspace.root, 'packages/b'), - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - }); - - afterAll(() => testingWorkspace.tearDown()); - - it('should return success', () => { - expect(result).toEqual({ success: true }); - }); - - it('should commit all changes', () => { - expect(uncommitedChanges()).toHaveLength(0); - }); - - it('should not bump root package.json', async () => { - expect((await lastValueFrom(readPackageJson('.'))).version).toEqual( - '0.0.0' - ); - }); - - it('should not generate root changelog', () => { - expect(fileExists('CHANGELOG.md')).toBe(false); - }); - - it(`should generate "b"'s changelog`, async () => { - expect(readFileSync('packages/b/CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Changelog - -This file was generated.* - -## 0.0.1 \\(.*\\) - - -### Bug Fixes - -\\* \\*\\*b:\\*\\* 🐞 fix emptiness .* -$`) - ); - }); - }); - - describe('package "a" with --syncVersions=false & --skipProjectChangelog', () => { - beforeAll(async () => { - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - - /* Commit changes. */ - commitChanges(); - - /* Run builder. */ - result = await version( - { ...defaultBuilderOptions, skipProjectChangelog: true }, - createFakeContext({ - project: 'a', - projectRoot: resolve(testingWorkspace.root, 'packages/a'), - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - }); - - afterAll(() => testingWorkspace.tearDown()); - - it('should return success', () => { - expect(result).toEqual({ success: true }); - }); - - it('should commit all changes', () => { - expect(uncommitedChanges()).toHaveLength(0); - }); - - it('should not generate root changelog', () => { - expect(fileExists('CHANGELOG.md')).toBe(false); - }); - - it(`should bump a's package.json`, async () => { - expect( - (await lastValueFrom(readPackageJson('packages/a'))).version - ).toEqual('0.1.0'); - }); - - it(`should not generate "a"'s changelog`, async () => { - expect(fileExists('packages/a/CHANGELOG.md')).toBe(false); - }); - }); - - describe('--syncVersions', () => { - beforeAll(async () => { - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - - /* Commit changes. */ - commitChanges(); - - /* Run builder. */ - result = await version( - { - ...defaultBuilderOptions, - syncVersions: true, - }, - createFakeContext({ - project: 'workspace', - projectRoot: testingWorkspace.root, - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - }); - - afterAll(() => testingWorkspace.tearDown()); - - it('should return success', () => { - expect(result).toEqual({ success: true }); - }); - - it('should commit all changes', () => { - expect(uncommitedChanges()).toHaveLength(0); - }); - - it('should bump root package.json', async () => { - expect((await lastValueFrom(readPackageJson('.'))).version).toEqual( - '0.1.0' - ); - }); - - it(`should preserve indentation in root package.json`, async () => { - expect(await lastValueFrom(readFile('package.json'))).toEqual( - '{\n "version": "0.1.0"\n}\n' - ); - }); - - it(`should bump "a"'s package.json`, async () => { - expect( - (await lastValueFrom(readPackageJson('packages/a'))).version - ).toEqual('0.1.0'); - }); - - it(`should preserve indentation in a's package.json`, async () => { - expect(await lastValueFrom(readFile('packages/a/package.json'))).toEqual( - '{\n "version": "0.1.0"\n}\n' - ); - }); - - it('should generate root changelog', async () => { - expect(readFileSync('CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Changelog - -This file was generated.* - -# 0.1.0 \\(.*\\) - - -### Bug Fixes - -\\* \\*\\*b:\\*\\* 🐞 fix emptiness .* - - -### Features - -\\* \\*\\*a:\\*\\* 🚀 new feature .* - - -### Performance Improvements - -\\* \\*\\*a:\\*\\* ⚡ improve quickness .* -$`) - ); - }); - - it('should generate sub-changelogs', async () => { - expect(readFileSync('packages/a/CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Changelog - -This file was generated.* - -# 0.1.0 \\(.*\\) - - -### Features - -\\* \\*\\*a:\\*\\* 🚀 new feature .* - - -### Performance Improvements - -\\* \\*\\*a:\\*\\* ⚡ improve quickness .* -$`) - ); - - expect(readFileSync('packages/b/CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Changelog - -This file was generated.* - -# 0.1.0 \\(.*\\) - - -### Bug Fixes - -\\* \\*\\*b:\\*\\* 🐞 fix emptiness .* -$`) - ); - }); - }); - - describe('on workspace with --syncVersions, after changing lib "b"', () => { - beforeAll(async () => { - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - - /* Commit changes. */ - commitChanges(); - - /* Run builder. */ - await version( - { - ...defaultBuilderOptions, - syncVersions: true, - }, - createFakeContext({ - project: 'workspace', - projectRoot: testingWorkspace.root, - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - - /* Change b and commit. */ - execSync(` - echo b > packages/b/b - git add packages/b/b - git commit -m "feat(b): b" - `); - - result = await version( - { - ...defaultBuilderOptions, - syncVersions: true, - }, - createFakeContext({ - project: 'workspace', - projectRoot: testingWorkspace.root, - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - }); - - afterAll(() => testingWorkspace.tearDown()); - - it('should return success', () => { - expect(result).toEqual({ success: true }); - }); - - it('should commit all changes', () => { - expect(uncommitedChanges()).toHaveLength(0); - }); - - it('should bump root package.json', async () => { - expect((await lastValueFrom(readPackageJson('.'))).version).toEqual( - '0.2.0' - ); - }); - - /* In sync mode, we bump "a" even if change concerns "b". */ - it(`should bump "a"'s package.json`, async () => { - expect( - (await lastValueFrom(readPackageJson('packages/a'))).version - ).toEqual('0.2.0'); - }); - - it('should update root changelog', async () => { - expect(readFileSync('CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(` -# \\[0.2.0\\]\\(/compare/v0.1.0...v0.2.0\\) \\(.*\\) - - -### Features - -\\* \\*\\*b:\\*\\* b .* - - - -# 0.1.0 \\(.*\\) -`) - ); - }); - - it(`should update "a"'s changelog without listing "b"'s feature`, async () => { - expect(readFileSync('packages/a/CHANGELOG.md', 'utf-8')).toMatch( - /\n# \[0.2.0\]\(\/compare\/v0.1.0...v0.2.0\) \(.*\)\n\n\n\n# 0.1.0 \(.*\)\n/ - ); - }); - - it(`should update "b"'s changelog with new feature`, async () => { - expect(readFileSync('packages/b/CHANGELOG.md', 'utf-8')).toMatch( - /\n# \[0.2.0\]\(\/compare\/v0.1.0...v0.2.0\) \(.*\)\n\n\n### Features\n\n\* \*\*b:\*\* b .*\n\n\n\n# 0.1.0 \(.*\)\n/ - ); - }); - }); - - describe('workspace with --syncVersions & --skipRootChangelog`', () => { - beforeAll(async () => { - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - - /* Commit changes. */ - commitChanges(); - - /* Run builder. */ - result = await version( - { - ...defaultBuilderOptions, - skipRootChangelog: true, - syncVersions: true, - }, - createFakeContext({ - project: 'workspace', - projectRoot: testingWorkspace.root, - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - }); - - afterAll(() => testingWorkspace.tearDown()); - - it('should return success', () => { - expect(result).toEqual({ success: true }); - }); - - it('should commit all changes', () => { - expect(uncommitedChanges()).toHaveLength(0); - }); - - it('should bump root package.json', async () => { - expect((await lastValueFrom(readPackageJson('.'))).version).toEqual( - '0.1.0' - ); - }); - - it(`should bump "a"'s package.json`, async () => { - expect( - (await lastValueFrom(readPackageJson('packages/a'))).version - ).toEqual('0.1.0'); - }); - - it('should not generate root changelog', () => { - expect(fileExists('CHANGELOG.md')).toBe(false); - }); - - it('should generate sub-changelogs', async () => { - expect(readFileSync('packages/a/CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Changelog - -This file was generated.* - -# 0.1.0 \\(.*\\) - - -### Features - -\\* \\*\\*a:\\*\\* 🚀 new feature .* - - -### Performance Improvements - -\\* \\*\\*a:\\*\\* ⚡ improve quickness .* -$`) - ); - - expect(readFileSync('packages/b/CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Changelog - -This file was generated.* - -# 0.1.0 \\(.*\\) - - -### Bug Fixes - -\\* \\*\\*b:\\*\\* 🐞 fix emptiness .* -$`) - ); - }); - }); - - describe('--trackDeps', () => { - /** - * Ideally, these would not be mocked in an e2e test, but in order to truly - * test its use in `getProjectDependencies`, it would require a full NX workspace - * testing environment with interdependent projects. - */ - const mockCreateProjectGraphAsync = - createProjectGraphAsync as jest.MockedFunction< - typeof createProjectGraphAsync - >; - - describe('utilizes the project graph', () => { - beforeEach(() => { - const originalModule = jest.requireActual( - '@nrwl/workspace/src/core/project-graph' - ); - mockCreateProjectGraphAsync.mockImplementation( - originalModule.createProjectGraphAsync - ); - }); - afterEach(() => jest.resetAllMocks()); - - it('uses a valid project graph version', async () => { - await expect(getProjectDependencies('semver')).resolves.not.toThrow(); - /** If this failed, then the pinned version of the project graph - * is no longer supported for the current version of NX. The version should - * be bumped and the tests should be run against an example of the updated - * project graph. - */ - }); - }); - - describe('when disabled with an unchanged project', () => { - beforeAll(async () => { - mockCreateProjectGraphAsync.mockReturnValue(projectGraph()); - - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - - /* Commit changes. */ - commitChanges(); - - /* Run builder. */ - result = await version( - { - ...defaultBuilderOptions, - trackDeps: false, - }, - createFakeContext({ - project: 'c', - projectRoot: resolve(testingWorkspace.root, 'packages/c'), - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - }); - - afterAll(() => { - mockCreateProjectGraphAsync.mockRestore(); - return testingWorkspace.tearDown(); - }); - - it('should not get affected projects', () => { - expect(mockCreateProjectGraphAsync).toHaveBeenCalledTimes(0); - }); - - it('should not generate changelogs', () => { - expect(existsSync('packages/c/CHANGELOG.md')).toBeFalse(); - }); - }); - - /* - The workspace is set up with the following dependencies and state: - package a depends on lib d - package c depends on lib e - packages a, b, and lib d have changes - package c is unchanged - */ - describe('used with unchanged package with unchanged libs', () => { - beforeAll(async () => { - mockCreateProjectGraphAsync.mockReturnValue(projectGraph()); - - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - - /* Commit changes. */ - commitChanges(); - - /* Run builder. */ - result = await version( - { - ...defaultBuilderOptions, - syncVersions: false, - trackDeps: true, - }, - createFakeContext({ - project: 'c', - projectRoot: resolve(testingWorkspace.root, 'packages/c'), - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - }); - - afterAll(() => { - mockCreateProjectGraphAsync.mockRestore(); - return testingWorkspace.tearDown(); - }); - - it('should get affected projects', () => { - expect(mockCreateProjectGraphAsync).toHaveBeenCalledTimes(1); - }); - - it('should not generate changelogs', async () => { - expect(existsSync('packages/c/CHANGELOG.md')).toBeFalse(); - }); - }); - - describe('used with unchanged package with changed lib', () => { - beforeAll(async () => { - mockCreateProjectGraphAsync.mockReturnValue(projectGraph()); - - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - - /* Commit changes. */ - commitChanges(); - - execSync(` - echo e > libs/e/e.txt - git add . - # This does not directly add a feature to a single package. - git commit -m "feat: 🚀 new feature" - `); - - /* Run builder. */ - result = await version( - { - ...defaultBuilderOptions, - syncVersions: false, - trackDeps: true, - }, - createFakeContext({ - project: 'c', - projectRoot: resolve(testingWorkspace.root, 'packages/c'), - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - }); - - afterAll(() => { - mockCreateProjectGraphAsync.mockRestore(); - return testingWorkspace.tearDown(); - }); - - it('should get affected projects', () => { - expect(mockCreateProjectGraphAsync).toHaveBeenCalledTimes(1); - }); - - it('generates change logs', () => { - expect(readFileSync('packages/c/CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Changelog - -This file was generated.* - -## 0.0.1 \\(.*\\) - -### Dependency Updates - -\\* \`e\` updated to version \`0.1.0\` -$`) - ); - }); - }); - - describe('used with changed package with changed lib', () => { - beforeAll(async () => { - mockCreateProjectGraphAsync.mockReturnValue(projectGraph()); - - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - - /* Commit changes. */ - commitChanges(); - - execSync(` - echo c > packages/c/c.txt - git add . - git commit -m "feat(c): 🚀 new feature" - echo e > libs/e/e.txt - git add . - # This does not directly fix a single package. - git commit -m "feat: 🐞 fix emptiness" - `); - - /* Run builder. */ - result = await version( - { - ...defaultBuilderOptions, - syncVersions: false, - trackDeps: true, - }, - createFakeContext({ - project: 'c', - projectRoot: resolve(testingWorkspace.root, 'packages/c'), - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - }); - - afterAll(() => { - mockCreateProjectGraphAsync.mockRestore(); - return testingWorkspace.tearDown(); - }); - - it('should get affected projects', () => { - expect(mockCreateProjectGraphAsync).toHaveBeenCalledTimes(1); - }); - - it('generates change logs', async () => { - expect(readFileSync('packages/c/CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Changelog - -This file was generated.* - -# 0.1.0 \\(.*\\) - -### Dependency Updates - -\\* \`e\` updated to version \`0.1.0\` - -### Features - -\\* \\*\\*c:\\*\\* 🚀 new feature .* -$`) - ); - }); - }); - - describe('used with changed package with unchanged lib', () => { - beforeAll(async () => { - mockCreateProjectGraphAsync.mockReturnValue(projectGraph()); - - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - - /* Commit changes. */ - commitChanges(); - - /* Run builder. */ - result = await version( - { - ...defaultBuilderOptions, - syncVersions: false, - trackDeps: true, - }, - createFakeContext({ - project: 'a', - projectRoot: resolve(testingWorkspace.root, 'packages/a'), - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - }); - - afterAll(() => { - mockCreateProjectGraphAsync.mockRestore(); - return testingWorkspace.tearDown(); - }); - - it('should get affected projects', () => { - expect(mockCreateProjectGraphAsync).toHaveBeenCalledTimes(1); - }); - - it('generates change logs', () => { - expect(readFileSync('packages/a/CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Changelog - -This file was generated.* - -# 0.1.0 \\(.*\\) - - -### Features - -\\* \\*\\*a:\\*\\* 🚀 new feature .* - - -### Performance Improvements - -\\* \\*\\*a:\\*\\* ⚡ improve quickness .* -$`) - ); - }); - }); - - describe('used with unchanged package with changed lib (--syncVersions)', () => { - beforeAll(async () => { - mockCreateProjectGraphAsync.mockReturnValue(projectGraph()); - - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - - /* Commit changes. */ - commitChanges(); - - execSync(` - echo e > libs/e/e.txt - git add . - # This does not directly fix a single package. - git commit -m "fix: 🐞 fix emptiness" - `); - - /* Run builder. */ - await version( - { - ...defaultBuilderOptions, - syncVersions: true, - trackDeps: true, - }, - createFakeContext({ - project: 'c', - projectRoot: resolve(testingWorkspace.root, 'packages/c'), - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - }); - - afterAll(() => { - mockCreateProjectGraphAsync.mockRestore(); - return testingWorkspace.tearDown(); - }); - - it('should get affected projects', () => { - expect(mockCreateProjectGraphAsync).toHaveBeenCalledTimes(1); - }); - - it('generates change logs', async () => { - expect(readFileSync('packages/c/CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Changelog.* - -This file was generated.* - -## 0.0.1 \\(.*\\).* -`) - ); - }); - }); - }); - - describe('workspace with --version=major', () => { - beforeAll(async () => { - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - - /* Commit changes. */ - commitChanges(); - - /* Run builder. */ - result = await version( - { - ...defaultBuilderOptions, - syncVersions: true, - version: 'major', - }, - createFakeContext({ - project: 'workspace', - projectRoot: testingWorkspace.root, - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - }); - - afterAll(() => testingWorkspace.tearDown()); - - it('should return success', () => { - expect(result).toEqual({ success: true }); - }); - - it('should commit all changes', () => { - expect(uncommitedChanges()).toHaveLength(0); - }); - - it('should bump root package.json', async () => { - expect((await lastValueFrom(readPackageJson('.'))).version).toEqual( - '1.0.0' - ); - }); - - it(`should bump "a"'s package.json`, async () => { - expect( - (await lastValueFrom(readPackageJson('packages/a'))).version - ).toEqual('1.0.0'); - }); - - it('should generate root changelog', async () => { - expect(readFileSync('CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Changelog - -This file was generated.* - -# 1.0.0 \\(.*\\) - - -### Bug Fixes - -\\* \\*\\*b:\\*\\* 🐞 fix emptiness .* - - -### Features - -\\* \\*\\*a:\\*\\* 🚀 new feature .* - - -### Performance Improvements - -\\* \\*\\*a:\\*\\* ⚡ improve quickness .* -$`) - ); - }); - - it('should generate sub-changelogs', async () => { - expect(readFileSync('packages/a/CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Changelog - -This file was generated.* - -# 1.0.0 \\(.*\\) - - -### Features - -\\* \\*\\*a:\\*\\* 🚀 new feature .* - - -### Performance Improvements - -\\* \\*\\*a:\\*\\* ⚡ improve quickness .* -$`) - ); - - expect(readFileSync('packages/b/CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Changelog - -This file was generated.* - -# 1.0.0 \\(.*\\) - - -### Bug Fixes - -\\* \\*\\*b:\\*\\* 🐞 fix emptiness .* -$`) - ); - }); - }); - - describe('workspace with --version=prerelease --preid=beta', () => { - let fakeContext: ExecutorContext; - beforeEach(async () => { - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - fakeContext = createFakeContext({ - project: 'workspace', - projectRoot: testingWorkspace.root, - workspaceRoot: testingWorkspace.root, - additionalProjects, - }); - /* Commit changes. */ - commitChanges(); - - /* Run builder. */ - result = await version( - { - ...defaultBuilderOptions, - syncVersions: true, - version: 'prerelease', - preid: 'beta', - }, - fakeContext - ); - }); - - afterEach(() => testingWorkspace.tearDown()); - - it('should return success', () => { - expect(result).toEqual({ success: true }); - }); - - it('should commit all changes', () => { - expect(uncommitedChanges()).toHaveLength(0); - }); - - it('should bump root package.json', async () => { - expect((await lastValueFrom(readPackageJson('.'))).version).toEqual( - '0.0.1-beta.0' - ); - }); - - it(`should bump "a"'s package.json`, async () => { - expect( - (await lastValueFrom(readPackageJson('packages/a'))).version - ).toEqual('0.0.1-beta.0'); - }); - - it(`should bump "a"'s package.json`, async () => { - expect( - (await lastValueFrom(readPackageJson('packages/a'))).version - ).toEqual('0.0.1-beta.0'); - }); - - it('should generate root changelog', async () => { - expect(readFileSync('CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Changelog - -This file was generated.* - -## 0.0.1-beta.0 \\(.*\\) - - -### Bug Fixes - -\\* \\*\\*b:\\*\\* 🐞 fix emptiness .* - - -### Features - -\\* \\*\\*a:\\*\\* 🚀 new feature .* - - -### Performance Improvements - -\\* \\*\\*a:\\*\\* ⚡ improve quickness .* -$`) - ); - }); - - it('should generate sub-changelogs', async () => { - expect(readFileSync('packages/a/CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Changelog - -This file was generated.* - -## 0.0.1-beta.0 \\(.*\\) - - -### Features - -\\* \\*\\*a:\\*\\* 🚀 new feature .* - - -### Performance Improvements - -\\* \\*\\*a:\\*\\* ⚡ improve quickness .* -$`) - ); - - expect(readFileSync('packages/b/CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Changelog - -This file was generated.* - -## 0.0.1-beta.0 \\(.*\\) - - -### Bug Fixes - -\\* \\*\\*b:\\*\\* 🐞 fix emptiness .* -$`) - ); - }); - }); - - describe('workspace with --version=prerelease and dufferent preids', () => { - let fakeContext: ExecutorContext; - beforeEach(async () => { - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - fakeContext = createFakeContext({ - project: 'a', - projectRoot: resolve(testingWorkspace.root, 'packages/a'), - workspaceRoot: testingWorkspace.root, - additionalProjects, - }); - /* Commit changes. */ - commitChanges(); - - /* Run builder few times. */ - result = await version( - { - ...defaultBuilderOptions, - version: 'prerelease', - preid: 'fix-bug', - }, - fakeContext - ); - await version( - { - ...defaultBuilderOptions, - version: 'prerelease', - preid: 'add-feature', - }, - fakeContext - ); - await version( - { - ...defaultBuilderOptions, - version: 'prerelease', - preid: 'add-feature', - }, - fakeContext - ); - }); - - afterEach(() => testingWorkspace.tearDown()); - - it(`should bump "a"'s package.json with different preids`, async () => { - expect( - (await lastValueFrom(readPackageJson('packages/a'))).version - ).toEqual('0.0.1-add-feature.1'); - }); - }); - - describe('--changelogHeader', () => { - beforeAll(async () => { - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - - /* Commit changes. */ - commitChanges(); - - /* Run builder. */ - result = await version( - { - ...defaultBuilderOptions, - syncVersions: true, - changelogHeader: '# Custom changelog header \n', - }, - createFakeContext({ - project: 'workspace', - projectRoot: testingWorkspace.root, - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - }); - - afterAll(() => testingWorkspace.tearDown()); - - it('should generate changelogs with custom header', () => { - expect(readFileSync('CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Custom changelog header *`) - ); - }); - }); - - describe('--commitMessageFormat', () => { - beforeEach(async () => { - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - - /* Commit changes. */ - commitChanges(); - }); - - afterEach(() => testingWorkspace.tearDown()); - - it('should have the latest commit following the provided format', async () => { - result = await version( - { - ...defaultBuilderOptions, - commitMessageFormat: - 'chore(${projectName}): 🎸 release ${version} [skip ci]', - }, - createFakeContext({ - project: 'a', - projectRoot: resolve(testingWorkspace.root, 'packages/a'), - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - - expect(commitMessage()).toBe('chore(a): 🎸 release 0.1.0 [skip ci]'); - }); - - it('should have the latest commit following the default format', async () => { - result = await version( - defaultBuilderOptions, - createFakeContext({ - project: 'a', - projectRoot: resolve(testingWorkspace.root, 'packages/a'), - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - - expect(commitMessage()).toBe('chore(a): release version 0.1.0'); - }); - }); - - describe('--skipCommit', () => { - beforeEach(async () => { - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - - /* Commit changes. */ - commitChanges(); - }); - - afterEach(() => testingWorkspace.tearDown()); - - it('should make changes but not create a commit', async () => { - result = await version( - { - ...defaultBuilderOptions, - skipCommit: true, - }, - createFakeContext({ - project: 'b', - projectRoot: resolve(testingWorkspace.root, 'packages/b'), - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - - expect(commitMessage()).toBe('perf(a): ⚡ improve quickness'); - expect(uncommitedChanges()).toHaveLength(1); - expect(commitMessageOfATag('b-0.0.1')).toBe('fix(b): 🐞 fix emptiness'); - - expect(readFileSync('packages/b/CHANGELOG.md', 'utf-8')).toMatch( - new RegExp(`^# Changelog - -This file was generated.* - -## 0.0.1 \\(.*\\) - - -### Bug Fixes - -\\* \\*\\*b:\\*\\* 🐞 fix emptiness .* -$`) - ); - }); - }); - - describe('ignoring merge commits', () => { - beforeEach(async () => { - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - - /* Commit changes. */ - initGit(); - - execSync( - ` - git add . - git commit -m "🐣" - - echo a > packages/a/a.txt - git add . - git commit -m "docs(a): 🚀 new feature" - - echo b > packages/b/b.txt - git add . - git commit -m "fix(b): 🐞 fix emptiness" - ` - ); - createMergeCommit(); - }); - - afterEach(() => testingWorkspace.tearDown()); - - it('should not create a version if all commits are of skipCommitTypes or merge commits', async () => { - result = await version( - { - ...defaultBuilderOptions, - skipCommitTypes: ['docs'], - }, - createFakeContext({ - project: 'a', - projectRoot: resolve(testingWorkspace.root, 'packages/a'), - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - - expect(commitMessage()).toBe("Merge branch 'another-branch'"); - expect(uncommitedChanges()).toHaveLength(0); - }); - - it('should create correct version if last tag was put on merge commit', async () => { - execSync(` - git tag b-5.0.0 - echo b > packages/b/b-1.txt - git add . - git commit -m "fix(b): 🐞 fix emptiness" - `); - result = await version( - { - ...defaultBuilderOptions, - skipCommitTypes: ['docs'], - }, - createFakeContext({ - project: 'b', - projectRoot: resolve(testingWorkspace.root, 'packages/b'), - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - - expect(commitMessage()).toBe('chore(b): release version 5.0.1'); - expect(uncommitedChanges()).toHaveLength(0); - }); - }); - - // The testing workspace isn't really configured for - // executors, perhaps using the `new FSTree()` from - // and `new Workspace()` @nrwl/toa would give a - // more suitable test environment - xdescribe('--postTargets', () => { - beforeAll(async () => { - testingWorkspace = setupTestingWorkspace(new Map(commonWorkspaceFiles)); - - /* Commit changes. */ - commitChanges(); - - /* Run builder. */ - result = await version( - { - ...defaultBuilderOptions, - syncVersions: true, - version: 'prerelease', - preid: 'beta', - postTargets: ['e:github'], - }, - createFakeContext({ - project: 'workspace', - projectRoot: testingWorkspace.root, - workspaceRoot: testingWorkspace.root, - additionalProjects, - }) - ); - }); - - afterAll(() => testingWorkspace.tearDown()); - - it.todo('should pass in only the new lines from the changelog as ${notes}'); - }); -}); - -function initGit() { - execSync( - ` - git init --quiet - - # These are needed by CI. - git config user.email "bot@jest.io" - git config user.name "Test Bot" - - git config commit.gpgsign false -` - ); -} - -function createAndCommitFiles() { - execSync( - ` - git add . - git commit -m "🐣" - - echo a > packages/a/a.txt - git add . - git commit -m "feat(a): 🚀 new feature" - - echo b > packages/b/b.txt - git add . - git commit -m "fix(b): 🐞 fix emptiness" - - echo c > packages/a/c.txt - git add . - git commit -m "perf(a): ⚡ improve quickness" - ` - ); -} - -function commitChanges() { - initGit(); - createAndCommitFiles(); -} - -function createMergeCommit() { - execSync( - ` - git checkout HEAD~2 - git checkout -b "another-branch" - echo a > packages/a/a-merge.txt - git add . - git commit -m "docs(a): merge 🐣" - - git checkout master - git merge another-branch - ` - ); -} - -function uncommitedChanges() { - return ( - execSync('git status --porcelain', { encoding: 'utf-8' }) - .split('\n') - /* Remove empty line. */ - .filter((line) => line.length !== 0) - ); -} - -function commitMessage() { - return execSync('git show -s --format=%s', { encoding: 'utf-8' }).trim(); -} - -function commitMessageOfATag(tagName: string) { - return execSync(`git log -1 --format=format:"%B" ${tagName}`, { - encoding: 'utf-8', - }).trim(); -} - -function projectGraph() { - // package a depends on lib d - // package c depends on lib e - return Promise.resolve({ - nodes: {}, - dependencies: { - a: [ - { - type: 'static', - source: 'a', - target: 'npm:@mock/npm-lib1', - }, - { - type: 'implicit', - source: 'a', - target: 'd', - }, - ], - c: [ - { - type: 'static', - source: 'c', - target: 'npm:@mock/npm-lib1', - }, - { - type: 'implicit', - source: 'c', - target: 'e', - }, - ], - d: [], - e: [], - }, - }); -} diff --git a/packages/semver/src/executors/version/index.spec.ts b/packages/semver/src/executors/version/index.spec.ts deleted file mode 100644 index adf9e5435..000000000 --- a/packages/semver/src/executors/version/index.spec.ts +++ /dev/null @@ -1,789 +0,0 @@ -import type { ExecutorContext } from '@nrwl/devkit'; -import { logger } from '@nrwl/devkit'; -import { of, throwError } from 'rxjs'; -import version from './'; -import type { VersionBuilderSchema } from './schema'; -import { createFakeContext } from './testing'; -import * as changelog from './utils/changelog'; -import { defaultHeader } from './utils/changelog'; -import * as commit from './utils/commit'; -import { getDependencyRoots } from './utils/get-project-dependencies'; -import * as git from './utils/git'; -import { runPostTargets } from './utils/post-target'; -import * as project from './utils/project'; -import { tryBump } from './utils/try-bump'; -import * as workspace from './utils/workspace'; -const LAST_COMMIT_HASH = 'lastCommitHash'; -jest.mock('./utils/changelog'); -jest.mock('./utils/project'); -jest.mock('./utils/commit', () => ({ - commit: jest.fn(), - formatCommitMessage: jest.requireActual('./utils/commit').formatCommitMessage, -})); -jest.mock('./utils/git'); -jest.mock('./utils/get-project-dependencies'); -jest.mock('./utils/try-bump'); -jest.mock('./utils/post-target'); - -describe('@jscutlery/semver:version', () => { - const mockUpdatePackageJson = - project.updatePackageJson as jest.MockedFunction< - typeof project.updatePackageJson - >; - const mockUpdateChangelog = changelog.updateChangelog as jest.MockedFunction< - typeof changelog.updateChangelog - >; - const mockInsertChangelogDependencyUpdates = - changelog.insertChangelogDependencyUpdates as jest.MockedFunction< - typeof changelog.insertChangelogDependencyUpdates - >; - const mockCalculateChangelogChanges = - changelog.calculateChangelogChanges as jest.MockedFunction< - typeof changelog.calculateChangelogChanges - >; - const mockTryPush = git.tryPush as jest.MockedFunction; - const mockGetLastCommitHash = git.getLastCommitHash as jest.MockedFunction< - typeof git.getLastCommitHash - >; - const mockAddToStage = git.addToStage as jest.MockedFunction< - typeof git.addToStage - >; - const mockCommit = commit.commit as jest.MockedFunction; - const mockCreateTag = git.createTag as jest.MockedFunction< - typeof git.createTag - >; - const mockTryBump = tryBump as jest.MockedFunction; - const mockGetDependencyRoots = getDependencyRoots as jest.MockedFunction< - typeof getDependencyRoots - >; - const mockRunPostTargets = runPostTargets as jest.MockedFunction< - typeof runPostTargets - >; - - let context: ExecutorContext; - - const options: VersionBuilderSchema = { - dryRun: false, - trackDeps: false, - noVerify: false, - push: false, - remote: 'origin', - baseBranch: 'main', - syncVersions: false, - skipRootChangelog: false, - skipProjectChangelog: false, - postTargets: [], - preset: 'angular', - commitMessageFormat: 'chore(${projectName}): release version ${version}', - }; - - beforeEach(() => { - context = createFakeContext({ - project: 'a', - projectRoot: '/root/packages/a', - workspaceRoot: '/root', - additionalProjects: [ - { - project: 'lib1', - projectRoot: '/root/libs/lib1', - }, - { - project: 'lib2', - projectRoot: '/root/libs/lib2', - }, - ], - }); - - jest.spyOn(logger, 'info'); - jest.spyOn(logger, 'error'); - jest.spyOn(logger, 'log').mockImplementation(); - - mockTryBump.mockReturnValue( - of({ version: '2.1.0', previousVersion: '2.0.0', dependencyUpdates: [] }) - ); - mockUpdateChangelog.mockImplementation(({ projectRoot }) => - of(changelog.getChangelogPath(projectRoot)) - ); - mockUpdatePackageJson.mockImplementation(({ projectRoot }) => - of(project.getPackageJsonPath(projectRoot)) - ); - mockCalculateChangelogChanges.mockReturnValue((source) => { - source.subscribe(); - return of(''); - }); - mockInsertChangelogDependencyUpdates.mockReturnValue(of('')); - - /* Mock Git execution */ - mockTryPush.mockReturnValue(of('')); - - mockGetLastCommitHash.mockReturnValue(of(LAST_COMMIT_HASH)); - mockAddToStage.mockReturnValue(of(undefined)); - mockCommit.mockReturnValue(of(undefined)); - mockCreateTag.mockReturnValue(of('')); - - mockRunPostTargets.mockReturnValue(of(undefined)); - mockGetDependencyRoots.mockReturnValue(Promise.resolve([])); - - jest - .spyOn(workspace, 'getProjectRoots') - .mockReturnValue([ - '/root/packages/a', - '/root/packages/b', - '/root/libs/lib1', - '/root/libs/lib2', - ]); - }); - - afterEach(() => { - jest.resetAllMocks(); - }); - - it('should run tasks in order', async () => { - const { success } = await version( - { ...options, push: true, postTargets: ['a:publish'] }, - context - ); - expect(success).toBe(true); - expect(mockTryBump).toHaveBeenCalledBefore( - mockUpdateChangelog as jest.Mock - ); - expect(mockUpdateChangelog).toHaveBeenCalledBefore( - mockUpdatePackageJson as jest.Mock - ); - expect(mockCommit).toHaveBeenCalledBefore(mockCreateTag as jest.Mock); - expect(mockCreateTag).toHaveBeenCalledBefore(mockTryPush as jest.Mock); - expect(mockTryPush).toHaveBeenCalledBefore(mockRunPostTargets as jest.Mock); - }); - - it('should version with --releaseAs', async () => { - const { success } = await version( - { ...options, releaseAs: 'major' }, - context - ); - expect(success).toBe(true); - expect(mockTryBump).toBeCalledWith( - expect.objectContaining({ - releaseType: 'major', - }) - ); - expect(mockUpdateChangelog).toBeCalledWith( - expect.objectContaining({ newVersion: '2.1.0' }) - ); - expect(mockUpdatePackageJson).toBeCalledWith( - expect.objectContaining({ newVersion: '2.1.0' }) - ); - expect(mockCommit).toBeCalledWith( - expect.objectContaining({ - commitMessage: 'chore(a): release version 2.1.0', - }) - ); - expect(mockCreateTag).toBeCalledWith( - expect.objectContaining({ tag: 'a-2.1.0' }) - ); - }); - - it('should version with --noVerify', async () => { - const { success } = await version({ ...options, noVerify: true }, context); - expect(success).toBe(true); - expect(mockCommit).toBeCalledWith( - expect.objectContaining({ noVerify: true }) - ); - }); - - it('should skip changelog and package.json update with --dryRun', async () => { - const { success } = await version( - { - ...options, - dryRun: true, - }, - context - ); - - expect(success).toBe(true); - expect(mockUpdatePackageJson).toBeCalledWith( - expect.objectContaining({ dryRun: true }) - ); - expect(mockUpdateChangelog).toBeCalledWith( - expect.objectContaining({ dryRun: true }) - ); - }); - - describe('--skipCommit', () => { - it('should not make a commit', async () => { - const { success } = await version( - { - ...options, - skipCommit: true, - }, - context - ); - - expect(success).toBe(true); - expect(mockCommit).toBeCalledWith( - expect.objectContaining({ skipCommit: true }) - ); - }); - - it('should put tag on last commit in a library', async () => { - const { success } = await version( - { - ...options, - skipCommit: true, - }, - context - ); - - expect(success).toBe(true); - expect(mockCreateTag).toBeCalledWith( - expect.objectContaining({ commitHash: LAST_COMMIT_HASH }) - ); - }); - }); - - describe('--syncVersions=false (independent mode)', () => { - it('should run semver independently on a project', async () => { - const { success } = await version(options, context); - - expect(success).toBe(true); - expect(mockTryBump).toBeCalledWith( - expect.objectContaining({ - dependencyRoots: [], - }) - ); - expect(mockUpdateChangelog).toBeCalledWith( - expect.objectContaining({ newVersion: '2.1.0' }) - ); - expect(mockUpdatePackageJson).toBeCalledWith( - expect.objectContaining({ newVersion: '2.1.0' }) - ); - expect(mockCommit).toBeCalledWith( - expect.objectContaining({ - commitMessage: 'chore(a): release version 2.1.0', - }) - ); - expect(mockCreateTag).toBeCalledWith( - expect.objectContaining({ tag: 'a-2.1.0' }) - ); - }); - - it('should run semver independently on a project with dependencies', async () => { - mockGetDependencyRoots.mockReturnValue( - Promise.resolve([ - { name: 'lib1', path: '/root/libs/lib1' }, - { name: 'lib2', path: '/root/libs/lib2' }, - ]) - ); - const { success } = await version( - { ...options, trackDeps: true }, - context - ); - - expect(success).toBe(true); - expect(mockTryBump).toBeCalledWith( - expect.objectContaining({ - dependencyRoots: [ - { name: 'lib1', path: '/root/libs/lib1' }, - { name: 'lib2', path: '/root/libs/lib2' }, - ], - }) - ); - expect(mockUpdateChangelog).toBeCalledWith( - expect.objectContaining({ newVersion: '2.1.0' }) - ); - expect(mockUpdatePackageJson).toBeCalledWith( - expect.objectContaining({ newVersion: '2.1.0' }) - ); - expect(mockCommit).toBeCalledWith( - expect.objectContaining({ - commitMessage: 'chore(a): release version 2.1.0', - }) - ); - expect(mockCreateTag).toBeCalledWith( - expect.objectContaining({ tag: 'a-2.1.0' }) - ); - }); - - it('should run semver independently on a project with failure on dependencies', async () => { - mockGetDependencyRoots.mockReturnValue(Promise.reject('thrown error')); - - expect(await version({ ...options, trackDeps: true }, context)).toEqual({ - success: false, - }); - expect(logger.error).toBeCalledWith( - expect.stringContaining('Failed to determine dependencies.') - ); - expect(mockUpdatePackageJson).not.toBeCalled(); - expect(mockCommit).not.toBeCalled(); - expect(mockCreateTag).not.toBeCalled(); - }); - - it('should resolve ${projectName} tagPrefix interpolation', async () => { - const { success } = await version( - { ...options, tagPrefix: 'custom-tag-prefix/${projectName}-' }, - context - ); - - expect(success).toBe(true); - expect(mockCreateTag).toBeCalledWith( - expect.objectContaining({ - tag: 'custom-tag-prefix/a-2.1.0', - }) - ); - }); - - it('should not version if no commits since last release', async () => { - mockTryBump.mockReturnValue(of(null)); - - const { success } = await version(options, context); - - expect(success).toBe(true); - expect(logger.info).toBeCalledWith( - expect.stringContaining('Nothing changed since last release.') - ); - expect(mockUpdatePackageJson).not.toBeCalled(); - expect(mockCommit).not.toBeCalled(); - expect(mockCreateTag).not.toBeCalled(); - }); - - it('should skip changelog generation with --skipProjectChangelog', async () => { - const { success } = await version( - { ...options, skipProjectChangelog: true }, - context - ); - - expect(success).toBe(true); - expect(mockUpdateChangelog).not.toBeCalled(); - expect(mockUpdatePackageJson).toBeCalled(); - expect(mockCommit).toBeCalled(); - expect(mockCreateTag).toBeCalled(); - }); - }); - - describe('--syncVersions', () => { - beforeEach(() => { - /* With the sync versions, the builder runs on the workspace. */ - context = createFakeContext({ - project: 'workspace', - projectRoot: '/root', - workspaceRoot: '/root', - additionalProjects: [ - { - project: 'a', - projectRoot: 'packages/a', - }, - { - project: 'b', - projectRoot: 'packages/b', - }, - ], - }); - - jest - .spyOn(workspace, 'getProjectRoots') - .mockReturnValue(['/root/packages/a', '/root/packages/b', '/root']); - }); - - it('should commit and tag', async () => { - const { success } = await version( - { - ...options, - /* Enable sync versions. */ - syncVersions: true, - }, - context - ); - - expect(success).toBe(true); - expect(mockCreateTag).toBeCalledWith( - expect.objectContaining({ - commitMessage: 'chore(workspace): release version 2.1.0', - dryRun: false, - projectName: 'workspace', - tag: 'v2.1.0', - }) - ); - expect(mockCommit).toBeCalledWith( - expect.objectContaining({ - commitMessage: 'chore(workspace): release version 2.1.0', - dryRun: false, - noVerify: false, - projectName: 'workspace', - }) - ); - }); - - it('should update package.json files', async () => { - const { success } = await version( - { - ...options, - /* Enable sync versions. */ - syncVersions: true, - }, - context - ); - - expect(success).toBe(true); - expect(mockUpdatePackageJson).toBeCalledTimes(3); - expect(mockUpdatePackageJson.mock.calls[0][0]).toEqual( - expect.objectContaining({ - newVersion: '2.1.0', - projectRoot: '/root/packages/a', - }) - ); - expect(mockUpdatePackageJson.mock.calls[1][0]).toEqual( - expect.objectContaining({ - newVersion: '2.1.0', - projectRoot: '/root/packages/b', - }) - ); - expect(mockUpdatePackageJson.mock.calls[2][0]).toEqual( - expect.objectContaining({ - newVersion: '2.1.0', - projectRoot: '/root', - }) - ); - }); - - it('should update changelogs', async () => { - const { success } = await version( - { - ...options, - /* Enable sync versions. */ - syncVersions: true, - }, - context - ); - - expect(success).toBe(true); - expect(mockUpdateChangelog).toBeCalledTimes(3); - expect(mockUpdateChangelog).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ - projectRoot: '/root/packages/a', - }) - ); - expect(mockUpdateChangelog).toHaveBeenNthCalledWith( - 2, - expect.objectContaining({ - projectRoot: '/root/packages/b', - }) - ); - expect(mockUpdateChangelog).toHaveBeenNthCalledWith( - 3, - expect.objectContaining({ - projectRoot: '/root', - }) - ); - }); - - it('should skip root CHANGELOG generation with --skipRootChangelog', async () => { - await version( - { - ...options, - syncVersions: true, - /* Disable root CHANGELOG */ - skipRootChangelog: true, - }, - context - ); - - expect(mockUpdateChangelog).toBeCalledTimes(2); - expect(mockUpdateChangelog).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ - projectRoot: '/root/packages/a', - }) - ); - expect(mockUpdateChangelog).toHaveBeenNthCalledWith( - 2, - expect.objectContaining({ - projectRoot: '/root/packages/b', - }) - ); - }); - - it('should skip project CHANGELOG generation with --skipProjectChangelog', async () => { - await version( - { - ...options, - syncVersions: true, - /* Disable project CHANGELOG */ - skipProjectChangelog: true, - }, - context - ); - expect(mockUpdateChangelog).toBeCalledTimes(1); - expect(mockUpdateChangelog).toBeCalledWith( - expect.objectContaining({ - projectRoot: '/root', - }) - ); - }); - - it('should not version if no commits since last release', async () => { - mockTryBump.mockReturnValue(of(null)); - - const { success } = await version( - { - ...options, - syncVersions: true, - }, - context - ); - - expect(success).toBe(true); - expect(logger.info).toBeCalledWith( - expect.stringContaining('Nothing changed since last release.') - ); - expect(mockUpdateChangelog).not.toBeCalled(); - expect(mockUpdatePackageJson).not.toBeCalled(); - expect(mockAddToStage).not.toBeCalled(); - expect(mockCreateTag).not.toBeCalled(); - expect(mockCommit).not.toBeCalled(); - }); - }); - - describe('--commitMessageFormat', () => { - it('should handle given format', async () => { - const { success } = await version( - { - ...options, - commitMessageFormat: - 'chore: bump "${projectName}" to ${version} [skip ci]', - }, - context - ); - - expect(success).toBe(true); - expect(mockCommit).toBeCalledWith( - expect.objectContaining({ - commitMessage: 'chore: bump "a" to 2.1.0 [skip ci]', - }) - ); - }); - - it('should commit with default format', async () => { - const { success } = await version(options, context); - - expect(success).toBe(true); - expect(mockCommit).toBeCalledWith( - expect.objectContaining({ - commitMessage: 'chore(a): release version 2.1.0', - }) - ); - }); - }); - - describe('--push', () => { - it('should push to Git', async () => { - mockTryPush.mockReturnValue(of('success')); - - const { success } = await version({ ...options, push: true }, context); - - expect(success).toBe(true); - expect(mockTryPush).toHaveBeenCalledWith( - expect.objectContaining({ - remote: 'origin', - branch: 'main', - noVerify: false, - }) - ); - }); - - it('should handle Git failure', async () => { - mockTryPush.mockReturnValue( - throwError(() => new Error('Something went wrong')) - ); - - const { success } = await version({ ...options, push: true }, context); - - expect(success).toBe(false); - expect(logger.error).toBeCalledWith( - expect.stringContaining('Error: Something went wrong') - ); - }); - - it('should not push to Git by default', async () => { - await version(options, context); - expect(mockTryPush).not.toHaveBeenCalled(); - }); - - it('should not push to Git when with --dryRun', async () => { - await version({ ...options, dryRun: true }, context); - expect(mockTryPush).not.toHaveBeenCalled(); - }); - }); - - describe('--postTargets', () => { - it('should successfully execute post targets', async () => { - const { success } = await version( - { - ...options, - postTargets: [ - 'project-a:test', - 'project-b:test', - 'project-c:test:prod', - ], - }, - context - ); - - expect(success).toBe(true); - expect(mockRunPostTargets).toBeCalledWith( - expect.objectContaining({ - templateStringContext: { - dryRun: false, - notes: '', - projectName: 'a', - tag: 'a-2.1.0', - version: '2.1.0', - previousTag: 'a-2.0.0', - }, - }) - ); - }); - - it('should handle post targets failure', async () => { - mockRunPostTargets.mockReturnValue(throwError(() => new Error('Nop!'))); - - const { success } = await version( - { - ...options, - postTargets: ['project-a:test'], - }, - context - ); - - expect(success).toBe(false); - expect(logger.error).toBeCalledWith(expect.stringMatching('Nop!')); - }); - - it('should skip post targets with --dryRun', async () => { - const { success } = await version( - { - ...options, - dryRun: true, - postTargets: ['project-a:test', 'project-b:test:prod'], - }, - context - ); - - expect(success).toBe(true); - expect(mockRunPostTargets).not.toBeCalled(); - }); - - it('should execute post targets after the bump occurred', async () => { - const { success } = await version( - { - ...options, - postTargets: ['project-a:test'], - }, - context - ); - - expect(success).toBe(true); - expect(mockTryBump).toHaveBeenCalledBefore( - mockRunPostTargets as jest.Mock - ); - }); - - it('should skip executing post targets if no bump occurred', async () => { - mockTryBump.mockReturnValue(of(null)); - - const { success } = await version( - { - ...options, - postTargets: ['project-a:test'], - }, - context - ); - - expect(success).toBe(true); - expect(mockRunPostTargets).not.toBeCalled(); - }); - }); - - describe('--preset', () => { - it('should use --preset=angular by default', async () => { - const { success } = await version( - { ...options, preset: undefined }, - context - ); - - expect(success).toBe(true); - expect(mockUpdateChangelog).toBeCalledWith( - expect.objectContaining({ - preset: 'angular', - }) - ); - }); - - it('should use --preset=conventional', async () => { - const { success } = await version( - { ...options, preset: 'conventional' }, - context - ); - - expect(success).toBe(true); - expect(mockUpdateChangelog).toBeCalledWith( - expect.objectContaining({ - preset: 'conventionalcommits', - }) - ); - }); - - it('should use --preset=conventional-changelog-config-spec', async () => { - const { success } = await version( - { - ...options, - preset: { - name: 'conventionalcommits', - compareUrlFormat: - '{{host}}/{{owner}}/{{repository}}/compareee/{{previousTag}}...{{currentTag}}', - }, - }, - context - ); - - expect(success).toBe(true); - expect(mockUpdateChangelog).toBeCalledWith( - expect.objectContaining({ - preset: { - compareUrlFormat: - '{{host}}/{{owner}}/{{repository}}/compareee/{{previousTag}}...{{currentTag}}', - name: 'conventionalcommits', - }, - }) - ); - }); - }); - - describe('---changelogHeader', () => { - const customChangelogHeader = `# Custom Changelog Header`; - it('should use --changelogHeader=defaultHeader by default', async () => { - const { success } = await version(options, context); - - expect(success).toBe(true); - - expect(mockUpdateChangelog).toBeCalledWith( - expect.objectContaining({ - changelogHeader: defaultHeader, - }) - ); - }); - it(`should use --changelogHeader=${customChangelogHeader} by default`, async () => { - const { success } = await version( - { ...options, changelogHeader: customChangelogHeader }, - context - ); - - expect(success).toBe(true); - - expect(mockUpdateChangelog).toBeCalledWith( - expect.objectContaining({ - changelogHeader: customChangelogHeader, - }) - ); - }); - }); -}); diff --git a/packages/semver/src/executors/version/index.ts b/packages/semver/src/executors/version/index.ts deleted file mode 100644 index c5b9c85e8..000000000 --- a/packages/semver/src/executors/version/index.ts +++ /dev/null @@ -1,245 +0,0 @@ -import { type ExecutorContext } from '@nrwl/devkit'; -import { concat, defer, lastValueFrom, of } from 'rxjs'; -import { catchError, concatMap, reduce, switchMap } from 'rxjs/operators'; -import type { VersionBuilderSchema } from './schema'; -import { - calculateChangelogChanges, - defaultHeader, - getChangelogPath, -} from './utils/changelog'; -import { formatCommitMessage } from './utils/commit'; -import { - getDependencyRoots, - type DependencyRoot, -} from './utils/get-project-dependencies'; -import { tryPush } from './utils/git'; -import { _logStep } from './utils/logger'; -import { runPostTargets } from './utils/post-target'; -import { formatTag, formatTagPrefix } from './utils/tag'; -import { tryBump } from './utils/try-bump'; -import { getProject } from './utils/workspace'; -import { - versionProject, - versionWorkspace, - type CommonVersionOptions, -} from './version'; - -export default async function version( - options: VersionBuilderSchema, - context: ExecutorContext -): Promise<{ success: boolean }> { - const { - push, - remote, - dryRun, - trackDeps, - baseBranch, - noVerify, - syncVersions, - skipRootChangelog, - skipProjectChangelog, - releaseAs, - preid, - changelogHeader, - versionTagPrefix, - postTargets, - commitMessageFormat, - preset, - allowEmptyRelease, - skipCommitTypes, - skipCommit, - } = _normalizeOptions(options); - const workspaceRoot = context.root; - const projectName = context.projectName as string; - - let dependencyRoots: DependencyRoot[] = []; - try { - dependencyRoots = await getDependencyRoots({ - projectName, - releaseAs, - trackDeps, - context, - }); - } catch (e) { - _logStep({ - step: 'failure', - level: 'error', - message: `Failed to determine dependencies. - Please report an issue: https://github.com/jscutlery/semver/issues/new.`, - projectName, - }); - return { success: false }; - } - - const tagPrefix = formatTagPrefix({ - versionTagPrefix, - projectName, - syncVersions, - }); - const projectRoot = getProject(context).root; - const newVersion$ = tryBump({ - preset, - projectRoot, - dependencyRoots, - tagPrefix, - versionTagPrefix, - releaseType: releaseAs, - preid, - syncVersions, - allowEmptyRelease, - skipCommitTypes, - projectName, - }); - - const runSemver$ = newVersion$.pipe( - switchMap((newVersion) => { - if (newVersion == null) { - _logStep({ - step: 'nothing_changed', - level: 'info', - message: 'Nothing changed since last release.', - projectName, - }); - return of({ success: true }); - } - - _logStep({ - step: 'calculate_version_success', - message: `Calculated new version "${newVersion.version}".`, - projectName, - }); - - const { version, dependencyUpdates } = newVersion; - const tag = formatTag({ tagPrefix, version }); - const commitMessage = formatCommitMessage({ - projectName, - commitMessageFormat, - version, - }); - - const options: CommonVersionOptions = { - newVersion: version, - tag, - dryRun, - trackDeps, - noVerify, - preset, - tagPrefix, - changelogHeader, - workspaceRoot, - projectName, - skipProjectChangelog, - commitMessage, - dependencyUpdates, - skipCommit, - workspace: context.projectsConfigurations, - }; - - const version$ = defer(() => - syncVersions - ? versionWorkspace({ - ...options, - projectRoot, - skipRootChangelog, - }) - : versionProject({ - ...options, - projectRoot, - }) - ); - - const push$ = defer(() => - tryPush({ - tag, - branch: baseBranch, - noVerify, - remote, - projectName, - }) - ); - - const _runPostTargets = ({ notes }: { notes: string }) => - defer(() => - runPostTargets({ - context, - projectName, - postTargets, - templateStringContext: { - dryRun, - notes, - version, - projectName, - tag, - previousTag: formatTag({ - tagPrefix, - version: newVersion.previousVersion, - }), - }, - }) - ); - - const changelogPath = getChangelogPath( - syncVersions ? workspaceRoot : projectRoot - ); - - return version$.pipe( - calculateChangelogChanges({ - changelogHeader, - changelogPath, - }), - concatMap((notes) => - concat( - ...(push && dryRun === false ? [push$] : []), - ...(dryRun === false ? [_runPostTargets({ notes })] : []) - ) - ), - reduce((result) => result, { success: true }) - ); - }) - ); - - return lastValueFrom( - runSemver$.pipe( - catchError((error) => { - _logStep({ - step: 'failure', - level: 'error', - message: _toErrorMessage(error), - projectName, - }); - return of({ success: false }); - }) - ) - ); -} - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function _toErrorMessage(error: any): string { - return error.stack ?? error.toString(); -} - -function _normalizeOptions(options: VersionBuilderSchema) { - return { - ...options, - push: options.push as boolean, - remote: options.remote as string, - dryRun: options.dryRun as boolean, - trackDeps: options.trackDeps as boolean, - baseBranch: options.baseBranch as string, - noVerify: options.noVerify as boolean, - syncVersions: options.syncVersions as boolean, - skipRootChangelog: options.skipRootChangelog as boolean, - skipProjectChangelog: options.skipProjectChangelog as boolean, - allowEmptyRelease: options.allowEmptyRelease as boolean, - skipCommitTypes: options.skipCommitTypes as string[], - releaseAs: options.releaseAs ?? options.version, - changelogHeader: options.changelogHeader ?? defaultHeader, - versionTagPrefix: options.tagPrefix ?? options.versionTagPrefix, - commitMessageFormat: options.commitMessageFormat as string, - skipCommit: options.skipCommit as boolean, - preset: - options.preset === 'conventional' - ? 'conventionalcommits' - : options.preset || 'angular', - }; -} diff --git a/packages/semver/src/executors/version/schema.d.ts b/packages/semver/src/executors/version/schema.d.ts deleted file mode 100644 index 7078b6907..000000000 --- a/packages/semver/src/executors/version/schema.d.ts +++ /dev/null @@ -1,56 +0,0 @@ -import ConventionalChangelogConfigSpec from '@types/conventional-changelog-config-spec'; -export type ReleaseIdentifier = - | 'patch' - | 'minor' - | 'major' - | 'premajor' - | 'preminor' - | 'prepatch' - | 'prerelease'; - -export type Preset = - | 'angular' - | 'conventional' - | 'conventionalcommits' - | ({ name: string } & ConventionalChangelogConfigSpec.Config); - -export interface VersionBuilderSchema { - dryRun?: boolean; - noVerify?: boolean; - push?: boolean; - remote?: string; - baseBranch?: string; - syncVersions?: boolean; - skipRootChangelog?: boolean; - skipProjectChangelog?: boolean; - trackDeps?: boolean; - skipCommit?: boolean; - /** - * @deprecated Use the alias releaseAs (--releaseAs) instead. - * @sunset 3.0.0 - */ - version?: ReleaseIdentifier; - releaseAs?: ReleaseIdentifier; - preid?: string; - changelogHeader?: string; - tagPrefix?: string | null; - /** - * @deprecated Use the alias tagPrefix (--tagPrefix) instead. - * @sunset 3.0.0 - */ - versionTagPrefix?: string | null; - postTargets: string[]; - allowEmptyRelease?: boolean; - skipCommitTypes?: string[]; - commitMessageFormat?: string; - preset: Preset; -} - -export interface WriteChangelogConfig { - changelogHeader: string; - projectRoot: string; - preset: Preset; - dryRun?: boolean; - changelogPath: string; - tagPrefix: string; -} diff --git a/packages/semver/src/executors/version/schema.json b/packages/semver/src/executors/version/schema.json deleted file mode 100644 index 988980469..000000000 --- a/packages/semver/src/executors/version/schema.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "version": 2, - "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", - "$id": "jscutlery-semver-version", - "title": "JSCutlery Version builder", - "description": "Automate versioning and CHANGELOG generation.", - "type": "object", - "cli": "nx", - "properties": { - "dryRun": { - "description": "See what commands would be run, without committing to git or updating files.", - "type": "boolean", - "default": false - }, - "noVerify": { - "description": "Bypass pre-commit or commit-msg git hooks during the commit phase.", - "type": "boolean", - "default": false - }, - "changelogHeader": { - "description": "Generates changelog with custom header.", - "type": "string" - }, - "push": { - "description": "Pushes to the git remote.", - "type": "boolean", - "default": false - }, - "remote": { - "description": "Pushes against git remote repository.", - "type": "string", - "default": "origin" - }, - "baseBranch": { - "description": "Pushes against git base branch.", - "type": "string", - "default": "main" - }, - "syncVersions": { - "description": "Sync all package versions.", - "type": "boolean", - "default": false - }, - "skipRootChangelog": { - "description": "Skip root CHANGELOG generation containing all monorepo changes (only with sync mode).", - "type": "boolean", - "default": false - }, - "skipProjectChangelog": { - "description": "Skip project CHANGELOG generation (only with sync mode).", - "type": "boolean", - "default": false - }, - "version": { - "description": "(Deprecated) Manually increment the version by that keyword.", - "type": "string" - }, - "releaseAs": { - "description": "Manually increment the version by that keyword.", - "type": "string" - }, - "preid": { - "description": "Use the next semantic prerelease version with a specific prerelease identifier.", - "type": "string" - }, - "tagPrefix": { - "description": "Version tag prefix. Default is 'v' with the sync mode and '${projectName}-' independent mode.", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "versionTagPrefix": { - "description": "(Deprecated) Version tag prefix. Default is 'v' with the sync mode and '${projectName}-' independent mode.", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "postTargets": { - "description": "Specify the targets to run after a new version was successfully created.", - "type": "array", - "default": [], - "items": { - "type": "string", - "description": "The target to run." - } - }, - "trackDeps": { - "description": "Includes the project's dependencies in calculating a recommended version bump.", - "type": "boolean", - "default": false - }, - "allowEmptyRelease": { - "description": "Allow bumping versions even if there are no changes in the library.", - "type": "boolean", - "default": false - }, - "skipCommit": { - "description": "Allows to skip making a commit when bumping a version and put the tag on last existent commit.", - "type": "boolean", - "default": false - }, - "skipCommitTypes": { - "description": "Specify array of commit types to be ignored when calculating next version bump.", - "type": "array", - "default": [], - "items": { - "type": "string", - "description": "Type to ignore" - } - }, - "commitMessageFormat": { - "description": "A string to be used to format the auto-generated release commit message.", - "type": "string", - "default": "chore(${projectName}): release version ${version}" - }, - "preset": { - "oneOf": [ - { - "type": "string", - "enum": ["angular", "conventional"], - "default": "angular" - }, - { - "$ref": "#/definitions/conventionalChangelogConfiguration" - } - ] - } - }, - "definitions": { - "conventionalChangelogConfiguration": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Conventional Changelog Configuration", - "description": "Describes the configuration options supported by conventional-config for upstream tooling.", - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string", - "description": "A base preset name to be customized.", - "default": "angular" - }, - "header": { - "type": "string", - "description": "A string to be used as the main header section of the CHANGELOG.", - "default": "# Changelog\n\n" - }, - "types": { - "description": "An array of `type` objects representing the explicitly supported commit message types, and whether they should show up in generated `CHANGELOG`s.", - "type": "array", - "items": { - "$ref": "#/definitions/type" - }, - "default": [ - { - "type": "feat", - "section": "Features" - }, - { - "type": "fix", - "section": "Bug Fixes" - }, - { - "type": "chore", - "hidden": true - }, - { - "type": "docs", - "hidden": true - }, - { - "type": "style", - "hidden": true - }, - { - "type": "refactor", - "hidden": true - }, - { - "type": "perf", - "hidden": true - }, - { - "type": "test", - "hidden": true - } - ] - }, - "preMajor": { - "type": "boolean", - "description": "Boolean indicating whether or not the action being run (generating CHANGELOG, recommendedBump, etc.) is being performed for a pre-major release (<1.0.0).\n This config setting will generally be set by tooling and not a user.", - "default": false - }, - "commitUrlFormat": { - "type": "string", - "description": "A URL representing a specific commit at a hash.", - "default": "{{host}}/{{owner}}/{{repository}}/commit/{{hash}}" - }, - "compareUrlFormat": { - "type": "string", - "description": "A URL representing the comparison between two git SHAs.", - "default": "{{host}}/{{owner}}/{{repository}}/compare/{{previousTag}}...{{currentTag}}" - }, - "issueUrlFormat": { - "type": "string", - "description": "A URL representing the issue format (allowing a different URL format to be swapped in for Gitlab, Bitbucket, etc).", - "default": "{{host}}/{{owner}}/{{repository}}/issues/{{id}}" - }, - "userUrlFormat": { - "type": "string", - "description": "A URL representing the a user's profile URL on GitHub, Gitlab, etc. This URL is used for substituting @bcoe with https://github.com/bcoe in commit messages.", - "default": "{{host}}/{{user}}" - }, - "releaseCommitMessageFormat": { - "type": "string", - "description": "A string to be used to format the auto-generated release commit message.", - "default": "chore(release): {{currentTag}}" - }, - "issuePrefixes": { - "type": "array", - "items": { - "type": "string" - }, - "description": "An array of prefixes used to detect references to issues", - "default": ["#"] - } - } - }, - "type": { - "description": "An object that describes a commit type's settings in the CHANGELOG", - "type": "object", - "properties": { - "type": { - "description": "A string used to match s used in the Conventional Commits convention.", - "type": "string" - }, - "scope": { - "description": "A string used to match `[optional scope]` used in the Conventional Commits convention.", - "type": "string" - }, - "section": { - "description": "The section where the matched commit type will display in the CHANGELOG.", - "type": "string" - }, - "hidden": { - "description": "Set to `true` to hide matched commit types in the CHANGELOG.", - "type": "boolean" - } - }, - "required": ["type"], - "oneOf": [ - { - "required": ["section"] - }, - { - "required": ["hidden"] - } - ] - } - }, - "required": [] -} diff --git a/packages/semver/src/executors/version/testing.ts b/packages/semver/src/executors/version/testing.ts deleted file mode 100644 index 8f9c1ea15..000000000 --- a/packages/semver/src/executors/version/testing.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { mkdirSync, writeFileSync } from 'fs'; -import { dirname, resolve } from 'path'; -import * as rimraf from 'rimraf'; -import * as tmp from 'tmp'; -import { promisify } from 'util'; - -import { - ExecutorContext, - ProjectConfiguration, - TargetConfiguration, -} from '@nrwl/devkit'; - -export interface TestingWorkspace { - tearDown(): Promise; - root: string; -} - -export function setupTestingWorkspace( - files: Map -): TestingWorkspace { - /* Create a temporary directory. */ - const tmpDir = tmp.dirSync(); - - for (const [fileRelativePath, content] of files.entries()) { - const filePath = resolve(tmpDir.name, fileRelativePath); - const directory = dirname(filePath); - /* Create path. */ - mkdirSync(directory, { recursive: true }); - /* Create file. */ - writeFileSync(filePath, content, 'utf-8'); - } - - const originalCwd = process.cwd(); - process.chdir(tmpDir.name); - - /* Retrieving path from `process.cwd()` - * because for some strange reasons it returns a different value. - * Cf. https://github.com/nodejs/node/issues/7545 */ - const workspaceRoot = process.cwd(); - - return { - /** - * Destroy and restore cwd. - */ - async tearDown() { - await promisify(rimraf)(workspaceRoot); - process.chdir(originalCwd); - }, - root: workspaceRoot, - }; -} - -export function createFakeContext({ - cwd = process.cwd(), - project, - projectRoot, - workspaceRoot, - additionalProjects = [], -}: { - cwd?: string; - project: string; - projectRoot: string; - workspaceRoot: string; - additionalProjects?: { - project: string; - projectRoot: string; - targets?: Record; - }[]; -}): ExecutorContext { - return { - isVerbose: false, - cwd: cwd, - root: workspaceRoot, - projectName: project, - projectsConfigurations: { - version: 2, - projects: { - [project]: { - root: projectRoot, - targets: {}, - }, - ...assembleAdditionalProjects(additionalProjects), - }, - }, - } satisfies ExecutorContext; -} - -function assembleAdditionalProjects( - additionalProjects: { - project: string; - projectRoot: string; - targets?: Record; - }[] -) { - return additionalProjects.reduce<{ - [projectName: string]: ProjectConfiguration; - }>((acc, p) => { - acc[p.project] = { - root: p.projectRoot, - targets: p.targets || {}, - }; - return acc; - }, {} satisfies { [project: string]: ProjectConfiguration }); -} diff --git a/packages/semver/src/executors/version/utils/changelog.ts b/packages/semver/src/executors/version/utils/changelog.ts deleted file mode 100644 index 4485cf55c..000000000 --- a/packages/semver/src/executors/version/utils/changelog.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { resolve } from 'path'; -import { - combineLatestWith, - concatMap, - defer, - lastValueFrom, - map, - of, - switchMap, - type Observable, - type OperatorFunction, -} from 'rxjs'; -import writeChangelog from './write-changelog'; -import type { Version } from '../version'; -import { diff } from './diff'; -import { readFile, readFileIfExists, writeFile } from './filesystem'; -import { Preset } from '../schema'; -export const defaultHeader = `# Changelog - -This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). -`; - -export function getChangelogPath(projectRoot: string) { - return resolve(projectRoot, 'CHANGELOG.md'); -} - -export function updateChangelog({ - projectRoot, - dryRun, - preset, - newVersion, - changelogHeader, - tagPrefix, -}: { - projectRoot: string; - dryRun: boolean; - preset: Preset; - newVersion: string; - tagPrefix: string; - changelogHeader: string; -}): Observable { - return defer(async () => { - const changelogPath = getChangelogPath(projectRoot); - await writeChangelog( - { - changelogHeader, - changelogPath, - dryRun, - projectRoot, - preset, - tagPrefix, - }, - newVersion - ); - return changelogPath; - }); -} - -export function insertChangelogDependencyUpdates({ - changelogPath, - version, - dryRun, - dependencyUpdates, -}: { - changelogPath: string; - version: string; - dryRun: boolean; - dependencyUpdates: Version[]; -}): Observable { - return of(!dependencyUpdates.length || dryRun).pipe( - switchMap((skipDependencyUpdates) => { - if (skipDependencyUpdates) { - return of(changelogPath); - } - - return readFile(changelogPath).pipe( - map((changelog) => - _calculateDependencyUpdates({ - changelog, - version, - dependencyUpdates, - }) - ), - switchMap((changelog) => writeFile(changelogPath, changelog)), - map(() => changelogPath) - ); - }) - ); -} - -export function calculateChangelogChanges({ - changelogPath, - changelogHeader, -}: { - changelogPath: string; - changelogHeader: string; -}): OperatorFunction { - return (source) => { - return readFileIfExists(changelogPath, changelogHeader).pipe( - combineLatestWith(source), - concatMap(async ([input]) => { - const output = await lastValueFrom( - readFileIfExists(changelogPath, changelogHeader) - ); - - return diff(input, output); - }) - ); - }; -} - -/* istanbul ignore next */ -export function _calculateDependencyUpdates({ - changelog, - version, - dependencyUpdates, -}: { - changelog: string; - version: string; - dependencyUpdates: Version[]; -}): string { - const match = changelog.match(new RegExp(`##? \\[?${version}\\]? ?\\(.*\\)`)); - - if (match && match.index !== undefined) { - const dependencyNames = dependencyUpdates.reduce((acc, ver) => { - if (ver.type === 'dependency') { - acc.push( - `* \`${ver.dependencyName}\` updated to version \`${ver.version}\`` - ); - } - return acc; - }, [] as string[]); - - changelog = - `${changelog.substring(0, match.index + match[0].length)}` + - `\n\n### Dependency Updates\n\n${dependencyNames.join('\n')}\n` + - `${changelog.substring(match.index + match[0].length + 2)}`; - } - - return changelog; -} diff --git a/packages/semver/src/executors/version/utils/commit.spec.ts b/packages/semver/src/executors/version/utils/commit.spec.ts deleted file mode 100644 index 7d88c6dfa..000000000 --- a/packages/semver/src/executors/version/utils/commit.spec.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { lastValueFrom, of } from 'rxjs'; -import * as cp from '../../common/exec'; -import { commit, formatCommitMessage } from './commit'; - -jest.mock('../../common/exec'); - -jest.spyOn(console, 'log').mockImplementation(); - -describe(formatCommitMessage.name, () => { - it('should format commit message with projectName and version', () => { - expect( - formatCommitMessage({ - commitMessageFormat: 'chore(${projectName}): release ${version}', - version: '1.0.0', - projectName: 'a', - }) - ).toBe('chore(a): release 1.0.0'); - }); -}); - -describe(commit.name, () => { - afterEach(() => (cp.exec as jest.Mock).mockReset()); - - beforeEach(() => jest.spyOn(cp, 'exec').mockReturnValue(of('success'))); - - it('should commit', async () => { - await lastValueFrom( - commit({ - dryRun: false, - noVerify: false, - skipCommit: false, - commitMessage: 'chore(release): 1.0.0', - projectName: 'p', - }) - ); - - expect(cp.exec).toBeCalledWith( - 'git', - expect.arrayContaining(['commit', '-m', 'chore(release): 1.0.0']) - ); - }); - - it('should skip with --dryRun', (done) => { - commit({ - dryRun: true, - noVerify: false, - skipCommit: false, - commitMessage: 'chore(release): 1.0.0', - projectName: 'p', - }).subscribe({ - complete: () => { - expect(cp.exec).not.toBeCalled(); - done(); - }, - }); - }); - - it('should skip commit with --skipCommit but do not complete the stream', (done) => { - commit({ - dryRun: false, - noVerify: false, - skipCommit: true, - commitMessage: 'chore(release): 1.0.0', - projectName: 'p', - }).subscribe({ - next: () => { - expect(cp.exec).not.toBeCalled(); - done(); - }, - }); - }); - - it('should pass --noVerify', async () => { - await lastValueFrom( - commit({ - dryRun: false, - noVerify: true, - skipCommit: false, - commitMessage: 'chore(release): 1.0.0', - projectName: 'p', - }) - ); - - expect(cp.exec).toBeCalledWith( - 'git', - expect.arrayContaining(['--no-verify']) - ); - }); -}); diff --git a/packages/semver/src/executors/version/utils/commit.ts b/packages/semver/src/executors/version/utils/commit.ts deleted file mode 100644 index 4faf0e95a..000000000 --- a/packages/semver/src/executors/version/utils/commit.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { of } from 'rxjs'; -import { EMPTY, map, type Observable } from 'rxjs'; -import { exec } from '../../common/exec'; -import { logStep } from './logger'; -import { createTemplateString } from './template-string'; - -export function commit({ - dryRun, - noVerify, - skipCommit, - commitMessage, - projectName, -}: { - dryRun: boolean; - skipCommit: boolean; - noVerify: boolean; - commitMessage: string; - projectName: string; -}): Observable { - if (dryRun || skipCommit) { - return of(undefined); - } - - return exec('git', [ - 'commit', - ...(noVerify ? ['--no-verify'] : []), - '-m', - commitMessage, - ]).pipe( - map(() => undefined), - logStep({ - step: 'commit_success', - message: `Committed "${commitMessage}".`, - projectName, - }) - ); -} - -export function formatCommitMessage({ - commitMessageFormat, - version, - projectName, -}: { - version: string; - commitMessageFormat: string; - projectName: string; -}): string { - return createTemplateString(commitMessageFormat, { - projectName, - version, - }); -} diff --git a/packages/semver/src/executors/version/utils/diff.spec.ts b/packages/semver/src/executors/version/utils/diff.spec.ts deleted file mode 100644 index 9d66cabbc..000000000 --- a/packages/semver/src/executors/version/utils/diff.spec.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { diff } from './diff'; - -const FILE_BEFORE = `# This is the header -## This is the second line of the header - -change 6 - -change 5 -change 4 -change 3 -change 2 -change 1 -`; - -const FILE_AFTER = `# This is the header -## This is the second line of the header - -change 9 - -change 8 -change 7 -change 6 - -change 5 -change 4 -change 3 -change 2 -change 1 -`; - -describe('diff', () => { - it('should not include the header in the diff', () => { - const difference = diff(FILE_BEFORE, FILE_AFTER); - - expect(difference).not.toInclude('# This is the header'); - expect(difference).not.toInclude( - '## This is the second line of the header' - ); - }); - - it('should not include changes from before', () => { - const difference = diff(FILE_BEFORE, FILE_AFTER); - expect(difference).not.toMatch(/change [1-6]/); - }); - - it('should include changes from after', () => { - const difference = diff(FILE_BEFORE, FILE_AFTER); - expect(difference).toInclude("change 7"); - expect(difference).toInclude("change 8"); - expect(difference).toInclude("change 9"); - }); -}); diff --git a/packages/semver/src/executors/version/utils/diff.ts b/packages/semver/src/executors/version/utils/diff.ts deleted file mode 100644 index 0da228731..000000000 --- a/packages/semver/src/executors/version/utils/diff.ts +++ /dev/null @@ -1,17 +0,0 @@ -export function diff(before: string, after: string): string { - const linesBefore = before.split('\n'); - const linesAfter = after.split('\n'); - - const differentLines: string[] = []; - - let oldIndex = 0; - for (const line of linesAfter) { - if (line === linesBefore[oldIndex]) { - oldIndex += 1; - } else { - differentLines.push(line); - } - } - - return differentLines.join('\n'); -} \ No newline at end of file diff --git a/packages/semver/src/executors/version/utils/filesystem.spec.ts b/packages/semver/src/executors/version/utils/filesystem.spec.ts deleted file mode 100644 index 79d9fa132..000000000 --- a/packages/semver/src/executors/version/utils/filesystem.spec.ts +++ /dev/null @@ -1,83 +0,0 @@ -import * as fs from 'fs'; -import { lastValueFrom } from 'rxjs'; - -import { readFileIfExists, readJsonFile } from './filesystem'; - -jest.mock('fs', () => ({ - promises: { - readFile: jest.fn().mockResolvedValue(() => Promise.resolve()), - access: jest.fn().mockResolvedValue(() => Promise.resolve()), - }, -})); - -const fsPromises = fs.promises; - -describe('readJsonFile', () => { - const mockReadFile = fsPromises.readFile as jest.Mock; - - afterEach(() => { - mockReadFile.mockReset(); - }); - - it('should emit error', async () => { - mockReadFile.mockRejectedValue( - new Error('ENOENT: no such file or directory') - ); - - const file$ = readJsonFile('/unexisting-file'); - - /* Wait for all microtasks to finish. */ - /* We want to make sure that `fs.readFile` is not called - * before we subscribe, otherwise the error is not handled. */ - await new Promise(setImmediate); - - await expect(lastValueFrom(file$)).rejects.toThrow( - 'ENOENT: no such file or directory' - ); - expect(mockReadFile).toBeCalledTimes(1); - }); -}); - -describe('readFileIfExists', () => { - const mockReadFile = fsPromises.readFile as jest.Mock; - const mockAccess = fsPromises.access as jest.Mock; - - afterEach(() => { - mockReadFile.mockReset(); - mockAccess.mockReset(); - }); - - it('should return an empty string if the file does not exists', async () => { - mockAccess.mockResolvedValue(false); - - mockReadFile.mockRejectedValue( - new Error('ENOENT: no such file or directory') - ); - - const file$ = readFileIfExists('/unexisting-file'); - - /* Wait for all microtasks to finish. */ - /* We want to make sure that `fs.readFile` is not called - * before we subscribe, otherwise the error is not handled. */ - await new Promise(setImmediate); - - expect(await lastValueFrom(file$)).toBe(''); - }); - - it('should return a fallback value if provided', async () => { - mockAccess.mockResolvedValue(false); - - mockReadFile.mockRejectedValue( - new Error('ENOENT: no such file or directory') - ); - - const file$ = readFileIfExists('/unexisting-file', 'some fallback'); - - /* Wait for all microtasks to finish. */ - /* We want to make sure that `fs.readFile` is not called - * before we subscribe, otherwise the error is not handled. */ - await new Promise(setImmediate); - - expect(await lastValueFrom(file$)).toBe('some fallback'); - }); -}); diff --git a/packages/semver/src/executors/version/utils/filesystem.ts b/packages/semver/src/executors/version/utils/filesystem.ts deleted file mode 100644 index ba8600ff4..000000000 --- a/packages/semver/src/executors/version/utils/filesystem.ts +++ /dev/null @@ -1,37 +0,0 @@ -import * as fs from 'fs'; -import { defer, Observable, of } from 'rxjs'; -import { catchError, map, switchMap } from 'rxjs/operators'; - -const fsPromises = fs.promises; - -export function exists(filePath: string) { - return defer(() => - fsPromises.access(filePath, fs.constants.R_OK | fs.constants.W_OK) - ).pipe( - map(() => true), - catchError(() => of(false)) - ); -} - -export function readFile(filePath: string) { - return defer(() => fsPromises.readFile(filePath, { encoding: 'utf-8' })); -} - -export function readFileIfExists(filePath: string, fallback = '') { - return exists(filePath).pipe( - switchMap((exist) => (exist ? readFile(filePath) : of(fallback))) - ); -} - -export function readJsonFile(filePath: string) { - return readFile(filePath).pipe(map((data) => JSON.parse(data))); -} - -export function writeFile( - filePath: string, - data: Parameters[1] -): Observable { - return defer(() => - fsPromises.writeFile(filePath, data, { encoding: 'utf-8' }) - ); -} diff --git a/packages/semver/src/executors/version/utils/get-last-version.spec.ts b/packages/semver/src/executors/version/utils/get-last-version.spec.ts deleted file mode 100644 index 0266abcec..000000000 --- a/packages/semver/src/executors/version/utils/get-last-version.spec.ts +++ /dev/null @@ -1,91 +0,0 @@ -import * as gitSemverTags from 'git-semver-tags'; -import { lastValueFrom } from 'rxjs'; -import { callbackify } from 'util'; - -import { getLastVersion } from './get-last-version'; - -jest.mock('git-semver-tags', () => jest.fn()); -jest.mock('./project'); - -const tagPrefix = 'my-lib-'; - -describe(getLastVersion.name, () => { - let mockGitSemverTags: jest.Mock; - - beforeEach(() => { - mockGitSemverTags = jest.fn(); - (gitSemverTags as jest.Mock).mockImplementation( - callbackify(mockGitSemverTags) - ); - }); - - it('should compute current version from previous semver tag', async () => { - mockGitSemverTags.mockResolvedValue([ - 'my-lib-2.1.0', - 'my-lib-2.0.0', - 'my-lib-1.0.0', - ]); - - const tag = await lastValueFrom(getLastVersion({ tagPrefix })); - - expect(tag).toEqual('2.1.0'); - }); - - it('should compute current version without a matching prerelease preid', async () => { - mockGitSemverTags.mockResolvedValue([ - 'my-lib-2.1.0-add-feature.5', - 'my-lib-2.0.0', - 'my-lib-1.0.0', - ]); - - const tag = await lastValueFrom( - getLastVersion({ tagPrefix, preid: 'new-feature' }) - ); - - expect(tag).toEqual('2.0.0'); - }); - - it('should compute current version from previous semver prerelease tag with corresponding preid', async () => { - mockGitSemverTags.mockResolvedValue([ - 'my-lib-2.1.0-z-is-the-last-letter-in-alphabet.0', - 'my-lib-2.1.0-add-feature.5', - 'my-lib-2.1.0-fix-bug.0', - 'my-lib-2.0.0', - 'my-lib-1.0.0', - ]); - - const tag = await lastValueFrom(getLastVersion({ tagPrefix })); - const tagWithPreidFeat = await lastValueFrom( - getLastVersion({ tagPrefix, preid: 'add-feature' }) - ); - const tagWithPreidFix = await lastValueFrom( - getLastVersion({ tagPrefix, preid: 'fix-bug' }) - ); - - expect(tag).toEqual('2.1.0-z-is-the-last-letter-in-alphabet.0'); - expect(tagWithPreidFeat).toEqual('2.1.0-add-feature.5'); - expect(tagWithPreidFix).toEqual('2.1.0-fix-bug.0'); - }); - - it('should compute current version from previous semver release tag', async () => { - mockGitSemverTags.mockResolvedValue([ - 'my-lib-2.1.0-beta.0', - 'my-lib-2.0.0', - 'my-lib-1.0.0', - ]); - - const tag = await lastValueFrom( - getLastVersion({ tagPrefix, includePrerelease: false }) - ); - - expect(tag).toEqual('2.0.0'); - }); - - it('should throw error if no tag available', async () => { - mockGitSemverTags.mockResolvedValue([]); - - expect(lastValueFrom(getLastVersion({ tagPrefix }))).rejects.toThrow( - 'No semver tag found' - ); - }); -}); diff --git a/packages/semver/src/executors/version/utils/get-last-version.ts b/packages/semver/src/executors/version/utils/get-last-version.ts deleted file mode 100644 index 9ff5c5332..000000000 --- a/packages/semver/src/executors/version/utils/get-last-version.ts +++ /dev/null @@ -1,58 +0,0 @@ -import * as gitSemverTags from 'git-semver-tags'; -import { from, of, throwError } from 'rxjs'; -import { switchMap } from 'rxjs/operators'; -import * as semver from 'semver'; -import { promisify } from 'util'; - -import type { Observable } from 'rxjs'; - -export function getLastVersion({ - tagPrefix, - includePrerelease = true, - preid, -}: { - tagPrefix: string; - includePrerelease?: boolean; - preid?: string; -}): Observable { - return from( - promisify(gitSemverTags)({ tagPrefix }) as Promise - ).pipe( - switchMap((tags: string[]) => { - const versions = tags - .map((tag) => tag.substring(tagPrefix.length)) - .filter((v) => { - const prerelease = semver.prerelease(v); - - /* Filter-in everything except prereleases. */ - if (prerelease == null) { - return true; - } - - if (includePrerelease) { - /* Filter-in everything if preid is not set. */ - if (preid == null) { - return true; - } - - /* Filter-in if preids match. */ - const [versionPreid] = prerelease; - if (versionPreid === preid) { - return true; - } - } - - /* Filter-out everything else.*/ - return false; - }); - - const [version] = versions.sort(semver.rcompare); - - if (version == null) { - return throwError(() => new Error('No semver tag found')); - } - - return of(version); - }) - ); -} diff --git a/packages/semver/src/executors/version/utils/get-project-dependencies.spec.ts b/packages/semver/src/executors/version/utils/get-project-dependencies.spec.ts deleted file mode 100644 index a40fae11c..000000000 --- a/packages/semver/src/executors/version/utils/get-project-dependencies.spec.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { type ProjectGraph } from '@nrwl/devkit'; -import { getProjectDependencies } from './get-project-dependencies'; - -const projectGraph: ProjectGraph = { - nodes: {}, - dependencies: { - demo: [ - { - type: 'static', - source: 'demo', - target: 'npm:@mock/npm-lib1', - }, - { - type: 'implicit', - source: 'demo', - target: 'lib1', - }, - { - type: 'static', - source: 'demo', - target: 'lib2', - }, - ], - lib1: [ - { - type: 'static', - source: 'lib1', - target: 'npm:@mock/npm-lib1', - }, - { - type: 'implicit', - source: 'lib1', - target: 'lib2', - }, - ], - lib2: [ - { - type: 'static', - source: 'lib2', - target: 'npm:@mock/npm-lib2', - }, - { - type: 'static', - source: 'lib2', - target: 'lib1', - }, - { - type: 'static', - source: 'lib2', - target: 'lib3', - }, - ], - lib3: [], - 'demo-e2e': [ - { - type: 'implicit', - source: 'demo-e2e', - target: 'demo', - }, - ], - }, -}; - -describe('projectDependencies', () => { - const mockCreateProjectGraphAsync = jest.fn(); - - beforeEach(() => { - jest.resetModules(); - }); - - describe('Nx > 13', () => { - jest.mock('@nrwl/devkit', () => ({ - createProjectGraphAsync: mockCreateProjectGraphAsync, - })); - jest.mock('@nrwl/workspace/src/core/project-graph', () => ({})); - - beforeEach(() => { - mockCreateProjectGraphAsync.mockRestore(); - }); - - it('returns a list of libs that the project is dependent on', async () => { - mockCreateProjectGraphAsync.mockReturnValue( - Promise.resolve(projectGraph) - ); - - const dependencies = await getProjectDependencies('demo'); - expect(dependencies).toEqual(['lib1', 'lib2']); - - expect(mockCreateProjectGraphAsync).toHaveBeenCalledTimes(1); - }); - - it('returns a sub-dependency', async () => { - mockCreateProjectGraphAsync.mockReturnValue( - Promise.resolve(projectGraph) - ); - - const dependencies = await getProjectDependencies('lib1'); - expect(dependencies).toEqual(['lib2']); - - expect(mockCreateProjectGraphAsync).toHaveBeenCalledTimes(1); - }); - - it('handles a failure in retrieving the dependency graph', async () => { - mockCreateProjectGraphAsync.mockReturnValue( - Promise.reject('thrown error') - ); - - let error; - try { - await getProjectDependencies('lib1'); - } catch (e) { - error = e; - } - expect(error).toEqual('thrown error'); - }); - }); - - it('should support Nx < 13 project graph', async () => { - jest.mock('@nrwl/devkit', () => ({})); - jest.mock('@nrwl/workspace/src/core/project-graph', () => ({ - createProjectGraph: jest.fn(() => projectGraph), - })); - - const dependencies = await getProjectDependencies('demo'); - - expect(dependencies).toEqual(['lib1', 'lib2']); - }); -}); diff --git a/packages/semver/src/executors/version/utils/get-project-dependencies.ts b/packages/semver/src/executors/version/utils/get-project-dependencies.ts deleted file mode 100644 index b3d407706..000000000 --- a/packages/semver/src/executors/version/utils/get-project-dependencies.ts +++ /dev/null @@ -1,60 +0,0 @@ -import type { ExecutorContext, ProjectGraphDependency } from '@nrwl/devkit'; -import type { VersionBuilderSchema } from '../schema'; - -export interface DependencyRoot { - name: string; - path: string; -} - -export async function getDependencyRoots({ - trackDeps, - releaseAs, - projectName, - context, -}: Required> & - Pick & { - projectName: string; - context: ExecutorContext; - }): Promise { - if (trackDeps && !releaseAs) { - // Include any depended-upon libraries in determining the version bump. - return (await getProjectDependencies(projectName)).map((name) => ({ - name, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - path: context.projectsConfigurations!.projects[name].root, - })); - } - - return []; -} - -/** - * Returns a list of in-repo dependencies based on NX's dependency graph. - */ -export async function getProjectDependencies( - projectName: string -): Promise { - const { createProjectGraphAsync } = await import('@nrwl/devkit'); - /* @todo: remove the compatibility support later on. */ - const dependencyGraph = - typeof createProjectGraphAsync === 'function' - ? await createProjectGraphAsync() - : // eslint-disable-next-line @typescript-eslint/no-explicit-any - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ( - (await import('@nrwl/workspace/src/core/project-graph')) as any - ).createProjectGraph(); - - return getProjectsFromDependencies(dependencyGraph.dependencies[projectName]); -} - -/** - * Gets only the dependencies that are in the project. Not NPM packages. - */ -function getProjectsFromDependencies( - dependencies: ProjectGraphDependency[] -): string[] { - return dependencies - .filter((d) => !d.target.startsWith('npm:')) - .map((d) => d.target); -} diff --git a/packages/semver/src/executors/version/utils/git.spec.ts b/packages/semver/src/executors/version/utils/git.spec.ts deleted file mode 100644 index 0c4f8d77f..000000000 --- a/packages/semver/src/executors/version/utils/git.spec.ts +++ /dev/null @@ -1,300 +0,0 @@ -import * as gitRawCommits from 'git-raw-commits'; -import { lastValueFrom, of, throwError } from 'rxjs'; -import { PassThrough } from 'stream'; -import * as cp from '../../common/exec'; -import { - addToStage, - createTag, - getCommits, - getFirstCommitRef, - tryPush, -} from './git'; - -jest.mock('git-raw-commits', () => jest.fn()); -jest.mock('../../common/exec'); - -describe('git', () => { - jest.spyOn(console, 'log').mockImplementation(); - - afterEach(() => (cp.exec as jest.Mock).mockReset()); - - describe(getCommits.name, () => { - const mockGitRawCommits = gitRawCommits as jest.Mock; - - it('should get commits list', () => { - const stream = new PassThrough(); - mockGitRawCommits.mockReturnValue(stream); - - const observer = { - next: jest.fn(), - complete: jest.fn(), - }; - - getCommits({ - projectRoot: 'libs/demo', - since: 'x1.0.0', - }).subscribe(observer); - - stream.emit('data', 'feat A'); - stream.emit('data', 'feat B'); - stream.emit('close'); - - expect(observer.next).toBeCalledTimes(1); - expect(observer.next).toBeCalledWith(['feat A', 'feat B']); - expect(observer.complete).toBeCalledTimes(1); - }); - }); - - describe(tryPush.name, () => { - it('should Git push with right options', async () => { - jest.spyOn(cp, 'exec').mockReturnValue(of('success')); - - await lastValueFrom( - tryPush({ - tag: 'v1.0.0', - remote: 'upstream', - branch: 'master', - noVerify: false, - projectName: 'p', - }) - ); - - expect(cp.exec).toBeCalledWith( - 'git', - expect.arrayContaining([ - 'push', - '--atomic', - 'upstream', - 'master', - 'v1.0.0', - ]) - ); - }); - - it(`should Git push and add '--no-verify' option when asked for`, async () => { - jest.spyOn(cp, 'exec').mockReturnValue(of('success')); - - await lastValueFrom( - tryPush({ - tag: 'v1.0.0', - remote: 'origin', - branch: 'main', - noVerify: true, - projectName: 'p', - }) - ); - - expect(cp.exec).toBeCalledWith( - 'git', - expect.arrayContaining([ - 'push', - '--no-verify', - '--atomic', - 'origin', - 'main', - 'v1.0.0', - ]) - ); - }); - - it(`should retry Git push if '--atomic' option not supported`, async () => { - jest - .spyOn(cp, 'exec') - .mockReturnValueOnce(throwError(() => new Error('atomic failed'))) - .mockReturnValueOnce(of('success')); - - jest.spyOn(console, 'warn').mockImplementation(); - - await lastValueFrom( - tryPush({ - tag: 'v1.0.0', - remote: 'origin', - branch: 'master', - noVerify: false, - projectName: 'p', - }) - ); - - expect(cp.exec).toHaveBeenNthCalledWith( - 1, - 'git', - expect.arrayContaining(['push', '--atomic', 'v1.0.0']) - ); - expect(cp.exec).toHaveBeenNthCalledWith( - 2, - 'git', - expect.not.arrayContaining(['--atomic']) - ); - expect(console.warn).toBeCalled(); - }); - - it(`should throw if Git push failed`, async () => { - jest - .spyOn(cp, 'exec') - .mockReturnValue(throwError(() => new Error('Something went wrong'))); - - await expect( - lastValueFrom( - tryPush({ - tag: 'v1.0.0', - remote: 'origin', - branch: 'master', - noVerify: false, - projectName: 'p', - }) - ) - ).rejects.toEqual(new Error('Something went wrong')); - expect(cp.exec).toBeCalledTimes(1); - }); - - it('should fail if options are undefined', async () => { - await expect( - lastValueFrom( - tryPush({ - tag: 'v1.0.0', - /* eslint-disable @typescript-eslint/no-explicit-any */ - remote: undefined as any, - branch: undefined as any, - /* eslint-enable @typescript-eslint/no-explicit-any */ - noVerify: false, - projectName: 'p', - }) - ) - ).rejects.toEqual(expect.any(Error)); - }); - }); - - describe(addToStage.name, () => { - it('should add to git stage', async () => { - jest.spyOn(cp, 'exec').mockReturnValue(of('ok')); - - await lastValueFrom( - addToStage({ - paths: ['packages/demo/file.txt', 'packages/demo/other-file.ts'], - dryRun: false, - }) - ); - - expect(cp.exec).toBeCalledWith( - 'git', - expect.arrayContaining([ - 'add', - 'packages/demo/file.txt', - 'packages/demo/other-file.ts', - ]) - ); - }); - - it('should skip git add if paths argument is empty', async () => { - jest.spyOn(cp, 'exec').mockReturnValue(of('ok')); - - await lastValueFrom( - addToStage({ - paths: [], - dryRun: false, - }), - { defaultValue: undefined } - ); - - expect(cp.exec).not.toBeCalled(); - }); - }); - - describe(getFirstCommitRef.name, () => { - it('should get last git commit', async () => { - jest.spyOn(cp, 'exec').mockReturnValue(of('sha1\n')); - - const tag = await lastValueFrom(getFirstCommitRef()); - - expect(tag).toBe('sha1'); - expect(cp.exec).toBeCalledWith( - 'git', - expect.arrayContaining(['rev-list', '--max-parents=0', 'HEAD']) - ); - }); - - it(`should get last listed git commit when multiple unrelated histories' origins exist`, async () => { - jest.spyOn(cp, 'exec').mockReturnValue(of('sha1\nsha2\nsha3\n\r\n')); - - const tag = await lastValueFrom(getFirstCommitRef()); - - expect(tag).toBe('sha3'); - expect(cp.exec).toBeCalledWith( - 'git', - expect.arrayContaining(['rev-list', '--max-parents=0', 'HEAD']) - ); - }); - }); - - describe(createTag.name, () => { - it('should create git tag', async () => { - jest.spyOn(cp, 'exec').mockReturnValue(of('success')); - - const tag = await lastValueFrom( - createTag({ - dryRun: false, - commitHash: '123', - tag: 'project-a-1.0.0', - commitMessage: 'chore(release): 1.0.0', - projectName: 'p', - }) - ); - - expect(tag).toBe('project-a-1.0.0'); - expect(cp.exec).toBeCalledWith( - 'git', - expect.arrayContaining([ - 'tag', - '-a', - 'project-a-1.0.0', - '123', - '-m', - 'chore(release): 1.0.0', - ]) - ); - }); - - it('should skip with --dryRun', (done) => { - createTag({ - dryRun: true, - tag: 'project-a-1.0.0', - commitHash: '123', - commitMessage: 'chore(release): 1.0.0', - projectName: 'p', - }).subscribe({ - complete: () => { - expect(cp.exec).not.toBeCalled(); - done(); - }, - }); - }); - - it('should handle tag already exists error', (done) => { - jest - .spyOn(cp, 'exec') - .mockReturnValue( - throwError( - () => new Error("fatal: tag 'project-a-1.0.0' already exists") - ) - ); - - createTag({ - dryRun: false, - tag: 'project-a-1.0.0', - commitHash: '123', - commitMessage: 'chore(release): 1.0.0', - projectName: 'p', - }).subscribe({ - next: expect.fail, - complete: () => expect.fail('should not complete'), - error: (error) => { - expect(cp.exec).toBeCalled(); - expect(error.message).toMatch( - 'Failed to tag "project-a-1.0.0", this tag already exists.' - ); - done(); - }, - }); - }); - }); -}); diff --git a/packages/semver/src/executors/version/utils/git.ts b/packages/semver/src/executors/version/utils/git.ts deleted file mode 100644 index aeddffb5f..000000000 --- a/packages/semver/src/executors/version/utils/git.ts +++ /dev/null @@ -1,191 +0,0 @@ -import * as gitRawCommits from 'git-raw-commits'; -import { EMPTY, Observable, throwError } from 'rxjs'; -import { catchError, last, map, scan, startWith } from 'rxjs/operators'; -import { exec } from '../../common/exec'; -import { logStep, _logStep } from './logger'; - -/** - * Return the list of commit bodies since `since` commit. - */ -export function getCommits({ - projectRoot, - since, -}: { - projectRoot: string; - since?: string; -}): Observable { - return getFormattedCommits({ - since, - projectRoot, - ignoreMergeCommits: true, - format: '%B', - }); -} -/** - * Return hash of last commit of a project - */ -export function getLastCommitHash({ - projectRoot, -}: { - projectRoot: string; -}): Observable { - return getFormattedCommits({ - projectRoot, - ignoreMergeCommits: false, - format: '%H', - }).pipe(map(([commit]) => commit.trim())); -} - -function getFormattedCommits({ - projectRoot, - format, - ignoreMergeCommits, - since = '', -}: { - projectRoot: string; - format: string; - ignoreMergeCommits: boolean; - since?: string; -}): Observable { - return new Observable((observer) => { - const params: any = { - from: since, - format, - path: projectRoot, - 'full-history': true, - }; - if (ignoreMergeCommits) { - params['no-merges'] = ignoreMergeCommits; - } - gitRawCommits(params) - .on('data', (data: string) => observer.next(data)) - .on('error', (error: Error) => observer.error(error)) - .on('close', () => observer.complete()) - .on('finish', () => observer.complete()); - }).pipe( - scan((commits, commit) => [...commits, commit.toString()], [] as string[]), - startWith([]), - last() - ); -} - -export function tryPush({ - remote, - branch, - noVerify, - projectName, - tag, -}: { - tag: string; - remote: string; - branch: string; - noVerify: boolean; - projectName: string; -}): Observable { - if (remote == null || branch == null) { - return throwError( - () => - new Error( - 'Missing option --remote or --branch, see: https://github.com/jscutlery/semver#configure.' - ) - ); - } - - const gitPushOptions = [...(noVerify ? ['--no-verify'] : [])]; - - return exec('git', [ - 'push', - ...gitPushOptions, - '--atomic', - remote, - branch, - tag, - ]) - .pipe( - catchError((error) => { - if (/atomic/.test(error)) { - _logStep({ - step: 'warning', - level: 'warn', - message: 'Git push --atomic failed, attempting non-atomic push.', - projectName, - }); - return exec('git', ['push', ...gitPushOptions, remote, branch, tag]); - } - - return throwError(() => error); - }) - ) - .pipe( - logStep({ - step: 'push_success', - message: `Pushed to "${remote}" "${branch}".`, - projectName, - }) - ); -} - -export function addToStage({ - paths, - dryRun, -}: { - paths: string[]; - dryRun: boolean; -}): Observable { - if (paths.length === 0) { - return EMPTY; - } - - const gitAddOptions = [...(dryRun ? ['--dry-run'] : []), ...paths]; - return exec('git', ['add', ...gitAddOptions]).pipe(map(() => undefined)); -} - -export function getFirstCommitRef(): Observable { - return exec('git', ['rev-list', '--max-parents=0', 'HEAD']).pipe( - map((output) => { - return output - .split('\n') - .map((c) => c.trim()) - .filter(Boolean) - .pop()!; - }) - ); -} - -export function createTag({ - dryRun, - tag, - commitHash, - commitMessage, - projectName, -}: { - dryRun: boolean; - tag: string; - commitHash: string; - commitMessage: string; - projectName: string; -}): Observable { - if (dryRun) { - return EMPTY; - } - return exec('git', ['tag', '-a', tag, commitHash, '-m', commitMessage]).pipe( - catchError((error) => { - if (/already exists/.test(error)) { - return throwError( - () => - new Error(`Failed to tag "${tag}", this tag already exists. - This error occurs because the same version was previously created but the tag does not point to a commit referenced in your base branch. - Please delete the tag by running "git tag -d ${tag}", make sure the tag has been removed from the remote repository as well and run this command again.`) - ); - } - - return throwError(() => error); - }), - map(() => tag), - logStep({ - step: 'tag_success', - message: `Tagged "${tag}".`, - projectName, - }) - ); -} diff --git a/packages/semver/src/executors/version/utils/init-conventional-commit-readable-stream.ts b/packages/semver/src/executors/version/utils/init-conventional-commit-readable-stream.ts deleted file mode 100644 index 28b8d4426..000000000 --- a/packages/semver/src/executors/version/utils/init-conventional-commit-readable-stream.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { WriteChangelogConfig } from '../schema'; -import * as conventionalChangelog from 'conventional-changelog'; - -export function initConventionalCommitReadableStream( - config: WriteChangelogConfig, - newVersion: string -) { - const context = { version: newVersion }; - return conventionalChangelog( - { - preset: config.preset, - tagPrefix: config.tagPrefix, - }, - context, - { merges: null, path: config.projectRoot } as conventionalChangelog.Options - ); -} diff --git a/packages/semver/src/executors/version/utils/logger.ts b/packages/semver/src/executors/version/utils/logger.ts deleted file mode 100644 index 0d45c571c..000000000 --- a/packages/semver/src/executors/version/utils/logger.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { logger } from '@nrwl/devkit'; -import * as chalk from 'chalk'; -import { tap, type MonoTypeOperatorFunction } from 'rxjs'; - -type Step = - | 'nothing_changed' - | 'failure' - | 'warning' - | 'calculate_version_success' - | 'package_json_success' - | 'changelog_success' - | 'tag_success' - | 'post_target_success' - | 'push_success' - | 'commit_success'; - -const iconMap = new Map([ - ['failure', '❌'], - ['warning', '🟠'], - ['nothing_changed', '🟢'], - ['calculate_version_success', '🆕'], - ['changelog_success', '📜'], - ['commit_success', '📦'], - ['package_json_success', '📝'], - ['post_target_success', '🎉'], - ['tag_success', '🔖'], - ['push_success', '🚀'], -]); - -/* istanbul ignore next */ -export function logStep({ - step, - message, - projectName, -}: { - step: Step; - message: string; - projectName: string; -}): MonoTypeOperatorFunction { - return (source) => - source.pipe(tap(() => _logStep({ step, message, projectName }))); -} - -/* istanbul ignore next */ -export function _logStep({ - step, - message, - projectName, - level = 'log', -}: { - step: Step; - message: string; - projectName: string; - level?: keyof typeof logger; -}): void { - const msg = `${chalk.bold(`[${projectName}]`)} ${iconMap.get( - step - )} ${message}`; - logger[level](msg); -} diff --git a/packages/semver/src/executors/version/utils/post-target.spec.ts b/packages/semver/src/executors/version/utils/post-target.spec.ts deleted file mode 100644 index bd79f1a0d..000000000 --- a/packages/semver/src/executors/version/utils/post-target.spec.ts +++ /dev/null @@ -1,299 +0,0 @@ -import { - readTargetOptions, - runExecutor, - TargetConfiguration, -} from '@nrwl/devkit'; -import { createFakeContext } from '../testing'; -import { runPostTargets } from './post-target'; - -jest.mock('@nrwl/devkit', () => ({ - runExecutor: jest.fn(), - readTargetOptions: jest.fn(), - parseTargetString: jest.requireActual('@nrwl/devkit').parseTargetString, - logger: { - log: jest.fn(), - }, -})); - -describe(runPostTargets.name, () => { - const mockRunExecutor = runExecutor as jest.Mock; - const mockReadTargetOptions = readTargetOptions as jest.Mock; - - let nextSpy: jest.Mock; - - const additionalProjects: { - project: string; - projectRoot: string; - targets?: Record; - }[] = [ - { - project: 'project-a', - projectRoot: 'libs/project-a', - targets: { - test: { - executor: 'test', - }, - }, - }, - { - project: 'project-b', - projectRoot: 'libs/project-b', - targets: { - test: { - executor: 'test', - }, - }, - }, - { - project: 'project-c', - projectRoot: 'libs/project-c', - targets: { - test: { - executor: 'test', - }, - }, - }, - ]; - - const context = createFakeContext({ - project: 'test', - projectRoot: 'libs/test', - workspaceRoot: '/root', - additionalProjects: additionalProjects, - }); - - beforeEach(() => { - nextSpy = jest.fn(); - mockRunExecutor.mockImplementation(function* () { - yield { success: true }; - }); - mockReadTargetOptions.mockReturnValue({}); - }); - - afterEach(() => { - jest.resetAllMocks(); - }); - - it('should successfully execute post targets', (done) => { - mockReadTargetOptions.mockReturnValue({ - optionA: 'optionA', - }); - - runPostTargets({ - projectName: 'p', - postTargets: ['project-a:test', 'project-b:test', 'project-c:test:prod'], - templateStringContext: {}, - context, - }).subscribe({ - next: nextSpy, - complete: () => { - expect(nextSpy).toBeCalledTimes(3); - expect(mockRunExecutor).toBeCalledTimes(3); - expect(mockRunExecutor.mock.calls[0][0]).toEqual( - expect.objectContaining({ - project: 'project-a', - target: 'test', - }) - ); - expect(mockRunExecutor.mock.calls[1][0]).toEqual( - expect.objectContaining({ - project: 'project-b', - target: 'test', - }) - ); - expect(mockRunExecutor.mock.calls[1][1]).toEqual( - expect.objectContaining({ - optionA: 'optionA', - }) - ); - expect(mockRunExecutor.mock.calls[2][0]).toEqual( - expect.objectContaining({ - project: 'project-c', - target: 'test', - configuration: 'prod', - }) - ); - done(); - }, - }); - }); - - it('should handle post target failure', (done) => { - mockRunExecutor.mockImplementationOnce(function* () { - yield { success: true }; - }); - mockRunExecutor.mockImplementationOnce(function* () { - yield new Error('Nop!'); - }); - - runPostTargets({ - projectName: 'p', - postTargets: ['project-a:test', 'project-b:test'], - templateStringContext: {}, - context, - }).subscribe({ - next: nextSpy, - error: (error) => { - expect(nextSpy).toBeCalledTimes(1); - expect(error.toString()).toEqual( - 'Error: Something went wrong with post-target "project-b:test".' - ); - expect(mockRunExecutor).toBeCalledTimes(2); - done(); - }, - }); - }); - - it('should handle empty post target', (done) => { - const errorSpy = jest.fn(); - - runPostTargets({ - projectName: 'p', - postTargets: [], - templateStringContext: {}, - context, - }).subscribe({ - next: nextSpy, - error: errorSpy, - complete: () => { - expect(nextSpy).not.toBeCalled(); - expect(errorSpy).not.toBeCalled(); - expect(mockRunExecutor).not.toBeCalled(); - done(); - }, - }); - }); - - it('should handle wrong post target project', (done) => { - runPostTargets({ - projectName: 'p', - /* The second project "project-foo" is not defined in the workspace. */ - postTargets: ['project-a:test', 'project-foo:test'], - templateStringContext: {}, - context, - }).subscribe({ - next: nextSpy, - error: (error) => { - expect(nextSpy).toBeCalledTimes(1); - expect(mockRunExecutor).toBeCalledTimes(1); - expect(error.toString()).toEqual( - 'Error: The target project "project-foo" does not exist in your workspace. Available projects: "test","project-a","project-b","project-c".' - ); - done(); - }, - }); - }); - - it('should handle wrong post target name', (done) => { - runPostTargets({ - projectName: 'p', - /* The second target "foo" is not defined in the workspace. */ - postTargets: ['project-a:test', 'project-b:foo'], - templateStringContext: {}, - context, - }).subscribe({ - next: nextSpy, - error: (error) => { - expect(nextSpy).toBeCalledTimes(1); - expect(mockRunExecutor).toBeCalledTimes(1); - expect(error.toString()).toEqual( - 'Error: The target name "foo" does not exist. Available targets for "project-b": "test".' - ); - done(); - }, - }); - }); - - it('should forward and resolve options', (done) => { - mockReadTargetOptions.mockReturnValueOnce({ - optionA: 'optionA', - version: '${version}', - dryRun: '${dryRun}', - numeric: '${num}', - falseyValue: '${falseyValue}', - }); - mockReadTargetOptions.mockReturnValueOnce({ - optionB: 'optionB', - version: 'project@${version}', - }); - mockReadTargetOptions.mockReturnValueOnce({ - notNested: '${num}', - nestedObject: { - version: '${version}', - }, - deepNestedObject: { - versions: { - versionA: '${version}-a', - versionB: '${version}-b', - }, - }, - arrayWithObjects: { - assetsArray: [ - { - name: 'first-asset-${version}.end', - path: 'path/to/first-asset-${version}.end', - }, - { - name: 'second-asset-${version}.end', - path: 'path/to/second-asset-${version}.end', - }, - ], - }, - arrayWithStrings: ['first-${version}', 'seconnd-${version}'], - }); - - const templateStringContext = { - version: '2.0.0', - dryRun: true, - num: 42, - falseyValue: false, - }; - - runPostTargets({ - projectName: 'p', - postTargets: ['project-a:test', 'project-b:test', 'project-c:test'], - templateStringContext, - context, - }).subscribe({ - complete: () => { - expect(mockRunExecutor.mock.calls[0][1]).toEqual({ - optionA: 'optionA', - version: '2.0.0', - dryRun: true, - numeric: 42, - falseyValue: false, - }); - expect(mockRunExecutor.mock.calls[1][1]).toEqual({ - optionB: 'optionB', - version: 'project@2.0.0', - }); - expect(mockRunExecutor.mock.calls[2][1]).toEqual({ - notNested: 42, - nestedObject: { - version: '2.0.0', - }, - deepNestedObject: { - versions: { - versionA: '2.0.0-a', - versionB: '2.0.0-b', - }, - }, - arrayWithObjects: { - assetsArray: [ - { - name: 'first-asset-2.0.0.end', - path: 'path/to/first-asset-2.0.0.end', - }, - { - name: 'second-asset-2.0.0.end', - path: 'path/to/second-asset-2.0.0.end', - }, - ], - }, - arrayWithStrings: ['first-2.0.0', 'seconnd-2.0.0'], - }); - done(); - }, - }); - }); -}); diff --git a/packages/semver/src/executors/version/utils/post-target.ts b/packages/semver/src/executors/version/utils/post-target.ts deleted file mode 100644 index bfc48c70c..000000000 --- a/packages/semver/src/executors/version/utils/post-target.ts +++ /dev/null @@ -1,131 +0,0 @@ -import type { ExecutorContext } from '@nrwl/devkit'; -import { - parseTargetString, - readTargetOptions, - runExecutor, - Target, -} from '@nrwl/devkit'; -import { catchError, concat, defer, Observable, throwError } from 'rxjs'; -import { logStep } from './logger'; -import { coerce, createTemplateString } from './template-string'; - -export function runPostTargets({ - postTargets, - templateStringContext, - context, - projectName, -}: { - postTargets: string[]; - templateStringContext: Record; - context: ExecutorContext; - projectName: string; -}): Observable { - return concat( - ...postTargets.map((postTargetSchema) => - defer(async () => { - const target = parseTargetString(postTargetSchema); - - _checkTargetExist(target, context); - - const targetOptions = _getTargetOptions({ - options: readTargetOptions(target, context), - context: templateStringContext, - }); - - for await (const { success } of await runExecutor( - target, - targetOptions, - context - )) { - if (!success) { - throw new Error( - `Something went wrong with post-target "${target.project}:${target.target}".` - ); - } - } - }).pipe( - logStep({ - step: 'post_target_success', - message: `Ran post-target "${postTargetSchema}".`, - projectName, - }), - catchError((error) => { - if (error?.name === 'SchemaError') { - return throwError(() => new Error(error.message)); - } - - return throwError(() => error); - }) - ) - ) - ); -} - -/* istanbul ignore next */ -export function _getTargetOptions({ - options = {}, - context, -}: { - options?: Record; - context: Record; -}): Record { - return Object.entries(options).reduce( - (optionsAccumulator, [option, value]) => { - const resolvedValue = Array.isArray(value) - ? value.map((_element) => - typeof _element !== 'object' - ? coerce( - createTemplateString( - (_element as number | string | boolean).toString(), - context - ) - ) - : _getTargetOptions({ options: _element, context }) - ) - : typeof value === 'object' - ? _getTargetOptions({ - options: value as Record, - context, - }) - : coerce( - createTemplateString( - (value as number | string | boolean).toString(), - context - ) - ); - - return { - ...optionsAccumulator, - [option]: resolvedValue, - }; - }, - {} - ); -} - -/* istanbul ignore next */ -export function _checkTargetExist(target: Target, context: ExecutorContext) { - const project = context.projectsConfigurations?.projects?.[target.project]; - - if (project === undefined) { - throw new Error( - `The target project "${ - target.project - }" does not exist in your workspace. Available projects: ${Object.keys( - context.projectsConfigurations?.projects ?? [] - ).map((project) => `"${project}"`)}.` - ); - } - - const projectTarget = project.targets?.[target.target]; - - if (projectTarget === undefined) { - throw new Error( - `The target name "${ - target.target - }" does not exist. Available targets for "${ - target.project - }": ${Object.keys(project.targets || {}).map((target) => `"${target}"`)}.` - ); - } -} diff --git a/packages/semver/src/executors/version/utils/project.spec.ts b/packages/semver/src/executors/version/utils/project.spec.ts deleted file mode 100644 index 34524b83e..000000000 --- a/packages/semver/src/executors/version/utils/project.spec.ts +++ /dev/null @@ -1,17 +0,0 @@ -import * as fs from 'fs'; -import { lastValueFrom } from 'rxjs'; - -import { readPackageJson } from './project'; - -const fsPromises = fs.promises; - -describe('readPackageJson', () => { - it('should read package.json', async () => { - jest.spyOn(fsPromises, 'readFile').mockResolvedValue(`{"version":"2.1.0"}`); - - const content = await lastValueFrom(readPackageJson('/root')); - expect(content).toEqual({ - version: '2.1.0', - }); - }); -}); diff --git a/packages/semver/src/executors/version/utils/project.ts b/packages/semver/src/executors/version/utils/project.ts deleted file mode 100644 index 12681ea4c..000000000 --- a/packages/semver/src/executors/version/utils/project.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { resolve } from 'path'; -import { map, of, switchMap, type Observable } from 'rxjs'; -import { readFileIfExists, readJsonFile, writeFile } from './filesystem'; -import { logStep } from './logger'; -import * as detectIndent from 'detect-indent'; - -export function readPackageJson(projectRoot: string): Observable<{ - version?: string; -}> { - return readJsonFile(getPackageJsonPath(projectRoot)); -} - -export function getPackageJsonPath(projectRoot: string) { - return resolve(projectRoot, 'package.json'); -} - -/** - * Safely update package.json file. - */ -export function updatePackageJson({ - newVersion, - projectRoot, - projectName, - dryRun, -}: { - newVersion: string; - projectRoot: string; - projectName: string; - dryRun: boolean; -}): Observable { - if (dryRun) { - return of(null); - } - - const path = getPackageJsonPath(projectRoot); - - return readFileIfExists(path).pipe( - switchMap((packageJson) => { - if (!packageJson.length) { - return of(null); - } - - const newPackageJson = _updatePackageVersion(packageJson, newVersion); - - return writeFile(path, newPackageJson).pipe( - logStep({ - step: 'package_json_success', - message: `Updated package.json version.`, - projectName, - }), - map(() => path) - ); - }) - ); -} - -function _updatePackageVersion(packageJson: string, version: string): string { - const data = JSON.parse(packageJson); - const { indent } = detectIndent(packageJson); - return _stringifyJson({ ...data, version }, indent); -} - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function _stringifyJson(data: any, indent: string | number): string { - // We need to add a newline at the end so that Prettier will not complain about the new file. - return JSON.stringify(data, null, indent).concat('\n'); -} diff --git a/packages/semver/src/executors/version/utils/tag.spec.ts b/packages/semver/src/executors/version/utils/tag.spec.ts deleted file mode 100644 index 4919327b8..000000000 --- a/packages/semver/src/executors/version/utils/tag.spec.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { formatTagPrefix } from './tag'; - -describe(formatTagPrefix.name, () => { - it('should resolve interpolated string', () => { - expect( - formatTagPrefix({ - versionTagPrefix: 'testtagPrefix', - projectName: 'testProjectName', - syncVersions: true, - }) - ).toBe('testtagPrefix'); - }); - - it('should resolve syncVersions', () => { - expect( - formatTagPrefix({ - versionTagPrefix: undefined, - projectName: 'testProjectName', - syncVersions: true, - }) - ).toBe('v'); - }); - - it('should resolve default tag', () => { - expect( - formatTagPrefix({ - versionTagPrefix: undefined, - projectName: 'testProjectName', - syncVersions: false, - }) - ).toBe('testProjectName-'); - }); -}); diff --git a/packages/semver/src/executors/version/utils/tag.ts b/packages/semver/src/executors/version/utils/tag.ts deleted file mode 100644 index c7e27eb26..000000000 --- a/packages/semver/src/executors/version/utils/tag.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { createTemplateString } from './template-string'; - -export function formatTagPrefix({ - versionTagPrefix, - projectName, - syncVersions, -}: { - versionTagPrefix: string | null | undefined; - projectName: string; - syncVersions: boolean; -}): string { - if (versionTagPrefix != null) { - return createTemplateString(versionTagPrefix, { - target: projectName, - projectName: projectName, - }); - } - - if (syncVersions) { - return 'v'; - } - - return `${projectName}-`; -} - -export function formatTag({ - tagPrefix, - version, -}: { - tagPrefix: string; - version: string; -}): string { - return `${tagPrefix}${version}`; -} diff --git a/packages/semver/src/executors/version/utils/template-string.spec.ts b/packages/semver/src/executors/version/utils/template-string.spec.ts deleted file mode 100644 index c54ebd4a5..000000000 --- a/packages/semver/src/executors/version/utils/template-string.spec.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { coerce, createTemplateString } from './template-string'; - -describe(createTemplateString.name, () => { - const testContext = { test1: 'xxx', test2: 'yyy' }; - - it('should resolve noting', () => { - expect( - createTemplateString( - 'test string that have test1 and ${nothing} in it', - testContext - ) - ).toBe('test string that have test1 and ${nothing} in it'); - }); - - it('should resolve ${test1} placeholders', () => { - expect( - createTemplateString( - 'test string with ${test1}, when ${test1} repeat itself', - testContext - ) - ).toBe('test string with xxx, when xxx repeat itself'); - }); - - it('should resolve ${test1} and ${test2} placeholders', () => { - expect( - createTemplateString( - 'test string with ${test1} and ${test2}', - testContext - ) - ).toBe('test string with xxx and yyy'); - }); - - it('should resolve boolean and numbers placeholders', () => { - expect( - createTemplateString('test string with ${num} and ${bool}', { - num: 42, - bool: true, - }) - ).toBe('test string with 42 and true'); - }); -}); - -describe(coerce.name, () => { - it('should resolve true boolean', () => { - expect(coerce(createTemplateString('${bool}', { bool: true }))).toBe(true); - }); - - it('should resolve false boolean', () => { - expect(coerce(createTemplateString('${bool}', { bool: false }))).toBe( - false - ); - }); - - it('should resolve number', () => { - expect(coerce(createTemplateString('${num}', { num: 42 }))).toBe(42); - }); - - it('should handle multiple keys', () => { - expect( - coerce(createTemplateString('${num}', { num: 42, bool: true })) - ).toBe(42); - }); - - it('should handle multiple interpolations', () => { - expect( - coerce(createTemplateString('${num} ${bool}', { num: 42, bool: true })) - ).toBe('42 true'); - }); -}); diff --git a/packages/semver/src/executors/version/utils/template-string.ts b/packages/semver/src/executors/version/utils/template-string.ts deleted file mode 100644 index 4d2438458..000000000 --- a/packages/semver/src/executors/version/utils/template-string.ts +++ /dev/null @@ -1,33 +0,0 @@ -export function createTemplateString( - template: string, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - context: Record -): string { - return Object.keys(context).reduce((accumulator, contextParamKey) => { - const interpolationRegex = new RegExp(`\\$\\{${contextParamKey}}`, 'g'); - return accumulator.replace( - interpolationRegex, - context[contextParamKey].toString() - ); - }, template); -} - -export function coerce(value: string): string | number | boolean { - if (_isBool(value)) { - return value === 'true'; - } - - if (_isNumeric(value)) { - return +value; - } - - return value; -} - -function _isNumeric(value: string): boolean { - return !isNaN(+value) && !isNaN(parseFloat(value)); -} - -function _isBool(value: string): boolean { - return value === 'true' || value === 'false'; -} diff --git a/packages/semver/src/executors/version/utils/try-bump.spec.ts b/packages/semver/src/executors/version/utils/try-bump.spec.ts deleted file mode 100644 index 161c35b4a..000000000 --- a/packages/semver/src/executors/version/utils/try-bump.spec.ts +++ /dev/null @@ -1,484 +0,0 @@ -import { logger } from '@nrwl/devkit'; -import * as conventionalRecommendedBump from 'conventional-recommended-bump'; -import * as gitSemverTags from 'git-semver-tags'; -import { lastValueFrom, of, throwError } from 'rxjs'; -import { callbackify } from 'util'; -import { getLastVersion } from './get-last-version'; -import { getCommits, getFirstCommitRef } from './git'; -import { tryBump } from './try-bump'; - -jest.mock('conventional-recommended-bump'); -jest.mock('./get-last-version'); -jest.mock('./git'); -jest.mock('git-semver-tags', () => jest.fn()); - -describe('tryBump', () => { - const mockConventionalRecommendedBump = - conventionalRecommendedBump as jest.MockedFunction< - typeof conventionalRecommendedBump - >; - const mockGetLastVersion = getLastVersion as jest.MockedFunction< - typeof getLastVersion - >; - const mockGetCommits = getCommits as jest.MockedFunction; - const mockGetFirstCommitRef = getFirstCommitRef as jest.MockedFunction< - typeof getFirstCommitRef - >; - let mockGitSemverTags: jest.Mock; - - let loggerSpy: jest.SpyInstance; - - beforeEach(() => { - mockGitSemverTags = jest.fn(); - (gitSemverTags as jest.Mock).mockImplementation( - callbackify(mockGitSemverTags) - ); - mockGetLastVersion.mockReturnValue(of('2.1.0')); - loggerSpy = jest.spyOn(logger, 'warn'); - }); - - afterEach(() => { - jest.resetAllMocks(); - }); - - it('should compute next version based on last version and changes', async () => { - mockGetCommits.mockReturnValue(of(['feat: A', 'feat: B'])); - /* Mock bump to return "minor". */ - mockConventionalRecommendedBump.mockImplementation( - callbackify( - jest.fn().mockResolvedValue({ - releaseType: 'minor', - }) - ) as () => void - ); - - const newVersion = await lastValueFrom( - tryBump({ - syncVersions: false, - preset: 'angular', - projectRoot: '/libs/demo', - tagPrefix: 'v', - releaseType: undefined, - preid: undefined, - skipCommitTypes: [], - - projectName: '', - }) - ); - - expect(newVersion?.version).toEqual('2.2.0'); - expect(newVersion?.previousVersion).toEqual('2.1.0'); - expect(mockGetCommits).toBeCalledTimes(1); - expect(mockGetCommits).toBeCalledWith({ - projectRoot: '/libs/demo', - since: 'v2.1.0', - }); - - expect(mockConventionalRecommendedBump).toBeCalledTimes(1); - expect(mockConventionalRecommendedBump).toBeCalledWith( - { - path: '/libs/demo', - preset: 'angular', - tagPrefix: 'v', - }, - expect.any(Function) - ); - }); - - it('should compute the next version based on last version, changes, and dependencies', async () => { - mockGetCommits - .mockReturnValueOnce(of(['chore: A', 'chore: B'])) - .mockReturnValueOnce(of(['chore: A', 'chore: B'])) - .mockReturnValueOnce(of(['fix: A', 'feat: B'])); - - /* Mock bump to return "minor". */ - mockConventionalRecommendedBump.mockImplementation( - callbackify( - jest - .fn() - .mockResolvedValueOnce({ - releaseType: undefined, - }) - .mockResolvedValueOnce({ - releaseType: undefined, - }) - .mockResolvedValueOnce({ - releaseType: 'minor', - }) - ) as () => void - ); - - const newVersion = await lastValueFrom( - tryBump({ - preset: 'angular', - projectRoot: '/libs/demo', - dependencyRoots: [ - { name: 'dep1', path: '/libs/dep1' }, - { name: 'dep2', path: '/libs/dep2' }, - ], - tagPrefix: 'v', - syncVersions: true, - skipCommitTypes: [], - - projectName: '', - }) - ); - - expect(newVersion?.version).toEqual('2.1.1'); - - expect(mockGetCommits).toBeCalledTimes(3); - expect(mockGetCommits).toBeCalledWith({ - projectRoot: '/libs/demo', - - since: 'v2.1.0', - }); - expect(mockGetCommits).toBeCalledWith({ - projectRoot: '/libs/dep1', - since: 'v2.1.0', - }); - expect(mockGetCommits).toBeCalledWith({ - projectRoot: '/libs/dep2', - since: 'v2.1.0', - }); - - expect(mockConventionalRecommendedBump).toBeCalledTimes(1); - expect(mockConventionalRecommendedBump).toBeCalledWith( - { - path: '/libs/demo', - preset: 'angular', - tagPrefix: 'v', - }, - expect.any(Function) - ); - }); - - it('should use given type to calculate next version', async () => { - mockGetCommits.mockReturnValue(of(['feat: A', 'feat: B'])); - - const newVersion = await lastValueFrom( - tryBump({ - syncVersions: false, - preset: 'angular', - projectRoot: '/libs/demo', - tagPrefix: 'v', - releaseType: 'premajor', - skipCommitTypes: [], - preid: 'alpha', - - projectName: '', - }) - ); - - expect(newVersion?.version).toEqual('3.0.0-alpha.0'); - - expect(mockConventionalRecommendedBump).not.toBeCalled(); - - expect(mockGetCommits).toBeCalledTimes(1); - expect(mockGetCommits).toBeCalledWith({ - projectRoot: '/libs/demo', - since: 'v2.1.0', - }); - }); - - it('should use prerelease to calculate next major release version', async () => { - mockGitSemverTags.mockResolvedValue([ - 'my-lib-3.0.0-beta.0', - 'my-lib-2.1.0', - 'my-lib-2.0.0', - 'my-lib-1.0.0', - ]); - mockGetCommits.mockReturnValue(of(['feat: A', 'feat: B'])); - - const newVersion = await lastValueFrom( - tryBump({ - syncVersions: false, - preset: 'angular', - projectRoot: '/libs/demo', - tagPrefix: 'v', - releaseType: 'major', - skipCommitTypes: [], - projectName: '', - }) - ); - - expect(newVersion).toEqual({ - version: '3.0.0', - previousVersion: '2.1.0', - dependencyUpdates: [], - }); - expect(mockConventionalRecommendedBump).not.toBeCalled(); - expect(mockGetCommits).toBeCalledTimes(1); - expect(mockGetCommits).toBeCalledWith({ - projectRoot: '/libs/demo', - since: 'v2.1.0', - }); - }); - - it('should use prerelease to calculate next patch release version', async () => { - mockGitSemverTags.mockResolvedValue([ - 'my-lib-2.1.1-beta.0', - 'my-lib-2.1.0', - 'my-lib-2.0.0', - 'my-lib-1.0.0', - ]); - mockGetCommits.mockReturnValue(of(['feat: A', 'feat: B'])); - - const newVersion = await lastValueFrom( - tryBump({ - syncVersions: false, - preset: 'angular', - projectRoot: '/libs/demo', - tagPrefix: 'v', - releaseType: 'patch', - projectName: '', - skipCommitTypes: [], - }) - ); - - expect(newVersion).toEqual({ - version: '2.1.1', - previousVersion: '2.1.0', - dependencyUpdates: [], - }); - expect(mockConventionalRecommendedBump).not.toBeCalled(); - expect(mockGetCommits).toBeCalledTimes(1); - expect(mockGetCommits).toBeCalledWith({ - projectRoot: '/libs/demo', - since: 'v2.1.0', - }); - }); - - it('should use prerelease to calculate next minor release version', async () => { - mockGitSemverTags.mockResolvedValue([ - 'my-lib-2.2.0-beta.0', - 'my-lib-2.1.0', - 'my-lib-2.0.0', - 'my-lib-1.0.0', - ]); - mockGetCommits.mockReturnValue(of(['feat: A', 'feat: B'])); - - const newVersion = await lastValueFrom( - tryBump({ - syncVersions: false, - preset: 'angular', - projectRoot: '/libs/demo', - tagPrefix: 'v', - releaseType: 'minor', - projectName: '', - - skipCommitTypes: [], - }) - ); - - expect(newVersion).toEqual({ - version: '2.2.0', - previousVersion: '2.1.0', - dependencyUpdates: [], - }); - expect(mockConventionalRecommendedBump).not.toBeCalled(); - expect(mockGetCommits).toBeCalledTimes(1); - expect(mockGetCommits).toBeCalledWith({ - projectRoot: '/libs/demo', - since: 'v2.1.0', - }); - }); - - it('should use given type to calculate next version even if there are no changes', async () => { - mockGetCommits.mockReturnValue(of([])); - - const newVersion = await lastValueFrom( - tryBump({ - syncVersions: false, - preset: 'angular', - projectRoot: '/libs/demo', - tagPrefix: 'v', - releaseType: 'patch', - projectName: '', - - skipCommitTypes: [], - }) - ); - - expect(newVersion?.version).toEqual('2.1.1'); - expect(newVersion?.previousVersion).toEqual('2.1.0'); - expect(mockConventionalRecommendedBump).not.toBeCalled(); - }); - - it('should call getFirstCommitRef if version is 0.0.0', async () => { - mockGetLastVersion.mockReturnValue(throwError(() => 'No version found')); - mockGetCommits.mockReturnValue(of([])); - mockGetFirstCommitRef.mockReturnValue(of('sha1')); - mockConventionalRecommendedBump.mockImplementation( - callbackify( - jest.fn().mockResolvedValue({ - releaseType: undefined, - }) - ) as () => void - ); - - await lastValueFrom( - tryBump({ - syncVersions: false, - preset: 'angular', - projectRoot: '/libs/demo', - tagPrefix: 'v', - projectName: '', - - skipCommitTypes: [], - }) - ); - - expect(loggerSpy).toBeCalledWith( - expect.stringContaining('No previous version tag found') - ); - expect(mockGetCommits).toBeCalledTimes(1); - expect(mockGetCommits).toBeCalledWith({ - projectRoot: '/libs/demo', - since: 'sha1', - }); - }); - - it('should return undefined if there are no changes in current path', async () => { - mockGetCommits.mockReturnValue(of([])); - mockConventionalRecommendedBump.mockImplementation( - callbackify( - jest.fn().mockResolvedValue({ - releaseType: 'patch', - }) - ) as () => void - ); - - const newVersion = await lastValueFrom( - tryBump({ - syncVersions: false, - preset: 'angular', - projectRoot: '/libs/demo', - tagPrefix: 'v', - projectName: '', - - skipCommitTypes: [], - }) - ); - - expect(newVersion).toBeNull(); - expect(mockGetCommits).toBeCalledWith({ - projectRoot: '/libs/demo', - since: 'v2.1.0', - }); - }); - - it('should try to do a bump even if there are no changes in current path when allowEmptyRelease is true', async () => { - mockGetCommits.mockReturnValue(of([])); - mockConventionalRecommendedBump.mockImplementation( - callbackify( - jest.fn().mockResolvedValue({ - releaseType: 'patch', - }) - ) as () => void - ); - - const newVersion = await lastValueFrom( - tryBump({ - syncVersions: false, - preset: 'angular', - projectRoot: '/libs/demo', - tagPrefix: 'v', - allowEmptyRelease: true, - projectName: '', - - skipCommitTypes: [], - }) - ); - - expect(newVersion?.version).toEqual('2.1.1'); - expect(mockGetCommits).toBeCalledWith({ - projectRoot: '/libs/demo', - since: 'v2.1.0', - }); - }); - - describe('skipCommitTypes is set', () => { - it('should return undefined if all commits types match skipCommitTypes', async () => { - mockGetCommits.mockReturnValue(of(['docs: A ', 'refactor: B '])); - mockConventionalRecommendedBump.mockImplementation( - callbackify( - jest.fn().mockResolvedValue({ - releaseType: 'patch', - }) - ) as () => void - ); - - const newVersion = await lastValueFrom( - tryBump({ - syncVersions: false, - preset: 'angular', - skipCommitTypes: ['docs', 'refactor'], - projectRoot: '/libs/demo', - tagPrefix: 'v', - - projectName: '', - }) - ); - - expect(newVersion).toBeNull(); - }); - it('should return correct version if NOT commits types match skipCommitTypes', async () => { - mockGetCommits.mockReturnValue(of(['feat: A', 'docs: B'])); - mockConventionalRecommendedBump.mockImplementation( - callbackify( - jest.fn().mockResolvedValue({ - releaseType: 'patch', - }) - ) as () => void - ); - - const newVersion = await lastValueFrom( - tryBump({ - syncVersions: false, - preset: 'angular', - skipCommitTypes: ['docs', 'refactor'], - projectRoot: '/libs/demo', - tagPrefix: 'v', - - projectName: '', - }) - ); - - expect(newVersion?.version).toEqual('2.1.1'); - }); - - it('should return undefined if all dependency commits types match skipCommitTypes', async () => { - mockGetCommits - .mockReturnValueOnce(of([])) - .mockReturnValueOnce(of(['docs: A', 'refactor(scope): B'])); - - mockConventionalRecommendedBump.mockImplementation( - callbackify( - jest - .fn() - .mockResolvedValueOnce({ - releaseType: undefined, - }) - .mockResolvedValueOnce({ - releaseType: undefined, - }) - ) as () => void - ); - - const newVersion = await lastValueFrom( - tryBump({ - preset: 'angular', - projectRoot: '/libs/demo', - dependencyRoots: [{ name: 'dep1', path: '/libs/dep1' }], - tagPrefix: 'v', - skipCommitTypes: ['docs', 'refactor'], - - syncVersions: true, - projectName: '', - }) - ); - - expect(newVersion).toBeNull(); - }); - }); -}); diff --git a/packages/semver/src/executors/version/utils/try-bump.ts b/packages/semver/src/executors/version/utils/try-bump.ts deleted file mode 100644 index b6e3b9e0a..000000000 --- a/packages/semver/src/executors/version/utils/try-bump.ts +++ /dev/null @@ -1,372 +0,0 @@ -import * as conventionalCommitsParser from 'conventional-commits-parser'; -import * as conventionalRecommendedBump from 'conventional-recommended-bump'; -import { defer, forkJoin, iif, of, type Observable } from 'rxjs'; -import { - catchError, - defaultIfEmpty, - map, - shareReplay, - switchMap, -} from 'rxjs/operators'; -import * as semver from 'semver'; -import { promisify } from 'util'; -import { type ReleaseIdentifier } from '../schema'; -import { type Version } from '../version'; -import { getLastVersion } from './get-last-version'; -import { type DependencyRoot } from './get-project-dependencies'; -import { getCommits, getFirstCommitRef } from './git'; -import { _logStep } from './logger'; -import { formatTag, formatTagPrefix } from './tag'; - -export interface NewVersion { - version: string; - previousVersion: string; - dependencyUpdates: Version[]; -} - -const initialVersion = '0.0.0'; - -export function getProjectVersion({ - tagPrefix, - projectRoot, - releaseType, - since, - projectName, - preid, -}: { - tagPrefix: string; - projectRoot: string; - releaseType?: ReleaseIdentifier; - since?: string; - projectName: string; - preid?: string; -}) { - const lastVersion$ = getLastVersion({ - tagPrefix, - preid, - includePrerelease: releaseType === 'prerelease', - }).pipe( - catchError(() => { - _logStep({ - step: 'warning', - level: 'warn', - message: `No previous version tag found, fallback to version 0.0.0. - New version will be calculated based on all changes since first commit. - If your project is already versioned, please tag the latest release commit with ${tagPrefix}x.y.z and run this command again.`, - projectName, - }); - return of(initialVersion); - }), - shareReplay({ - refCount: true, - bufferSize: 1, - }) - ); - - const lastVersionGitRef$ = lastVersion$.pipe( - /** If lastVersion equals 0.0.0 it means no tag exist, - * then get the first commit ref to compute the initial version. */ - switchMap((lastVersion) => - iif( - () => _isInitialVersion({ lastVersion }), - getFirstCommitRef(), - of(formatTag({ tagPrefix, version: lastVersion })) - ) - ) - ); - - const commits$ = lastVersionGitRef$.pipe( - switchMap((lastVersionGitRef) => { - return getCommits({ - projectRoot, - since: since ?? lastVersionGitRef, - }); - }) - ); - - return { - lastVersion$, - commits$, - lastVersionGitRef$, - }; -} - -/** - * Return new version or null if nothing changed. - */ -export function tryBump({ - preset, - projectRoot, - tagPrefix, - dependencyRoots = [], - releaseType, - preid, - versionTagPrefix, - syncVersions, - allowEmptyRelease, - skipCommitTypes, - projectName, -}: { - preset: string; - projectRoot: string; - tagPrefix: string; - dependencyRoots?: DependencyRoot[]; - releaseType?: ReleaseIdentifier; - preid?: string; - versionTagPrefix?: string | null; - syncVersions: boolean; - allowEmptyRelease?: boolean; - skipCommitTypes: string[]; - projectName: string; -}): Observable { - const { lastVersion$, commits$, lastVersionGitRef$ } = getProjectVersion({ - tagPrefix, - projectRoot, - releaseType, - projectName, - preid, - }); - - return forkJoin([lastVersion$, commits$, lastVersionGitRef$]).pipe( - switchMap(([lastVersion, commits, lastVersionGitRef]) => { - /* If release type is manually specified, - * we just release even if there are no changes. */ - if (releaseType !== undefined) { - return _manualBump({ - since: lastVersion, - releaseType: releaseType as string, - preid: preid as string, - }).pipe( - map((version) => - version - ? ({ - version, - previousVersion: lastVersion, - dependencyUpdates: [], - } satisfies NewVersion) - : null - ) - ); - } - - const dependencyVersions$ = _getDependencyVersions({ - lastVersionGitRef, - dependencyRoots, - preset, - releaseType, - versionTagPrefix, - skipCommitTypes, - syncVersions, - projectName, - preid, - }); - - const projectBump$ = _semverBump({ - since: lastVersion, - preset, - projectRoot, - tagPrefix, - }).pipe(map((version) => ({ type: 'project', version }))); - - return forkJoin([projectBump$, dependencyVersions$]).pipe( - switchMap(([projectVersion, dependencyVersions]) => { - const dependencyUpdates = dependencyVersions.filter(_isNewVersion); - const newVersion: NewVersion = { - version: projectVersion.version || lastVersion, - previousVersion: lastVersion, - dependencyUpdates, - }; - - /* bump patch version if dependency updates are available */ - if (projectVersion.version === null && dependencyUpdates.length) { - return _manualBump({ - since: lastVersion, - releaseType: 'patch', - preid: preid as string, - }).pipe( - map((version) => - version - ? ({ - ...newVersion, - version: version || lastVersion, - previousVersion: lastVersion, - } satisfies NewVersion) - : null - ) - ); - } - - const filteredCommits = commits.filter((commit: string) => - shouldCommitBeCalculated({ commit, skipCommitTypes }) - ); - - /* No commits since last release & no dependency updates so don't bump if the `releastAtLeast` flag is not present. */ - if ( - !dependencyUpdates.length && - !filteredCommits.length && - !allowEmptyRelease - ) { - return of(null); - } - - return of(newVersion); - }) - ); - }) - ); -} - -export function _semverBump({ - since, - preset, - projectRoot, - tagPrefix, -}: { - since: string; - preset: string; - projectRoot: string; - tagPrefix: string; -}) { - return defer(async () => { - const recommended = (await promisify(conventionalRecommendedBump)({ - path: projectRoot, - preset, - tagPrefix, - })) as { releaseType: semver.ReleaseType }; - const { releaseType } = recommended; - - return semver.inc(since, releaseType); - }); -} - -export function _manualBump({ - since, - releaseType, - preid, -}: { - since: string; - releaseType: string; - preid: string; -}) { - return defer(() => { - const hasPreid = - ['premajor', 'preminor', 'prepatch', 'prerelease'].includes( - releaseType - ) && preid !== null; - - const semverArgs: [string, semver.ReleaseType, ...string[]] = [ - since, - releaseType as semver.ReleaseType, - ...(hasPreid ? [preid] : []), - ]; - - return of(semver.inc(...semverArgs)); - }); -} - -function shouldCommitBeCalculated({ - commit, - skipCommitTypes, -}: { - commit: string; - skipCommitTypes: string[]; -}): boolean { - const { type } = conventionalCommitsParser.sync(commit, {}); - const shouldSkip = skipCommitTypes.some((typeToSkip) => typeToSkip === type); - return !shouldSkip; -} - -export function _getDependencyVersions({ - preset, - dependencyRoots, - releaseType, - versionTagPrefix, - syncVersions, - lastVersionGitRef, - skipCommitTypes, - projectName, - preid, -}: { - preset: string; - lastVersionGitRef: string; - dependencyRoots: DependencyRoot[]; - releaseType?: ReleaseIdentifier; - skipCommitTypes: string[]; - versionTagPrefix?: string | null; - syncVersions: boolean; - projectName: string; - preid?: string; -}): Observable { - return forkJoin( - dependencyRoots.map(({ path: projectRoot, name: dependencyName }) => { - /* Get dependency version changes since last project version */ - const tagPrefix = formatTagPrefix({ - versionTagPrefix, - projectName: dependencyName, - syncVersions, - }); - - const { lastVersion$, commits$ } = getProjectVersion({ - tagPrefix, - projectRoot, - releaseType, - since: lastVersionGitRef, - projectName, - preid, - }); - - return forkJoin([lastVersion$, commits$]).pipe( - switchMap(([dependencyLastVersion, commits]) => { - const filteredCommits = commits.filter((commit) => - shouldCommitBeCalculated({ commit, skipCommitTypes }) - ); - if (filteredCommits.length === 0) { - return of({ - type: 'dependency', - version: null, - dependencyName: dependencyName, - } satisfies Version); - } - - /* Dependency has changes but has no tagged version */ - if (_isInitialVersion({ lastVersion: dependencyLastVersion })) { - return _semverBump({ - since: dependencyLastVersion, - preset, - projectRoot, - tagPrefix, - }).pipe( - map( - (version) => - ({ - type: 'dependency', - version, - dependencyName: dependencyName, - } satisfies Version) - ) - ); - } - - /* Return the changed version of dependency since last commit within project */ - return of({ - type: 'dependency', - version: dependencyLastVersion, - dependencyName: dependencyName, - } satisfies Version); - }) - ); - }) - ).pipe(defaultIfEmpty([])); -} - -export function _isNewVersion(version: Version): boolean { - return version.version !== null && version.version !== initialVersion; -} - -export function _isInitialVersion({ - lastVersion, -}: { - lastVersion: string; -}): boolean { - return lastVersion === initialVersion; -} diff --git a/packages/semver/src/executors/version/utils/workspace.ts b/packages/semver/src/executors/version/utils/workspace.ts deleted file mode 100644 index 12f5a8d67..000000000 --- a/packages/semver/src/executors/version/utils/workspace.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { - ExecutorContext, - ProjectConfiguration, - ProjectsConfigurations, -} from '@nrwl/devkit'; -import { resolve } from 'path'; - -/* istanbul ignore next */ -export function getProject(context: ExecutorContext): ProjectConfiguration { - const project = - context.projectsConfigurations?.projects[context.projectName as string]; - - if (!project) { - throw new Error(`Project root not found for ${context.projectName}`); - } - - return project; -} - -/* istanbul ignore next */ -export function getProjectRoots( - workspaceRoot: string, - workspace: ProjectsConfigurations | undefined -): string[] { - const projects = Object.values(workspace?.projects ?? {}); - - if (projects.length === 0) { - throw new Error('No projects found in workspace'); - } - - return projects.map((project) => - typeof project === 'string' - ? resolve(workspaceRoot, project) - : resolve(workspaceRoot, project.root) - ); -} diff --git a/packages/semver/src/executors/version/utils/write-changelog.spec.ts b/packages/semver/src/executors/version/utils/write-changelog.spec.ts deleted file mode 100644 index 5cb848921..000000000 --- a/packages/semver/src/executors/version/utils/write-changelog.spec.ts +++ /dev/null @@ -1,91 +0,0 @@ -import * as Stream from 'stream'; -import * as fs from 'fs'; - -import { initConventionalCommitReadableStream } from './init-conventional-commit-readable-stream'; -import writeChangelog from './write-changelog'; - -jest.mock('./utils/init-conventional-commit-readable-stream'); -const mockInitConventionalCommitReadableStream = - initConventionalCommitReadableStream as jest.MockedFunction< - typeof initConventionalCommitReadableStream - >; - -const config = { - changelogHeader: '# Changelog', - projectRoot: './', - preset: 'angular', - dryRun: false, - changelogPath: 'CHANGELOG.md', - tagPrefix: 'button', -}; - -describe('writeChangelog', () => { - beforeAll(() => { - jest.spyOn(console, 'warn').mockImplementation(); - jest.spyOn(console, 'info').mockImplementation(); - jest.spyOn(fs, 'writeFileSync').mockImplementation(); - }); - afterAll(() => { - (console.warn as jest.Mock).mockRestore(); - (console.info as jest.Mock).mockRestore(); - (fs.writeFileSync as jest.Mock).mockRestore(); - mockInitConventionalCommitReadableStream.mockRestore(); - }); - - describe('handle buildConventionalChangelog error', () => { - beforeAll(async () => { - mockInitConventionalCommitReadableStream.mockReturnValue( - new Stream.Readable({ - read() { - this.emit('error', '💥'); - }, - }) - ); - await writeChangelog(config, '0.0.1'); - }); - - afterAll(() => { - (console.warn as jest.Mock).mockClear(); - (console.info as jest.Mock).mockClear(); - }); - - it('should print a console.warn', async () => { - expect(console.warn).toHaveBeenCalledWith( - 'changelog creation failed', - '💥' - ); - }); - it('should not write a changelog file', async () => { - expect(fs.writeFileSync).not.toHaveBeenCalled(); - }); - }); - describe('--dryRun', () => { - const version = '0.0.1-rc1'; - - beforeAll(async () => { - mockInitConventionalCommitReadableStream.mockImplementation( - jest.requireActual('./utils/init-conventional-commit-readable-stream') - .initConventionalCommitReadableStream - ); - - await writeChangelog({ ...config, dryRun: true }, version); - }); - - afterAll(() => { - (console.warn as jest.Mock).mockClear(); - (console.info as jest.Mock).mockClear(); - }); - - it('should not write a changelog file', async () => { - expect(fs.writeFileSync).not.toHaveBeenCalled(); - }); - it('should print a console.info with the changelog contents without the header', async () => { - expect(console.info).toHaveBeenCalledWith( - expect.stringContaining(`## ${version}`) - ); - expect(console.info).toHaveBeenCalledWith( - expect.not.stringContaining(config.changelogHeader) - ); - }); - }); -}); diff --git a/packages/semver/src/executors/version/utils/write-changelog.ts b/packages/semver/src/executors/version/utils/write-changelog.ts deleted file mode 100644 index 1e3cb53a2..000000000 --- a/packages/semver/src/executors/version/utils/write-changelog.ts +++ /dev/null @@ -1,79 +0,0 @@ -import * as chalk from 'chalk'; -import { accessSync, constants, readFileSync, writeFileSync } from 'fs'; -import { WriteChangelogConfig } from '../schema'; -import { initConventionalCommitReadableStream } from './init-conventional-commit-readable-stream'; - -const START_OF_LAST_RELEASE_PATTERN = - /(^#+ \[?[0-9]+\.[0-9]+\.[0-9]+| { - if (config.dryRun) { - return console.info(`\n---\n${chalk.gray(newContent.trim())}\n---\n`); - } - - try { - accessSync(config.changelogPath, constants.F_OK); - } catch ({ code }) { - if (code === 'ENOENT') { - writeFileSync(config.changelogPath, '\n', 'utf8'); - } - } - - return writeFileSync( - config.changelogPath, - config.changelogHeader + - '\n' + - (newContent + buildExistingContent(config)).replace(/\n+$/, '\n'), - 'utf8' - ); - }) - .catch((err) => { - console.warn('changelog creation failed', err); - return err; - }); -} - -function buildExistingContent(config: WriteChangelogConfig) { - const existingContent = readFileSync(config.changelogPath, 'utf-8'); - const existingContentStart = existingContent.search( - START_OF_LAST_RELEASE_PATTERN - ); - // find the position of the last release and remove header: - if (existingContentStart !== -1) { - return existingContent.substring(existingContentStart); - } - - return existingContent; -} - -function buildConventionalChangelog( - config: WriteChangelogConfig, - newVersion: string -): Promise { - return new Promise((resolve, reject) => { - let changelog = ''; - const changelogStream = initConventionalCommitReadableStream( - config, - newVersion - ); - - changelogStream.on('error', function (err) { - reject(err); - }); - - changelogStream.on('data', function (buffer: ArrayBuffer) { - changelog += buffer.toString(); - }); - - changelogStream.on('end', function () { - resolve(changelog); - }); - - return; - }); -} diff --git a/packages/semver/src/executors/version/version.ts b/packages/semver/src/executors/version/version.ts deleted file mode 100644 index f21e45e17..000000000 --- a/packages/semver/src/executors/version/version.ts +++ /dev/null @@ -1,244 +0,0 @@ -import { ProjectsConfigurations } from '@nrwl/devkit'; -import { forkJoin, Observable, of } from 'rxjs'; -import { concatMap, map } from 'rxjs/operators'; -import { Preset } from './schema'; -import { - insertChangelogDependencyUpdates, - updateChangelog, -} from './utils/changelog'; -import { commit } from './utils/commit'; -import { addToStage, createTag, getLastCommitHash } from './utils/git'; -import { logStep } from './utils/logger'; -import { updatePackageJson } from './utils/project'; -import { getProjectRoots } from './utils/workspace'; - -export type Version = - | { - type: 'project'; - version: string | null; - } - | { - type: 'dependency'; - version: string | null; - dependencyName: string; - }; - -export interface CommonVersionOptions { - tag: string; - dryRun: boolean; - trackDeps: boolean; - newVersion: string; - noVerify: boolean; - workspaceRoot: string; - tagPrefix: string; - changelogHeader: string; - skipCommit: boolean; - commitMessage: string; - projectName: string; - skipProjectChangelog: boolean; - dependencyUpdates: Version[]; - preset: Preset; - workspace: ProjectsConfigurations | undefined; -} - -export function versionWorkspace({ - skipRootChangelog, - commitMessage, - newVersion, - dryRun, - noVerify, - projectName, - tag, - skipCommit, - projectRoot, - ...options -}: { - skipRootChangelog: boolean; - projectRoot: string; -} & CommonVersionOptions) { - const projectRoots = getProjectRoots( - options.workspaceRoot, - options.workspace - ); - return forkJoin([ - _generateChangelogs({ - projectRoots, - skipRootChangelog, - commitMessage, - newVersion, - dryRun, - noVerify, - projectName, - skipCommit, - tag, - ...options, - }), - - forkJoin( - projectRoots.map((projectRoot) => - updatePackageJson({ - projectRoot, - newVersion, - projectName, - dryRun, - }) - ) - ).pipe(map((paths) => paths.filter(isNotNull))), - ]).pipe( - map((paths) => paths.flat()), - concatMap((paths) => - addToStage({ - paths, - dryRun, - }) - ), - concatMap(() => - commit({ - skipCommit, - dryRun, - noVerify, - commitMessage, - projectName, - }) - ), - concatMap(() => getLastCommitHash({ projectRoot })), - concatMap((commitHash) => - createTag({ - dryRun, - tag, - commitHash, - commitMessage, - projectName, - }) - ) - ); -} - -export function versionProject({ - workspaceRoot, - projectRoot, - newVersion, - dryRun, - commitMessage, - noVerify, - tagPrefix, - projectName, - skipCommit, - tag, - ...options -}: { - projectRoot: string; -} & CommonVersionOptions) { - return _generateChangelogs({ - projectName, - projectRoots: [projectRoot], - skipRootChangelog: true, - workspaceRoot, - newVersion, - commitMessage, - dryRun, - skipCommit, - noVerify, - tagPrefix, - tag, - ...options, - }).pipe( - concatMap((changelogPaths) => - /* If --skipProjectChangelog is passed `changelogPaths` has length 0, otherwise it has 1 single entry. */ - changelogPaths.length === 1 - ? insertChangelogDependencyUpdates({ - changelogPath: changelogPaths[0], - version: newVersion, - dryRun, - dependencyUpdates: options.dependencyUpdates, - }).pipe( - concatMap((changelogPath) => - addToStage({ paths: [changelogPath], dryRun }) - ) - ) - : of(undefined) - ), - concatMap(() => - updatePackageJson({ - newVersion, - projectRoot, - projectName, - dryRun, - }).pipe( - concatMap((packageFile) => - packageFile !== null - ? addToStage({ - paths: [packageFile], - dryRun, - }) - : of(undefined) - ) - ) - ), - concatMap(() => - commit({ - skipCommit, - dryRun, - noVerify, - commitMessage, - projectName, - }) - ), - concatMap(() => getLastCommitHash({ projectRoot })), - concatMap((commitHash) => - createTag({ - dryRun, - tag, - commitHash, - commitMessage, - projectName, - }) - ) - ); -} - -/** - * istanbul ignore next - */ -export function _generateChangelogs({ - projectRoots, - workspaceRoot, - skipRootChangelog, - skipProjectChangelog, - projectName, - ...options -}: CommonVersionOptions & { - skipRootChangelog: boolean; - projectRoots: string[]; -}): Observable { - const changelogRoots = projectRoots - .filter( - (projectRoot) => !(skipProjectChangelog && projectRoot !== workspaceRoot) - ) - .filter( - (projectRoot) => !(skipRootChangelog && projectRoot === workspaceRoot) - ); - - if (changelogRoots.length === 0) { - return of([]); - } - - return forkJoin( - changelogRoots.map((projectRoot) => - updateChangelog({ - projectRoot, - ...options, - }).pipe( - logStep({ - step: 'changelog_success', - message: `Generated CHANGELOG.md.`, - projectName, - }) - ) - ) - ); -} - -function isNotNull(path: string | null): path is string { - return path !== null; -} diff --git a/packages/semver/src/generators/install/compat.ts b/packages/semver/src/generators/install/compat.ts deleted file mode 100644 index f8fd9b270..000000000 --- a/packages/semver/src/generators/install/compat.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { convertNxGenerator } from '@nrwl/devkit'; - -import install from '.'; - -export default convertNxGenerator(install); diff --git a/packages/semver/src/generators/install/index.spec.ts b/packages/semver/src/generators/install/index.spec.ts deleted file mode 100644 index 8e7ca7162..000000000 --- a/packages/semver/src/generators/install/index.spec.ts +++ /dev/null @@ -1,331 +0,0 @@ -import { - addProjectConfiguration, - readJson, - writeJson, - type Tree, -} from '@nrwl/devkit'; -import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing'; -import * as inquirer from 'inquirer'; - -import install from '.'; - -import type { SchemaOptions } from './schema'; - -jest.mock('inquirer'); - -const defaultOptions: SchemaOptions = { - syncVersions: false, - enforceConventionalCommits: true, - projects: [], -}; - -describe('Install generator', () => { - let tree: Tree; - - beforeEach(() => { - tree = createTreeWithEmptyWorkspace(); - }); - - describe('Sync versioning', () => { - const options = { ...defaultOptions, syncVersions: true }; - - it('should add a workspace project.json to the root of the workspace', async () => { - await install(tree, options); - - const projectJSON = readJson(tree, 'project.json'); - - expect(projectJSON).toBeDefined(); - expect(projectJSON.targets).toEqual( - expect.objectContaining({ - version: { - executor: '@jscutlery/semver:version', - options: expect.objectContaining({ syncVersions: true }), - }, - }) - ); - }); - }); - - describe('Independent versions', () => { - const options = { - ...defaultOptions, - syncVersions: false, - }; - - beforeEach(async () => { - addProjectConfiguration(tree, 'lib1', { - root: 'libs/lib1', - sourceRoot: 'libs/lib1/src', - targets: {}, - }); - - writeJson(tree, 'libs/lib1/tsconfig.json', { - files: [], - include: [], - references: [], - }); - - addProjectConfiguration(tree, 'lib2', { - root: 'libs/lib2', - sourceRoot: 'libs/lib1/src', - targets: {}, - }); - - writeJson(tree, 'libs/lib2/tsconfig.json', { - files: [], - include: [], - references: [], - }); - - jest.spyOn(inquirer, 'prompt').mockResolvedValue({ projects: ['lib1'] }); - }); - - afterEach(() => - ( - inquirer.prompt as jest.MockedFunction - ).mockRestore() - ); - - it('should prompt user to select which projects should be versioned', async () => { - await install(tree, options); - - const lib1 = readJson(tree, 'libs/lib1/project.json'); - const lib2 = readJson(tree, 'libs/lib2/project.json'); - - expect(inquirer.prompt).toBeCalledWith( - expect.objectContaining({ - name: 'projects', - type: 'checkbox', - choices: expect.arrayContaining([{ name: 'lib1', checked: true }]), - }) - ); - /* Project "lib1" selected by the prompt. */ - expect(lib1.targets).toEqual( - expect.objectContaining({ - version: { - executor: '@jscutlery/semver:version', - }, - }) - ); - /* Project "lib2" not selected by the prompt. */ - expect(lib2.targets.version).toBeUndefined(); - }); - - it('should use --projects option', async () => { - await install(tree, { ...options, projects: ['lib2'] }); - - const lib1 = readJson(tree, 'libs/lib1/project.json'); - const lib2 = readJson(tree, 'libs/lib2/project.json'); - - expect(inquirer.prompt).not.toBeCalled(); - expect(lib1.targets.version).toBeUndefined(); - expect(lib2.targets).toEqual( - expect.objectContaining({ - version: { - executor: '@jscutlery/semver:version', - }, - }) - ); - }); - - it('should forward --baseBranch option to all projects', async () => { - jest - .spyOn(inquirer, 'prompt') - .mockResolvedValue({ projects: ['lib1', 'lib2'] }); - - await install(tree, { ...options, baseBranch: 'master' }); - - const lib1 = readJson(tree, 'libs/lib1/project.json'); - const lib2 = readJson(tree, 'libs/lib2/project.json'); - - expect(lib1.targets).toEqual( - expect.objectContaining({ - version: { - executor: '@jscutlery/semver:version', - options: expect.objectContaining({ baseBranch: 'master' }), - }, - }) - ); - expect(lib2.targets).toEqual( - expect.objectContaining({ - version: { - executor: '@jscutlery/semver:version', - options: expect.objectContaining({ baseBranch: 'master' }), - }, - }) - ); - }); - - it('should not create a root project.json', async () => { - await install(tree, options); - - let projectJSON; - - try { - projectJSON = readJson(tree, 'project.json'); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (error: any) { - expect(error?.message).toEqual('Cannot find project.json'); - } - - expect(projectJSON).toBeUndefined(); - }); - - describe('--preset option', () => { - it('should install conventional config', async () => { - await install(tree, { ...defaultOptions, preset: 'conventional' }); - - const packageJson = readJson(tree, 'package.json'); - const lib1 = readJson(tree, 'libs/lib1/project.json'); - - expect(packageJson.devDependencies).toContainKeys([ - '@commitlint/cli', - '@commitlint/config-conventional', - ]); - expect(lib1.targets).toEqual( - expect.objectContaining({ - version: { - executor: '@jscutlery/semver:version', - options: expect.objectContaining({ preset: 'conventional' }), - }, - }) - ); - }); - - it('should install angular config', async () => { - await install(tree, { ...defaultOptions, preset: 'angular' }); - - const packageJson = readJson(tree, 'package.json'); - const lib1 = readJson(tree, 'libs/lib1/project.json'); - - expect(packageJson.devDependencies).toContainKeys([ - '@commitlint/cli', - '@commitlint/config-angular', - ]); - expect(lib1.targets).toEqual( - expect.objectContaining({ - version: { - executor: '@jscutlery/semver:version', - options: expect.objectContaining({ preset: 'angular' }), - }, - }) - ); - }); - - it('should install angular config', async () => { - await install(tree, { ...defaultOptions, preset: 'conventional' }); - - const lib1 = readJson(tree, 'libs/lib1/project.json'); - - expect(lib1.targets).toEqual( - expect.objectContaining({ - version: { - executor: '@jscutlery/semver:version', - options: expect.objectContaining({ preset: 'conventional' }), - }, - }) - ); - }); - - it('extends conventional commitlint config', async () => { - await install(tree, { ...options, preset: 'conventional' }); - - const commitlintConfig = readJson(tree, '.commitlintrc.json'); - - expect(commitlintConfig.extends).toEqual([ - '@commitlint/config-conventional', - ]); - }); - - it('extends angular commitlint config', async () => { - await install(tree, { ...options, preset: 'angular' }); - - const commitlintConfig = readJson(tree, '.commitlintrc.json'); - - expect(commitlintConfig.extends).toEqual([ - '@commitlint/config-angular', - ]); - }); - }); - }); - - describe('Enforce Conventional Commits', () => { - const options: SchemaOptions = { - ...defaultOptions, - enforceConventionalCommits: true, - preset: 'angular', - }; - - it('add commitlint to package.json devDepencencies', async () => { - await install(tree, options); - - const packageJson = readJson(tree, 'package.json'); - expect(packageJson.devDependencies).toContainKeys([ - '@commitlint/cli', - '@commitlint/config-angular', - ]); - }); - - it('adds commitlint config if does not exist', async () => { - await install(tree, options); - - const commitlintConfig = readJson(tree, '.commitlintrc.json'); - - expect(commitlintConfig.extends).toEqual(['@commitlint/config-angular']); - }); - - it('does not add commitlint config to package.json if exists', async () => { - const packageJson = readJson(tree, 'package.json'); - - packageJson.commitlint = { - extends: ['other'], - }; - tree.write('package.json', JSON.stringify(packageJson, null, 2)); - - await install(tree, options); - - expect(readJson(tree, 'package.json').commitlint.extends).toEqual([ - 'other', - ]); - }); - - it('add husky to package.json devDepencencies', async () => { - await install(tree, options); - - const packageJson = readJson(tree, 'package.json'); - expect(packageJson.devDependencies.husky).toBeDefined(); - }); - - it('adds husky config if does not exist', async () => { - await install(tree, options); - - const packageJson = readJson(tree, 'package.json'); - - expect(tree.exists('.husky/commit-msg')).toEqual(true); - expect(packageJson.scripts.prepare).toEqual('husky install'); - }); - - it('does not add husky config if exists', async () => { - tree.write('.husky/_/husky.sh', ''); - tree.write('.husky/commit-msg', 'test'); - - await install(tree, options); - - const packageJson = readJson(tree, 'package.json'); - - expect(tree.read('.husky/commit-msg')?.toString()).toEqual('test'); - expect(packageJson?.scripts?.prepare).toBeUndefined(); - }); - - it('does nothing if no enforceConventionalCommits', async () => { - await install(tree, { ...options, enforceConventionalCommits: false }); - - const packageJson = readJson(tree, 'package.json'); - - expect(packageJson.devDependencies).not.toContainKeys([ - '@commitlint/cli', - '@commitlint/config-angular', - ]); - }); - }); -}); diff --git a/packages/semver/src/generators/install/index.ts b/packages/semver/src/generators/install/index.ts deleted file mode 100644 index 5d59a1800..000000000 --- a/packages/semver/src/generators/install/index.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - addProjectConfiguration, - formatFiles, - installPackagesTask, - type Tree, -} from '@nrwl/devkit'; - -import { createTarget } from './utils/create-target'; -import { addDependencies } from './utils/dependencies'; -import { - updateWorkspaceFromPrompt, - updateWorkspaceFromSchema, -} from './utils/workspace'; - -import type { SchemaOptions } from './schema'; - -export default async function install(tree: Tree, options: SchemaOptions) { - /* Synced versioning. */ - if (options.syncVersions) { - addProjectConfiguration( - tree, - 'workspace', - { - root: '.', - targets: { - version: createTarget(options), - }, - }, - false - ); - - /* Independent versioning. */ - } else { - options.projects && options.projects.length > 0 - ? updateWorkspaceFromSchema(tree, options) - : await updateWorkspaceFromPrompt(tree, options); - } - - addDependencies(tree, options); - - /* Supports Angular CLI workspace definition format, see https://github.com/nrwl/nx/discussions/6955#discussioncomment-1341893 */ - await formatFiles(tree); - - return () => { - !options.skipInstall && installPackagesTask(tree); - }; -} diff --git a/packages/semver/src/generators/install/schema.json b/packages/semver/src/generators/install/schema.json deleted file mode 100644 index e89f58897..000000000 --- a/packages/semver/src/generators/install/schema.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "$id": "ng-add", - "title": "@jscutlery/semver install generator", - "type": "object", - "cli": "nx", - "properties": { - "syncVersions": { - "description": "Lock/sync versions between packages", - "type": "boolean", - "default": false - }, - "projects": { - "description": "Which projects should be versioned independently", - "type": "array" - }, - "baseBranch": { - "description": "Configure base branch", - "type": "string" - }, - "commitMessageFormat": { - "description": "A string to be used to format the auto-generated release commit message.", - "type": "string" - }, - "enforceConventionalCommits": { - "description": "Install & configure commitlint and husky.", - "type": "boolean", - "default": true, - "x-prompt": "Would you want to enforce conventional commits?" - }, - "preset": { - "description": "Customize CHANGELOG generation and lint rules.", - "type": "string", - "enum": ["angular", "conventional"], - "default": "angular", - "x-prompt": { - "message": "Which preset would you want to use?", - "type": "list", - "items": [ - { - "value": "angular", - "label": "Angular [ https://github.com/angular/angular/blob/master/CONTRIBUTING.md#-commit-message-format ]" - }, - { - "value": "conventional", - "label": "Conventional [ https://www.conventionalcommits.org/en/v1.0.0-beta.4 ]" - } - ] - } - }, - "skipInstall": { - "description": "Skip install dependencies", - "type": "boolean", - "default": false - } - }, - "required": [] -} diff --git a/packages/semver/src/generators/install/schema.ts b/packages/semver/src/generators/install/schema.ts deleted file mode 100644 index 4c08c41fe..000000000 --- a/packages/semver/src/generators/install/schema.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface SchemaOptions { - syncVersions: boolean; - baseBranch?: string; - projects?: string[]; - enforceConventionalCommits?: boolean; - skipInstall?: boolean; - commitMessageFormat?: string; - preset?: 'angular' | 'conventional'; -} diff --git a/packages/semver/src/generators/install/utils/create-target.ts b/packages/semver/src/generators/install/utils/create-target.ts deleted file mode 100644 index c288016b5..000000000 --- a/packages/semver/src/generators/install/utils/create-target.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { TargetConfiguration } from '@nrwl/devkit'; -import type { SchemaOptions } from '../schema'; - -/* istanbul ignore next */ -export function createTarget(options: SchemaOptions): TargetConfiguration { - const targetOptions = _createOptions(options); - return { - executor: '@jscutlery/semver:version', - ...(Object.keys(targetOptions).length > 0 - ? { options: targetOptions } - : {}), - }; -} - -/* istanbul ignore next */ -export function _createOptions( - options: SchemaOptions -): TargetConfiguration['options'] { - const targetOptions = [ - 'syncVersions', - 'baseBranch', - 'preset', - 'commitMessageFormat', - ] as const; - - return targetOptions - .filter((key) => Boolean(options[key])) - .reduce( - (targetOptions, key) => ({ - ...targetOptions, - [key]: options[key as keyof SchemaOptions], - }), - {} - ); -} diff --git a/packages/semver/src/generators/install/utils/dependencies.ts b/packages/semver/src/generators/install/utils/dependencies.ts deleted file mode 100644 index d8dc07f0c..000000000 --- a/packages/semver/src/generators/install/utils/dependencies.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { - addDependenciesToPackageJson, - readJson, - updateJson, - type Tree, -} from '@nrwl/devkit'; -import { constants } from 'fs'; -import type { SchemaOptions } from '../schema'; - -const PACKAGE_JSON = 'package.json'; - -export interface PackageJson { - scripts: PackageJsonPart; - devDependencies: PackageJsonPart; - commitlint: PackageJsonPart; -} - -export interface PackageJsonPart { - [key: string]: T; -} - -export function addDependencies(tree: Tree, options: SchemaOptions) { - if (options.enforceConventionalCommits) { - _addCommitlintConfig(tree, options); - _addHuskyConfig(tree); - _addHuskyConfigMsg(tree); - _addDevDependencies(tree, options); - } -} - -function _addDevDependencies(tree: Tree, options: SchemaOptions) { - if (!options.skipInstall) { - addDependenciesToPackageJson( - tree, - {}, - { - '@commitlint/cli': '^17.0.0', - [_getCommitlintConfig(options)]: '^17.0.0', - husky: '^8.0.0', - } - ); - } -} - -function _addCommitlintConfig(tree: Tree, options: SchemaOptions) { - const packageJson = readJson(tree, PACKAGE_JSON); - - const hasConfig: boolean = - packageJson.commitlint != null || - tree.exists('commitlint.config.js') || - tree.exists('commitlint') || - tree.exists('.commitlintrc.js') || - tree.exists('.commitlintrc.json') || - tree.exists('.commitlintrc.yml'); - - if (!hasConfig) { - tree.write( - '.commitlintrc.json', - JSON.stringify( - { - extends: [_getCommitlintConfig(options)], - rules: {}, - }, - null, - 2 - ) - ); - } - - return tree; -} - -function _addHuskyConfig(tree: Tree) { - return updateJson(tree, PACKAGE_JSON, (packageJson: PackageJson) => { - const hasHusky: boolean = tree.exists('.husky/_/husky.sh'); - - if (!hasHusky) { - packageJson.scripts = { - ...packageJson.scripts, - ...{ prepare: 'husky install' }, - }; - } - - return packageJson; - }); -} - -function _addHuskyConfigMsg(tree: Tree) { - const hasConfigFile: boolean = tree.exists('.husky/commit-msg'); - - if (!hasConfigFile) { - const commitMsg = `#!/bin/sh\n. "$(dirname "$0")/_/husky.sh"\n\nnpx --no-install commitlint --edit $1\n`; - - tree.write('.husky/commit-msg', commitMsg, { - /* File mode indicating readable, writable, and executable by owner. */ - mode: constants.S_IRWXU, - }); - } -} - -function _getCommitlintConfig(options: SchemaOptions) { - return options.preset === 'angular' - ? '@commitlint/config-angular' - : '@commitlint/config-conventional'; -} diff --git a/packages/semver/src/generators/install/utils/prompt.ts b/packages/semver/src/generators/install/utils/prompt.ts deleted file mode 100644 index dce613704..000000000 --- a/packages/semver/src/generators/install/utils/prompt.ts +++ /dev/null @@ -1,17 +0,0 @@ -import * as inquirer from 'inquirer'; - -import type { ProjectDefinition } from './workspace'; - -export function createPrompt( - projects: ProjectDefinition[] -): Promise<{ projects: string[] }> { - return inquirer.prompt({ - name: 'projects', - type: 'checkbox', - message: 'Which projects would you want to version independently?', - choices: projects.map(({ projectName }) => ({ - name: projectName, - checked: true, - })), - }); -} diff --git a/packages/semver/src/generators/install/utils/workspace.ts b/packages/semver/src/generators/install/utils/workspace.ts deleted file mode 100644 index e64ffcc85..000000000 --- a/packages/semver/src/generators/install/utils/workspace.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { - getProjects, - updateProjectConfiguration, - type ProjectConfiguration, -} from '@nrwl/devkit'; - -import { createTarget } from './create-target'; -import { createPrompt } from './prompt'; - -import type { Tree } from '@nrwl/devkit'; -import type { SchemaOptions } from '../schema'; - -export type ProjectDefinition = ProjectConfiguration & { projectName: string }; - -export function listProjects(tree: Tree): ProjectDefinition[] { - const projects = getProjects(tree); - - return Array.from(projects.entries()).map(([projectName, project]) => ({ - projectName, - ...project, - })); -} - -export function updateProjects( - tree: Tree, - options: SchemaOptions, - predicate: (projectName: string) => boolean -) { - getProjects(tree).forEach((project, projectName) => { - if (predicate(projectName)) { - const targets = project.targets ?? {}; - targets.version = createTarget(options); - - updateProjectConfiguration(tree, projectName, project); - } - }); -} - -export async function updateWorkspaceFromPrompt( - tree: Tree, - options: SchemaOptions -): Promise { - const projects = listProjects(tree); - const answers = await createPrompt(projects); - - return updateProjects(tree, options, (projectName) => - answers.projects.includes(projectName) - ); -} - -export function updateWorkspaceFromSchema( - tree: Tree, - options: SchemaOptions -): void { - return updateProjects( - tree, - options, - (projectName) => options.projects?.includes(projectName) as boolean - ); -} diff --git a/packages/semver/src/index.ts b/packages/semver/src/index.ts index e69de29bb..1c2a9be69 100644 --- a/packages/semver/src/index.ts +++ b/packages/semver/src/index.ts @@ -0,0 +1,10 @@ +import { release } from './release'; + +release() + .then(() => { + process.exit(0); + }) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/packages/semver/src/migrations/update-2-0-0/compat.ts b/packages/semver/src/migrations/update-2-0-0/compat.ts deleted file mode 100644 index 4711ecc98..000000000 --- a/packages/semver/src/migrations/update-2-0-0/compat.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { convertNxGenerator } from '@nrwl/devkit'; - -import migrate from '.'; - -export default convertNxGenerator(migrate); diff --git a/packages/semver/src/migrations/update-2-0-0/index.spec.ts b/packages/semver/src/migrations/update-2-0-0/index.spec.ts deleted file mode 100644 index 726c49c4a..000000000 --- a/packages/semver/src/migrations/update-2-0-0/index.spec.ts +++ /dev/null @@ -1,95 +0,0 @@ -import type { Tree } from '@nrwl/devkit'; -import { getProjects } from '@nrwl/devkit'; -import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing'; - -import migrate from '.'; - -function serializeJson(json: unknown) { - return `${JSON.stringify(json, null, 2)}\n`; -} - -describe('2.0.0 migration schematic', () => { - let appTree: Tree; - - beforeEach(async () => { - appTree = createTreeWithEmptyWorkspace(); - }); - - it('should update --root-changelog=false option to --skip-root-changelog=true', () => { - appTree.write( - 'apps/demo/project.json', - serializeJson({ - targets: { - version: { - executor: '@jscutlery/semver', - options: { - rootChangelog: false, - }, - }, - }, - }) - ); - - migrate(appTree); - - const projects = getProjects(appTree); - expect(projects.get('demo')?.targets?.version.options).not.toContainKey( - 'rootChangelog' - ); - expect(projects.get('demo')?.targets?.version.options).toEqual( - expect.objectContaining({ - skipRootChangelog: true, - }) - ); - }); - - it('should update --root-changelog=true option to --skip-root-changelog=false', () => { - appTree.write( - 'apps/demo/project.json', - serializeJson({ - targets: { - version: { - executor: '@jscutlery/semver', - options: { - rootChangelog: true, - }, - }, - }, - }) - ); - - migrate(appTree); - - const projects = getProjects(appTree); - expect(projects.get('demo')?.targets?.version.options).not.toContainKey( - 'rootChangelog' - ); - expect(projects.get('demo')?.targets?.version.options).toEqual( - expect.objectContaining({ - skipRootChangelog: false, - }) - ); - }); - - it('should not update other targets', () => { - appTree.write( - 'apps/demo/project.json', - serializeJson({ - targets: { - test: { - executor: 'another', - options: { option: 'value' }, - }, - }, - }) - ); - - migrate(appTree); - - const projects = getProjects(appTree); - expect(projects.get('demo')?.targets?.test).toEqual({ - executor: 'another', - options: { option: 'value' }, - }); - }); -}); diff --git a/packages/semver/src/migrations/update-2-0-0/index.ts b/packages/semver/src/migrations/update-2-0-0/index.ts deleted file mode 100644 index 58a387274..000000000 --- a/packages/semver/src/migrations/update-2-0-0/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { - getProjects, - updateProjectConfiguration, - type Tree, -} from '@nrwl/devkit'; - -/* istanbul ignore next */ -export default function migrate(tree: Tree) { - getProjects(tree).forEach((project, projectName) => { - if (project.targets?.version) { - const options = project.targets.version.options ?? {}; - - /* Check if the outdated option is defined. */ - if (typeof options.rootChangelog === 'boolean') { - const newOptions = { - skipRootChangelog: !options.rootChangelog, - }; - - /* eslint-disable-next-line @typescript-eslint/no-unused-vars */ - const { rootChangelog, ...otherOptions } = options; - - updateProjectConfiguration(tree, projectName, { - ...project, - targets: { - ...project.targets, - version: { - executor: '@jscutlery/semver:version', - options: { ...otherOptions, ...newOptions }, - }, - }, - }); - } - } - }); -} diff --git a/packages/semver/src/release/config.ts b/packages/semver/src/release/config.ts new file mode 100644 index 000000000..5699e04e6 --- /dev/null +++ b/packages/semver/src/release/config.ts @@ -0,0 +1,54 @@ +import { resolve } from 'path'; +import * as z from 'zod'; +import { devkit } from './devkit'; + +export async function getConfig(): Promise { + try { + const config = await devkit.readFile(resolve(devkit.cwd(), 'semver.json')); + return validate(JSON.parse(config)); + } catch (error: unknown) { + if (isErrnoException(error) && error.code === 'ENOENT') { + throw new Error('Could not find semver.json'); + } + if (error instanceof SyntaxError || error instanceof z.ZodError) { + throw new Error(`Invalid semver.json`); + } + throw error; + } +} + +function isErrnoException(error: unknown): error is NodeJS.ErrnoException { + return typeof error === 'object' && error !== null && 'code' in error; +} + +const groupSchema = z.object({ + name: z.string(), + type: z.literal('group'), + tagPrefix: z.string().optional(), + path: z.string(), + packages: z.array( + z.object({ + name: z.string(), + path: z.string(), + }) + ), +}); + +const independentSchema = z.object({ + name: z.string(), + type: z.literal('independent'), + tagPrefix: z.string().optional(), + path: z.string(), +}); + +const schema = z.object({ + packages: z.array(z.union([groupSchema, independentSchema])), +}); + +export type Config = z.infer; +export type GroupConfig = z.infer; +export type IndependentConfig = z.infer; + +function validate(config: unknown): Config { + return schema.parse(config); +} diff --git a/packages/semver/src/release/devkit.ts b/packages/semver/src/release/devkit.ts new file mode 100644 index 000000000..794a73449 --- /dev/null +++ b/packages/semver/src/release/devkit.ts @@ -0,0 +1,32 @@ +import { ProjectGraph, createProjectGraphAsync } from '@nrwl/devkit'; +import { readFile } from 'fs/promises'; +import { cwd } from 'process'; + +/** + * Devkit is a wrapper around Node.js APIs and Nx Workspace Graph to make them testable through contract testing. + * It is used to abstract away the file system, the current working directory, and Nx workspace graph. + */ +export interface Devkit { + cwd(): string; + readFile(path: string): Promise; + createGraph(): Promise; +} + +export class ConcreteDevkit implements Devkit { + cwd(): string { + return cwd(); + } + + readFile(path: string): Promise { + return readFile(path, 'utf-8'); + } + + createGraph(): Promise { + return createProjectGraphAsync({ + exitOnError: true, + resetDaemonClient: false, + }); + } +} + +export const devkit = new ConcreteDevkit(); diff --git a/packages/semver/src/release/index.ts b/packages/semver/src/release/index.ts new file mode 100644 index 000000000..5101ff777 --- /dev/null +++ b/packages/semver/src/release/index.ts @@ -0,0 +1 @@ +export { release } from './release'; diff --git a/packages/semver/src/release/release.spec.ts b/packages/semver/src/release/release.spec.ts new file mode 100644 index 000000000..39a6d765e --- /dev/null +++ b/packages/semver/src/release/release.spec.ts @@ -0,0 +1,49 @@ +import { TestingDevkit } from '../testing/devkit'; +import { release } from './release'; + +describe(release, () => { + it('should throw an error when config does not exist', async () => { + new TestingDevkit({}, { nodes: {}, dependencies: {} }); + await expect(release()).rejects.toThrow('Could not find semver.json'); + }); + + it('should throw an error when config is invalid', async () => { + new TestingDevkit( + { 'semver.json': 'invalid' }, + { nodes: {}, dependencies: {} } + ); + await expect(release()).rejects.toThrow('Invalid semver.json'); + }); + + it('should not throw', async () => { + new TestingDevkit( + { + 'semver.json': JSON.stringify({ + packages: [ + { + name: 'template', + type: 'independent', + path: 'packages/template', + }, + ], + }), + }, + { + nodes: { + template: { + name: 'template', + type: 'lib', + data: { + files: [], + root: 'packages/template', + targets: {}, + tags: [], + }, + }, + }, + dependencies: {}, + } + ); + await expect(release()).resolves.not.toThrow(); + }); +}); diff --git a/packages/semver/src/release/release.ts b/packages/semver/src/release/release.ts new file mode 100644 index 000000000..3f5c2f0af --- /dev/null +++ b/packages/semver/src/release/release.ts @@ -0,0 +1,7 @@ +import { getConfig } from './config'; +import { devkit } from './devkit'; + +export async function release(): Promise { + const config = await getConfig(); + const graph = await devkit.createGraph(); +} diff --git a/packages/semver/src/release/version.spec.ts b/packages/semver/src/release/version.spec.ts new file mode 100644 index 000000000..f11b7d82d --- /dev/null +++ b/packages/semver/src/release/version.spec.ts @@ -0,0 +1,47 @@ +import { setupGitRepo } from '../testing/setup'; +import { exec } from '../utils/exec'; +import { getCurrentVersion } from './version'; + +describe(getCurrentVersion.name, () => { + beforeAll(async () => { + await setupGitRepo({ cwd: '/tmp/semver' }); + }); + + afterAll(async () => { + await exec('rm', ['-rf', '/tmp/semver']); + }); + + beforeEach(() => { + jest.spyOn(process, 'cwd').mockReturnValue('/tmp/semver'); + }); + + describe('when no tags exist', () => { + it('should return 0.0.0', async () => { + expect(await getCurrentVersion({ tagPrefix: 'prefix-' })).toEqual( + '0.0.0' + ); + }); + }); + + describe('when tags exist', () => { + beforeAll(async () => { + // Not matching the tagPrefix + await exec('git', ['tag', 'cdk-1.0.0'], { cwd: '/tmp/semver' }); + await exec('git', ['tag', '2.0.0'], { cwd: '/tmp/semver' }); + // Outdated versions + await exec('git', ['tag', 'template-0.1.0'], { cwd: '/tmp/semver' }); + await exec('git', ['tag', 'template-0.1.1'], { cwd: '/tmp/semver' }); + // Invalid versions + await exec('git', ['tag', 'template-0.a.b'], { cwd: '/tmp/semver' }); + await exec('git', ['tag', 'template-2.0.0-'], { cwd: '/tmp/semver' }); + // Current version + await exec('git', ['tag', 'template-1.0.0'], { cwd: '/tmp/semver' }); + }); + + it('should return the current version', async () => { + expect(await getCurrentVersion({ tagPrefix: 'template-' })).toEqual( + '1.0.0' + ); + }); + }); +}); diff --git a/packages/semver/src/release/version.ts b/packages/semver/src/release/version.ts new file mode 100644 index 000000000..c4f4887f4 --- /dev/null +++ b/packages/semver/src/release/version.ts @@ -0,0 +1,26 @@ +import * as semver from 'semver'; +import { exec } from '../utils/exec'; + +export async function getCurrentVersion({ + tagPrefix, +}: { + tagPrefix: string; +}): Promise { + const initialVersion = '0.0.0'; + const versions = (await getTags()) + .filter((tag) => tag.startsWith(tagPrefix)) + .map((tag) => tag.substring(tagPrefix.length)) + .filter((tag) => semver.valid(tag) != null); + + const [version] = versions.sort(semver.rcompare); + + if (version == null) { + return initialVersion; + } + + return version; +} + +async function getTags(): Promise { + return (await exec('git', ['tag', '--list'])).trim().split('\n'); +} diff --git a/packages/semver/src/shims.d.ts b/packages/semver/src/shims.d.ts deleted file mode 100644 index aec584cf4..000000000 --- a/packages/semver/src/shims.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare module 'git-raw-commits'; -declare module 'git-semver-tags'; diff --git a/packages/semver/src/testing/devkit.spec.ts b/packages/semver/src/testing/devkit.spec.ts new file mode 100644 index 000000000..86e76973a --- /dev/null +++ b/packages/semver/src/testing/devkit.spec.ts @@ -0,0 +1,88 @@ +import { resolve } from 'path'; + +describe('Devkit', () => { + describe('ConcreteDevkit', () => { + // Use require to avoid mock hoisting + // eslint-disable-next-line @typescript-eslint/no-var-requires + const ConcreteDevkit = require('../release/devkit').ConcreteDevkit; + const devkit = new ConcreteDevkit(); + + it('returns PWD', async () => { + const result = await devkit.cwd(); + expect(result).toEqual(process.cwd()); + }); + + it('reads JSON file', async () => { + const result = await devkit.readFile( + resolve(devkit.cwd(), 'semver.json') + ); + expect(JSON.parse(result)).toEqual({ + packages: [ + { name: 'semver', type: 'independent', path: 'packages/semver' }, + ], + }); + }); + + it('reads workspace graph', async () => { + const result = await devkit.createGraph(); + expect(result).toEqual( + expect.objectContaining({ + nodes: expect.objectContaining({ + semver: expect.objectContaining({ + name: 'semver', + }), + }), + }) + ); + }); + }); + + describe('TestingDevkit', () => { + // Use require to avoid mock hoisting + // eslint-disable-next-line @typescript-eslint/no-var-requires + const TestingDevkit = require('./devkit').TestingDevkit; + const devkit = new TestingDevkit( + { + 'semver.json': JSON.stringify({ value: 'JSON' }), + }, + { + nodes: { + project: { + name: 'project', + type: 'app', + }, + }, + }, + '/tmp/project' + ); + + afterAll(() => { + devkit.teardown(); + }); + + it('returns PWD', async () => { + const result = await devkit.cwd(); + expect(result).toEqual('/tmp/project'); + }); + + it('reads JSON file', async () => { + const result = await devkit.readFile( + resolve(devkit.cwd(), 'semver.json') + ); + expect(result).toEqual(JSON.stringify({ value: 'JSON' })); + }); + + it('reads workspace graph', async () => { + const result = await devkit.createGraph(); + expect(result).toEqual( + expect.objectContaining({ + nodes: expect.objectContaining({ + project: expect.objectContaining({ + name: 'project', + }), + }), + }) + ); + }); + }); +}); diff --git a/packages/semver/src/testing/devkit.ts b/packages/semver/src/testing/devkit.ts new file mode 100644 index 000000000..2ed308e9e --- /dev/null +++ b/packages/semver/src/testing/devkit.ts @@ -0,0 +1,39 @@ +import { ProjectGraph } from '@nrwl/devkit'; +import * as fs from 'fs/promises'; +import { DirectoryJSON, vol } from 'memfs'; +import { Devkit } from '../release/devkit'; + +const cwd = '/tmp/project'; + +jest.mock('process', () => ({ cwd: () => cwd })); +jest.mock('fs/promises', () => jest.requireActual('memfs').fs.promises); +jest.mock('@nrwl/devkit', () => ({ + ...jest.requireActual('@nrwl/devkit'), + createProjectGraphAsync: jest.fn(), +})); + +export class TestingDevkit implements Devkit { + constructor( + readonly virtualFs: DirectoryJSON, + readonly graph: ProjectGraph, + private readonly _cwd = '/tmp/project' + ) { + vol.fromJSON(virtualFs, this._cwd); + } + + readFile(path: string): Promise { + return fs.readFile(path, 'utf-8'); + } + + cwd(): string { + return this._cwd; + } + + async createGraph() { + return this.graph; + } + + teardown(): void { + vol.reset(); + } +} diff --git a/packages/semver/src/testing/setup.ts b/packages/semver/src/testing/setup.ts new file mode 100644 index 000000000..178e30bbf --- /dev/null +++ b/packages/semver/src/testing/setup.ts @@ -0,0 +1,15 @@ +import { exec } from '../utils/exec'; + +export async function setupGitRepo({ cwd = '/tmp/project' }): Promise { + await exec('mkdir', ['-p', cwd]); + await exec('git', ['init'], { cwd }); + await exec('git', ['config', 'user.email', 'test@email.com', '--local'], { + cwd, + }); + await exec('git', ['config', 'user.name', 'test', '--local'], { cwd }); + await exec( + 'git', + ['commit', '--allow-empty', '-m', 'init', '--no-gpg-sign'], + { cwd } + ); +} diff --git a/packages/semver/src/utils/exec.ts b/packages/semver/src/utils/exec.ts new file mode 100644 index 000000000..21cfa353d --- /dev/null +++ b/packages/semver/src/utils/exec.ts @@ -0,0 +1,20 @@ +import { execFile } from 'child_process'; +import { cwd as _cwd } from 'process'; + +export function exec( + command: string, + args: string[], + { cwd = _cwd() }: { cwd?: string } = {} +): Promise { + return new Promise((resolve, reject) => { + execFile(command, args, { cwd }, (error, stdout, stderr) => { + if (error) { + reject(error); + } + if (stderr) { + reject(stderr); + } + resolve(stdout); + }); + }); +} diff --git a/packages/semver/tsconfig.lib.json b/packages/semver/tsconfig.lib.json index 8ac7a2a0b..0a3a1e76c 100644 --- a/packages/semver/tsconfig.lib.json +++ b/packages/semver/tsconfig.lib.json @@ -6,10 +6,6 @@ "declaration": true, "types": ["node", "jest"] }, - "exclude": [ - "src/builders/version/testing.ts", - "**/*.spec.ts", - "jest.config.ts" - ], + "exclude": ["**/*.spec.ts", "jest.config.ts", "src/testing/**/*"], "include": ["**/*.ts"] } diff --git a/packages/semver/tsconfig.spec.json b/packages/semver/tsconfig.spec.json index c7d6b5815..b1e75b151 100644 --- a/packages/semver/tsconfig.spec.json +++ b/packages/semver/tsconfig.spec.json @@ -3,7 +3,7 @@ "compilerOptions": { "outDir": "../../dist/out-tsc", "module": "commonjs", - "types": ["jest", "node", "jest-extended", "standard-version"] + "types": ["jest", "node", "jest-extended"] }, "include": [ "**/*.spec.ts", diff --git a/semver.json b/semver.json new file mode 100644 index 000000000..b6b6b35f8 --- /dev/null +++ b/semver.json @@ -0,0 +1,5 @@ +{ + "packages": [ + { "name": "semver", "type": "independent", "path": "packages/semver" } + ] +} diff --git a/yarn.lock b/yarn.lock index bd7a0feda..3d187220c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -46,54 +46,54 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/code-frame@npm:7.18.6" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.18.6, @babel/code-frame@npm:^7.21.4": + version: 7.21.4 + resolution: "@babel/code-frame@npm:7.21.4" dependencies: "@babel/highlight": ^7.18.6 - checksum: 195e2be3172d7684bf95cff69ae3b7a15a9841ea9d27d3c843662d50cdd7d6470fd9c8e64be84d031117e4a4083486effba39f9aef6bbb2c89f7f21bcfba33ba + checksum: e5390e6ec1ac58dcef01d4f18eaf1fd2f1325528661ff6d4a5de8979588b9f5a8e852a54a91b923846f7a5c681b217f0a45c2524eb9560553160cd963b7d592c languageName: node linkType: hard -"@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.20.1, @babel/compat-data@npm:^7.20.5": - version: 7.21.0 - resolution: "@babel/compat-data@npm:7.21.0" - checksum: dbf632c532f9c75ba0be7d1dc9f6cd3582501af52f10a6b90415d634ec5878735bd46064c91673b10317af94d4cc99c4da5bd9d955978cdccb7905fc33291e4d +"@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.21.4": + version: 7.21.4 + resolution: "@babel/compat-data@npm:7.21.4" + checksum: 5f8b98c66f2ffba9f3c3a82c0cf354c52a0ec5ad4797b370dc32bdcd6e136ac4febe5e93d76ce76e175632e2dbf6ce9f46319aa689fcfafa41b6e49834fa4b66 languageName: node linkType: hard "@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.15.0": - version: 7.21.3 - resolution: "@babel/core@npm:7.21.3" + version: 7.21.4 + resolution: "@babel/core@npm:7.21.4" dependencies: "@ampproject/remapping": ^2.2.0 - "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.21.3 - "@babel/helper-compilation-targets": ^7.20.7 + "@babel/code-frame": ^7.21.4 + "@babel/generator": ^7.21.4 + "@babel/helper-compilation-targets": ^7.21.4 "@babel/helper-module-transforms": ^7.21.2 "@babel/helpers": ^7.21.0 - "@babel/parser": ^7.21.3 + "@babel/parser": ^7.21.4 "@babel/template": ^7.20.7 - "@babel/traverse": ^7.21.3 - "@babel/types": ^7.21.3 + "@babel/traverse": ^7.21.4 + "@babel/types": ^7.21.4 convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.2 semver: ^6.3.0 - checksum: bef25fbea96f461bf79bd1d0e4f0cdce679fd5ada464a89c1141ddba59ae1adfdbb23e04440c266ed525712d33d5ffd818cd8b0c25b1dee0e648d5559516153a + checksum: a3beebb2cc79908a02f27a07dc381bcb34e8ecc58fa99f568ad0934c49e12111fc977ee9c5b51eb7ea2da66f63155d37c4dd96b6472eaeecfc35843ccb56bf3d languageName: node linkType: hard -"@babel/generator@npm:^7.21.3, @babel/generator@npm:^7.7.2": - version: 7.21.3 - resolution: "@babel/generator@npm:7.21.3" +"@babel/generator@npm:^7.21.4, @babel/generator@npm:^7.7.2": + version: 7.21.4 + resolution: "@babel/generator@npm:7.21.4" dependencies: - "@babel/types": ^7.21.3 + "@babel/types": ^7.21.4 "@jridgewell/gen-mapping": ^0.3.2 "@jridgewell/trace-mapping": ^0.3.17 jsesc: ^2.5.1 - checksum: be6bb5a32a0273260b91210d4137b7b5da148a2db8dd324654275cb0af865ae59de5e1536e93ac83423b2586415059e1c24cf94293026755cf995757238da749 + checksum: 9ffbb526a53bb8469b5402f7b5feac93809b09b2a9f82fcbfcdc5916268a65dae746a1f2479e03ba4fb0776facd7c892191f63baa61ab69b2cfdb24f7b92424d languageName: node linkType: hard @@ -116,24 +116,24 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.17.7, @babel/helper-compilation-targets@npm:^7.18.9, @babel/helper-compilation-targets@npm:^7.20.0, @babel/helper-compilation-targets@npm:^7.20.7": - version: 7.20.7 - resolution: "@babel/helper-compilation-targets@npm:7.20.7" +"@babel/helper-compilation-targets@npm:^7.17.7, @babel/helper-compilation-targets@npm:^7.18.9, @babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.21.4": + version: 7.21.4 + resolution: "@babel/helper-compilation-targets@npm:7.21.4" dependencies: - "@babel/compat-data": ^7.20.5 - "@babel/helper-validator-option": ^7.18.6 + "@babel/compat-data": ^7.21.4 + "@babel/helper-validator-option": ^7.21.0 browserslist: ^4.21.3 lru-cache: ^5.1.1 semver: ^6.3.0 peerDependencies: "@babel/core": ^7.0.0 - checksum: 8c32c873ba86e2e1805b30e0807abd07188acbe00ebb97576f0b09061cc65007f1312b589eccb4349c5a8c7f8bb9f2ab199d41da7030bf103d9f347dcd3a3cf4 + checksum: bf9c7d3e7e6adff9222c05d898724cd4ee91d7eb9d52222c7ad2a22955620c2872cc2d9bdf0e047df8efdb79f4e3af2a06b53f509286145feccc4d10ddc318be languageName: node linkType: hard "@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.21.0": - version: 7.21.0 - resolution: "@babel/helper-create-class-features-plugin@npm:7.21.0" + version: 7.21.4 + resolution: "@babel/helper-create-class-features-plugin@npm:7.21.4" dependencies: "@babel/helper-annotate-as-pure": ^7.18.6 "@babel/helper-environment-visitor": ^7.18.9 @@ -145,19 +145,19 @@ __metadata: "@babel/helper-split-export-declaration": ^7.18.6 peerDependencies: "@babel/core": ^7.0.0 - checksum: 3e781d91d1056ea9b3a0395f3017492594a8b86899119b4a1645227c31727b8bec9bc8f6b72e86b1c5cf2dd6690893d2e8c5baff4974c429e616ead089552a21 + checksum: 9123ca80a4894aafdb1f0bc08e44f6be7b12ed1fbbe99c501b484f9b1a17ff296b6c90c18c222047d53c276f07f17b4de857946fa9d0aa207023b03e4cc716f2 languageName: node linkType: hard "@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.20.5": - version: 7.21.0 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.21.0" + version: 7.21.4 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.21.4" dependencies: "@babel/helper-annotate-as-pure": ^7.18.6 regexpu-core: ^5.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 63a6396a4e9444edc7e97617845583ea5cf059573d0b4cc566869f38576d543e37fde0edfcc21d6dfb7962ed241e909561714dc41c5213198bac04e0983b04f2 + checksum: 78334865db2cd1d64d103bd0d96dee2818b0387d10aa973c084e245e829df32652bca530803e397b7158af4c02b9b21d5a9601c29bdfbb8d54a3d4ad894e067b languageName: node linkType: hard @@ -221,12 +221,12 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-module-imports@npm:7.18.6" +"@babel/helper-module-imports@npm:^7.18.6, @babel/helper-module-imports@npm:^7.21.4": + version: 7.21.4 + resolution: "@babel/helper-module-imports@npm:7.21.4" dependencies: - "@babel/types": ^7.18.6 - checksum: f393f8a3b3304b1b7a288a38c10989de754f01d29caf62ce7c4e5835daf0a27b81f3ac687d9d2780d39685aae7b55267324b512150e7b2be967b0c493b6a1def + "@babel/types": ^7.21.4 + checksum: bd330a2edaafeb281fbcd9357652f8d2666502567c0aad71db926e8499c773c9ea9c10dfaae30122452940326d90c8caff5c649ed8e1bf15b23f858758d3abc6 languageName: node linkType: hard @@ -331,7 +331,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.18.6, @babel/helper-validator-option@npm:^7.21.0": +"@babel/helper-validator-option@npm:^7.21.0": version: 7.21.0 resolution: "@babel/helper-validator-option@npm:7.21.0" checksum: 8ece4c78ffa5461fd8ab6b6e57cc51afad59df08192ed5d84b475af4a7193fc1cb794b59e3e7be64f3cdc4df7ac78bf3dbb20c129d7757ae078e6279ff8c2f07 @@ -372,12 +372,12 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.3": - version: 7.21.3 - resolution: "@babel/parser@npm:7.21.3" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.4": + version: 7.21.4 + resolution: "@babel/parser@npm:7.21.4" bin: parser: ./bin/babel-parser.js - checksum: a71e6456a1260c2a943736b56cc0acdf5f2a53c6c79e545f56618967e51f9b710d1d3359264e7c979313a7153741b1d95ad8860834cc2ab4ce4f428b13cc07be + checksum: de610ecd1bff331766d0c058023ca11a4f242bfafefc42caf926becccfb6756637d167c001987ca830dd4b34b93c629a4cef63f8c8c864a8564cdfde1989ac77 languageName: node linkType: hard @@ -392,7 +392,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.18.9": +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.20.7": version: 7.20.7 resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.20.7" dependencies: @@ -405,7 +405,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-async-generator-functions@npm:^7.20.1": +"@babel/plugin-proposal-async-generator-functions@npm:^7.20.7": version: 7.20.7 resolution: "@babel/plugin-proposal-async-generator-functions@npm:7.20.7" dependencies: @@ -431,7 +431,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-class-static-block@npm:^7.18.6": +"@babel/plugin-proposal-class-static-block@npm:^7.21.0": version: 7.21.0 resolution: "@babel/plugin-proposal-class-static-block@npm:7.21.0" dependencies: @@ -495,7 +495,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-logical-assignment-operators@npm:^7.18.9": +"@babel/plugin-proposal-logical-assignment-operators@npm:^7.20.7": version: 7.20.7 resolution: "@babel/plugin-proposal-logical-assignment-operators@npm:7.20.7" dependencies: @@ -531,7 +531,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-object-rest-spread@npm:^7.20.2": +"@babel/plugin-proposal-object-rest-spread@npm:^7.20.7": version: 7.20.7 resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.20.7" dependencies: @@ -558,7 +558,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-optional-chaining@npm:^7.18.9, @babel/plugin-proposal-optional-chaining@npm:^7.20.7": +"@babel/plugin-proposal-optional-chaining@npm:^7.20.7, @babel/plugin-proposal-optional-chaining@npm:^7.21.0": version: 7.21.0 resolution: "@babel/plugin-proposal-optional-chaining@npm:7.21.0" dependencies: @@ -583,7 +583,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-private-property-in-object@npm:^7.18.6": +"@babel/plugin-proposal-private-property-in-object@npm:^7.21.0": version: 7.21.0 resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0" dependencies: @@ -719,14 +719,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.7.2": - version: 7.18.6 - resolution: "@babel/plugin-syntax-jsx@npm:7.18.6" +"@babel/plugin-syntax-jsx@npm:^7.21.4, @babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.21.4 + resolution: "@babel/plugin-syntax-jsx@npm:7.21.4" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.20.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6d37ea972970195f1ffe1a54745ce2ae456e0ac6145fae9aa1480f297248b262ea6ebb93010eddb86ebfacb94f57c05a1fc5d232b9a67325b09060299d515c67 + checksum: bb7309402a1d4e155f32aa0cf216e1fa8324d6c4cfd248b03280028a015a10e46b6efd6565f515f8913918a3602b39255999c06046f7d4b8a5106be2165d724a languageName: node linkType: hard @@ -819,17 +819,17 @@ __metadata: linkType: hard "@babel/plugin-syntax-typescript@npm:^7.20.0, @babel/plugin-syntax-typescript@npm:^7.3.3, @babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.20.0 - resolution: "@babel/plugin-syntax-typescript@npm:7.20.0" + version: 7.21.4 + resolution: "@babel/plugin-syntax-typescript@npm:7.21.4" dependencies: - "@babel/helper-plugin-utils": ^7.19.0 + "@babel/helper-plugin-utils": ^7.20.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6189c0b5c32ba3c9a80a42338bd50719d783b20ef29b853d4f03929e971913d3cefd80184e924ae98ad6db09080be8fe6f1ffde9a6db8972523234f0274d36f7 + checksum: a59ce2477b7ae8c8945dc37dda292fef9ce46a6507b3d76b03ce7f3a6c9451a6567438b20a78ebcb3955d04095fd1ccd767075a863f79fcc30aa34dcfa441fe0 languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.18.6": +"@babel/plugin-transform-arrow-functions@npm:^7.20.7": version: 7.20.7 resolution: "@babel/plugin-transform-arrow-functions@npm:7.20.7" dependencies: @@ -840,7 +840,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.18.6": +"@babel/plugin-transform-async-to-generator@npm:^7.20.7": version: 7.20.7 resolution: "@babel/plugin-transform-async-to-generator@npm:7.20.7" dependencies: @@ -864,7 +864,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.20.2": +"@babel/plugin-transform-block-scoping@npm:^7.21.0": version: 7.21.0 resolution: "@babel/plugin-transform-block-scoping@npm:7.21.0" dependencies: @@ -875,7 +875,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.20.2": +"@babel/plugin-transform-classes@npm:^7.21.0": version: 7.21.0 resolution: "@babel/plugin-transform-classes@npm:7.21.0" dependencies: @@ -894,7 +894,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.18.9": +"@babel/plugin-transform-computed-properties@npm:^7.20.7": version: 7.20.7 resolution: "@babel/plugin-transform-computed-properties@npm:7.20.7" dependencies: @@ -906,7 +906,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.20.2": +"@babel/plugin-transform-destructuring@npm:^7.21.3": version: 7.21.3 resolution: "@babel/plugin-transform-destructuring@npm:7.21.3" dependencies: @@ -952,7 +952,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.18.8": +"@babel/plugin-transform-for-of@npm:^7.21.0": version: 7.21.0 resolution: "@babel/plugin-transform-for-of@npm:7.21.0" dependencies: @@ -998,7 +998,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.19.6": +"@babel/plugin-transform-modules-amd@npm:^7.20.11": version: 7.20.11 resolution: "@babel/plugin-transform-modules-amd@npm:7.20.11" dependencies: @@ -1010,7 +1010,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.19.6": +"@babel/plugin-transform-modules-commonjs@npm:^7.21.2": version: 7.21.2 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.21.2" dependencies: @@ -1023,7 +1023,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.19.6": +"@babel/plugin-transform-modules-systemjs@npm:^7.20.11": version: 7.20.11 resolution: "@babel/plugin-transform-modules-systemjs@npm:7.20.11" dependencies: @@ -1049,7 +1049,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.19.1": +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.20.5": version: 7.20.5 resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.20.5" dependencies: @@ -1084,7 +1084,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.20.1, @babel/plugin-transform-parameters@npm:^7.20.7": +"@babel/plugin-transform-parameters@npm:^7.20.7, @babel/plugin-transform-parameters@npm:^7.21.3": version: 7.21.3 resolution: "@babel/plugin-transform-parameters@npm:7.21.3" dependencies: @@ -1106,7 +1106,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.18.6": +"@babel/plugin-transform-regenerator@npm:^7.20.5": version: 7.20.5 resolution: "@babel/plugin-transform-regenerator@npm:7.20.5" dependencies: @@ -1130,10 +1130,10 @@ __metadata: linkType: hard "@babel/plugin-transform-runtime@npm:^7.15.0": - version: 7.21.0 - resolution: "@babel/plugin-transform-runtime@npm:7.21.0" + version: 7.21.4 + resolution: "@babel/plugin-transform-runtime@npm:7.21.4" dependencies: - "@babel/helper-module-imports": ^7.18.6 + "@babel/helper-module-imports": ^7.21.4 "@babel/helper-plugin-utils": ^7.20.2 babel-plugin-polyfill-corejs2: ^0.3.3 babel-plugin-polyfill-corejs3: ^0.6.0 @@ -1141,7 +1141,7 @@ __metadata: semver: ^6.3.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6c9d655bef0caaf998984eea47145bd1a95cfcbad2901c5f31a73b32fa5d1748f5e7abeb962243bcd197d16b1d5a0c9f02198d174c1247de973bbd12559b3a4d + checksum: 7e2e6b0d6f9762fde58738829e4d3b5e13dc88ccc1463e4eee83c8d8f50238eeb8e3699923f5ad4d7edf597515f74d67fbb14eb330225075fc7733b547e22145 languageName: node linkType: hard @@ -1156,7 +1156,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.19.0": +"@babel/plugin-transform-spread@npm:^7.20.7": version: 7.20.7 resolution: "@babel/plugin-transform-spread@npm:7.20.7" dependencies: @@ -1201,7 +1201,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.21.0": +"@babel/plugin-transform-typescript@npm:^7.21.3": version: 7.21.3 resolution: "@babel/plugin-transform-typescript@npm:7.21.3" dependencies: @@ -1239,29 +1239,29 @@ __metadata: linkType: hard "@babel/preset-env@npm:^7.15.0": - version: 7.20.2 - resolution: "@babel/preset-env@npm:7.20.2" + version: 7.21.4 + resolution: "@babel/preset-env@npm:7.21.4" dependencies: - "@babel/compat-data": ^7.20.1 - "@babel/helper-compilation-targets": ^7.20.0 + "@babel/compat-data": ^7.21.4 + "@babel/helper-compilation-targets": ^7.21.4 "@babel/helper-plugin-utils": ^7.20.2 - "@babel/helper-validator-option": ^7.18.6 + "@babel/helper-validator-option": ^7.21.0 "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.18.6 - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.18.9 - "@babel/plugin-proposal-async-generator-functions": ^7.20.1 + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.20.7 + "@babel/plugin-proposal-async-generator-functions": ^7.20.7 "@babel/plugin-proposal-class-properties": ^7.18.6 - "@babel/plugin-proposal-class-static-block": ^7.18.6 + "@babel/plugin-proposal-class-static-block": ^7.21.0 "@babel/plugin-proposal-dynamic-import": ^7.18.6 "@babel/plugin-proposal-export-namespace-from": ^7.18.9 "@babel/plugin-proposal-json-strings": ^7.18.6 - "@babel/plugin-proposal-logical-assignment-operators": ^7.18.9 + "@babel/plugin-proposal-logical-assignment-operators": ^7.20.7 "@babel/plugin-proposal-nullish-coalescing-operator": ^7.18.6 "@babel/plugin-proposal-numeric-separator": ^7.18.6 - "@babel/plugin-proposal-object-rest-spread": ^7.20.2 + "@babel/plugin-proposal-object-rest-spread": ^7.20.7 "@babel/plugin-proposal-optional-catch-binding": ^7.18.6 - "@babel/plugin-proposal-optional-chaining": ^7.18.9 + "@babel/plugin-proposal-optional-chaining": ^7.21.0 "@babel/plugin-proposal-private-methods": ^7.18.6 - "@babel/plugin-proposal-private-property-in-object": ^7.18.6 + "@babel/plugin-proposal-private-property-in-object": ^7.21.0 "@babel/plugin-proposal-unicode-property-regex": ^7.18.6 "@babel/plugin-syntax-async-generators": ^7.8.4 "@babel/plugin-syntax-class-properties": ^7.12.13 @@ -1278,40 +1278,40 @@ __metadata: "@babel/plugin-syntax-optional-chaining": ^7.8.3 "@babel/plugin-syntax-private-property-in-object": ^7.14.5 "@babel/plugin-syntax-top-level-await": ^7.14.5 - "@babel/plugin-transform-arrow-functions": ^7.18.6 - "@babel/plugin-transform-async-to-generator": ^7.18.6 + "@babel/plugin-transform-arrow-functions": ^7.20.7 + "@babel/plugin-transform-async-to-generator": ^7.20.7 "@babel/plugin-transform-block-scoped-functions": ^7.18.6 - "@babel/plugin-transform-block-scoping": ^7.20.2 - "@babel/plugin-transform-classes": ^7.20.2 - "@babel/plugin-transform-computed-properties": ^7.18.9 - "@babel/plugin-transform-destructuring": ^7.20.2 + "@babel/plugin-transform-block-scoping": ^7.21.0 + "@babel/plugin-transform-classes": ^7.21.0 + "@babel/plugin-transform-computed-properties": ^7.20.7 + "@babel/plugin-transform-destructuring": ^7.21.3 "@babel/plugin-transform-dotall-regex": ^7.18.6 "@babel/plugin-transform-duplicate-keys": ^7.18.9 "@babel/plugin-transform-exponentiation-operator": ^7.18.6 - "@babel/plugin-transform-for-of": ^7.18.8 + "@babel/plugin-transform-for-of": ^7.21.0 "@babel/plugin-transform-function-name": ^7.18.9 "@babel/plugin-transform-literals": ^7.18.9 "@babel/plugin-transform-member-expression-literals": ^7.18.6 - "@babel/plugin-transform-modules-amd": ^7.19.6 - "@babel/plugin-transform-modules-commonjs": ^7.19.6 - "@babel/plugin-transform-modules-systemjs": ^7.19.6 + "@babel/plugin-transform-modules-amd": ^7.20.11 + "@babel/plugin-transform-modules-commonjs": ^7.21.2 + "@babel/plugin-transform-modules-systemjs": ^7.20.11 "@babel/plugin-transform-modules-umd": ^7.18.6 - "@babel/plugin-transform-named-capturing-groups-regex": ^7.19.1 + "@babel/plugin-transform-named-capturing-groups-regex": ^7.20.5 "@babel/plugin-transform-new-target": ^7.18.6 "@babel/plugin-transform-object-super": ^7.18.6 - "@babel/plugin-transform-parameters": ^7.20.1 + "@babel/plugin-transform-parameters": ^7.21.3 "@babel/plugin-transform-property-literals": ^7.18.6 - "@babel/plugin-transform-regenerator": ^7.18.6 + "@babel/plugin-transform-regenerator": ^7.20.5 "@babel/plugin-transform-reserved-words": ^7.18.6 "@babel/plugin-transform-shorthand-properties": ^7.18.6 - "@babel/plugin-transform-spread": ^7.19.0 + "@babel/plugin-transform-spread": ^7.20.7 "@babel/plugin-transform-sticky-regex": ^7.18.6 "@babel/plugin-transform-template-literals": ^7.18.9 "@babel/plugin-transform-typeof-symbol": ^7.18.9 "@babel/plugin-transform-unicode-escapes": ^7.18.10 "@babel/plugin-transform-unicode-regex": ^7.18.6 "@babel/preset-modules": ^0.1.5 - "@babel/types": ^7.20.2 + "@babel/types": ^7.21.4 babel-plugin-polyfill-corejs2: ^0.3.3 babel-plugin-polyfill-corejs3: ^0.6.0 babel-plugin-polyfill-regenerator: ^0.4.1 @@ -1319,7 +1319,7 @@ __metadata: semver: ^6.3.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ece2d7e9c7789db6116e962b8e1a55eb55c110c44c217f0c8f6ffea4ca234954e66557f7bd019b7affadf7fbb3a53ccc807e93fc935aacd48146234b73b6947e + checksum: 1e328674c4b39e985fa81e5a8eee9aaab353dea4ff1f28f454c5e27a6498c762e25d42e827f5bfc9d7acf6c9b8bc317b5283aa7c83d9fd03c1a89e5c08f334f9 languageName: node linkType: hard @@ -1339,15 +1339,17 @@ __metadata: linkType: hard "@babel/preset-typescript@npm:^7.15.0": - version: 7.21.0 - resolution: "@babel/preset-typescript@npm:7.21.0" + version: 7.21.4 + resolution: "@babel/preset-typescript@npm:7.21.4" dependencies: "@babel/helper-plugin-utils": ^7.20.2 "@babel/helper-validator-option": ^7.21.0 - "@babel/plugin-transform-typescript": ^7.21.0 + "@babel/plugin-syntax-jsx": ^7.21.4 + "@babel/plugin-transform-modules-commonjs": ^7.21.2 + "@babel/plugin-transform-typescript": ^7.21.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6e1f4d7294de2678fbaf36035e98847b2be432f40fe7a1204e5e45b8b05bcbe22902fe0d726e16af14de5bc08987fae28a7899871503fd661050d85f58755af6 + checksum: 83b2f2bf7be3a970acd212177525f58bbb1f2e042b675a47d021a675ae27cf00b6b6babfaf3ae5c980592c9ed1b0712e5197796b691905d25c99f9006478ea06 languageName: node linkType: hard @@ -1378,32 +1380,32 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.16.0, @babel/traverse@npm:^7.20.5, @babel/traverse@npm:^7.20.7, @babel/traverse@npm:^7.21.0, @babel/traverse@npm:^7.21.2, @babel/traverse@npm:^7.21.3, @babel/traverse@npm:^7.7.2": - version: 7.21.3 - resolution: "@babel/traverse@npm:7.21.3" +"@babel/traverse@npm:^7.16.0, @babel/traverse@npm:^7.20.5, @babel/traverse@npm:^7.20.7, @babel/traverse@npm:^7.21.0, @babel/traverse@npm:^7.21.2, @babel/traverse@npm:^7.21.4, @babel/traverse@npm:^7.7.2": + version: 7.21.4 + resolution: "@babel/traverse@npm:7.21.4" dependencies: - "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.21.3 + "@babel/code-frame": ^7.21.4 + "@babel/generator": ^7.21.4 "@babel/helper-environment-visitor": ^7.18.9 "@babel/helper-function-name": ^7.21.0 "@babel/helper-hoist-variables": ^7.18.6 "@babel/helper-split-export-declaration": ^7.18.6 - "@babel/parser": ^7.21.3 - "@babel/types": ^7.21.3 + "@babel/parser": ^7.21.4 + "@babel/types": ^7.21.4 debug: ^4.1.0 globals: ^11.1.0 - checksum: 0af5bcd47a2fc501592b90ac1feae9d449afb9ab0772a4f6e68230f4cd3a475795d538c1de3f880fe3414b6c2820bac84d02c6549eea796f39d74a603717447b + checksum: f22f067c2d9b6497abf3d4e53ea71f3aa82a21f2ed434dd69b8c5767f11f2a4c24c8d2f517d2312c9e5248e5c69395fdca1c95a2b3286122c75f5783ddb6f53c languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.5, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.2, @babel/types@npm:^7.21.3, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.21.3 - resolution: "@babel/types@npm:7.21.3" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.5, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.2, @babel/types@npm:^7.21.4, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": + version: 7.21.4 + resolution: "@babel/types@npm:7.21.4" dependencies: "@babel/helper-string-parser": ^7.19.4 "@babel/helper-validator-identifier": ^7.19.1 to-fast-properties: ^2.0.0 - checksum: b750274718ba9cefd0b81836c464009bb6ba339fccce51b9baff497a0a2d96c044c61dc90cf203cec0adc770454b53a9681c3f7716883c802b85ab84c365ba35 + checksum: 587bc55a91ce003b0f8aa10d70070f8006560d7dc0360dc0406d306a2cb2a10154e2f9080b9c37abec76907a90b330a536406cb75e6bdc905484f37b75c73219 languageName: node linkType: hard @@ -1639,9 +1641,9 @@ __metadata: linkType: hard "@eslint-community/regexpp@npm:^4.4.0": - version: 4.4.1 - resolution: "@eslint-community/regexpp@npm:4.4.1" - checksum: db97d8d08e784147b55ab0dda5892503c1a0eebad94d1c4646d89a94f02ca70b25f05d8e021fc05a075e7eb312e03e21f63d84f0b327719f8cf3bb64e66917cb + version: 4.5.0 + resolution: "@eslint-community/regexpp@npm:4.5.0" + checksum: 99c01335947dbd7f2129e954413067e217ccaa4e219fe0917b7d2bd96135789384b8fedbfb8eb09584d5130b27a7b876a7150ab7376f51b3a0c377d5ce026a10 languageName: node linkType: hard @@ -1701,13 +1703,6 @@ __metadata: languageName: node linkType: hard -"@hutson/parse-repository-url@npm:^3.0.0": - version: 3.0.2 - resolution: "@hutson/parse-repository-url@npm:3.0.2" - checksum: 39992c5f183c5ca3d761d6ed9dfabcb79b5f3750bf1b7f3532e1dc439ca370138bbd426ee250fdaba460bc948e6761fbefd484b8f4f36885d71ded96138340d1 - languageName: node - linkType: hard - "@istanbuljs/load-nyc-config@npm:^1.0.0": version: 1.1.0 resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" @@ -2225,19 +2220,7 @@ __metadata: version: 0.0.0-use.local resolution: "@jscutlery/semver@workspace:packages/semver" dependencies: - "@types/conventional-changelog": ^3.1.1 - "@types/conventional-recommended-bump": 6.1.0 - "@types/inquirer": 8.2.6 - "@types/rimraf": 3.0.2 - "@types/semver": 7.3.13 - "@types/standard-version": 7.0.1 - "@types/tmp": 0.2.3 - chalk: 4.1.2 - conventional-changelog: ^3.1.25 - conventional-recommended-bump: ^6.1.0 - detect-indent: 6.1.0 - inquirer: 8.2.5 - rxjs: 7.8.0 + zod: 3.20.2 peerDependencies: "@nrwl/devkit": ^15.0.0 languageName: unknown @@ -2668,90 +2651,6 @@ __metadata: languageName: node linkType: hard -"@types/conventional-changelog-config-spec@npm:*": - version: 2.1.2 - resolution: "@types/conventional-changelog-config-spec@npm:2.1.2" - dependencies: - "@types/json-schema": "*" - checksum: 2a5bf822d66568af0892f38357616800c95c3dbe40efadb552d56e3609d07a0c9f93f2c71374fadfc25874c6786bd0b5f7597cf7936eea37de1790b1b50e4775 - languageName: node - linkType: hard - -"@types/conventional-changelog-core@npm:*": - version: 4.2.1 - resolution: "@types/conventional-changelog-core@npm:4.2.1" - dependencies: - "@types/conventional-changelog-writer": "*" - "@types/conventional-commits-parser": "*" - "@types/conventional-recommended-bump": "*" - "@types/git-raw-commits": "*" - "@types/node": "*" - "@types/normalize-package-data": "*" - checksum: bd8557c1cb2cfc225d728e874eca794ef75270dcfaa1681efe4599c5fdd69d8352a10526f07321b870c7c6a23df1b2a21508dd5317255ab71dd65f2eadbad44c - languageName: node - linkType: hard - -"@types/conventional-changelog-writer@npm:*": - version: 4.0.2 - resolution: "@types/conventional-changelog-writer@npm:4.0.2" - dependencies: - "@types/conventional-commits-parser": "*" - "@types/node": "*" - checksum: e992a0847f7611e515498dd7c26d774ecda39b35a08ac8d2f01f9a1684794afe25c03feb8235e1567e64224842febf8d25da60a70c32fff09cbab5a89eb0bbb8 - languageName: node - linkType: hard - -"@types/conventional-changelog@npm:^3.1.1": - version: 3.1.1 - resolution: "@types/conventional-changelog@npm:3.1.1" - dependencies: - "@types/conventional-changelog-core": "*" - "@types/conventional-changelog-writer": "*" - "@types/conventional-commits-parser": "*" - "@types/node": "*" - checksum: 9278f6603fd5594ede86d1c48bdd12f5871564a9070e4c3df6e60f83a723e55e2fb878e572648e92ccb99bea21074090633562240cebb6106c93f930a6cbd442 - languageName: node - linkType: hard - -"@types/conventional-commits-parser@npm:*": - version: 3.0.3 - resolution: "@types/conventional-commits-parser@npm:3.0.3" - dependencies: - "@types/node": "*" - checksum: d40c0685380f160ec4c9f4287c03d1ffe9572eb5805865db1e03a31791da0357457ba389b2b532f9daa4aca3315c6344e822d7d619f082338f23ea01e6423e09 - languageName: node - linkType: hard - -"@types/conventional-recommended-bump@npm:*, @types/conventional-recommended-bump@npm:6.1.0": - version: 6.1.0 - resolution: "@types/conventional-recommended-bump@npm:6.1.0" - dependencies: - "@types/conventional-changelog-core": "*" - "@types/conventional-changelog-writer": "*" - "@types/conventional-commits-parser": "*" - checksum: 123c0d7a3b9cbf3e4a55f5d0bc9a889e65ccfc22a88543e43b73fb840c5a9c5b386285e5a1c873d86af405dae94c957b3f2401c8b86ee9dcd880558c8a1c79f3 - languageName: node - linkType: hard - -"@types/git-raw-commits@npm:*": - version: 2.0.1 - resolution: "@types/git-raw-commits@npm:2.0.1" - dependencies: - "@types/node": "*" - checksum: b5d41433a5201b8fbd475d29d08df77d60a402acfdba9703125eab96449a7040721d698e8bad8debbb3377338e08c3d75faab409e2e2b47b6f0a66f535d1594f - languageName: node - linkType: hard - -"@types/glob@npm:*": - version: 8.1.0 - resolution: "@types/glob@npm:8.1.0" - dependencies: - "@types/minimatch": ^5.1.2 - "@types/node": "*" - checksum: 9101f3a9061e40137190f70626aa0e202369b5ec4012c3fabe6f5d229cce04772db9a94fa5a0eb39655e2e4ad105c38afbb4af56a56c0996a8c7d4fc72350e3d - languageName: node - linkType: hard - "@types/graceful-fs@npm:^4.1.3": version: 4.1.6 resolution: "@types/graceful-fs@npm:4.1.6" @@ -2761,16 +2660,6 @@ __metadata: languageName: node linkType: hard -"@types/inquirer@npm:8.2.6": - version: 8.2.6 - resolution: "@types/inquirer@npm:8.2.6" - dependencies: - "@types/through": "*" - rxjs: ^7.2.0 - checksum: d09c3b6bbfb1aff8bdb8fc938d43536be55dfb51af0c91d0105e3f7c5e3950c12618ac00e2e91f10b5abeba38f4b903289be1df5aa31f213b58c3cc675a19f81 - languageName: node - linkType: hard - "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": version: 2.0.4 resolution: "@types/istanbul-lib-coverage@npm:2.0.4" @@ -2806,20 +2695,13 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:^7.0.9": version: 7.0.11 resolution: "@types/json-schema@npm:7.0.11" checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d languageName: node linkType: hard -"@types/minimatch@npm:^5.1.2": - version: 5.1.2 - resolution: "@types/minimatch@npm:5.1.2" - checksum: 0391a282860c7cb6fe262c12b99564732401bdaa5e395bee9ca323c312c1a0f45efbf34dce974682036e857db59a5c9b1da522f3d6055aeead7097264c8705a8 - languageName: node - linkType: hard - "@types/minimist@npm:^1.2.0": version: 1.2.2 resolution: "@types/minimist@npm:1.2.2" @@ -2827,21 +2709,23 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*": - version: 18.15.10 - resolution: "@types/node@npm:18.15.10" - checksum: 9aeae0b683eda82892def5315812bdee3f1a28c4898b7e70f8e2514564538b16c4dccbe8339c1266f8fc1d707a48f152689264a854f5ebc2eba5011e793612d9 +"@types/mock-fs@npm:^4.13.1": + version: 4.13.1 + resolution: "@types/mock-fs@npm:4.13.1" + dependencies: + "@types/node": "*" + checksum: a5fcf8212daa270e6aa560019a4bd28a66e6fa49c55c1373746d5894f4aa1aafa5588335194953cf014de3c77df6be67a041fb6638ead7124307370985880b6c languageName: node linkType: hard -"@types/node@npm:^18.0.0": +"@types/node@npm:*, @types/node@npm:^18.0.0": version: 18.15.11 resolution: "@types/node@npm:18.15.11" checksum: 977b4ad04708897ff0eb049ecf82246d210939c82461922d20f7d2dcfd81bbc661582ba3af28869210f7e8b1934529dcd46bff7d448551400f9d48b9d3bddec3 languageName: node linkType: hard -"@types/normalize-package-data@npm:*, @types/normalize-package-data@npm:^2.4.0": +"@types/normalize-package-data@npm:^2.4.0": version: 2.4.1 resolution: "@types/normalize-package-data@npm:2.4.1" checksum: e87bccbf11f95035c89a132b52b79ce69a1e3652fe55962363063c9c0dae0fe2477ebc585e03a9652adc6f381d24ba5589cc5e51849df4ced3d3e004a7d40ed5 @@ -2862,17 +2746,7 @@ __metadata: languageName: node linkType: hard -"@types/rimraf@npm:3.0.2": - version: 3.0.2 - resolution: "@types/rimraf@npm:3.0.2" - dependencies: - "@types/glob": "*" - "@types/node": "*" - checksum: b47fa302f46434cba704d20465861ad250df79467d3d289f9d6490d3aeeb41e8cb32dd80bd1a8fd833d1e185ac719fbf9be12e05ad9ce9be094d8ee8f1405347 - languageName: node - linkType: hard - -"@types/semver@npm:7.3.13, @types/semver@npm:^7.3.12": +"@types/semver@npm:^7.3.12": version: 7.3.13 resolution: "@types/semver@npm:7.3.13" checksum: 00c0724d54757c2f4bc60b5032fe91cda6410e48689633d5f35ece8a0a66445e3e57fa1d6e07eb780f792e82ac542948ec4d0b76eb3484297b79bd18b8cf1cb0 @@ -2886,32 +2760,6 @@ __metadata: languageName: node linkType: hard -"@types/standard-version@npm:7.0.1": - version: 7.0.1 - resolution: "@types/standard-version@npm:7.0.1" - dependencies: - "@types/conventional-changelog-config-spec": "*" - "@types/node": "*" - checksum: ad0828b410cb0e355373f7bc3f3cba9684c9b10c81c7c78caf3084bcfc06fe5cba3e65f7994cd167e4b309d8c1d9c0ed3cc796d30739106ea0bd8788ee6ef4df - languageName: node - linkType: hard - -"@types/through@npm:*": - version: 0.0.30 - resolution: "@types/through@npm:0.0.30" - dependencies: - "@types/node": "*" - checksum: 9578470db0b527c26e246a1220ae9bffc6bf47f20f89c54aac467c083ab1f7e16c00d9a7b4bb6cb4e2dfae465027270827e5908a6236063f6214625e50585d78 - languageName: node - linkType: hard - -"@types/tmp@npm:0.2.3": - version: 0.2.3 - resolution: "@types/tmp@npm:0.2.3" - checksum: 0ca45e99b3b3c6959d5c4f4555f73c8007db540cfb0fbbb9373217f9ab85e67eef75193f51a1d6564b0ee6c6f5ffa259d1034d7f7530a5b7ce80acb94cfc4daa - languageName: node - linkType: hard - "@types/yargs-parser@npm:*": version: 21.0.0 resolution: "@types/yargs-parser@npm:21.0.0" @@ -2920,11 +2768,11 @@ __metadata: linkType: hard "@types/yargs@npm:^17.0.8": - version: 17.0.23 - resolution: "@types/yargs@npm:17.0.23" + version: 17.0.24 + resolution: "@types/yargs@npm:17.0.24" dependencies: "@types/yargs-parser": "*" - checksum: c5f787d7a9a36ea94ba5d3f340fc5d93d2860eff8fa9731cd614ed23212e4fca75637e2386e37e376a720e4bf088ceed6f39050f1c3638fc1b75bce5c70b1ad4 + checksum: 5f3ac4dc4f6e211c1627340160fbe2fd247ceba002190da6cf9155af1798450501d628c9165a183f30a224fc68fa5e700490d740ff4c73e2cdef95bc4e8ba7bf languageName: node linkType: hard @@ -2969,16 +2817,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.56.0": - version: 5.56.0 - resolution: "@typescript-eslint/scope-manager@npm:5.56.0" - dependencies: - "@typescript-eslint/types": 5.56.0 - "@typescript-eslint/visitor-keys": 5.56.0 - checksum: bacac255ee52148cee6622be2811c0d7e25419058b89f1a11f4c1303faef4535a0a1237549f9556ec1d7a297c640ce4357183a1a8465d72e1393b7d8fb43874b - languageName: node - linkType: hard - "@typescript-eslint/scope-manager@npm:5.57.0": version: 5.57.0 resolution: "@typescript-eslint/scope-manager@npm:5.57.0" @@ -3006,13 +2844,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:5.56.0": - version: 5.56.0 - resolution: "@typescript-eslint/types@npm:5.56.0" - checksum: 82ca11553bbb1bbfcaf7e7760b03c0d898940238dc002552c21af3e58f7d482c64c3c6cf0666521aff2a1e7b4b58bb6e4d9a00b1e4998a16b5039f5d288d003a - languageName: node - linkType: hard - "@typescript-eslint/types@npm:5.57.0": version: 5.57.0 resolution: "@typescript-eslint/types@npm:5.57.0" @@ -3020,24 +2851,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.56.0": - version: 5.56.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.56.0" - dependencies: - "@typescript-eslint/types": 5.56.0 - "@typescript-eslint/visitor-keys": 5.56.0 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.3.7 - tsutils: ^3.21.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: ec3e85201786aa9adddba7cb834a9f330a7f55c729ee9ccf847dbdc2f7437b760f3774152ccad6d0aa48d13fd78df766c880e3a7ca42e01a20aba0e1a1ed61c5 - languageName: node - linkType: hard - "@typescript-eslint/typescript-estree@npm:5.57.0": version: 5.57.0 resolution: "@typescript-eslint/typescript-estree@npm:5.57.0" @@ -3056,7 +2869,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.57.0": +"@typescript-eslint/utils@npm:5.57.0, @typescript-eslint/utils@npm:^5.36.1": version: 5.57.0 resolution: "@typescript-eslint/utils@npm:5.57.0" dependencies: @@ -3074,34 +2887,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:^5.36.1": - version: 5.56.0 - resolution: "@typescript-eslint/utils@npm:5.56.0" - dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@types/json-schema": ^7.0.9 - "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.56.0 - "@typescript-eslint/types": 5.56.0 - "@typescript-eslint/typescript-estree": 5.56.0 - eslint-scope: ^5.1.1 - semver: ^7.3.7 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 413e8d4bf7023ee5ba4f695b62e796a1f94930bb92fe5aa0cee58f63b9837116c23f618825a9c671f610e50f5630188b6059b4ed6b05a2a3336f01d8e977becb - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:5.56.0": - version: 5.56.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.56.0" - dependencies: - "@typescript-eslint/types": 5.56.0 - eslint-visitor-keys: ^3.3.0 - checksum: 568fda40134e153d7befb59b55698f7919ba780d2d3431d8745feabf2e0fbb8aa7a02173b3c467dd20a0f6594e5248a1f82bb25d6c37827716d77452e86cad29 - languageName: node - linkType: hard - "@typescript-eslint/visitor-keys@npm:5.57.0": version: 5.57.0 resolution: "@typescript-eslint/visitor-keys@npm:5.57.0" @@ -3120,12 +2905,12 @@ __metadata: linkType: hard "@yarnpkg/parsers@npm:^3.0.0-rc.18": - version: 3.0.0-rc.40 - resolution: "@yarnpkg/parsers@npm:3.0.0-rc.40" + version: 3.0.0-rc.42 + resolution: "@yarnpkg/parsers@npm:3.0.0-rc.42" dependencies: js-yaml: ^3.10.0 tslib: ^2.4.0 - checksum: 64df0d8dad4cd43af5fcff758b0cfc47e7dc56e00eed87e3bd6ce8a9ea265c41fe758c1e01607e630bae46c9f8324ca853bced58be3d1c93492e125757ab7f30 + checksum: 147216f53d683ac2b0b4a68e6cda77b7194d70db5ad3b0b6863129b6f1e36054de5cd5c707707fc36921e110d3ac1cb6a0f51fc9e8d74a4a4123ec3b93d3951e languageName: node linkType: hard @@ -3184,13 +2969,6 @@ __metadata: languageName: node linkType: hard -"add-stream@npm:^1.0.0": - version: 1.0.0 - resolution: "add-stream@npm:1.0.0" - checksum: 3e9e8b0b8f0170406d7c3a9a39bfbdf419ccccb0fd2a396338c0fda0a339af73bf738ad414fc520741de74517acf0dd92b4a36fd3298a47fd5371eee8f2c5a06 - languageName: node - linkType: hard - "agent-base@npm:6, agent-base@npm:^6.0.2": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -3784,19 +3562,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001449": - version: 1.0.30001470 - resolution: "caniuse-lite@npm:1.0.30001470" - checksum: 14ce3cf17c90960309b82256b991c546a53aa321efae973578954faf5256a88dec1eaebe6bea516cfca04ea146787a89664a09b254df72da5c3ec4a95b5f319f - languageName: node - linkType: hard - -"chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + version: 1.0.30001473 + resolution: "caniuse-lite@npm:1.0.30001473" + checksum: 007ad17463612d38080fc59b5fa115ccb1016a1aff8daab92199a7cf8eb91cf987e85e7015cb0bca830ee2ef45f252a016c29a98a6497b334cceb038526b73f1 languageName: node linkType: hard @@ -3811,6 +3579,16 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + "char-regex@npm:^1.0.2": version: 1.0.2 resolution: "char-regex@npm:1.0.2" @@ -4030,18 +3808,6 @@ __metadata: languageName: node linkType: hard -"concat-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "concat-stream@npm:2.0.0" - dependencies: - buffer-from: ^1.0.0 - inherits: ^2.0.3 - readable-stream: ^3.0.2 - typedarray: ^0.0.6 - checksum: d7f75d48f0ecd356c1545d87e22f57b488172811b1181d96021c7c4b14ab8855f5313280263dca44bb06e5222f274d047da3e290a38841ef87b59719bde967c7 - languageName: node - linkType: hard - "confusing-browser-globals@npm:^1.0.9": version: 1.0.11 resolution: "confusing-browser-globals@npm:1.0.11" @@ -4056,7 +3822,7 @@ __metadata: languageName: node linkType: hard -"conventional-changelog-angular@npm:^5.0.11, conventional-changelog-angular@npm:^5.0.12": +"conventional-changelog-angular@npm:^5.0.11": version: 5.0.13 resolution: "conventional-changelog-angular@npm:5.0.13" dependencies: @@ -4066,159 +3832,7 @@ __metadata: languageName: node linkType: hard -"conventional-changelog-atom@npm:^2.0.8": - version: 2.0.8 - resolution: "conventional-changelog-atom@npm:2.0.8" - dependencies: - q: ^1.5.1 - checksum: 12ecbd928f8c261f9afaac067fcc0cf10ff6ac8505e4285dc3d9959ee072a8937ac942d505e850dce27c4527046009adb22b498ba0b10802916d2c7d2dc1f7bc - languageName: node - linkType: hard - -"conventional-changelog-codemirror@npm:^2.0.8": - version: 2.0.8 - resolution: "conventional-changelog-codemirror@npm:2.0.8" - dependencies: - q: ^1.5.1 - checksum: cf331db40cc54c2353b0189aba26a2b959cb08b059bf2a81245272027371519c9acc90d574295782985829c50f0c52da60c952c70ec6dbd70e9e17affeb61453 - languageName: node - linkType: hard - -"conventional-changelog-conventionalcommits@npm:^4.5.0": - version: 4.6.3 - resolution: "conventional-changelog-conventionalcommits@npm:4.6.3" - dependencies: - compare-func: ^2.0.0 - lodash: ^4.17.15 - q: ^1.5.1 - checksum: 7b8e8a21ebb56f9aaa510e12917b7c609202072c3e71089e0a09630c37c2e8146cdb04364809839b0e3eb55f807fe84d03b2079500b37f6186d505848be5c562 - languageName: node - linkType: hard - -"conventional-changelog-core@npm:^4.2.1": - version: 4.2.4 - resolution: "conventional-changelog-core@npm:4.2.4" - dependencies: - add-stream: ^1.0.0 - conventional-changelog-writer: ^5.0.0 - conventional-commits-parser: ^3.2.0 - dateformat: ^3.0.0 - get-pkg-repo: ^4.0.0 - git-raw-commits: ^2.0.8 - git-remote-origin-url: ^2.0.0 - git-semver-tags: ^4.1.1 - lodash: ^4.17.15 - normalize-package-data: ^3.0.0 - q: ^1.5.1 - read-pkg: ^3.0.0 - read-pkg-up: ^3.0.0 - through2: ^4.0.0 - checksum: 56d5194040495ea316e53fd64cb3614462c318f0fe54b1bf25aba6fba9b3d51cb9fdf7ac5b766f17e5529a3f90e317257394e00b0a9a5ce42caf3a59f82afb3a - languageName: node - linkType: hard - -"conventional-changelog-ember@npm:^2.0.9": - version: 2.0.9 - resolution: "conventional-changelog-ember@npm:2.0.9" - dependencies: - q: ^1.5.1 - checksum: 30c7bd48ce995e39fc91bcd8c719b2bee10cb408c246a6a7de6cec44a3ca12afe5a86f57f55aa1fd2c64beb484c68013d16658047e6273f130c1c80e7dad38e9 - languageName: node - linkType: hard - -"conventional-changelog-eslint@npm:^3.0.9": - version: 3.0.9 - resolution: "conventional-changelog-eslint@npm:3.0.9" - dependencies: - q: ^1.5.1 - checksum: 402ae73a8c5390405d4f902819f630f56fa7dfa8f6bef77b3b5f2fb7c8bd17f64ad83edbacc030cfef5b84400ab722d4f166dd906296a4d286e66205c1bd8a3f - languageName: node - linkType: hard - -"conventional-changelog-express@npm:^2.0.6": - version: 2.0.6 - resolution: "conventional-changelog-express@npm:2.0.6" - dependencies: - q: ^1.5.1 - checksum: c139fa9878971455cce9904a195d92f770679d24a88ef07a016a6954e28f0f237ec59e45f2591b2fc9b8e10fd46c30150ddf0ce50a2cb03be85cae0ee64d4cdd - languageName: node - linkType: hard - -"conventional-changelog-jquery@npm:^3.0.11": - version: 3.0.11 - resolution: "conventional-changelog-jquery@npm:3.0.11" - dependencies: - q: ^1.5.1 - checksum: df1145467c75e8e61f35ed24d7539e8b7dcdc810b86267b0173420c8955590cca139eb51f89ac255d70c632433d996b0ed227cb1acdf59537f3d2f4ad9c770d3 - languageName: node - linkType: hard - -"conventional-changelog-jshint@npm:^2.0.9": - version: 2.0.9 - resolution: "conventional-changelog-jshint@npm:2.0.9" - dependencies: - compare-func: ^2.0.0 - q: ^1.5.1 - checksum: ec96144b75fdb84c4a6f7db9b671dc258d964cd7aa35f9b00539e42bbe05601a9127c17cf0dcc315ae81a0dd20fe795d9d41dd90373928d24b33f065728eb2e2 - languageName: node - linkType: hard - -"conventional-changelog-preset-loader@npm:^2.3.4": - version: 2.3.4 - resolution: "conventional-changelog-preset-loader@npm:2.3.4" - checksum: 23a889b7fcf6fe7653e61f32a048877b2f954dcc1e0daa2848c5422eb908e6f24c78372f8d0d2130b5ed941c02e7010c599dccf44b8552602c6c8db9cb227453 - languageName: node - linkType: hard - -"conventional-changelog-writer@npm:^5.0.0": - version: 5.0.1 - resolution: "conventional-changelog-writer@npm:5.0.1" - dependencies: - conventional-commits-filter: ^2.0.7 - dateformat: ^3.0.0 - handlebars: ^4.7.7 - json-stringify-safe: ^5.0.1 - lodash: ^4.17.15 - meow: ^8.0.0 - semver: ^6.0.0 - split: ^1.0.0 - through2: ^4.0.0 - bin: - conventional-changelog-writer: cli.js - checksum: 5c0129db44577f14b1f8de225b62a392a9927ba7fe3422cb21ad71a771b8472bd03badb7c87cb47419913abc3f2ce3759b69f59550cdc6f7a7b0459015b3b44c - languageName: node - linkType: hard - -"conventional-changelog@npm:^3.1.25": - version: 3.1.25 - resolution: "conventional-changelog@npm:3.1.25" - dependencies: - conventional-changelog-angular: ^5.0.12 - conventional-changelog-atom: ^2.0.8 - conventional-changelog-codemirror: ^2.0.8 - conventional-changelog-conventionalcommits: ^4.5.0 - conventional-changelog-core: ^4.2.1 - conventional-changelog-ember: ^2.0.9 - conventional-changelog-eslint: ^3.0.9 - conventional-changelog-express: ^2.0.6 - conventional-changelog-jquery: ^3.0.11 - conventional-changelog-jshint: ^2.0.9 - conventional-changelog-preset-loader: ^2.3.4 - checksum: 1ea18378120cca9fd459f58ed2cf59170773cbfb2fcecad2504c7c44af076c368950013fa16f5e9428f1d723bea4c16e0c48170e152568b73b254a9c1bb93287 - languageName: node - linkType: hard - -"conventional-commits-filter@npm:^2.0.7": - version: 2.0.7 - resolution: "conventional-commits-filter@npm:2.0.7" - dependencies: - lodash.ismatch: ^4.4.0 - modify-values: ^1.0.0 - checksum: feb567f680a6da1baaa1ef3cff393b3c56a5828f77ab9df5e70626475425d109a6fee0289b4979223c62bbd63bf9c98ef532baa6fcb1b66ee8b5f49077f5d46c - languageName: node - linkType: hard - -"conventional-commits-parser@npm:^3.2.0, conventional-commits-parser@npm:^3.2.2": +"conventional-commits-parser@npm:^3.2.2": version: 3.2.4 resolution: "conventional-commits-parser@npm:3.2.4" dependencies: @@ -4234,24 +3848,6 @@ __metadata: languageName: node linkType: hard -"conventional-recommended-bump@npm:^6.1.0": - version: 6.1.0 - resolution: "conventional-recommended-bump@npm:6.1.0" - dependencies: - concat-stream: ^2.0.0 - conventional-changelog-preset-loader: ^2.3.4 - conventional-commits-filter: ^2.0.7 - conventional-commits-parser: ^3.2.0 - git-raw-commits: ^2.0.8 - git-semver-tags: ^4.1.1 - meow: ^8.0.0 - q: ^1.5.1 - bin: - conventional-recommended-bump: cli.js - checksum: da1d7a5f3b9f7706bede685cdcb3db67997fdaa43c310fd5bf340955c84a4b85dbb9427031522ee06dad290b730a54be987b08629d79c73720dbad3a2531146b - languageName: node - linkType: hard - "convert-source-map@npm:^1.4.0, convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0": version: 1.9.0 resolution: "convert-source-map@npm:1.9.0" @@ -4275,13 +3871,6 @@ __metadata: languageName: node linkType: hard -"core-util-is@npm:~1.0.0": - version: 1.0.3 - resolution: "core-util-is@npm:1.0.3" - checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 - languageName: node - linkType: hard - "cosmiconfig-typescript-loader@npm:^4.0.0": version: 4.3.0 resolution: "cosmiconfig-typescript-loader@npm:4.3.0" @@ -4344,13 +3933,6 @@ __metadata: languageName: node linkType: hard -"dateformat@npm:^3.0.0": - version: 3.0.3 - resolution: "dateformat@npm:3.0.3" - checksum: ca4911148abb09887bd9bdcd632c399b06f3ecad709a18eb594d289a1031982f441e08e281db77ffebcb2cbcbfa1ac578a7cbfbf8743f41009aa5adc1846ed34 - languageName: node - linkType: hard - "debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" @@ -4438,13 +4020,6 @@ __metadata: languageName: node linkType: hard -"detect-indent@npm:6.1.0": - version: 6.1.0 - resolution: "detect-indent@npm:6.1.0" - checksum: ab953a73c72dbd4e8fc68e4ed4bfd92c97eb6c43734af3900add963fd3a9316f3bc0578b018b24198d4c31a358571eff5f0656e81a1f3b9ad5c547d58b2d093d - languageName: node - linkType: hard - "detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -4540,9 +4115,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.284": - version: 1.4.340 - resolution: "electron-to-chromium@npm:1.4.340" - checksum: b7ffa64814efa49891c23ca0560f6831a992fa904c463bbf635ceccd57821dd0f4ecc22fa066860d34d9614b0ef4b27b385a5f59aed5dcf73ed832d58f746780 + version: 1.4.348 + resolution: "electron-to-chromium@npm:1.4.348" + checksum: 662491cd395de9eb7f400f139d8abc9a5e6dd33ff2b0eb71c060bdd7570f16ed876e0a57485dec2c42d55ad875f6c9d8f68f72f2ad3d8e1b2ab2cb4c20ee7bc5 languageName: node linkType: hard @@ -4676,14 +4251,7 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0": - version: 3.3.0 - resolution: "eslint-visitor-keys@npm:3.3.0" - checksum: d59e68a7c5a6d0146526b0eec16ce87fbf97fe46b8281e0d41384224375c4e52f5ffb9e16d48f4ea50785cde93f766b0c898e31ab89978d88b0e1720fbfb7808 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.4.0": +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.0": version: 3.4.0 resolution: "eslint-visitor-keys@npm:3.4.0" checksum: 33159169462d3989321a1ec1e9aaaf6a24cc403d5d347e9886d1b5bfe18ffa1be73bdc6203143a28a606b142b1af49787f33cff0d6d0813eb5f2e8d2e1a6043c @@ -4962,15 +4530,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^2.0.0": - version: 2.1.0 - resolution: "find-up@npm:2.1.0" - dependencies: - locate-path: ^2.0.0 - checksum: 43284fe4da09f89011f08e3c32cd38401e786b19226ea440b75386c1b12a4cb738c94969808d53a84f564ede22f732c8409e3cfc3f7fb5b5c32378ad0bbf28bd - languageName: node - linkType: hard - "find-up@npm:^4.0.0, find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" @@ -5065,6 +4624,13 @@ __metadata: languageName: node linkType: hard +"fs-monkey@npm:^1.0.3": + version: 1.0.3 + resolution: "fs-monkey@npm:1.0.3" + checksum: cf50804833f9b88a476911ae911fe50f61a98d986df52f890bd97e7262796d023698cb2309fa9b74fdd8974f04315b648748a0a8ee059e7d5257b293bfc409c0 + languageName: node + linkType: hard + "fs.realpath@npm:^1.0.0": version: 1.0.0 resolution: "fs.realpath@npm:1.0.0" @@ -5135,20 +4701,6 @@ __metadata: languageName: node linkType: hard -"get-pkg-repo@npm:^4.0.0": - version: 4.2.1 - resolution: "get-pkg-repo@npm:4.2.1" - dependencies: - "@hutson/parse-repository-url": ^3.0.0 - hosted-git-info: ^4.0.0 - through2: ^2.0.0 - yargs: ^16.2.0 - bin: - get-pkg-repo: src/cli.js - checksum: 5abf169137665e45b09a857b33ad2fdcf2f4a09f0ecbd0ebdd789a7ce78c39186a21f58621127eb724d2d4a3a7ee8e6bd4ac7715efda01ad5200665afc218e0d - languageName: node - linkType: hard - "get-stream@npm:^6.0.0": version: 6.0.1 resolution: "get-stream@npm:6.0.1" @@ -5156,7 +4708,7 @@ __metadata: languageName: node linkType: hard -"git-raw-commits@npm:^2.0.11, git-raw-commits@npm:^2.0.8": +"git-raw-commits@npm:^2.0.11": version: 2.0.11 resolution: "git-raw-commits@npm:2.0.11" dependencies: @@ -5171,37 +4723,6 @@ __metadata: languageName: node linkType: hard -"git-remote-origin-url@npm:^2.0.0": - version: 2.0.0 - resolution: "git-remote-origin-url@npm:2.0.0" - dependencies: - gitconfiglocal: ^1.0.0 - pify: ^2.3.0 - checksum: 85263a09c044b5f4fe2acc45cbb3c5331ab2bd4484bb53dfe7f3dd593a4bf90a9786a2e00b9884524331f50b3da18e8c924f01c2944087fc7f342282c4437b73 - languageName: node - linkType: hard - -"git-semver-tags@npm:^4.1.1": - version: 4.1.1 - resolution: "git-semver-tags@npm:4.1.1" - dependencies: - meow: ^8.0.0 - semver: ^6.0.0 - bin: - git-semver-tags: cli.js - checksum: e16d02a515c0f88289a28b5bf59bf42c0dc053765922d3b617ae4b50546bd4f74a25bf3ad53b91cb6c1159319a2e92533b160c573b856c2629125c8b26b3b0e3 - languageName: node - linkType: hard - -"gitconfiglocal@npm:^1.0.0": - version: 1.0.0 - resolution: "gitconfiglocal@npm:1.0.0" - dependencies: - ini: ^1.3.2 - checksum: e6d2764c15bbab6d1d1000d1181bb907f6b3796bb04f63614dba571b18369e0ecb1beaf27ce8da5b24307ef607e3a5f262a67cb9575510b9446aac697d421beb - languageName: node - linkType: hard - "glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -5300,7 +4821,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 @@ -5314,24 +4835,6 @@ __metadata: languageName: node linkType: hard -"handlebars@npm:^4.7.7": - version: 4.7.7 - resolution: "handlebars@npm:4.7.7" - dependencies: - minimist: ^1.2.5 - neo-async: ^2.6.0 - source-map: ^0.6.1 - uglify-js: ^3.1.4 - wordwrap: ^1.0.0 - dependenciesMeta: - uglify-js: - optional: true - bin: - handlebars: bin/handlebars - checksum: 1e79a43f5e18d15742977cb987923eab3e2a8f44f2d9d340982bcb69e1735ed049226e534d7c1074eaddaf37e4fb4f471a8adb71cddd5bc8cf3f894241df5cee - languageName: node - linkType: hard - "hard-rejection@npm:^2.1.0": version: 2.1.0 resolution: "hard-rejection@npm:2.1.0" @@ -5383,7 +4886,7 @@ __metadata: languageName: node linkType: hard -"hosted-git-info@npm:^4.0.0, hosted-git-info@npm:^4.0.1": +"hosted-git-info@npm:^4.0.1": version: 4.1.0 resolution: "hosted-git-info@npm:4.1.0" dependencies: @@ -5546,43 +5049,20 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": +"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 languageName: node linkType: hard -"ini@npm:^1.3.2, ini@npm:^1.3.4": +"ini@npm:^1.3.4": version: 1.3.8 resolution: "ini@npm:1.3.8" checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 languageName: node linkType: hard -"inquirer@npm:8.2.5": - version: 8.2.5 - resolution: "inquirer@npm:8.2.5" - dependencies: - ansi-escapes: ^4.2.1 - chalk: ^4.1.1 - cli-cursor: ^3.1.0 - cli-width: ^3.0.0 - external-editor: ^3.0.3 - figures: ^3.0.0 - lodash: ^4.17.21 - mute-stream: 0.0.8 - ora: ^5.4.1 - run-async: ^2.4.0 - rxjs: ^7.5.5 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - through: ^2.3.6 - wrap-ansi: ^7.0.0 - checksum: f13ee4c444187786fb393609dedf6b30870115a57b603f2e6424f29a99abc13446fd45ee22461c33c9c40a92a60a8df62d0d6b25d74fc6676fa4cb211de55b55 - languageName: node - linkType: hard - "inquirer@npm:^7.3.3": version: 7.3.3 resolution: "inquirer@npm:7.3.3" @@ -5749,13 +5229,6 @@ __metadata: languageName: node linkType: hard -"isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab - languageName: node - linkType: hard - "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -6730,6 +6203,7 @@ __metadata: "@nrwl/nx-plugin": 15.9.2 "@nrwl/workspace": 15.9.2 "@types/jest": 29.5.0 + "@types/mock-fs": ^4.13.1 "@types/node": ^18.0.0 "@typescript-eslint/eslint-plugin": 5.57.0 "@typescript-eslint/parser": 5.57.0 @@ -6740,6 +6214,7 @@ __metadata: husky: ^8.0.0 jest: 29.5.0 jest-extended: ^3.0.0 + memfs: ^3.4.13 ngx-deploy-npm: ^5.0.0 nx: 15.9.2 prettier: 2.8.7 @@ -6781,13 +6256,6 @@ __metadata: languageName: node linkType: hard -"json-parse-better-errors@npm:^1.0.1": - version: 1.0.2 - resolution: "json-parse-better-errors@npm:1.0.2" - checksum: ff2b5ba2a70e88fd97a3cb28c1840144c5ce8fae9cbeeddba15afa333a5c407cf0e42300cd0a2885dbb055227fe68d405070faad941beeffbfde9cf3b2c78c5d - languageName: node - linkType: hard - "json-parse-even-better-errors@npm:^2.3.0": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" @@ -6816,13 +6284,6 @@ __metadata: languageName: node linkType: hard -"json-stringify-safe@npm:^5.0.1": - version: 5.0.1 - resolution: "json-stringify-safe@npm:5.0.1" - checksum: 48ec0adad5280b8a96bb93f4563aa1667fd7a36334f79149abd42446d0989f2ddc58274b479f4819f1f00617957e6344c886c55d05a4e15ebb4ab931e4a6a8ee - languageName: node - linkType: hard - "json5@npm:^2.2.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" @@ -6904,28 +6365,6 @@ __metadata: languageName: node linkType: hard -"load-json-file@npm:^4.0.0": - version: 4.0.0 - resolution: "load-json-file@npm:4.0.0" - dependencies: - graceful-fs: ^4.1.2 - parse-json: ^4.0.0 - pify: ^3.0.0 - strip-bom: ^3.0.0 - checksum: 8f5d6d93ba64a9620445ee9bde4d98b1eac32cf6c8c2d20d44abfa41a6945e7969456ab5f1ca2fb06ee32e206c9769a20eec7002fe290de462e8c884b6b8b356 - languageName: node - linkType: hard - -"locate-path@npm:^2.0.0": - version: 2.0.0 - resolution: "locate-path@npm:2.0.0" - dependencies: - p-locate: ^2.0.0 - path-exists: ^3.0.0 - checksum: 02d581edbbbb0fa292e28d96b7de36b5b62c2fa8b5a7e82638ebb33afa74284acf022d3b1e9ae10e3ffb7658fbc49163fcd5e76e7d1baaa7801c3e05a81da755 - languageName: node - linkType: hard - "locate-path@npm:^5.0.0": version: 5.0.0 resolution: "locate-path@npm:5.0.0" @@ -6965,13 +6404,6 @@ __metadata: languageName: node linkType: hard -"lodash.ismatch@npm:^4.4.0": - version: 4.4.0 - resolution: "lodash.ismatch@npm:4.4.0" - checksum: a393917578842705c7fc1a30fb80613d1ac42d20b67eb26a2a6004d6d61ee90b419f9eb320508ddcd608e328d91eeaa2651411727eaa9a12534ed6ccb02fc705 - languageName: node - linkType: hard - "lodash.isplainobject@npm:^4.0.6": version: 4.0.6 resolution: "lodash.isplainobject@npm:4.0.6" @@ -7035,7 +6467,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.11.2, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.21": +"lodash@npm:^4.11.2, lodash@npm:^4.17.15, lodash@npm:^4.17.19": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -7149,6 +6581,15 @@ __metadata: languageName: node linkType: hard +"memfs@npm:^3.4.13": + version: 3.4.13 + resolution: "memfs@npm:3.4.13" + dependencies: + fs-monkey: ^1.0.3 + checksum: 3f9717d6f060919d53f211acb6096a0ea2f566a8cbcc4ef7e1f2561e31e33dc456053fdf951c90a49c8ec55402de7f01b006b81683ab7bd4bdbbd8c9b9cdae5f + languageName: node + linkType: hard + "meow@npm:^8.0.0": version: 8.1.2 resolution: "meow@npm:8.1.2" @@ -7260,7 +6701,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": +"minimist@npm:^1.2.0, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 @@ -7364,13 +6805,6 @@ __metadata: languageName: node linkType: hard -"modify-values@npm:^1.0.0": - version: 1.0.1 - resolution: "modify-values@npm:1.0.1" - checksum: 8296610c608bc97b03c2cf889c6cdf4517e32fa2d836440096374c2209f6b7b3e256c209493a0b32584b9cb32d528e99d0dd19dcd9a14d2d915a312d391cc7e9 - languageName: node - linkType: hard - "ms@npm:2.1.2": version: 2.1.2 resolution: "ms@npm:2.1.2" @@ -7413,13 +6847,6 @@ __metadata: languageName: node linkType: hard -"neo-async@npm:^2.6.0": - version: 2.6.2 - resolution: "neo-async@npm:2.6.2" - checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 - languageName: node - linkType: hard - "ngx-deploy-npm@npm:^5.0.0": version: 5.2.0 resolution: "ngx-deploy-npm@npm:5.2.0" @@ -7510,7 +6937,7 @@ __metadata: languageName: node linkType: hard -"normalize-package-data@npm:^2.3.2, normalize-package-data@npm:^2.5.0": +"normalize-package-data@npm:^2.5.0": version: 2.5.0 resolution: "normalize-package-data@npm:2.5.0" dependencies: @@ -7686,7 +7113,7 @@ __metadata: languageName: node linkType: hard -"ora@npm:5.4.1, ora@npm:^5.4.1": +"ora@npm:5.4.1": version: 5.4.1 resolution: "ora@npm:5.4.1" dependencies: @@ -7710,15 +7137,6 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^1.1.0": - version: 1.3.0 - resolution: "p-limit@npm:1.3.0" - dependencies: - p-try: ^1.0.0 - checksum: 281c1c0b8c82e1ac9f81acd72a2e35d402bf572e09721ce5520164e9de07d8274451378a3470707179ad13240535558f4b277f02405ad752e08c7d5b0d54fbfd - languageName: node - linkType: hard - "p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" @@ -7737,15 +7155,6 @@ __metadata: languageName: node linkType: hard -"p-locate@npm:^2.0.0": - version: 2.0.0 - resolution: "p-locate@npm:2.0.0" - dependencies: - p-limit: ^1.1.0 - checksum: e2dceb9b49b96d5513d90f715780f6f4972f46987dc32a0e18bc6c3fc74a1a5d73ec5f81b1398af5e58b99ea1ad03fd41e9181c01fa81b4af2833958696e3081 - languageName: node - linkType: hard - "p-locate@npm:^4.1.0": version: 4.1.0 resolution: "p-locate@npm:4.1.0" @@ -7773,13 +7182,6 @@ __metadata: languageName: node linkType: hard -"p-try@npm:^1.0.0": - version: 1.0.0 - resolution: "p-try@npm:1.0.0" - checksum: 3b5303f77eb7722144154288bfd96f799f8ff3e2b2b39330efe38db5dd359e4fb27012464cd85cb0a76e9b7edd1b443568cb3192c22e7cffc34989df0bafd605 - languageName: node - linkType: hard - "p-try@npm:^2.0.0": version: 2.2.0 resolution: "p-try@npm:2.2.0" @@ -7796,16 +7198,6 @@ __metadata: languageName: node linkType: hard -"parse-json@npm:^4.0.0": - version: 4.0.0 - resolution: "parse-json@npm:4.0.0" - dependencies: - error-ex: ^1.3.1 - json-parse-better-errors: ^1.0.1 - checksum: 0fe227d410a61090c247e34fa210552b834613c006c2c64d9a05cfe9e89cf8b4246d1246b1a99524b53b313e9ac024438d0680f67e33eaed7e6f38db64cfe7b5 - languageName: node - linkType: hard - "parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" @@ -7818,13 +7210,6 @@ __metadata: languageName: node linkType: hard -"path-exists@npm:^3.0.0": - version: 3.0.0 - resolution: "path-exists@npm:3.0.0" - checksum: 96e92643aa34b4b28d0de1cd2eba52a1c5313a90c6542d03f62750d82480e20bfa62bc865d5cfc6165f5fcd5aeb0851043c40a39be5989646f223300021bae0a - languageName: node - linkType: hard - "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -7853,15 +7238,6 @@ __metadata: languageName: node linkType: hard -"path-type@npm:^3.0.0": - version: 3.0.0 - resolution: "path-type@npm:3.0.0" - dependencies: - pify: ^3.0.0 - checksum: 735b35e256bad181f38fa021033b1c33cfbe62ead42bb2222b56c210e42938eecb272ae1949f3b6db4ac39597a61b44edd8384623ec4d79bfdc9a9c0f12537a6 - languageName: node - linkType: hard - "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -7892,20 +7268,6 @@ __metadata: languageName: node linkType: hard -"pify@npm:^2.3.0": - version: 2.3.0 - resolution: "pify@npm:2.3.0" - checksum: 9503aaeaf4577acc58642ad1d25c45c6d90288596238fb68f82811c08104c800e5a7870398e9f015d82b44ecbcbef3dc3d4251a1cbb582f6e5959fe09884b2ba - languageName: node - linkType: hard - -"pify@npm:^3.0.0": - version: 3.0.0 - resolution: "pify@npm:3.0.0" - checksum: 6cdcbc3567d5c412450c53261a3f10991665d660961e06605decf4544a61a97a54fefe70a68d5c37080ff9d6f4cf51444c90198d1ba9f9309a6c0d6e9f5c4fde - languageName: node - linkType: hard - "pify@npm:^5.0.0": version: 5.0.0 resolution: "pify@npm:5.0.0" @@ -7968,13 +7330,6 @@ __metadata: languageName: node linkType: hard -"process-nextick-args@npm:~2.0.0": - version: 2.0.1 - resolution: "process-nextick-args@npm:2.0.1" - checksum: 1d38588e520dab7cea67cbbe2efdd86a10cc7a074c09657635e34f035277b59fbb57d09d8638346bf7090f8e8ebc070c96fa5fd183b777fff4f5edff5e9466cf - languageName: node - linkType: hard - "promise-inflight@npm:^1.0.1": version: 1.0.1 resolution: "promise-inflight@npm:1.0.1" @@ -8051,16 +7406,6 @@ __metadata: languageName: node linkType: hard -"read-pkg-up@npm:^3.0.0": - version: 3.0.0 - resolution: "read-pkg-up@npm:3.0.0" - dependencies: - find-up: ^2.0.0 - read-pkg: ^3.0.0 - checksum: 16175573f2914ab9788897bcbe2a62b5728d0075e62285b3680cebe97059e2911e0134a062cf6e51ebe3e3775312bc788ac2039ed6af38ec68d2c10c6f2b30fb - languageName: node - linkType: hard - "read-pkg-up@npm:^7.0.1": version: 7.0.1 resolution: "read-pkg-up@npm:7.0.1" @@ -8072,17 +7417,6 @@ __metadata: languageName: node linkType: hard -"read-pkg@npm:^3.0.0": - version: 3.0.0 - resolution: "read-pkg@npm:3.0.0" - dependencies: - load-json-file: ^4.0.0 - normalize-package-data: ^2.3.2 - path-type: ^3.0.0 - checksum: 398903ebae6c7e9965419a1062924436cc0b6f516c42c4679a90290d2f87448ed8f977e7aa2dbba4aa1ac09248628c43e493ac25b2bc76640e946035200e34c6 - languageName: node - linkType: hard - "read-pkg@npm:^5.2.0": version: 5.2.0 resolution: "read-pkg@npm:5.2.0" @@ -8095,7 +7429,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.2, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -8106,21 +7440,6 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:~2.3.6": - version: 2.3.8 - resolution: "readable-stream@npm:2.3.8" - dependencies: - core-util-is: ~1.0.0 - inherits: ~2.0.3 - isarray: ~1.0.0 - process-nextick-args: ~2.0.0 - safe-buffer: ~5.1.1 - string_decoder: ~1.1.1 - util-deprecate: ~1.0.1 - checksum: 65645467038704f0c8aaf026a72fbb588a9e2ef7a75cd57a01702ee9db1c4a1e4b03aaad36861a6a0926546a74d174149c8c207527963e0c2d3eee2f37678a42 - languageName: node - linkType: hard - "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -8357,13 +7676,6 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c - languageName: node - linkType: hard - "safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" @@ -8567,15 +7879,6 @@ __metadata: languageName: node linkType: hard -"split@npm:^1.0.0": - version: 1.0.1 - resolution: "split@npm:1.0.1" - dependencies: - through: 2 - checksum: 12f4554a5792c7e98bb3e22b53c63bfa5ef89aa704353e1db608a55b51f5b12afaad6e4a8ecf7843c15f273f43cdadd67b3705cc43d48a75c2cf4641d51f7e7a - languageName: node - linkType: hard - "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -8631,15 +7934,6 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:~1.1.1": - version: 1.1.1 - resolution: "string_decoder@npm:1.1.1" - dependencies: - safe-buffer: ~5.1.0 - checksum: 9ab7e56f9d60a28f2be697419917c50cac19f3e8e6c28ef26ed5f4852289fe0de5d6997d29becf59028556f2c62983790c1d9ba1e2a3cc401768ca12d5183a5b - languageName: node - linkType: hard - "strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" @@ -8805,16 +8099,6 @@ __metadata: languageName: node linkType: hard -"through2@npm:^2.0.0": - version: 2.0.5 - resolution: "through2@npm:2.0.5" - dependencies: - readable-stream: ~2.3.6 - xtend: ~4.0.1 - checksum: beb0f338aa2931e5660ec7bf3ad949e6d2e068c31f4737b9525e5201b824ac40cac6a337224856b56bd1ddd866334bbfb92a9f57cd6f66bc3f18d3d86fc0fe50 - languageName: node - linkType: hard - "through2@npm:^4.0.0": version: 4.0.2 resolution: "through2@npm:4.0.2" @@ -8824,7 +8108,7 @@ __metadata: languageName: node linkType: hard -"through@npm:2, through@npm:>=2.2.7 <3, through@npm:^2.3.4, through@npm:^2.3.6": +"through@npm:>=2.2.7 <3, through@npm:^2.3.4, through@npm:^2.3.6": version: 2.3.8 resolution: "through@npm:2.3.8" checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd @@ -8967,13 +8251,13 @@ __metadata: linkType: hard "tsconfig-paths@npm:^4.1.2": - version: 4.1.2 - resolution: "tsconfig-paths@npm:4.1.2" + version: 4.2.0 + resolution: "tsconfig-paths@npm:4.2.0" dependencies: json5: ^2.2.2 minimist: ^1.2.6 strip-bom: ^3.0.0 - checksum: 3d9151ecea139594e25618717de15769ab9f38f8e6d510ac16e592b23e7f7105ea13cec5694c3de7e132c98277b775e18edd1651964164ee6d75737c408494cc + checksum: 28c5f7bbbcabc9dabd4117e8fdc61483f6872a1c6b02a4b1c4d68c5b79d06896c3cc9547610c4c3ba64658531caa2de13ead1ea1bf321c7b53e969c4752b98c7 languageName: node linkType: hard @@ -9089,13 +8373,6 @@ __metadata: languageName: node linkType: hard -"typedarray@npm:^0.0.6": - version: 0.0.6 - resolution: "typedarray@npm:0.0.6" - checksum: 33b39f3d0e8463985eeaeeacc3cb2e28bc3dfaf2a5ed219628c0b629d5d7b810b0eb2165f9f607c34871d5daa92ba1dc69f49051cf7d578b4cbd26c340b9d1b1 - languageName: node - linkType: hard - "typescript@npm:4.9.5": version: 4.9.5 resolution: "typescript@npm:4.9.5" @@ -9107,12 +8384,12 @@ __metadata: linkType: hard "typescript@npm:^4.6.4 || ^5.0.0": - version: 5.0.2 - resolution: "typescript@npm:5.0.2" + version: 5.0.3 + resolution: "typescript@npm:5.0.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: bef1dcd166acfc6934b2ec4d72f93edb8961a5fab36b8dd2aaf6f4f4cd5c0210f2e0850aef4724f3b4913d5aef203a94a28ded731b370880c8bcff7e4ff91fc1 + checksum: 3cce0576d218cb4277ff8b6adfef1a706e9114a98b4261a38ad658a7642f1b274a8396394f6cbff8c0ba852996d7ed2e233e9b8431d5d55ac7c2f6fea645af02 languageName: node linkType: hard @@ -9127,21 +8404,12 @@ __metadata: linkType: hard "typescript@patch:typescript@^4.6.4 || ^5.0.0#~builtin": - version: 5.0.2 - resolution: "typescript@patch:typescript@npm%3A5.0.2#~builtin::version=5.0.2&hash=85af82" + version: 5.0.3 + resolution: "typescript@patch:typescript@npm%3A5.0.3#~builtin::version=5.0.3&hash=85af82" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: b63cb742fbb9aeb3085e002ad8f10d5fd963606aa4d6b3b65b4e76c396ff09739f03b5dbae08e1698c3bce9d5619d3f67aeb7ee470ed4016bd345b3cfe37b54a - languageName: node - linkType: hard - -"uglify-js@npm:^3.1.4": - version: 3.17.4 - resolution: "uglify-js@npm:3.17.4" - bin: - uglifyjs: bin/uglifyjs - checksum: 7b3897df38b6fc7d7d9f4dcd658599d81aa2b1fb0d074829dd4e5290f7318dbca1f4af2f45acb833b95b1fe0ed4698662ab61b87e94328eb4c0a0d3435baf924 + checksum: 5580367025ff7ee1f2a61e5affdbddccfe6e893bc662aa33fefdbf12de7e493173fa7d47475e9e15121828691004c4ed13bcd115e57866baed97b54c60954e1c languageName: node linkType: hard @@ -9224,7 +8492,7 @@ __metadata: languageName: node linkType: hard -"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": +"util-deprecate@npm:^1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 @@ -9335,13 +8603,6 @@ __metadata: languageName: node linkType: hard -"wordwrap@npm:^1.0.0": - version: 1.0.0 - resolution: "wordwrap@npm:1.0.0" - checksum: 2a44b2788165d0a3de71fd517d4880a8e20ea3a82c080ce46e294f0b68b69a2e49cff5f99c600e275c698a90d12c5ea32aff06c311f0db2eb3f1201f3e7b2a04 - languageName: node - linkType: hard - "wrap-ansi@npm:^6.2.0": version: 6.2.0 resolution: "wrap-ansi@npm:6.2.0" @@ -9381,13 +8642,6 @@ __metadata: languageName: node linkType: hard -"xtend@npm:~4.0.1": - version: 4.0.2 - resolution: "xtend@npm:4.0.2" - checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a - languageName: node - linkType: hard - "y18n@npm:^4.0.0": version: 4.0.3 resolution: "y18n@npm:4.0.3" @@ -9440,7 +8694,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": +"yargs-parser@npm:^20.2.3": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 @@ -9466,21 +8720,6 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^16.2.0": - version: 16.2.0 - resolution: "yargs@npm:16.2.0" - dependencies: - cliui: ^7.0.2 - escalade: ^3.1.1 - get-caller-file: ^2.0.5 - require-directory: ^2.1.1 - string-width: ^4.2.0 - y18n: ^5.0.5 - yargs-parser: ^20.2.2 - checksum: b14afbb51e3251a204d81937c86a7e9d4bdbf9a2bcee38226c900d00f522969ab675703bee2a6f99f8e20103f608382936034e64d921b74df82b63c07c5e8f59 - languageName: node - linkType: hard - "yargs@npm:^17.0.0, yargs@npm:^17.3.1, yargs@npm:^17.6.2": version: 17.7.1 resolution: "yargs@npm:17.7.1" @@ -9509,3 +8748,10 @@ __metadata: checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 languageName: node linkType: hard + +"zod@npm:3.20.2": + version: 3.20.2 + resolution: "zod@npm:3.20.2" + checksum: 04172f7e9350372684ccd298d4716908edc9113751295b6c4e1b3ea84e2af8997e504b33ba36f4741417bb2a5dc90bfd40501f6b0e7389df10e42a63d6d8366c + languageName: node + linkType: hard