diff options
| author | 2023-11-03 21:25:40 +0800 | |
|---|---|---|
| committer | 2023-11-03 21:25:40 +0800 | |
| commit | 9029588590bea8b10451575c5142dcde77ecd1b5 (patch) | |
| tree | 04cf8aee56c23fd225ff19d340f7cee621d874ef /packages/turbo-codemod | |
| parent | 94071d7ce16c56641d67d488e2bac6be84ffe731 (diff) | |
| download | HydroRoll-9029588590bea8b10451575c5142dcde77ecd1b5.tar.gz HydroRoll-9029588590bea8b10451575c5142dcde77ecd1b5.zip | |
chore: delete useless files
Diffstat (limited to 'packages/turbo-codemod')
109 files changed, 0 insertions, 6567 deletions
diff --git a/packages/turbo-codemod/LICENSE b/packages/turbo-codemod/LICENSE deleted file mode 100644 index fa0086a..0000000 --- a/packages/turbo-codemod/LICENSE +++ /dev/null @@ -1,373 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0.
\ No newline at end of file diff --git a/packages/turbo-codemod/README.md b/packages/turbo-codemod/README.md deleted file mode 100644 index 5545561..0000000 --- a/packages/turbo-codemod/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# Turborepo Codemods - -Turborepo provides Codemod transformations to help upgrade your Turborepo codebase. - -Codemods are transformations that run on your codebase programmatically. This allows for a large amount of changes to be applied without having to manually go through every file. - -## Commands - -### `migrate` - -Updates your Turborepo codebase to the specified version of Turborepo (defaults to the latest), running any required codemods, and installing the new version of Turborepo. - -``` -Usage: @turbo/codemod migrate|update [options] [path] - -Migrate a project to the latest version of Turborepo - -Arguments: - path Directory where the transforms should be applied - -Options: - --from <version> Specify the version to migrate from (default: current version) - --to <version> Specify the version to migrate to (default: latest) - --install Install new version of turbo after migration (default: true) - --force Bypass Git safety checks and forcibly run codemods (default: false) - --dry Dry run (no changes are made to files) (default: false) - --print Print transformed files to your terminal (default: false) - -h, --help display help for command -``` - -### `transform` (default) - -Runs a single codemod on your codebase. This is the default command, and can be omitted. - -``` -Usage: @turbo/codemod transform [options] [transform] [path] - @turbo/codemod [options] [transform] [path] - -Apply a single code transformation to a project - -Arguments: - transform The transformer to run - path Directory where the transforms should be applied - -Options: - --force Bypass Git safety checks and forcibly run codemods (default: false) - --list List all available transforms (default: false) - --dry Dry run (no changes are made to files) (default: false) - --print Print transformed files to your terminal (default: false) - -h, --help display help for command -``` - -## Developing - -To add a new transformer, run `pnpm add-transformer`, or [view the complete guide](./src/transforms/README.md). diff --git a/packages/turbo-codemod/__tests__/__fixtures__/add-package-manager/has-package-manager/package.json b/packages/turbo-codemod/__tests__/__fixtures__/add-package-manager/has-package-manager/package.json deleted file mode 100644 index d6edac5..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/add-package-manager/has-package-manager/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "has-package-manager", - "version": "1.0.0", - "dependencies": {}, - "devDependencies": {}, - "packageManager": "npm@1.2.3" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/add-package-manager/no-package-manager/package.json b/packages/turbo-codemod/__tests__/__fixtures__/add-package-manager/no-package-manager/package.json deleted file mode 100644 index 2e28fe4..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/add-package-manager/no-package-manager/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "no-package-manager", - "version": "1.0.0", - "dependencies": {}, - "devDependencies": {} -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/add-package-manager/wrong-package-manager/package.json b/packages/turbo-codemod/__tests__/__fixtures__/add-package-manager/wrong-package-manager/package.json deleted file mode 100644 index f58aca2..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/add-package-manager/wrong-package-manager/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "has-package-manager", - "version": "1.0.0", - "dependencies": {}, - "devDependencies": {}, - "packageManager": "turbo@1.7.0" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/both-configs/package.json b/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/both-configs/package.json deleted file mode 100644 index c4606fa..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/both-configs/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "both-configs", - "version": "1.0.0", - "dependencies": {}, - "devDependencies": {}, - "packageManager": "npm@1.2.3", - "turbo": { - "$schema": "https://turbo.build/schema.json", - "pipeline": { - "package-only": { - "cache": false, - "persistent": true - }, - "build": { - "outputs": [ - ".next/**", - "!.next/cache/**" - ] - }, - "lint": { - "outputs": [] - }, - "dev": { - "cache": false - } - } - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/both-configs/turbo.json b/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/both-configs/turbo.json deleted file mode 100644 index e6eb652..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/both-configs/turbo.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "pipeline": { - "turbo-only": { - "cache": false, - "persistent": true - }, - "build": { - "outputs": [".next/**", "!.next/cache/**"] - }, - "lint": { - "outputs": [] - }, - "dev": { - "cache": false - } - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/no-package-json-config/package.json b/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/no-package-json-config/package.json deleted file mode 100644 index b965b7d..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/no-package-json-config/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "no-turbo-json-config", - "version": "1.0.0", - "dependencies": {}, - "devDependencies": {}, - "packageManager": "npm@1.2.3" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/no-package-json-file/a-random-file.txt b/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/no-package-json-file/a-random-file.txt deleted file mode 100644 index 7488fec..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/no-package-json-file/a-random-file.txt +++ /dev/null @@ -1 +0,0 @@ -Nothing exists here diff --git a/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/no-turbo-json-config/package.json b/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/no-turbo-json-config/package.json deleted file mode 100644 index 7754c7d..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/no-turbo-json-config/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "no-turbo-json-config", - "version": "1.0.0", - "dependencies": {}, - "devDependencies": {}, - "packageManager": "npm@1.2.3", - "turbo": { - "$schema": "https://turbo.build/schema.json", - "pipeline": { - "build": { - "outputs": [ - ".next/**", - "!.next/cache/**" - ] - }, - "lint": { - "outputs": [] - }, - "dev": { - "cache": false - } - } - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/turbo-json-config/package.json b/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/turbo-json-config/package.json deleted file mode 100644 index a48d0ec..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/turbo-json-config/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "both-configs", - "version": "1.0.0", - "dependencies": {}, - "devDependencies": {}, - "packageManager": "npm@1.2.3" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/turbo-json-config/turbo.json b/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/turbo-json-config/turbo.json deleted file mode 100644 index e6eb652..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/create-turbo-config/turbo-json-config/turbo.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "pipeline": { - "turbo-only": { - "cache": false, - "persistent": true - }, - "build": { - "outputs": [".next/**", "!.next/cache/**"] - }, - "lint": { - "outputs": [] - }, - "dev": { - "cache": false - } - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/no-deps/package.json b/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/no-deps/package.json deleted file mode 100644 index b632eef..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/no-deps/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "no-turbo", - "version": "0.0.0" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/no-package/README.md b/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/no-package/README.md deleted file mode 100644 index 64355e7..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/no-package/README.md +++ /dev/null @@ -1 +0,0 @@ -Nothing here diff --git a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/no-turbo/package.json b/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/no-turbo/package.json deleted file mode 100644 index 524df50..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/no-turbo/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "no-turbo", - "version": "0.0.0", - "dependencies": {}, - "devDependencies": {} -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/normal-workspaces-dev-install/package.json b/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/normal-workspaces-dev-install/package.json deleted file mode 100644 index f5b2368..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/normal-workspaces-dev-install/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "normal-workspaces", - "version": "0.0.0", - "workspaces": [ - "apps/*", - "packages/*" - ], - "dependencies": {}, - "devDependencies": { - "turbo": "1.0.0" - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/normal-workspaces/package.json b/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/normal-workspaces/package.json deleted file mode 100644 index 6344a38..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/normal-workspaces/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "normal-workspaces", - "version": "0.0.0", - "workspaces": [ - "apps/*", - "packages/*" - ], - "dependencies": { - "turbo": "1.0.0" - }, - "devDependencies": {} -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/pnpm-workspaces-dev-install/package.json b/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/pnpm-workspaces-dev-install/package.json deleted file mode 100644 index 5c12f28..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/pnpm-workspaces-dev-install/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "pnpm-workspaces", - "version": "0.0.0", - "dependencies": {}, - "devDependencies": { - "turbo": "1.0.0" - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/pnpm-workspaces-dev-install/pnpm-workspace.yaml b/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/pnpm-workspaces-dev-install/pnpm-workspace.yaml deleted file mode 100644 index 3ff5faa..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/pnpm-workspaces-dev-install/pnpm-workspace.yaml +++ /dev/null @@ -1,3 +0,0 @@ -packages: - - "apps/*" - - "packages/*" diff --git a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/pnpm-workspaces/package.json b/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/pnpm-workspaces/package.json deleted file mode 100644 index fedeb8d..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/pnpm-workspaces/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "pnpm-workspaces", - "version": "0.0.0", - "dependencies": { - "turbo": "1.0.0" - }, - "devDependencies": {} -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/pnpm-workspaces/pnpm-workspace.yaml b/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/pnpm-workspaces/pnpm-workspace.yaml deleted file mode 100644 index 3ff5faa..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/pnpm-workspaces/pnpm-workspace.yaml +++ /dev/null @@ -1,3 +0,0 @@ -packages: - - "apps/*" - - "packages/*" diff --git a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/single-package-dev-install/package.json b/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/single-package-dev-install/package.json deleted file mode 100644 index 38bd995..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/single-package-dev-install/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "single-package-dev-install", - "version": "0.0.0", - "dependencies": {}, - "devDependencies": { - "turbo": "1.0.0" - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/single-package/package.json b/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/single-package/package.json deleted file mode 100644 index 0fd3453..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/get-turbo-upgrade-command/single-package/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "single-package", - "version": "0.0.0", - "dependencies": { - "turbo": "1.0.0" - }, - "devDependencies": {} -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/env-dependencies/turbo.json b/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/env-dependencies/turbo.json deleted file mode 100644 index bb3e248..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/env-dependencies/turbo.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "globalDependencies": ["$NEXT_PUBLIC_API_KEY", "$STRIPE_API_KEY", ".env"], - "pipeline": { - "build": { - "outputs": [".next/**", "!.next/cache/**"], - "dependsOn": ["^build", "$PROD_API_KEY"] - }, - "lint": { - "outputs": [], - "dependsOn": ["$IS_CI"] - }, - "test": { - "outputs": [], - "dependsOn": ["$IS_CI", "test"] - }, - "dev": { - "cache": false - } - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/migrated-env-dependencies/turbo.json b/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/migrated-env-dependencies/turbo.json deleted file mode 100644 index 9217af6..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/migrated-env-dependencies/turbo.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "globalDependencies": [], - "globalEnv": ["NEXT_PUBLIC_API_KEY", "STRIPE_API_KEY"], - "pipeline": { - "build": { - "dependsOn": ["^build"], - "env": ["PROD_API_KEY"], - "outputs": [".next/**", "!.next/cache/**"] - }, - "dev": { - "cache": false - }, - "lint": { - "dependsOn": [], - "env": ["IS_CI"], - "outputs": [] - }, - "test": { - "dependsOn": ["test"], - "env": ["IS_CI"], - "outputs": [] - } - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/no-turbo-json/package.json b/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/no-turbo-json/package.json deleted file mode 100644 index 83443be..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/no-turbo-json/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "no-turbo-json", - "version": "1.0.0", - "dependencies": {}, - "devDependencies": {}, - "packageManager": "npm@1.2.3" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/old-config/package.json b/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/old-config/package.json deleted file mode 100644 index 6774d3c..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/old-config/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "migrate-env-var-dependencies-old-config", - "version": "1.0.0", - "dependencies": {}, - "devDependencies": {}, - "packageManager": "npm@1.2.3", - "turbo": { - "pipeline": { - "build-one": { - "outputs": [ - "foo" - ] - }, - "build-two": { - "outputs": [] - }, - "build-three": {} - } - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/old-config/turbo.json b/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/old-config/turbo.json deleted file mode 100644 index b0f6150..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/old-config/turbo.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "pipeline": { - "build-one": { - "outputs": ["foo"] - }, - "build-two": { - "outputs": [] - }, - "build-three": {} - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/apps/docs/index.js b/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/apps/docs/index.js deleted file mode 100644 index 4de53f5..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/apps/docs/index.js +++ /dev/null @@ -1,6 +0,0 @@ -export default function docs() { - if (process.env.ENV_1 === undefined) { - return "does not exist"; - } - return "exists"; -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/apps/docs/package.json b/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/apps/docs/package.json deleted file mode 100644 index 82f9a44..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/apps/docs/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "docs", - "version": "1.0.0" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/apps/docs/turbo.json b/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/apps/docs/turbo.json deleted file mode 100644 index a3713ef..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/apps/docs/turbo.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "extends": ["//"], - "pipeline": { - "build": { - "env": ["ENV_3"] - } - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/apps/web/index.js b/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/apps/web/index.js deleted file mode 100644 index bfd3ab8..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/apps/web/index.js +++ /dev/null @@ -1,6 +0,0 @@ -export default function web() { - if (!process.env.ENV_2) { - return "bar"; - } - return "foo"; -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/apps/web/package.json b/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/apps/web/package.json deleted file mode 100644 index d8a83ed..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/apps/web/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "web", - "version": "1.0.0" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/apps/web/turbo.json b/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/apps/web/turbo.json deleted file mode 100644 index dd69c31..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/apps/web/turbo.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "extends": ["//"], - "pipeline": { - "build": { - // old - "dependsOn": ["build", "$ENV_2"], - // new - "env": ["ENV_1"] - } - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/package.json b/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/package.json deleted file mode 100644 index c6616a6..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "private": true, - "workspaces": [ - "apps/*", - "packages/*" - ], - "scripts": { - "build": "turbo run build" - }, - "devDependencies": { - "turbo": "latest" - }, - "packageManager": "yarn@1.22.19" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/packages/ui/index.js b/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/packages/ui/index.js deleted file mode 100644 index dee5e80..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/packages/ui/index.js +++ /dev/null @@ -1,6 +0,0 @@ -export default function foo() { - if (!process.env.IS_SERVER) { - return "bar"; - } - return "foo"; -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/packages/ui/package.json b/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/packages/ui/package.json deleted file mode 100644 index 7cb7cf1..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/packages/ui/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "ui", - "version": "1.0.0" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/packages/ui/turbo.json b/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/packages/ui/turbo.json deleted file mode 100644 index 6ce7b30..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/packages/ui/turbo.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "extends": ["//"], - "pipeline": { - "build": { - "dependsOn": ["$IS_SERVER"] - } - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/turbo.json b/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/turbo.json deleted file mode 100644 index 718e461..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/migrate-env-var-dependencies/workspace-configs/turbo.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "globalDependencies": ["$NEXT_PUBLIC_API_KEY", "$STRIPE_API_KEY", ".env"], - "pipeline": { - "build": { - "outputs": [".next/**", "!.next/cache/**"], - "dependsOn": ["^build", "$PROD_API_KEY"] - }, - "lint": { - "outputs": [], - "dependsOn": ["$IS_TEST"] - }, - "test": { - "outputs": [], - "dependsOn": ["$IS_CI", "test"] - }, - "dev": { - "cache": false - } - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/migrate/no-repo/README.md b/packages/turbo-codemod/__tests__/__fixtures__/migrate/no-repo/README.md deleted file mode 100644 index 64355e7..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/migrate/no-repo/README.md +++ /dev/null @@ -1 +0,0 @@ -Nothing here diff --git a/packages/turbo-codemod/__tests__/__fixtures__/migrate/old-turbo/package.json b/packages/turbo-codemod/__tests__/__fixtures__/migrate/old-turbo/package.json deleted file mode 100644 index 62959b8..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/migrate/old-turbo/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "no-turbo-json", - "version": "1.0.0", - "dependencies": {}, - "devDependencies": { - "turbo": "1.0.0" - }, - "turbo": { - "$schema": "https://turbo.build/schema.json", - "pipeline": { - "build": { - "outputs": [ - ".next/**", - "!.next/cache/**" - ] - }, - "lint": { - "outputs": [] - }, - "test": {}, - "dev": { - "cache": false - } - } - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/invalid-outputs/package.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/invalid-outputs/package.json deleted file mode 100644 index 6b50aac..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/invalid-outputs/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "invalid-outputs", - "version": "1.0.0", - "dependencies": {}, - "devDependencies": {}, - "packageManager": "npm@1.2.3" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/invalid-outputs/turbo.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/invalid-outputs/turbo.json deleted file mode 100644 index 33c2b93..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/invalid-outputs/turbo.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "pipeline": { - "build-one": { - "outputs": ["foo"] - }, - "build-two": { - "outputs": [] - }, - "build-three": {}, - "garbage-in-numeric-0": { - "outputs": 0 - }, - "garbage-in-numeric": { - "outputs": 42 - }, - "garbage-in-string": { - "outputs": "string" - }, - "garbage-in-empty-string": { - "outputs": "" - }, - "garbage-in-null": { - "outputs": null - }, - "garbage-in-false": { - "outputs": false - }, - "garbage-in-true": { - "outputs": true - }, - "garbage-in-object": { - "outputs": {} - } - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/no-outputs/package.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/no-outputs/package.json deleted file mode 100644 index 4e17dc1..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/no-outputs/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "no-outputs", - "version": "1.0.0", - "dependencies": {}, - "devDependencies": {}, - "packageManager": "npm@1.2.3" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/no-outputs/turbo.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/no-outputs/turbo.json deleted file mode 100644 index f5d57fc..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/no-outputs/turbo.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "pipeline": { - "build-one": { - "dependsOn": ["build-two"] - }, - "build-two": { - "cache": false - }, - "build-three": { - "persistent": true - } - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/no-pipeline/package.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/no-pipeline/package.json deleted file mode 100644 index 6e20fc8..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/no-pipeline/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "no-pipeline", - "version": "1.0.0", - "dependencies": {}, - "devDependencies": {}, - "packageManager": "npm@1.2.3" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/no-pipeline/turbo.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/no-pipeline/turbo.json deleted file mode 100644 index 0e2d6fd..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/no-pipeline/turbo.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "globalDependencies": ["$NEXT_PUBLIC_API_KEY", "$STRIPE_API_KEY", ".env"], - "pipeline": {} -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/no-turbo-json/package.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/no-turbo-json/package.json deleted file mode 100644 index cd98334..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/no-turbo-json/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "set-default-outputs-no-turbo-json", - "version": "1.0.0", - "dependencies": {}, - "devDependencies": {}, - "packageManager": "npm@1.2.3" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/old-config/package.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/old-config/package.json deleted file mode 100644 index 4c816c2..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/old-config/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "set-default-outputs-old-config", - "version": "1.0.0", - "dependencies": {}, - "devDependencies": {}, - "packageManager": "npm@1.2.3", - "turbo": { - "pipeline": { - "build-one": { - "outputs": [ - "foo" - ] - }, - "build-two": { - "outputs": [] - }, - "build-three": {} - } - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/old-config/turbo.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/old-config/turbo.json deleted file mode 100644 index b0f6150..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/old-config/turbo.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "pipeline": { - "build-one": { - "outputs": ["foo"] - }, - "build-two": { - "outputs": [] - }, - "build-three": {} - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/old-outputs/package.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/old-outputs/package.json deleted file mode 100644 index e4220ba..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/old-outputs/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "old-outputs", - "version": "1.0.0", - "dependencies": {}, - "devDependencies": {}, - "packageManager": "npm@1.2.3" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/old-outputs/turbo.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/old-outputs/turbo.json deleted file mode 100644 index b0f6150..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/old-outputs/turbo.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "pipeline": { - "build-one": { - "outputs": ["foo"] - }, - "build-two": { - "outputs": [] - }, - "build-three": {} - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/apps/docs/index.js b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/apps/docs/index.js deleted file mode 100644 index 4de53f5..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/apps/docs/index.js +++ /dev/null @@ -1,6 +0,0 @@ -export default function docs() { - if (process.env.ENV_1 === undefined) { - return "does not exist"; - } - return "exists"; -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/apps/docs/package.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/apps/docs/package.json deleted file mode 100644 index 82f9a44..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/apps/docs/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "docs", - "version": "1.0.0" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/apps/docs/turbo.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/apps/docs/turbo.json deleted file mode 100644 index e60cdb7..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/apps/docs/turbo.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "extends": ["//"], - "pipeline": { - "build": {} - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/apps/web/index.js b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/apps/web/index.js deleted file mode 100644 index bfd3ab8..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/apps/web/index.js +++ /dev/null @@ -1,6 +0,0 @@ -export default function web() { - if (!process.env.ENV_2) { - return "bar"; - } - return "foo"; -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/apps/web/package.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/apps/web/package.json deleted file mode 100644 index d8a83ed..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/apps/web/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "web", - "version": "1.0.0" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/apps/web/turbo.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/apps/web/turbo.json deleted file mode 100644 index b239cbf..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/apps/web/turbo.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "extends": ["//"], - "pipeline": { - "build": { - // old - "outputs": [] - } - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/package.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/package.json deleted file mode 100644 index c6616a6..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "private": true, - "workspaces": [ - "apps/*", - "packages/*" - ], - "scripts": { - "build": "turbo run build" - }, - "devDependencies": { - "turbo": "latest" - }, - "packageManager": "yarn@1.22.19" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/packages/ui/index.js b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/packages/ui/index.js deleted file mode 100644 index dee5e80..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/packages/ui/index.js +++ /dev/null @@ -1,6 +0,0 @@ -export default function foo() { - if (!process.env.IS_SERVER) { - return "bar"; - } - return "foo"; -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/packages/ui/package.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/packages/ui/package.json deleted file mode 100644 index 7cb7cf1..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/packages/ui/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "ui", - "version": "1.0.0" -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/packages/ui/turbo.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/packages/ui/turbo.json deleted file mode 100644 index fe51119..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/packages/ui/turbo.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "extends": ["//"], - "pipeline": { - "build-three": {} - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/turbo.json b/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/turbo.json deleted file mode 100644 index b0f6150..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/set-default-outputs/workspace-configs/turbo.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "pipeline": { - "build-one": { - "outputs": ["foo"] - }, - "build-two": { - "outputs": [] - }, - "build-three": {} - } -} diff --git a/packages/turbo-codemod/__tests__/__fixtures__/transform/basic/package.json b/packages/turbo-codemod/__tests__/__fixtures__/transform/basic/package.json deleted file mode 100644 index 651edb6..0000000 --- a/packages/turbo-codemod/__tests__/__fixtures__/transform/basic/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "transform-basic", - "version": "1.0.0", - "dependencies": {}, - "devDependencies": { - "turbo": "1.0.0" - } -} diff --git a/packages/turbo-codemod/__tests__/add-package-manager.test.ts b/packages/turbo-codemod/__tests__/add-package-manager.test.ts deleted file mode 100644 index 5bde7e0..0000000 --- a/packages/turbo-codemod/__tests__/add-package-manager.test.ts +++ /dev/null @@ -1,504 +0,0 @@ -import { transformer } from "../src/transforms/add-package-manager"; -import { setupTestFixtures } from "@turbo/test-utils"; -import fs from "fs-extra"; -import * as getPackageManager from "../src/utils/getPackageManager"; -import * as getPackageManagerVersion from "../src/utils/getPackageManagerVersion"; - -describe("add-package-manager", () => { - const { useFixture } = setupTestFixtures({ - directory: __dirname, - test: "add-package-manager", - }); - test("no package manager - basic", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "no-package-manager" }); - - const packageManager = "pnpm"; - const packageManagerVersion = "1.2.3"; - - // mock out workspace and version detection so we're not dependent on our actual repo - const mockGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - - const mockGetPackageManager = jest - .spyOn(getPackageManager, "default") - .mockReturnValue(packageManager); - - // package manager should not exist - expect( - JSON.parse(read("package.json") || "{}").packageManager - ).toBeUndefined(); - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(mockGetPackageManager).toHaveBeenCalledWith({ directory: root }); - expect(mockGetPackageManagerVersion).toHaveBeenCalledWith( - packageManager, - root - ); - - // package manager should now exist - expect(JSON.parse(read("package.json") || "{}").packageManager).toBe( - `${packageManager}@${packageManagerVersion}` - ); - // result should be correct - expect(result.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "modified", - "additions": 1, - "deletions": 0, - }, - } - `); - - mockGetPackageManagerVersion.mockRestore(); - mockGetPackageManager.mockRestore(); - }); - - test("no package manager - repeat run", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "no-package-manager" }); - - const packageManager = "pnpm"; - const packageManagerVersion = "1.2.3"; - - // mock out workspace and version detection so we're not dependent on our actual repo - const mockGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - - const mockGetPackageManager = jest - .spyOn(getPackageManager, "default") - .mockReturnValue(packageManager); - - // package manager should not exist - expect( - JSON.parse(read("package.json") || "{}").packageManager - ).toBeUndefined(); - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(mockGetPackageManager).toHaveBeenCalledWith({ directory: root }); - expect(mockGetPackageManagerVersion).toHaveBeenCalled(); - expect(mockGetPackageManagerVersion).toHaveBeenCalledWith( - packageManager, - root - ); - - // package manager should now exist - expect(JSON.parse(read("package.json") || "{}").packageManager).toBe( - `${packageManager}@${packageManagerVersion}` - ); - // result should be correct - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "modified", - "additions": 1, - "deletions": 0, - }, - } - `); - - // run the transformer again to ensure nothing changes on a second run - const repeatResult = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - expect(repeatResult.fatalError).toBeUndefined(); - expect(repeatResult.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "unchanged", - "additions": 0, - "deletions": 0, - }, - } - `); - - mockGetPackageManagerVersion.mockRestore(); - mockGetPackageManager.mockRestore(); - }); - - test("no package manager - dry", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "no-package-manager" }); - - const packageManager = "npm"; - const packageManagerVersion = "1.2.3"; - - // mock out workspace and version detection so we're not dependent on our actual repo - const mockGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - const mockGetPackageManager = jest - .spyOn(getPackageManager, "default") - .mockReturnValue(packageManager); - - // package manager should not exist - expect( - JSON.parse(read("package.json") || "{}").packageManager - ).toBeUndefined(); - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: true, print: false }, - }); - - expect(mockGetPackageManager).toHaveBeenCalledWith({ directory: root }); - expect(mockGetPackageManagerVersion).toHaveBeenCalledWith( - packageManager, - root - ); - - // package manager should not exist - expect( - JSON.parse(read("package.json") || "{}").packageManager - ).toBeUndefined(); - // result should be correct - expect(result.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "skipped", - "additions": 1, - "deletions": 0, - }, - } - `); - - mockGetPackageManagerVersion.mockRestore(); - }); - - test("no package manager - print", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "no-package-manager" }); - - const packageManager = "yarn"; - const packageManagerVersion = "1.2.3"; - - // mock out workspace and version detection so we're not dependent on our actual repo - const mockGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - - const mockGetPackageManager = jest - .spyOn(getPackageManager, "default") - .mockReturnValue(packageManager); - - // package manager should not exist - expect( - JSON.parse(read("package.json") || "{}").packageManager - ).toBeUndefined(); - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: true }, - }); - - expect(mockGetPackageManager).toHaveBeenCalledWith({ directory: root }); - expect(mockGetPackageManagerVersion).toHaveBeenCalledWith( - packageManager, - root - ); - // package manager should now exist - expect(JSON.parse(read("package.json") || "{}").packageManager).toBe( - `${packageManager}@${packageManagerVersion}` - ); - // result should be correct - expect(result.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "modified", - "additions": 1, - "deletions": 0, - }, - } - `); - - mockGetPackageManagerVersion.mockRestore(); - }); - - test("no package manager - dry & print", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "no-package-manager" }); - - const packageManager = "npm"; - const packageManagerVersion = "1.2.3"; - - // mock out workspace and version detection so we're not dependent on our actual repo - const mockGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - - const mockGetPackageManager = jest - .spyOn(getPackageManager, "default") - .mockReturnValue(packageManager); - - // package manager should not exist - expect( - JSON.parse(read("package.json") || "{}").packageManager - ).toBeUndefined(); - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: true, print: true }, - }); - - expect(mockGetPackageManager).toHaveBeenCalledWith({ directory: root }); - expect(mockGetPackageManagerVersion).toHaveBeenCalledWith( - packageManager, - root - ); - - // package manager should not exist - expect( - JSON.parse(read("package.json") || "{}").packageManager - ).toBeUndefined(); - // result should be correct - expect(result.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "skipped", - "additions": 1, - "deletions": 0, - }, - } - `); - - mockGetPackageManagerVersion.mockRestore(); - mockGetPackageManager.mockRestore(); - }); - - test("package manager already exists", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "has-package-manager" }); - const packageManager = "npm"; - const packageManagerVersion = "1.2.3"; - - // mock out workspace and version detection so we're not dependent on our actual repo - const mockGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - - const mockGetPackageManager = jest - .spyOn(getPackageManager, "default") - .mockReturnValue(packageManager); - - // package manager should exist - expect(JSON.parse(read("package.json") || "{}").packageManager).toBe( - `${packageManager}@${packageManagerVersion}` - ); - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(mockGetPackageManager).toHaveBeenCalledWith({ directory: root }); - expect(mockGetPackageManagerVersion).toHaveBeenCalledWith( - packageManager, - root - ); - - // package manager should still exist - expect(JSON.parse(read("package.json") || "{}").packageManager).toBe( - `${packageManager}@${packageManagerVersion}` - ); - // result should be correct - expect(result.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "unchanged", - "additions": 0, - "deletions": 0, - }, - } - `); - - mockGetPackageManagerVersion.mockRestore(); - mockGetPackageManager.mockRestore(); - }); - - test("package manager exists but is wrong", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "wrong-package-manager" }); - - const packageManager = "pnpm"; - const packageManagerVersion = "1.2.3"; - - // mock out workspace and version detection so we're not dependent on our actual repo - const mockGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - - const mockGetPackageManager = jest - .spyOn(getPackageManager, "default") - .mockReturnValue(packageManager); - - // package manager should exist - expect(JSON.parse(read("package.json") || "{}").packageManager).toBe( - "turbo@1.7.0" - ); - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(mockGetPackageManager).toHaveBeenCalledWith({ directory: root }); - expect(mockGetPackageManagerVersion).toHaveBeenCalledWith( - packageManager, - root - ); - - // package manager should still exist - expect(JSON.parse(read("package.json") || "{}").packageManager).toBe( - `${packageManager}@${packageManagerVersion}` - ); - // result should be correct - expect(result.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "modified", - "additions": 1, - "deletions": 1, - }, - } - `); - - mockGetPackageManagerVersion.mockRestore(); - mockGetPackageManager.mockRestore(); - }); - - test("errors when unable to determine workspace manager", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "no-package-manager" }); - - const mockGetPackageManager = jest - .spyOn(getPackageManager, "default") - .mockReturnValue(undefined); - - // package manager should not exist - expect( - JSON.parse(read("package.json") || "{}").packageManager - ).toBeUndefined(); - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(mockGetPackageManager).toHaveBeenCalledTimes(1); - expect(mockGetPackageManager).toHaveBeenCalledWith({ directory: root }); - - // result should be correct - // result should be correct - expect(result.fatalError?.message).toMatch( - /Unable to determine package manager for .*?/ - ); - - mockGetPackageManager.mockRestore(); - }); - - test("errors when unable to determine package manager", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "no-package-manager" }); - - const mockGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockImplementation(() => { - throw new Error("package manager not supported"); - }); - - // package manager should not exist - expect( - JSON.parse(read("package.json") || "{}").packageManager - ).toBeUndefined(); - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(mockGetPackageManagerVersion).toHaveBeenCalledTimes(1); - - // result should be correct - expect(result.fatalError?.message).toMatch( - /Unable to determine package manager version for .*?/ - ); - - mockGetPackageManagerVersion.mockRestore(); - }); - - test("errors when unable to write json", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "no-package-manager" }); - - const packageManager = "pnpm"; - const packageManagerVersion = "1.2.3"; - - // mock out workspace and version detection so we're not dependent on our actual repo - const mockGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - - const mockGetPackageManager = jest - .spyOn(getPackageManager, "default") - .mockReturnValue(packageManager); - - const mockWriteJsonSync = jest - .spyOn(fs, "writeJsonSync") - .mockImplementation(() => { - throw new Error("could not write file"); - }); - - // package manager should not exist - expect( - JSON.parse(read("package.json") || "{}").packageManager - ).toBeUndefined(); - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(mockGetPackageManager).toHaveBeenCalledWith({ directory: root }); - expect(mockGetPackageManagerVersion).toHaveBeenCalledWith( - packageManager, - root - ); - - // package manager should still not exist (we couldn't write it) - expect( - JSON.parse(read("package.json") || "{}").packageManager - ).toBeUndefined(); - - // result should be correct - expect(result.fatalError?.message).toMatch( - "Encountered an error while transforming files" - ); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "error", - "additions": 1, - "deletions": 0, - "error": [Error: could not write file], - }, - } - `); - - mockWriteJsonSync.mockRestore(); - mockGetPackageManagerVersion.mockRestore(); - mockGetPackageManager.mockRestore(); - }); -}); diff --git a/packages/turbo-codemod/__tests__/create-turbo-config.test.ts b/packages/turbo-codemod/__tests__/create-turbo-config.test.ts deleted file mode 100644 index 8938c78..0000000 --- a/packages/turbo-codemod/__tests__/create-turbo-config.test.ts +++ /dev/null @@ -1,416 +0,0 @@ -import { transformer } from "../src/transforms/create-turbo-config"; -import { setupTestFixtures } from "@turbo/test-utils"; -import fs from "fs-extra"; - -describe("create-turbo-config", () => { - const { useFixture } = setupTestFixtures({ - directory: __dirname, - test: "create-turbo-config", - }); - - test("package.json config exists but no turbo.json config - basic", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "no-turbo-json-config" }); - - // turbo.json should not exist - expect(read("turbo.json")).toBeUndefined(); - - // get config from package.json for comparison later - const turboConfig = JSON.parse(read("package.json") || "{}").turbo; - expect(turboConfig).toBeDefined(); - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - // turbo.json should now exist (and match the package.json config) - expect(JSON.parse(read("turbo.json") || "{}")).toEqual(turboConfig); - - // result should be correct - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "modified", - "additions": 0, - "deletions": 1, - }, - "turbo.json": Object { - "action": "modified", - "additions": 1, - "deletions": 0, - }, - } - `); - }); - - test("package.json config exists but no turbo.json config - repeat run", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "no-turbo-json-config" }); - - // turbo.json should not exist - expect(read("turbo.json")).toBeUndefined(); - - // get config from package.json for comparison later - const turboConfig = JSON.parse(read("package.json") || "{}").turbo; - expect(turboConfig).toBeDefined(); - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - // turbo.json should now exist (and match the package.json config) - expect(JSON.parse(read("turbo.json") || "{}")).toEqual(turboConfig); - - // result should be correct - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "modified", - "additions": 0, - "deletions": 1, - }, - "turbo.json": Object { - "action": "modified", - "additions": 1, - "deletions": 0, - }, - } - `); - - // run the transformer - const repeatResult = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - // result should be correct - expect(repeatResult.fatalError).toBeUndefined(); - expect(repeatResult.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "unchanged", - "additions": 0, - "deletions": 0, - }, - "turbo.json": Object { - "action": "unchanged", - "additions": 0, - "deletions": 0, - }, - } - `); - }); - - test("package.json config exists but no turbo.json config - dry", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "no-turbo-json-config" }); - - // turbo.json should not exist - expect(read("turbo.json")).toBeUndefined(); - - // get config from package.json for comparison later - const turboConfig = JSON.parse(read("package.json") || "{}").turbo; - expect(turboConfig).toBeDefined(); - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: true, print: false }, - }); - - // turbo.json still not exist (dry run) - expect(read("turbo.json")).toBeUndefined(); - - // result should be correct - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "skipped", - "additions": 0, - "deletions": 1, - }, - "turbo.json": Object { - "action": "skipped", - "additions": 1, - "deletions": 0, - }, - } - `); - }); - - test("package.json config exists but no turbo.json config - print", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "no-turbo-json-config" }); - - // turbo.json should not exist - expect(read("turbo.json")).toBeUndefined(); - - // get config from package.json for comparison later - const turboConfig = JSON.parse(read("package.json") || "{}").turbo; - expect(turboConfig).toBeDefined(); - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: true }, - }); - - // turbo.json should now exist (and match the package.json config) - expect(JSON.parse(read("turbo.json") || "{}")).toEqual(turboConfig); - - // result should be correct - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "modified", - "additions": 0, - "deletions": 1, - }, - "turbo.json": Object { - "action": "modified", - "additions": 1, - "deletions": 0, - }, - } - `); - }); - - test("package.json config exists but no turbo.json config - dry & print", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "no-turbo-json-config" }); - - // turbo.json should not exist - expect(read("turbo.json")).toBeUndefined(); - - // get config from package.json for comparison later - const turboConfig = JSON.parse(read("package.json") || "{}").turbo; - expect(turboConfig).toBeDefined(); - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: true, print: true }, - }); - - // turbo.json still not exist (dry run) - expect(read("turbo.json")).toBeUndefined(); - - // result should be correct - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "skipped", - "additions": 0, - "deletions": 1, - }, - "turbo.json": Object { - "action": "skipped", - "additions": 1, - "deletions": 0, - }, - } - `); - }); - - test("no package.json config or turbo.json file exists", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "no-package-json-config" }); - - // turbo.json should not exist - expect(read("turbo.json")).toBeUndefined(); - - // get config from package.json for comparison later - const packageJsonConfig = JSON.parse(read("package.json") || "{}"); - const turboConfig = packageJsonConfig.turbo; - expect(turboConfig).toBeUndefined(); - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - // turbo.json should still not exist - expect(read("turbo.json")).toBeUndefined(); - - // make sure we didn't change the package.json - expect(JSON.parse(read("package.json") || "{}")).toEqual(packageJsonConfig); - - // result should be correct - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "unchanged", - "additions": 0, - "deletions": 0, - }, - "turbo.json": Object { - "action": "unchanged", - "additions": 0, - "deletions": 0, - }, - } - `); - }); - - test("no package.json file exists", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "no-package-json-file" }); - - // turbo.json should not exist - expect(read("turbo.json")).toBeUndefined(); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - // turbo.json should still not exist - expect(read("turbo.json")).toBeUndefined(); - - // result should be correct - expect(result.fatalError?.message).toMatch( - /No package\.json found at .*?\. Is the path correct\?/ - ); - }); - - test("turbo.json file exists and no package.json config exists", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "turbo-json-config" }); - - // turbo.json should exist - expect(read("turbo.json")).toBeDefined(); - - // no config should exist in package.json - const packageJsonConfig = JSON.parse(read("package.json") || "{}"); - const turboConfig = packageJsonConfig.turbo; - expect(turboConfig).toBeUndefined(); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - // turbo.json should still exist - expect(read("turbo.json")).toBeDefined(); - - // make sure we didn't change the package.json - expect(JSON.parse(read("package.json") || "{}")).toEqual(packageJsonConfig); - - // result should be correct - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "unchanged", - "additions": 0, - "deletions": 0, - }, - "turbo.json": Object { - "action": "unchanged", - "additions": 0, - "deletions": 0, - }, - } - `); - }); - - test("turbo.json file exists and package.json config exists", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "both-configs" }); - - // turbo.json should exist - const turboJsonConfig = JSON.parse(read("turbo.json") || "{}"); - expect(turboJsonConfig.pipeline).toBeDefined(); - - // no config should exist in package.json - const packageJsonConfig = JSON.parse(read("package.json") || "{}"); - const turboConfig = JSON.parse(read("package.json") || "{}").turbo; - expect(turboConfig).toBeDefined(); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - // make sure we didn't change the package.json - expect(JSON.parse(read("package.json") || "{}")).toEqual(packageJsonConfig); - - // make sure we didn't change the turbo.json - expect(JSON.parse(read("turbo.json") || "{}")).toEqual(turboJsonConfig); - - // result should be correct - expect(result.fatalError?.message).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "unchanged", - "additions": 0, - "deletions": 0, - }, - "turbo.json": Object { - "action": "unchanged", - "additions": 0, - "deletions": 0, - }, - } - `); - }); - - test("errors when unable to write json", () => { - // load the fixture for the test - const { root, read } = useFixture({ fixture: "no-turbo-json-config" }); - - // turbo.json should not exist - expect(read("turbo.json")).toBeUndefined(); - - // get config from package.json for comparison later - const turboConfig = JSON.parse(read("package.json") || "{}").turbo; - expect(turboConfig).toBeDefined(); - - const mockWriteJsonSync = jest - .spyOn(fs, "writeJsonSync") - .mockImplementation(() => { - throw new Error("could not write file"); - }); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - // turbo.json should still not exist (error writing) - expect(read("turbo.json")).toBeUndefined(); - - // result should be correct - expect(result.fatalError).toBeDefined(); - expect(result.fatalError?.message).toMatch( - "Encountered an error while transforming files" - ); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "package.json": Object { - "action": "error", - "additions": 0, - "deletions": 1, - "error": [Error: could not write file], - }, - "turbo.json": Object { - "action": "error", - "additions": 1, - "deletions": 0, - "error": [Error: could not write file], - }, - } - `); - - mockWriteJsonSync.mockRestore(); - }); -}); diff --git a/packages/turbo-codemod/__tests__/get-turbo-upgrade-command.test.ts b/packages/turbo-codemod/__tests__/get-turbo-upgrade-command.test.ts deleted file mode 100644 index 1015589..0000000 --- a/packages/turbo-codemod/__tests__/get-turbo-upgrade-command.test.ts +++ /dev/null @@ -1,576 +0,0 @@ -import { setupTestFixtures } from "@turbo/test-utils"; -import getTurboUpgradeCommand from "../src/commands/migrate/steps/getTurboUpgradeCommand"; -import * as utils from "../src/commands/migrate/utils"; -import * as getPackageManager from "../src/utils/getPackageManager"; -import * as getPackageManagerVersion from "../src/utils/getPackageManagerVersion"; - -const LOCAL_INSTALL_COMMANDS = [ - // npm - workspaces - [ - "latest", - "npm", - "7.0.0", - "normal-workspaces-dev-install", - "npm install turbo@latest --save-dev", - ], - [ - "1.6.3", - "npm", - "7.0.0", - "normal-workspaces-dev-install", - "npm install turbo@1.6.3 --save-dev", - ], - [ - "canary", - "npm", - "7.0.0", - "normal-workspaces-dev-install", - "npm install turbo@canary --save-dev", - ], - ["latest", "npm", "7.0.0", "normal-workspaces", "npm install turbo@latest"], - // npm - single package - [ - "latest", - "npm", - "7.0.0", - "single-package-dev-install", - "npm install turbo@latest --save-dev", - ], - ["latest", "npm", "7.0.0", "single-package", "npm install turbo@latest"], - // pnpm - workspaces - [ - "latest", - "pnpm", - "7.0.0", - "pnpm-workspaces-dev-install", - "pnpm install turbo@latest --save-dev -w", - ], - [ - "1.6.3", - "pnpm", - "7.0.0", - "pnpm-workspaces-dev-install", - "pnpm install turbo@1.6.3 --save-dev -w", - ], - [ - "canary", - "pnpm", - "7.0.0", - "pnpm-workspaces-dev-install", - "pnpm install turbo@canary --save-dev -w", - ], - [ - "latest", - "pnpm", - "7.0.0", - "pnpm-workspaces", - "pnpm install turbo@latest -w", - ], - // pnpm - single package - [ - "latest", - "pnpm", - "7.0.0", - "single-package-dev-install", - "pnpm install turbo@latest --save-dev", - ], - ["latest", "pnpm", "7.0.0", "single-package", "pnpm install turbo@latest"], - // yarn 1.x - workspaces - [ - "latest", - "yarn", - "1.22.19", - "normal-workspaces-dev-install", - "yarn add turbo@latest --dev -W", - ], - [ - "latest", - "yarn", - "1.22.19", - "normal-workspaces", - "yarn add turbo@latest -W", - ], - [ - "1.6.3", - "yarn", - "1.22.19", - "normal-workspaces-dev-install", - "yarn add turbo@1.6.3 --dev -W", - ], - [ - "canary", - "yarn", - "1.22.19", - "normal-workspaces-dev-install", - "yarn add turbo@canary --dev -W", - ], - // yarn 1.x - single package - [ - "latest", - "yarn", - "1.22.19", - "single-package-dev-install", - "yarn add turbo@latest --dev", - ], - ["latest", "yarn", "1.22.19", "single-package", "yarn add turbo@latest"], - // yarn 2.x - workspaces - [ - "latest", - "yarn", - "2.3.4", - "normal-workspaces-dev-install", - "yarn add turbo@latest --dev", - ], - ["latest", "yarn", "2.3.4", "normal-workspaces", "yarn add turbo@latest"], - [ - "1.6.3", - "yarn", - "2.3.4", - "normal-workspaces-dev-install", - "yarn add turbo@1.6.3 --dev", - ], - [ - "canary", - "yarn", - "2.3.4", - "normal-workspaces-dev-install", - "yarn add turbo@canary --dev", - ], - // yarn 2.x - single package - [ - "latest", - "yarn", - "2.3.4", - "single-package-dev-install", - "yarn add turbo@latest --dev", - ], - ["latest", "yarn", "2.3.4", "single-package", "yarn add turbo@latest"], - // yarn 3.x - workspaces - [ - "latest", - "yarn", - "3.3.4", - "normal-workspaces-dev-install", - "yarn add turbo@latest --dev", - ], - ["latest", "yarn", "3.3.4", "normal-workspaces", "yarn add turbo@latest"], - [ - "1.6.3", - "yarn", - "3.3.4", - "normal-workspaces-dev-install", - "yarn add turbo@1.6.3 --dev", - ], - [ - "canary", - "yarn", - "3.3.4", - "normal-workspaces-dev-install", - "yarn add turbo@canary --dev", - ], - // yarn 3.x - single package - [ - "latest", - "yarn", - "3.3.4", - "single-package-dev-install", - "yarn add turbo@latest --dev", - ], - ["latest", "yarn", "3.3.4", "single-package", "yarn add turbo@latest"], -]; - -const GLOBAL_INSTALL_COMMANDS = [ - // npm - [ - "latest", - "npm", - "7.0.0", - "normal-workspaces-dev-install", - "npm install turbo@latest --global", - ], - [ - "1.6.3", - "npm", - "7.0.0", - "normal-workspaces-dev-install", - "npm install turbo@1.6.3 --global", - ], - [ - "latest", - "npm", - "7.0.0", - "normal-workspaces", - "npm install turbo@latest --global", - ], - [ - "latest", - "npm", - "7.0.0", - "single-package", - "npm install turbo@latest --global", - ], - [ - "latest", - "npm", - "7.0.0", - "single-package-dev-install", - "npm install turbo@latest --global", - ], - // pnpm - [ - "latest", - "pnpm", - "7.0.0", - "pnpm-workspaces-dev-install", - "pnpm install turbo@latest --global", - ], - [ - "1.6.3", - "pnpm", - "7.0.0", - "pnpm-workspaces-dev-install", - "pnpm install turbo@1.6.3 --global", - ], - [ - "latest", - "pnpm", - "7.0.0", - "pnpm-workspaces", - "pnpm install turbo@latest --global", - ], - [ - "latest", - "pnpm", - "7.0.0", - "single-package", - "pnpm install turbo@latest --global", - ], - [ - "latest", - "pnpm", - "7.0.0", - "single-package-dev-install", - "pnpm install turbo@latest --global", - ], - // yarn 1.x - [ - "latest", - "yarn", - "1.22.19", - "normal-workspaces-dev-install", - "yarn global add turbo@latest", - ], - [ - "latest", - "yarn", - "1.22.19", - "normal-workspaces", - "yarn global add turbo@latest", - ], - [ - "1.6.3", - "yarn", - "1.22.19", - "normal-workspaces-dev-install", - "yarn global add turbo@1.6.3", - ], - [ - "latest", - "yarn", - "1.22.19", - "single-package", - "yarn global add turbo@latest", - ], - [ - "latest", - "yarn", - "1.22.19", - "single-package-dev-install", - "yarn global add turbo@latest", - ], - // yarn 2.x - [ - "latest", - "yarn", - "2.3.4", - "normal-workspaces-dev-install", - "yarn global add turbo@latest", - ], - [ - "latest", - "yarn", - "2.3.4", - "normal-workspaces", - "yarn global add turbo@latest", - ], - [ - "1.6.3", - "yarn", - "2.3.4", - "normal-workspaces-dev-install", - "yarn global add turbo@1.6.3", - ], - ["latest", "yarn", "2.3.4", "single-package", "yarn global add turbo@latest"], - [ - "latest", - "yarn", - "2.3.4", - "single-package-dev-install", - "yarn global add turbo@latest", - ], - // yarn 3.x - [ - "latest", - "yarn", - "3.3.3", - "normal-workspaces-dev-install", - "yarn global add turbo@latest", - ], - [ - "latest", - "yarn", - "3.3.3", - "normal-workspaces", - "yarn global add turbo@latest", - ], - [ - "1.6.3", - "yarn", - "3.3.3", - "normal-workspaces-dev-install", - "yarn global add turbo@1.6.3", - ], - ["latest", "yarn", "3.3.4", "single-package", "yarn global add turbo@latest"], - [ - "latest", - "yarn", - "3.3.4", - "single-package-dev-install", - "yarn global add turbo@latest", - ], -]; - -describe("get-turbo-upgrade-command", () => { - const { useFixture } = setupTestFixtures({ - directory: __dirname, - test: "get-turbo-upgrade-command", - }); - - test.each(LOCAL_INSTALL_COMMANDS)( - "returns correct upgrade command for local install of turbo@%s using %s@%s (fixture: %s)", - ( - turboVersion, - packageManager, - packageManagerVersion, - fixture, - expectedUpgradeCommand - ) => { - const { root } = useFixture({ - fixture, - }); - - const mockedExec = jest - .spyOn(utils, "exec") - .mockImplementation((command: string) => { - // fail the check for the turbo, and package manager bins to force local - if (command.includes("bin")) { - return undefined; - } - }); - const mockedGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - const mockedGetPackageManager = jest - .spyOn(getPackageManager, "default") - .mockReturnValue(packageManager as getPackageManager.PackageManager); - - // get the command - const upgradeCommand = getTurboUpgradeCommand({ - directory: root, - to: turboVersion === "latest" ? undefined : turboVersion, - }); - - expect(upgradeCommand).toEqual(expectedUpgradeCommand); - - mockedExec.mockRestore(); - mockedGetPackageManager.mockRestore(); - mockedGetPackageManagerVersion.mockRestore(); - } - ); - - test.each(GLOBAL_INSTALL_COMMANDS)( - "returns correct upgrade command for global install of turbo@%s using %s@%s (fixture: %s)", - ( - turboVersion, - packageManager, - packageManagerVersion, - fixture, - expectedUpgradeCommand - ) => { - const { root } = useFixture({ - fixture, - }); - - const mockedExec = jest - .spyOn(utils, "exec") - .mockImplementation((command: string) => { - if (command === "turbo bin") { - return `/global/${packageManager}/bin/turbo`; - } - if (command.includes(packageManager)) { - return `/global/${packageManager}/bin`; - } - }); - const mockedGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - const mockedGetPackageManager = jest - .spyOn(getPackageManager, "default") - .mockReturnValue(packageManager as getPackageManager.PackageManager); - - // get the command - const upgradeCommand = getTurboUpgradeCommand({ - directory: root, - to: turboVersion === "latest" ? undefined : turboVersion, - }); - - expect(upgradeCommand).toEqual(expectedUpgradeCommand); - - mockedExec.mockRestore(); - mockedGetPackageManager.mockRestore(); - mockedGetPackageManagerVersion.mockRestore(); - } - ); - - test("fails gracefully if no package.json exists", () => { - const { root } = useFixture({ - fixture: "no-package", - }); - - const mockedExec = jest - .spyOn(utils, "exec") - .mockImplementation((command: string) => { - // fail the check for the turbo, and package manager bins to force local - if (command.includes("bin")) { - return undefined; - } - }); - - const mockedGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue("8.0.0"); - const mockedGetPackageManager = jest - .spyOn(getPackageManager, "default") - .mockReturnValue("pnpm" as getPackageManager.PackageManager); - - // get the command - const upgradeCommand = getTurboUpgradeCommand({ - directory: root, - }); - - expect(upgradeCommand).toEqual(undefined); - - mockedExec.mockRestore(); - mockedGetPackageManager.mockRestore(); - mockedGetPackageManagerVersion.mockRestore(); - }); - - test("fails gracefully if turbo cannot be found in package.json", () => { - const { root } = useFixture({ - fixture: "no-turbo", - }); - - const mockedExec = jest - .spyOn(utils, "exec") - .mockImplementation((command: string) => { - // fail the check for the turbo, and package manager bins to force local - if (command.includes("bin")) { - return undefined; - } - }); - - const mockedGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue("8.0.0"); - const mockedGetPackageManager = jest - .spyOn(getPackageManager, "default") - .mockReturnValue("pnpm" as getPackageManager.PackageManager); - - // get the command - const upgradeCommand = getTurboUpgradeCommand({ - directory: root, - }); - - expect(upgradeCommand).toEqual(undefined); - - mockedExec.mockRestore(); - mockedGetPackageManager.mockRestore(); - mockedGetPackageManagerVersion.mockRestore(); - }); - - test("fails gracefully if package.json has no deps or devDeps", () => { - const { root } = useFixture({ - fixture: "no-deps", - }); - - const mockedExec = jest - .spyOn(utils, "exec") - .mockImplementation((command: string) => { - // fail the check for the turbo, and package manager bins to force local - if (command.includes("bin")) { - return undefined; - } - }); - - const mockedGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue("8.0.0"); - const mockedGetPackageManager = jest - .spyOn(getPackageManager, "default") - .mockReturnValue("pnpm" as getPackageManager.PackageManager); - - // get the command - const upgradeCommand = getTurboUpgradeCommand({ - directory: root, - }); - - expect(upgradeCommand).toEqual(undefined); - - mockedExec.mockRestore(); - mockedGetPackageManager.mockRestore(); - mockedGetPackageManagerVersion.mockRestore(); - }); - - test("fails gracefully if can't find packageManager", () => { - const { root } = useFixture({ - fixture: "no-deps", - }); - - const mockedExec = jest - .spyOn(utils, "exec") - .mockImplementation((command: string) => { - // fail the check for the turbo, and package manager bins to force local - if (command.includes("bin")) { - return undefined; - } - }); - - const mockedGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue("8.0.0"); - const mockedGetPackageManager = jest - .spyOn(getPackageManager, "default") - .mockReturnValue("pnpm" as getPackageManager.PackageManager); - - // get the command - const upgradeCommand = getTurboUpgradeCommand({ - directory: root, - }); - - expect(upgradeCommand).toEqual(undefined); - - mockedExec.mockRestore(); - mockedGetPackageManager.mockRestore(); - mockedGetPackageManagerVersion.mockRestore(); - }); -}); diff --git a/packages/turbo-codemod/__tests__/migrate-env-var-dependencies.test.ts b/packages/turbo-codemod/__tests__/migrate-env-var-dependencies.test.ts deleted file mode 100644 index fbc5d8d..0000000 --- a/packages/turbo-codemod/__tests__/migrate-env-var-dependencies.test.ts +++ /dev/null @@ -1,758 +0,0 @@ -import merge from "deepmerge"; -import { - hasLegacyEnvVarDependencies, - migratePipeline, - migrateConfig, - transformer, -} from "../src/transforms/migrate-env-var-dependencies"; -import { setupTestFixtures } from "@turbo/test-utils"; -import type { Schema } from "@turbo/types"; - -const getTestTurboConfig = (override: Schema = { pipeline: {} }): Schema => { - const config = { - $schema: "./docs/public/schema.json", - globalDependencies: ["$GLOBAL_ENV_KEY"], - pipeline: { - test: { - outputs: ["coverage/**/*"], - dependsOn: ["^build"], - }, - lint: { - outputs: [], - }, - dev: { - cache: false, - }, - build: { - outputs: ["dist/**/*", ".next/**/*", "!.next/cache/**"], - dependsOn: ["^build", "$TASK_ENV_KEY", "$ANOTHER_ENV_KEY"], - }, - }, - }; - - return merge(config, override, { - arrayMerge: (_, sourceArray) => sourceArray, - }); -}; - -describe("migrate-env-var-dependencies", () => { - describe("hasLegacyEnvVarDependencies - utility", () => { - it("finds env keys in legacy turbo.json - has keys", async () => { - const config = getTestTurboConfig(); - const { hasKeys, envVars } = hasLegacyEnvVarDependencies(config); - expect(hasKeys).toEqual(true); - expect(envVars).toMatchInlineSnapshot(` - Array [ - "$GLOBAL_ENV_KEY", - "$TASK_ENV_KEY", - "$ANOTHER_ENV_KEY", - ] - `); - }); - - it("finds env keys in legacy turbo.json - multiple pipeline keys", async () => { - const config = getTestTurboConfig({ - pipeline: { test: { dependsOn: ["$MY_ENV"] } }, - }); - const { hasKeys, envVars } = hasLegacyEnvVarDependencies(config); - expect(hasKeys).toEqual(true); - expect(envVars).toMatchInlineSnapshot(` - Array [ - "$GLOBAL_ENV_KEY", - "$MY_ENV", - "$TASK_ENV_KEY", - "$ANOTHER_ENV_KEY", - ] - `); - }); - - it("finds env keys in legacy turbo.json - no keys", async () => { - // override to exclude keys - const config = getTestTurboConfig({ - globalDependencies: [], - pipeline: { build: { dependsOn: [] } }, - }); - const { hasKeys, envVars } = hasLegacyEnvVarDependencies(config); - expect(hasKeys).toEqual(false); - expect(envVars).toMatchInlineSnapshot(`Array []`); - }); - - it("finds env keys in turbo.json - no global", async () => { - const { hasKeys, envVars } = hasLegacyEnvVarDependencies({ - pipeline: { build: { dependsOn: ["$cool"] } }, - }); - expect(hasKeys).toEqual(true); - expect(envVars).toMatchInlineSnapshot(` - Array [ - "$cool", - ] - `); - }); - }); - - describe("migratePipeline - utility", () => { - it("migrates pipeline with env var dependencies", async () => { - const config = getTestTurboConfig(); - const { build } = config.pipeline; - const pipeline = migratePipeline(build); - expect(pipeline).toHaveProperty("env"); - expect(pipeline?.env).toMatchInlineSnapshot(` - Array [ - "TASK_ENV_KEY", - "ANOTHER_ENV_KEY", - ] - `); - expect(pipeline?.dependsOn).toMatchInlineSnapshot(` - Array [ - "^build", - ] - `); - }); - - it("migrates pipeline with no env var dependencies", async () => { - const config = getTestTurboConfig(); - const { test } = config.pipeline; - const pipeline = migratePipeline(test); - expect(pipeline.env).toBeUndefined(); - expect(pipeline?.dependsOn).toMatchInlineSnapshot(` - Array [ - "^build", - ] - `); - }); - - it("migrates pipeline with existing env key", async () => { - const config = getTestTurboConfig({ - pipeline: { test: { env: ["$MY_ENV"], dependsOn: ["^build"] } }, - }); - const { test } = config.pipeline; - const pipeline = migratePipeline(test); - expect(pipeline).toHaveProperty("env"); - expect(pipeline?.env).toMatchInlineSnapshot(` - Array [ - "$MY_ENV", - ] - `); - expect(pipeline?.dependsOn).toMatchInlineSnapshot(` - Array [ - "^build", - ] - `); - }); - - it("migrates pipeline with incomplete env key", async () => { - const config = getTestTurboConfig({ - pipeline: { - test: { env: ["$MY_ENV"], dependsOn: ["^build", "$SUPER_COOL"] }, - }, - }); - const { test } = config.pipeline; - const pipeline = migratePipeline(test); - expect(pipeline).toHaveProperty("env"); - expect(pipeline?.env).toMatchInlineSnapshot(` - Array [ - "$MY_ENV", - "SUPER_COOL", - ] - `); - expect(pipeline?.dependsOn).toMatchInlineSnapshot(` - Array [ - "^build", - ] - `); - }); - - it("migrates pipeline with duplicate env keys", async () => { - const config = getTestTurboConfig({ - pipeline: { - test: { env: ["$MY_ENV"], dependsOn: ["^build", "$MY_ENV"] }, - }, - }); - const { test } = config.pipeline; - const pipeline = migratePipeline(test); - expect(pipeline).toHaveProperty("env"); - expect(pipeline?.env).toMatchInlineSnapshot(` - Array [ - "$MY_ENV", - "MY_ENV", - ] - `); - expect(pipeline?.dependsOn).toMatchInlineSnapshot(` - Array [ - "^build", - ] - `); - }); - }); - - describe("migrateConfig - utility", () => { - it("migrates config with env var dependencies", async () => { - const config = getTestTurboConfig(); - const pipeline = migrateConfig(config); - expect(pipeline).toMatchInlineSnapshot(` - Object { - "$schema": "./docs/public/schema.json", - "globalEnv": Array [ - "GLOBAL_ENV_KEY", - ], - "pipeline": Object { - "build": Object { - "dependsOn": Array [ - "^build", - ], - "env": Array [ - "TASK_ENV_KEY", - "ANOTHER_ENV_KEY", - ], - "outputs": Array [ - "dist/**/*", - ".next/**/*", - "!.next/cache/**", - ], - }, - "dev": Object { - "cache": false, - }, - "lint": Object { - "outputs": Array [], - }, - "test": Object { - "dependsOn": Array [ - "^build", - ], - "outputs": Array [ - "coverage/**/*", - ], - }, - }, - } - `); - }); - - it("migrates config with no env var dependencies", async () => { - const config = getTestTurboConfig({ - globalDependencies: [], - pipeline: { - build: { dependsOn: ["^build"] }, - }, - }); - const pipeline = migrateConfig(config); - expect(pipeline).toMatchInlineSnapshot(` - Object { - "$schema": "./docs/public/schema.json", - "pipeline": Object { - "build": Object { - "dependsOn": Array [ - "^build", - ], - "outputs": Array [ - "dist/**/*", - ".next/**/*", - "!.next/cache/**", - ], - }, - "dev": Object { - "cache": false, - }, - "lint": Object { - "outputs": Array [], - }, - "test": Object { - "dependsOn": Array [ - "^build", - ], - "outputs": Array [ - "coverage/**/*", - ], - }, - }, - } - `); - }); - - it("migrates config with inconsistent config", async () => { - const config = getTestTurboConfig({ - pipeline: { - test: { env: ["$MY_ENV"], dependsOn: ["^build", "$SUPER_COOL"] }, - }, - }); - const pipeline = migrateConfig(config); - expect(pipeline).toMatchInlineSnapshot(` - Object { - "$schema": "./docs/public/schema.json", - "globalEnv": Array [ - "GLOBAL_ENV_KEY", - ], - "pipeline": Object { - "build": Object { - "dependsOn": Array [ - "^build", - ], - "env": Array [ - "TASK_ENV_KEY", - "ANOTHER_ENV_KEY", - ], - "outputs": Array [ - "dist/**/*", - ".next/**/*", - "!.next/cache/**", - ], - }, - "dev": Object { - "cache": false, - }, - "lint": Object { - "outputs": Array [], - }, - "test": Object { - "dependsOn": Array [ - "^build", - ], - "env": Array [ - "$MY_ENV", - "SUPER_COOL", - ], - "outputs": Array [ - "coverage/**/*", - ], - }, - }, - } - `); - }); - - it("migrates config with duplicate env keys", async () => { - const config = getTestTurboConfig({ - pipeline: { - test: { env: ["$MY_ENV"], dependsOn: ["^build", "$MY_ENV"] }, - }, - }); - const pipeline = migrateConfig(config); - expect(pipeline).toMatchInlineSnapshot(` - Object { - "$schema": "./docs/public/schema.json", - "globalEnv": Array [ - "GLOBAL_ENV_KEY", - ], - "pipeline": Object { - "build": Object { - "dependsOn": Array [ - "^build", - ], - "env": Array [ - "TASK_ENV_KEY", - "ANOTHER_ENV_KEY", - ], - "outputs": Array [ - "dist/**/*", - ".next/**/*", - "!.next/cache/**", - ], - }, - "dev": Object { - "cache": false, - }, - "lint": Object { - "outputs": Array [], - }, - "test": Object { - "dependsOn": Array [ - "^build", - ], - "env": Array [ - "$MY_ENV", - "MY_ENV", - ], - "outputs": Array [ - "coverage/**/*", - ], - }, - }, - } - `); - }); - }); - - describe("transform", () => { - const { useFixture } = setupTestFixtures({ - directory: __dirname, - test: "migrate-env-var-dependencies", - }); - - it("migrates turbo.json env var dependencies - basic", async () => { - // load the fixture for the test - const { root, read } = useFixture({ - fixture: "env-dependencies", - }); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(JSON.parse(read("turbo.json") || "{}")).toStrictEqual({ - $schema: "https://turbo.build/schema.json", - globalDependencies: [".env"], - globalEnv: ["NEXT_PUBLIC_API_KEY", "STRIPE_API_KEY"], - pipeline: { - build: { - dependsOn: ["^build"], - env: ["PROD_API_KEY"], - outputs: [".next/**", "!.next/cache/**"], - }, - dev: { - cache: false, - }, - lint: { - dependsOn: [], - env: ["IS_CI"], - outputs: [], - }, - test: { - dependsOn: ["test"], - env: ["IS_CI"], - outputs: [], - }, - }, - }); - - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "turbo.json": Object { - "action": "modified", - "additions": 4, - "deletions": 4, - }, - } - `); - }); - - it("migrates turbo.json env var dependencies - workspace configs", async () => { - // load the fixture for the test - const { root, readJson } = useFixture({ - fixture: "workspace-configs", - }); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(readJson("turbo.json") || "{}").toStrictEqual({ - $schema: "https://turbo.build/schema.json", - globalDependencies: [".env"], - globalEnv: ["NEXT_PUBLIC_API_KEY", "STRIPE_API_KEY"], - pipeline: { - build: { - dependsOn: ["^build"], - env: ["PROD_API_KEY"], - outputs: [".next/**", "!.next/cache/**"], - }, - dev: { - cache: false, - }, - lint: { - dependsOn: [], - env: ["IS_TEST"], - outputs: [], - }, - test: { - dependsOn: ["test"], - env: ["IS_CI"], - outputs: [], - }, - }, - }); - - expect(readJson("apps/web/turbo.json") || "{}").toStrictEqual({ - $schema: "https://turbo.build/schema.json", - extends: ["//"], - pipeline: { - build: { - // old - dependsOn: ["build"], - // new - env: ["ENV_1", "ENV_2"], - }, - }, - }); - - expect(readJson("packages/ui/turbo.json") || "{}").toStrictEqual({ - $schema: "https://turbo.build/schema.json", - extends: ["//"], - pipeline: { - build: { - dependsOn: [], - env: ["IS_SERVER"], - }, - }, - }); - - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "apps/web/turbo.json": Object { - "action": "modified", - "additions": 1, - "deletions": 0, - }, - "packages/ui/turbo.json": Object { - "action": "modified", - "additions": 1, - "deletions": 1, - }, - "turbo.json": Object { - "action": "modified", - "additions": 4, - "deletions": 4, - }, - } - `); - }); - - it("migrates turbo.json env var dependencies - repeat run", async () => { - // load the fixture for the test - const { root, read } = useFixture({ - fixture: "env-dependencies", - }); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(JSON.parse(read("turbo.json") || "{}")).toStrictEqual({ - $schema: "https://turbo.build/schema.json", - globalDependencies: [".env"], - globalEnv: ["NEXT_PUBLIC_API_KEY", "STRIPE_API_KEY"], - pipeline: { - build: { - dependsOn: ["^build"], - env: ["PROD_API_KEY"], - outputs: [".next/**", "!.next/cache/**"], - }, - dev: { - cache: false, - }, - lint: { - dependsOn: [], - env: ["IS_CI"], - outputs: [], - }, - test: { - dependsOn: ["test"], - env: ["IS_CI"], - outputs: [], - }, - }, - }); - - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "turbo.json": Object { - "action": "modified", - "additions": 4, - "deletions": 4, - }, - } - `); - - // run the transformer - const repeatResult = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(repeatResult.fatalError).toBeUndefined(); - expect(repeatResult.changes).toMatchInlineSnapshot(` - Object { - "turbo.json": Object { - "action": "unchanged", - "additions": 0, - "deletions": 0, - }, - } - `); - }); - - it("migrates turbo.json env var dependencies - dry", async () => { - // load the fixture for the test - const { root, read } = useFixture({ - fixture: "env-dependencies", - }); - - const turboJson = JSON.parse(read("turbo.json") || "{}"); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: true, print: false }, - }); - - // make sure it didn't change - expect(JSON.parse(read("turbo.json") || "{}")).toEqual(turboJson); - - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "turbo.json": Object { - "action": "skipped", - "additions": 4, - "deletions": 4, - }, - } - `); - }); - - it("migrates turbo.json env var dependencies - print", async () => { - // load the fixture for the test - const { root, read } = useFixture({ - fixture: "env-dependencies", - }); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: true }, - }); - - expect(JSON.parse(read("turbo.json") || "{}")).toStrictEqual({ - $schema: "https://turbo.build/schema.json", - globalEnv: ["NEXT_PUBLIC_API_KEY", "STRIPE_API_KEY"], - globalDependencies: [".env"], - pipeline: { - build: { - dependsOn: ["^build"], - env: ["PROD_API_KEY"], - outputs: [".next/**", "!.next/cache/**"], - }, - dev: { - cache: false, - }, - lint: { - dependsOn: [], - env: ["IS_CI"], - outputs: [], - }, - test: { - dependsOn: ["test"], - env: ["IS_CI"], - outputs: [], - }, - }, - }); - - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "turbo.json": Object { - "action": "modified", - "additions": 4, - "deletions": 4, - }, - } - `); - }); - - it("migrates turbo.json env var dependencies - dry & print", async () => { - // load the fixture for the test - const { root, read } = useFixture({ - fixture: "env-dependencies", - }); - - const turboJson = JSON.parse(read("turbo.json") || "{}"); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: true, print: true }, - }); - - // make sure it didn't change - expect(JSON.parse(read("turbo.json") || "{}")).toEqual(turboJson); - - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "turbo.json": Object { - "action": "skipped", - "additions": 4, - "deletions": 4, - }, - } - `); - }); - - it("does not change turbo.json if already migrated", async () => { - // load the fixture for the test - const { root, read } = useFixture({ - fixture: "migrated-env-dependencies", - }); - - const turboJson = JSON.parse(read("turbo.json") || "{}"); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(JSON.parse(read("turbo.json") || "{}")).toEqual(turboJson); - - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "turbo.json": Object { - "action": "unchanged", - "additions": 0, - "deletions": 0, - }, - } - `); - }); - - it("errors if no turbo.json can be found", async () => { - // load the fixture for the test - const { root, read } = useFixture({ - fixture: "no-turbo-json", - }); - - expect(read("turbo.json")).toBeUndefined(); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(read("turbo.json")).toBeUndefined(); - expect(result.fatalError).toBeDefined(); - expect(result.fatalError?.message).toMatch( - /No turbo\.json found at .*?\. Is the path correct\?/ - ); - }); - - it("errors if package.json config exists and has not been migrated", async () => { - // load the fixture for the test - const { root } = useFixture({ - fixture: "old-config", - }); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(result.fatalError).toBeDefined(); - expect(result.fatalError?.message).toMatch( - 'turbo" key detected in package.json. Run `npx @turbo/codemod transform create-turbo-config` first' - ); - }); - }); -}); diff --git a/packages/turbo-codemod/__tests__/migrate.test.ts b/packages/turbo-codemod/__tests__/migrate.test.ts deleted file mode 100644 index 652ea41..0000000 --- a/packages/turbo-codemod/__tests__/migrate.test.ts +++ /dev/null @@ -1,761 +0,0 @@ -import { MigrateCommandArgument } from "../src/commands"; -import migrate from "../src/commands/migrate"; -import { setupTestFixtures, spyExit } from "@turbo/test-utils"; -import childProcess from "child_process"; -import * as checkGitStatus from "../src/utils/checkGitStatus"; -import * as getCurrentVersion from "../src/commands/migrate/steps/getCurrentVersion"; -import * as getLatestVersion from "../src/commands/migrate/steps/getLatestVersion"; -import * as getTurboUpgradeCommand from "../src/commands/migrate/steps/getTurboUpgradeCommand"; -import * as workspaceImplementation from "../src/utils/getPackageManager"; -import * as getPackageManagerVersion from "../src/utils/getPackageManagerVersion"; - -describe("migrate", () => { - const mockExit = spyExit(); - const { useFixture } = setupTestFixtures({ - directory: __dirname, - test: "migrate", - }); - - it("migrates from 1.0.0 to 1.7.0", async () => { - const { root, readJson } = useFixture({ - fixture: "old-turbo", - }); - - const packageManager = "pnpm"; - const packageManagerVersion = "1.2.3"; - - // setup mocks - const mockedCheckGitStatus = jest - .spyOn(checkGitStatus, "default") - .mockReturnValue(undefined); - const mockedGetCurrentVersion = jest - .spyOn(getCurrentVersion, "default") - .mockReturnValue("1.0.0"); - const mockedGetLatestVersion = jest - .spyOn(getLatestVersion, "default") - .mockResolvedValue("1.7.0"); - const mockedGetTurboUpgradeCommand = jest - .spyOn(getTurboUpgradeCommand, "default") - .mockReturnValue("pnpm install -g turbo@latest"); - const mockedGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - const mockedGetWorkspaceImplementation = jest - .spyOn(workspaceImplementation, "default") - .mockReturnValue(packageManager); - - await migrate(root as MigrateCommandArgument, { - force: false, - dry: false, - print: false, - install: false, - }); - - expect(readJson("package.json")).toStrictEqual({ - dependencies: {}, - devDependencies: { - turbo: "1.0.0", - }, - name: "no-turbo-json", - packageManager: "pnpm@1.2.3", - version: "1.0.0", - }); - expect(readJson("turbo.json")).toStrictEqual({ - $schema: "https://turbo.build/schema.json", - pipeline: { - build: { - outputs: [".next/**", "!.next/cache/**"], - }, - dev: { - cache: false, - }, - lint: {}, - test: { - outputs: ["dist/**", "build/**"], - }, - }, - }); - - // verify mocks were called - expect(mockedCheckGitStatus).toHaveBeenCalled(); - expect(mockedGetCurrentVersion).toHaveBeenCalled(); - expect(mockedGetLatestVersion).toHaveBeenCalled(); - expect(mockedGetTurboUpgradeCommand).toHaveBeenCalled(); - expect(mockedGetPackageManagerVersion).toHaveBeenCalled(); - expect(mockedGetWorkspaceImplementation).toHaveBeenCalled(); - - // restore mocks - mockedCheckGitStatus.mockRestore(); - mockedGetCurrentVersion.mockRestore(); - mockedGetLatestVersion.mockRestore(); - mockedGetTurboUpgradeCommand.mockRestore(); - mockedGetPackageManagerVersion.mockRestore(); - mockedGetWorkspaceImplementation.mockRestore(); - }); - - it("migrates from 1.0.0 to 1.2.0 (dry run)", async () => { - const { root, readJson } = useFixture({ - fixture: "old-turbo", - }); - - const packageManager = "pnpm"; - const packageManagerVersion = "1.2.3"; - - // setup mocks - const mockedCheckGitStatus = jest - .spyOn(checkGitStatus, "default") - .mockReturnValue(undefined); - const mockedGetCurrentVersion = jest - .spyOn(getCurrentVersion, "default") - .mockReturnValue("1.0.0"); - const mockedGetLatestVersion = jest - .spyOn(getLatestVersion, "default") - .mockResolvedValue("1.2.0"); - const mockedGetTurboUpgradeCommand = jest - .spyOn(getTurboUpgradeCommand, "default") - .mockReturnValue("pnpm install -g turbo@latest"); - const mockedGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - const mockedGetWorkspaceImplementation = jest - .spyOn(workspaceImplementation, "default") - .mockReturnValue(packageManager); - - const packageJson = readJson("package.json"); - const turboJson = readJson("turbo.json"); - - await migrate(root as MigrateCommandArgument, { - force: false, - dry: true, - print: false, - install: true, - }); - - // make sure nothing changed - expect(readJson("package.json")).toStrictEqual(packageJson); - expect(readJson("turbo.json")).toStrictEqual(turboJson); - - // verify mocks were called - expect(mockedCheckGitStatus).not.toHaveBeenCalled(); - expect(mockedGetCurrentVersion).toHaveBeenCalled(); - expect(mockedGetLatestVersion).toHaveBeenCalled(); - expect(mockedGetTurboUpgradeCommand).toHaveBeenCalled(); - expect(mockedGetPackageManagerVersion).toHaveBeenCalled(); - expect(mockedGetWorkspaceImplementation).toHaveBeenCalled(); - - // restore mocks - mockedCheckGitStatus.mockRestore(); - mockedGetCurrentVersion.mockRestore(); - mockedGetLatestVersion.mockRestore(); - mockedGetTurboUpgradeCommand.mockRestore(); - mockedGetPackageManagerVersion.mockRestore(); - mockedGetWorkspaceImplementation.mockRestore(); - }); - - it("next version can be passed as an option", async () => { - const { root, readJson } = useFixture({ - fixture: "old-turbo", - }); - - const packageManager = "pnpm"; - const packageManagerVersion = "1.2.3"; - - // setup mocks - const mockedCheckGitStatus = jest - .spyOn(checkGitStatus, "default") - .mockReturnValue(undefined); - const mockedGetCurrentVersion = jest - .spyOn(getCurrentVersion, "default") - .mockReturnValue("1.0.0"); - const mockedGetLatestVersion = jest - .spyOn(getLatestVersion, "default") - .mockResolvedValue("1.7.0"); - const mockedGetTurboUpgradeCommand = jest - .spyOn(getTurboUpgradeCommand, "default") - .mockReturnValue("pnpm install -g turbo@latest"); - const mockedGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - const mockedGetWorkspaceImplementation = jest - .spyOn(workspaceImplementation, "default") - .mockReturnValue(packageManager); - - await migrate(root as MigrateCommandArgument, { - force: false, - dry: false, - print: false, - install: false, - to: "1.7.0", - }); - - expect(readJson("package.json")).toStrictEqual({ - dependencies: {}, - devDependencies: { - turbo: "1.0.0", - }, - name: "no-turbo-json", - packageManager: "pnpm@1.2.3", - version: "1.0.0", - }); - expect(readJson("turbo.json")).toStrictEqual({ - $schema: "https://turbo.build/schema.json", - pipeline: { - build: { - outputs: [".next/**", "!.next/cache/**"], - }, - dev: { - cache: false, - }, - test: { - outputs: ["dist/**", "build/**"], - }, - lint: {}, - }, - }); - - // verify mocks were called - expect(mockedCheckGitStatus).toHaveBeenCalled(); - expect(mockedGetCurrentVersion).toHaveBeenCalled(); - expect(mockedGetLatestVersion).toHaveBeenCalled(); - expect(mockedGetTurboUpgradeCommand).toHaveBeenCalled(); - expect(mockedGetPackageManagerVersion).toHaveBeenCalled(); - expect(mockedGetWorkspaceImplementation).toHaveBeenCalled(); - - // restore mocks - mockedCheckGitStatus.mockRestore(); - mockedGetCurrentVersion.mockRestore(); - mockedGetLatestVersion.mockRestore(); - mockedGetTurboUpgradeCommand.mockRestore(); - mockedGetPackageManagerVersion.mockRestore(); - mockedGetWorkspaceImplementation.mockRestore(); - }); - - it("current version can be passed as an option", async () => { - const { root, readJson } = useFixture({ - fixture: "old-turbo", - }); - - const packageManager = "pnpm"; - const packageManagerVersion = "1.2.3"; - - // setup mocks - const mockedCheckGitStatus = jest - .spyOn(checkGitStatus, "default") - .mockReturnValue(undefined); - const mockedGetLatestVersion = jest - .spyOn(getLatestVersion, "default") - .mockResolvedValue("1.7.0"); - const mockedGetTurboUpgradeCommand = jest - .spyOn(getTurboUpgradeCommand, "default") - .mockReturnValue("pnpm install -g turbo@latest"); - const mockedGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - - const mockedGetWorkspaceImplementation = jest - .spyOn(workspaceImplementation, "default") - .mockReturnValue(packageManager); - - await migrate(root as MigrateCommandArgument, { - force: false, - dry: false, - print: false, - install: false, - from: "1.0.0", - }); - - expect(readJson("package.json")).toStrictEqual({ - dependencies: {}, - devDependencies: { - turbo: "1.0.0", - }, - name: "no-turbo-json", - packageManager: "pnpm@1.2.3", - version: "1.0.0", - }); - expect(readJson("turbo.json")).toStrictEqual({ - $schema: "https://turbo.build/schema.json", - pipeline: { - build: { - outputs: [".next/**", "!.next/cache/**"], - }, - dev: { - cache: false, - }, - lint: {}, - test: { - outputs: ["dist/**", "build/**"], - }, - }, - }); - - // verify mocks were called - expect(mockedCheckGitStatus).toHaveBeenCalled(); - expect(mockedGetLatestVersion).toHaveBeenCalled(); - expect(mockedGetTurboUpgradeCommand).toHaveBeenCalled(); - expect(mockedGetPackageManagerVersion).toHaveBeenCalled(); - expect(mockedGetWorkspaceImplementation).toHaveBeenCalled(); - - // restore mocks - mockedCheckGitStatus.mockRestore(); - mockedGetLatestVersion.mockRestore(); - mockedGetTurboUpgradeCommand.mockRestore(); - mockedGetPackageManagerVersion.mockRestore(); - mockedGetWorkspaceImplementation.mockRestore(); - }); - - it("exits if the current version is the same as the new version", async () => { - const { root } = useFixture({ - fixture: "old-turbo", - }); - - // setup mocks - const mockedCheckGitStatus = jest - .spyOn(checkGitStatus, "default") - .mockReturnValue(undefined); - const mockedGetCurrentVersion = jest - .spyOn(getCurrentVersion, "default") - .mockReturnValue("1.7.0"); - const mockedGetLatestVersion = jest - .spyOn(getLatestVersion, "default") - .mockResolvedValue("1.7.0"); - - await migrate(root as MigrateCommandArgument, { - force: false, - dry: false, - print: false, - install: false, - }); - - expect(mockExit.exit).toHaveBeenCalledWith(0); - - // verify mocks were called - expect(mockedCheckGitStatus).toHaveBeenCalled(); - expect(mockedGetCurrentVersion).toHaveBeenCalled(); - expect(mockedGetLatestVersion).toHaveBeenCalled(); - - // restore mocks - mockedCheckGitStatus.mockRestore(); - mockedGetCurrentVersion.mockRestore(); - mockedGetLatestVersion.mockRestore(); - }); - - it("continues when migration doesn't require codemods", async () => { - const { root } = useFixture({ - fixture: "old-turbo", - }); - - // setup mocks - const mockedCheckGitStatus = jest - .spyOn(checkGitStatus, "default") - .mockReturnValue(undefined); - const mockedGetCurrentVersion = jest - .spyOn(getCurrentVersion, "default") - .mockReturnValue("1.3.0"); - const mockedGetLatestVersion = jest - .spyOn(getLatestVersion, "default") - .mockResolvedValue("1.3.1"); - const mockedGetTurboUpgradeCommand = jest - .spyOn(getTurboUpgradeCommand, "default") - .mockReturnValue("npm install turbo@1.3.1"); - const mockExecSync = jest - .spyOn(childProcess, "execSync") - .mockReturnValue("installed"); - - await migrate(root as MigrateCommandArgument, { - force: false, - dry: false, - print: false, - install: true, - }); - - // verify mocks were called - expect(mockedCheckGitStatus).toHaveBeenCalled(); - expect(mockedGetCurrentVersion).toHaveBeenCalled(); - expect(mockedGetLatestVersion).toHaveBeenCalled(); - expect(mockedGetTurboUpgradeCommand).toHaveBeenCalled(); - expect(mockExecSync).toHaveBeenCalledWith("npm install turbo@1.3.1", { - cwd: root, - }); - - // restore mocks - mockedCheckGitStatus.mockRestore(); - mockedGetCurrentVersion.mockRestore(); - mockedGetLatestVersion.mockRestore(); - mockedGetTurboUpgradeCommand.mockRestore(); - mockExecSync.mockRestore(); - }); - - it("installs the correct turbo version", async () => { - const { root, readJson } = useFixture({ - fixture: "old-turbo", - }); - - const packageManager = "pnpm"; - const packageManagerVersion = "1.2.3"; - - // setup mocks - const mockedCheckGitStatus = jest - .spyOn(checkGitStatus, "default") - .mockReturnValue(undefined); - const mockedGetCurrentVersion = jest - .spyOn(getCurrentVersion, "default") - .mockReturnValue("1.0.0"); - const mockedGetLatestVersion = jest - .spyOn(getLatestVersion, "default") - .mockResolvedValue("1.7.0"); - const mockedGetTurboUpgradeCommand = jest - .spyOn(getTurboUpgradeCommand, "default") - .mockReturnValue("pnpm install -g turbo@1.7.0"); - const mockedGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - const mockedGetWorkspaceImplementation = jest - .spyOn(workspaceImplementation, "default") - .mockReturnValue(packageManager); - const mockExecSync = jest - .spyOn(childProcess, "execSync") - .mockReturnValue("installed"); - - await migrate(root as MigrateCommandArgument, { - force: false, - dry: false, - print: false, - install: true, - }); - - expect(readJson("package.json")).toStrictEqual({ - dependencies: {}, - devDependencies: { - turbo: "1.0.0", - }, - name: "no-turbo-json", - packageManager: "pnpm@1.2.3", - version: "1.0.0", - }); - expect(readJson("turbo.json")).toStrictEqual({ - $schema: "https://turbo.build/schema.json", - pipeline: { - build: { - outputs: [".next/**", "!.next/cache/**"], - }, - dev: { - cache: false, - }, - lint: {}, - test: { - outputs: ["dist/**", "build/**"], - }, - }, - }); - - // verify mocks were called - expect(mockedCheckGitStatus).toHaveBeenCalled(); - expect(mockedGetCurrentVersion).toHaveBeenCalled(); - expect(mockedGetLatestVersion).toHaveBeenCalled(); - expect(mockedGetTurboUpgradeCommand).toHaveBeenCalled(); - expect(mockedGetPackageManagerVersion).toHaveBeenCalled(); - expect(mockedGetWorkspaceImplementation).toHaveBeenCalled(); - expect(mockExecSync).toHaveBeenCalled(); - expect(mockExecSync).toHaveBeenCalledWith("pnpm install -g turbo@1.7.0", { - cwd: root, - }); - - // restore mocks - mockedCheckGitStatus.mockRestore(); - mockedGetCurrentVersion.mockRestore(); - mockedGetLatestVersion.mockRestore(); - mockedGetTurboUpgradeCommand.mockRestore(); - mockedGetPackageManagerVersion.mockRestore(); - mockedGetWorkspaceImplementation.mockRestore(); - mockExecSync.mockRestore(); - }); - - it("fails gracefully when the correct upgrade command cannot be found", async () => { - const { root, readJson } = useFixture({ - fixture: "old-turbo", - }); - - const packageManager = "pnpm"; - const packageManagerVersion = "1.2.3"; - - // setup mocks - const mockedCheckGitStatus = jest - .spyOn(checkGitStatus, "default") - .mockReturnValue(undefined); - const mockedGetCurrentVersion = jest - .spyOn(getCurrentVersion, "default") - .mockReturnValue("1.0.0"); - const mockedGetLatestVersion = jest - .spyOn(getLatestVersion, "default") - .mockResolvedValue("1.7.0"); - const mockedGetTurboUpgradeCommand = jest - .spyOn(getTurboUpgradeCommand, "default") - .mockReturnValue(undefined); - const mockedGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - const mockedGetWorkspaceImplementation = jest - .spyOn(workspaceImplementation, "default") - .mockReturnValue(packageManager); - const mockExecSync = jest - .spyOn(childProcess, "execSync") - .mockReturnValue("installed"); - - await migrate(root as MigrateCommandArgument, { - force: false, - dry: false, - print: false, - install: true, - }); - - expect(readJson("package.json")).toStrictEqual({ - dependencies: {}, - devDependencies: { - turbo: "1.0.0", - }, - name: "no-turbo-json", - packageManager: "pnpm@1.2.3", - version: "1.0.0", - }); - expect(readJson("turbo.json")).toStrictEqual({ - $schema: "https://turbo.build/schema.json", - pipeline: { - build: { - outputs: [".next/**", "!.next/cache/**"], - }, - dev: { - cache: false, - }, - lint: {}, - test: { - outputs: ["dist/**", "build/**"], - }, - }, - }); - - expect(mockExit.exit).toHaveBeenCalledWith(1); - - // verify mocks were called - expect(mockedCheckGitStatus).toHaveBeenCalled(); - expect(mockedGetCurrentVersion).toHaveBeenCalled(); - expect(mockedGetLatestVersion).toHaveBeenCalled(); - expect(mockedGetTurboUpgradeCommand).toHaveBeenCalled(); - expect(mockedGetPackageManagerVersion).toHaveBeenCalled(); - expect(mockedGetWorkspaceImplementation).toHaveBeenCalled(); - expect(mockExecSync).not.toHaveBeenCalled(); - - // restore mocks - mockedCheckGitStatus.mockRestore(); - mockedGetCurrentVersion.mockRestore(); - mockedGetLatestVersion.mockRestore(); - mockedGetTurboUpgradeCommand.mockRestore(); - mockedGetPackageManagerVersion.mockRestore(); - mockedGetWorkspaceImplementation.mockRestore(); - mockExecSync.mockRestore(); - }); - - it("exits if current version is not passed and cannot be inferred", async () => { - const { root } = useFixture({ - fixture: "old-turbo", - }); - - // setup mocks - const mockedCheckGitStatus = jest - .spyOn(checkGitStatus, "default") - .mockReturnValue(undefined); - const mockedGetCurrentVersion = jest - .spyOn(getCurrentVersion, "default") - .mockReturnValue(undefined); - - await migrate(root as MigrateCommandArgument, { - force: false, - dry: false, - print: false, - install: false, - }); - - expect(mockExit.exit).toHaveBeenCalledWith(1); - - // verify mocks were called - expect(mockedCheckGitStatus).toHaveBeenCalled(); - expect(mockedGetCurrentVersion).toHaveBeenCalled(); - - // restore mocks - mockedCheckGitStatus.mockRestore(); - mockedGetCurrentVersion.mockRestore(); - }); - - it("exits if latest version is not passed and cannot be inferred", async () => { - const { root } = useFixture({ - fixture: "old-turbo", - }); - - // setup mocks - const mockedCheckGitStatus = jest - .spyOn(checkGitStatus, "default") - .mockReturnValue(undefined); - const mockedGetCurrentVersion = jest - .spyOn(getCurrentVersion, "default") - .mockReturnValue("1.5.0"); - const mockedGetLatestVersion = jest - .spyOn(getLatestVersion, "default") - .mockResolvedValue(undefined); - - await migrate(root as MigrateCommandArgument, { - force: false, - dry: false, - print: false, - install: false, - }); - - expect(mockExit.exit).toHaveBeenCalledWith(1); - - // verify mocks were called - expect(mockedCheckGitStatus).toHaveBeenCalled(); - expect(mockedGetCurrentVersion).toHaveBeenCalled(); - expect(mockedGetLatestVersion).toHaveBeenCalled(); - - // restore mocks - mockedCheckGitStatus.mockRestore(); - mockedGetCurrentVersion.mockRestore(); - mockedGetLatestVersion.mockRestore(); - }); - - it("exits if latest version throws", async () => { - const { root } = useFixture({ - fixture: "old-turbo", - }); - - // setup mocks - const mockedCheckGitStatus = jest - .spyOn(checkGitStatus, "default") - .mockReturnValue(undefined); - const mockedGetCurrentVersion = jest - .spyOn(getCurrentVersion, "default") - .mockReturnValue("1.5.0"); - const mockedGetLatestVersion = jest - .spyOn(getLatestVersion, "default") - .mockRejectedValue(new Error("failed to fetch version")); - - await migrate(root as MigrateCommandArgument, { - force: false, - dry: false, - print: false, - install: false, - }); - - expect(mockExit.exit).toHaveBeenCalledWith(1); - - // verify mocks were called - expect(mockedCheckGitStatus).toHaveBeenCalled(); - expect(mockedGetCurrentVersion).toHaveBeenCalled(); - expect(mockedGetLatestVersion).toHaveBeenCalled(); - - // restore mocks - mockedCheckGitStatus.mockRestore(); - mockedGetCurrentVersion.mockRestore(); - mockedGetLatestVersion.mockRestore(); - }); - - it("exits if any transforms encounter an error", async () => { - const { root } = useFixture({ - fixture: "old-turbo", - }); - - const packageManager = "pnpm"; - const packageManagerVersion = "1.2.3"; - - // setup mocks - const mockedCheckGitStatus = jest - .spyOn(checkGitStatus, "default") - .mockReturnValue(undefined); - const mockedGetCurrentVersion = jest - .spyOn(getCurrentVersion, "default") - .mockReturnValue("1.0.0"); - const mockedGetLatestVersion = jest - .spyOn(getLatestVersion, "default") - .mockResolvedValue("1.7.0"); - const mockedGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - const mockedGetWorkspaceImplementation = jest - .spyOn(workspaceImplementation, "default") - .mockReturnValue(packageManager); - - await migrate(root as MigrateCommandArgument, { - force: false, - dry: true, - print: false, - install: true, - }); - - expect(mockExit.exit).toHaveBeenCalledWith(1); - - // verify mocks were called - expect(mockedCheckGitStatus).not.toHaveBeenCalled(); - expect(mockedGetCurrentVersion).toHaveBeenCalled(); - expect(mockedGetLatestVersion).toHaveBeenCalled(); - expect(mockedGetPackageManagerVersion).toHaveBeenCalled(); - expect(mockedGetWorkspaceImplementation).toHaveBeenCalled(); - - // restore mocks - mockedCheckGitStatus.mockRestore(); - mockedGetCurrentVersion.mockRestore(); - mockedGetLatestVersion.mockRestore(); - mockedGetPackageManagerVersion.mockRestore(); - mockedGetWorkspaceImplementation.mockRestore(); - }); - - it("exits if invalid directory is passed", async () => { - const { root } = useFixture({ - fixture: "old-turbo", - }); - - // setup mocks - const mockedCheckGitStatus = jest - .spyOn(checkGitStatus, "default") - .mockReturnValue(undefined); - - await migrate("~/path/that/does/not/exist" as MigrateCommandArgument, { - force: false, - dry: false, - print: false, - install: false, - }); - - expect(mockExit.exit).toHaveBeenCalledWith(1); - - // verify mocks were called - expect(mockedCheckGitStatus).toHaveBeenCalled(); - - // restore mocks - mockedCheckGitStatus.mockRestore(); - }); - - it("exits if directory with no repo is passed", async () => { - const { root } = useFixture({ - fixture: "no-repo", - }); - - // setup mocks - const mockedCheckGitStatus = jest - .spyOn(checkGitStatus, "default") - .mockReturnValue(undefined); - - await migrate(root as MigrateCommandArgument, { - force: false, - dry: false, - print: false, - install: false, - }); - - expect(mockExit.exit).toHaveBeenCalledWith(1); - - // verify mocks were called - expect(mockedCheckGitStatus).toHaveBeenCalled(); - - // restore mocks - mockedCheckGitStatus.mockRestore(); - }); -}); diff --git a/packages/turbo-codemod/__tests__/set-default-outputs.test.ts b/packages/turbo-codemod/__tests__/set-default-outputs.test.ts deleted file mode 100644 index 4a71fa7..0000000 --- a/packages/turbo-codemod/__tests__/set-default-outputs.test.ts +++ /dev/null @@ -1,391 +0,0 @@ -import { transformer } from "../src/transforms/set-default-outputs"; -import { setupTestFixtures } from "@turbo/test-utils"; - -describe("set-default-outputs", () => { - const { useFixture } = setupTestFixtures({ - directory: __dirname, - test: "set-default-outputs", - }); - it("migrates turbo.json outputs - basic", async () => { - // load the fixture for the test - const { root, read } = useFixture({ - fixture: "old-outputs", - }); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(JSON.parse(read("turbo.json") || "{}")).toStrictEqual({ - $schema: "https://turbo.build/schema.json", - pipeline: { - "build-one": { - outputs: ["foo"], - }, - "build-two": {}, - "build-three": { - outputs: ["dist/**", "build/**"], - }, - }, - }); - - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "turbo.json": Object { - "action": "modified", - "additions": 2, - "deletions": 1, - }, - } - `); - }); - - it("migrates turbo.json outputs - workspace configs", async () => { - // load the fixture for the test - const { root, readJson } = useFixture({ - fixture: "workspace-configs", - }); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(readJson("turbo.json") || "{}").toStrictEqual({ - $schema: "https://turbo.build/schema.json", - pipeline: { - "build-one": { - outputs: ["foo"], - }, - "build-two": {}, - "build-three": { - outputs: ["dist/**", "build/**"], - }, - }, - }); - - expect(readJson("apps/docs/turbo.json") || "{}").toStrictEqual({ - $schema: "https://turbo.build/schema.json", - extends: ["//"], - pipeline: { - build: { - outputs: ["dist/**", "build/**"], - }, - }, - }); - - expect(readJson("apps/web/turbo.json") || "{}").toStrictEqual({ - $schema: "https://turbo.build/schema.json", - extends: ["//"], - pipeline: { - build: {}, - }, - }); - - expect(readJson("packages/ui/turbo.json") || "{}").toStrictEqual({ - $schema: "https://turbo.build/schema.json", - extends: ["//"], - pipeline: { - "build-three": { - outputs: ["dist/**", "build/**"], - }, - }, - }); - - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "apps/docs/turbo.json": Object { - "action": "modified", - "additions": 1, - "deletions": 1, - }, - "apps/web/turbo.json": Object { - "action": "modified", - "additions": 1, - "deletions": 0, - }, - "packages/ui/turbo.json": Object { - "action": "modified", - "additions": 1, - "deletions": 1, - }, - "turbo.json": Object { - "action": "modified", - "additions": 2, - "deletions": 1, - }, - } - `); - }); - - it("migrates turbo.json outputs - dry", async () => { - // load the fixture for the test - const { root, read } = useFixture({ - fixture: "old-outputs", - }); - - const turboJson = JSON.parse(read("turbo.json") || "{}"); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: true, print: false }, - }); - - // make sure it didn't change - expect(JSON.parse(read("turbo.json") || "{}")).toEqual(turboJson); - - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "turbo.json": Object { - "action": "skipped", - "additions": 2, - "deletions": 1, - }, - } - `); - }); - - it("migrates turbo.json outputs - print", async () => { - // load the fixture for the test - const { root, read } = useFixture({ - fixture: "old-outputs", - }); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: true }, - }); - - expect(JSON.parse(read("turbo.json") || "{}")).toStrictEqual({ - $schema: "https://turbo.build/schema.json", - pipeline: { - "build-one": { - outputs: ["foo"], - }, - "build-two": {}, - "build-three": { - outputs: ["dist/**", "build/**"], - }, - }, - }); - - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "turbo.json": Object { - "action": "modified", - "additions": 2, - "deletions": 1, - }, - } - `); - }); - - it("migrates turbo.json outputs - dry & print", async () => { - // load the fixture for the test - const { root, read } = useFixture({ - fixture: "old-outputs", - }); - - const turboJson = JSON.parse(read("turbo.json") || "{}"); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: true, print: false }, - }); - - // make sure it didn't change - expect(JSON.parse(read("turbo.json") || "{}")).toEqual(turboJson); - - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "turbo.json": Object { - "action": "skipped", - "additions": 2, - "deletions": 1, - }, - } - `); - }); - - it("migrates turbo.json outputs - invalid", async () => { - // load the fixture for the test - const { root, read } = useFixture({ - fixture: "invalid-outputs", - }); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(JSON.parse(read("turbo.json") || "{}")).toStrictEqual({ - $schema: "https://turbo.build/schema.json", - pipeline: { - "build-one": { - outputs: ["foo"], - }, - "build-two": {}, - "build-three": { - outputs: ["dist/**", "build/**"], - }, - "garbage-in-numeric-0": { - outputs: ["dist/**", "build/**"], - }, - "garbage-in-numeric": { - outputs: 42, - }, - "garbage-in-string": { - outputs: "string", - }, - "garbage-in-empty-string": { - outputs: ["dist/**", "build/**"], - }, - "garbage-in-null": { - outputs: ["dist/**", "build/**"], - }, - "garbage-in-false": { - outputs: ["dist/**", "build/**"], - }, - "garbage-in-true": { - outputs: true, - }, - "garbage-in-object": { - outputs: {}, - }, - }, - }); - - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "turbo.json": Object { - "action": "modified", - "additions": 6, - "deletions": 5, - }, - } - `); - }); - - it("migrates turbo.json outputs - config with no pipeline", async () => { - // load the fixture for the test - const { root, read } = useFixture({ - fixture: "no-pipeline", - }); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(JSON.parse(read("turbo.json") || "{}")).toStrictEqual({ - $schema: "https://turbo.build/schema.json", - globalDependencies: ["$NEXT_PUBLIC_API_KEY", "$STRIPE_API_KEY", ".env"], - pipeline: {}, - }); - - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "turbo.json": Object { - "action": "unchanged", - "additions": 0, - "deletions": 0, - }, - } - `); - }); - - it("migrates turbo.json outputs - config with no outputs", async () => { - // load the fixture for the test - const { root, read } = useFixture({ - fixture: "no-outputs", - }); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(JSON.parse(read("turbo.json") || "{}")).toStrictEqual({ - $schema: "https://turbo.build/schema.json", - pipeline: { - "build-one": { - dependsOn: ["build-two"], - outputs: ["dist/**", "build/**"], - }, - "build-two": { - cache: false, - }, - "build-three": { - persistent: true, - outputs: ["dist/**", "build/**"], - }, - }, - }); - - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(` - Object { - "turbo.json": Object { - "action": "modified", - "additions": 2, - "deletions": 0, - }, - } - `); - }); - - it("errors if no turbo.json can be found", async () => { - // load the fixture for the test - const { root, read } = useFixture({ - fixture: "no-turbo-json", - }); - - expect(read("turbo.json")).toBeUndefined(); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(read("turbo.json")).toBeUndefined(); - expect(result.fatalError).toBeDefined(); - expect(result.fatalError?.message).toMatch( - /No turbo\.json found at .*?\. Is the path correct\?/ - ); - }); - - it("errors if package.json config exists and has not been migrated", async () => { - // load the fixture for the test - const { root } = useFixture({ - fixture: "old-config", - }); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - expect(result.fatalError).toBeDefined(); - expect(result.fatalError?.message).toMatch( - 'turbo" key detected in package.json. Run `npx @turbo/codemod transform create-turbo-config` first' - ); - }); -}); diff --git a/packages/turbo-codemod/__tests__/transform.test.ts b/packages/turbo-codemod/__tests__/transform.test.ts deleted file mode 100644 index abd015d..0000000 --- a/packages/turbo-codemod/__tests__/transform.test.ts +++ /dev/null @@ -1,172 +0,0 @@ -import transform from "../src/commands/transform"; -import { MigrateCommandArgument } from "../src/commands"; -import { setupTestFixtures, spyExit } from "@turbo/test-utils"; -import * as checkGitStatus from "../src/utils/checkGitStatus"; -import * as getPackageManager from "../src/utils/getPackageManager"; -import * as getPackageManagerVersion from "../src/utils/getPackageManagerVersion"; - -describe("transform", () => { - const mockExit = spyExit(); - const { useFixture } = setupTestFixtures({ - directory: __dirname, - test: "transform", - }); - - it("runs the selected transform", async () => { - const { root, readJson } = useFixture({ - fixture: "basic", - }); - - const packageManager = "pnpm"; - const packageManagerVersion = "1.2.3"; - - // setup mocks - const mockedCheckGitStatus = jest - .spyOn(checkGitStatus, "default") - .mockReturnValue(undefined); - const mockedGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - const mockedGetPackageManager = jest - .spyOn(getPackageManager, "default") - .mockReturnValue(packageManager); - - await transform( - "add-package-manager" as MigrateCommandArgument, - root as MigrateCommandArgument, - { - list: false, - force: false, - dry: false, - print: false, - } - ); - - expect(readJson("package.json")).toStrictEqual({ - dependencies: {}, - devDependencies: { - turbo: "1.0.0", - }, - name: "transform-basic", - packageManager: "pnpm@1.2.3", - version: "1.0.0", - }); - - // verify mocks were called - expect(mockedCheckGitStatus).toHaveBeenCalled(); - expect(mockedGetPackageManagerVersion).toHaveBeenCalled(); - expect(mockedGetPackageManager).toHaveBeenCalled(); - - // restore mocks - mockedCheckGitStatus.mockRestore(); - mockedGetPackageManagerVersion.mockRestore(); - mockedGetPackageManager.mockRestore(); - }); - - it("runs the selected transform - dry & print", async () => { - const { root, readJson } = useFixture({ - fixture: "basic", - }); - - const packageManager = "pnpm"; - const packageManagerVersion = "1.2.3"; - - // setup mocks - const mockedCheckGitStatus = jest - .spyOn(checkGitStatus, "default") - .mockReturnValue(undefined); - const mockedGetPackageManagerVersion = jest - .spyOn(getPackageManagerVersion, "default") - .mockReturnValue(packageManagerVersion); - const mockedGetPackageManager = jest - .spyOn(getPackageManager, "default") - .mockReturnValue(packageManager); - - await transform( - "add-package-manager" as MigrateCommandArgument, - root as MigrateCommandArgument, - { - list: false, - force: false, - dry: true, - print: true, - } - ); - - expect(readJson("package.json")).toStrictEqual({ - dependencies: {}, - devDependencies: { - turbo: "1.0.0", - }, - name: "transform-basic", - version: "1.0.0", - }); - - // verify mocks were called - expect(mockedCheckGitStatus).not.toHaveBeenCalled(); - expect(mockedGetPackageManagerVersion).toHaveBeenCalled(); - expect(mockedGetPackageManager).toHaveBeenCalled(); - - // restore mocks - mockedCheckGitStatus.mockRestore(); - mockedGetPackageManagerVersion.mockRestore(); - mockedGetPackageManager.mockRestore(); - }); - - it("lists transforms", async () => { - const { root } = useFixture({ - fixture: "basic", - }); - - await transform( - "add-package-manager" as MigrateCommandArgument, - root as MigrateCommandArgument, - { - list: true, - force: false, - dry: false, - print: false, - } - ); - - expect(mockExit.exit).toHaveBeenCalledWith(0); - }); - - it("exits on invalid transform", async () => { - const { root } = useFixture({ - fixture: "basic", - }); - - await transform( - "not-a-real-option" as MigrateCommandArgument, - root as MigrateCommandArgument, - { - list: false, - force: false, - dry: false, - print: false, - } - ); - - expect(mockExit.exit).toHaveBeenCalledWith(1); - }); - - it("exits on invalid directory", async () => { - const { root } = useFixture({ - fixture: "basic", - }); - - await transform( - "add-package-manager" as MigrateCommandArgument, - "~/path/that/does/not/exist" as MigrateCommandArgument, - { - list: false, - force: false, - dry: false, - print: false, - } - ); - - expect(mockExit.exit).toHaveBeenCalledWith(1); - }); -}); diff --git a/packages/turbo-codemod/index.d.ts b/packages/turbo-codemod/index.d.ts deleted file mode 100644 index c3a4874..0000000 --- a/packages/turbo-codemod/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module "is-git-clean"; diff --git a/packages/turbo-codemod/jest.config.js b/packages/turbo-codemod/jest.config.js deleted file mode 100644 index 2c7542a..0000000 --- a/packages/turbo-codemod/jest.config.js +++ /dev/null @@ -1,18 +0,0 @@ -/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ -module.exports = { - preset: "ts-jest/presets/js-with-ts", - testEnvironment: "node", - transformIgnorePatterns: ["/node_modules/(?!(ansi-regex)/)"], - modulePathIgnorePatterns: ["<rootDir>/node_modules", "<rootDir>/dist"], - testPathIgnorePatterns: ["/__fixtures__/"], - coveragePathIgnorePatterns: ["/__fixtures__/"], - collectCoverage: true, - coverageThreshold: { - global: { - branches: 80, - functions: 89, - lines: 89, - statements: 89, - }, - }, -}; diff --git a/packages/turbo-codemod/package.json b/packages/turbo-codemod/package.json deleted file mode 100644 index d16bb05..0000000 --- a/packages/turbo-codemod/package.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "@turbo/codemod", - "version": "1.9.4-canary.2", - "description": "Provides Codemod transformations to help upgrade your Turborepo codebase when a feature is deprecated.", - "homepage": "https://turbo.build/repo", - "license": "MPL-2.0", - "repository": { - "type": "git", - "url": "https://github.com/vercel/turbo", - "directory": "packages/turbo-codemod" - }, - "bugs": { - "url": "https://github.com/vercel/turbo/issues" - }, - "bin": "dist/cli.js", - "scripts": { - "build": "tsup", - "test": "jest", - "lint": "eslint src/**/*.ts", - "check-types": "tsc --noEmit", - "add-transformer": "plop" - }, - "dependencies": { - "axios": "0.27.2", - "chalk": "2.4.2", - "commander": "^9.5.0", - "diff": "^5.1.0", - "find-up": "4.1.0", - "fs-extra": "^10.0.0", - "gradient-string": "^2.0.0", - "inquirer": "^8.2.4", - "inquirer-file-tree-selection-prompt": "^1.0.19", - "is-git-clean": "^1.1.0", - "ora": "4.1.1", - "semver": "^7.3.7", - "update-check": "^1.5.4" - }, - "devDependencies": { - "@types/chalk-animation": "^1.6.0", - "@types/diff": "^5.0.2", - "@types/fs-extra": "^9.0.13", - "@types/gradient-string": "^1.1.2", - "@types/inquirer": "^8.2.0", - "@types/jest": "^27.4.0", - "@types/node": "^16.11.12", - "@types/semver": "^7.3.9", - "@types/uuid": "^9.0.0", - "deepmerge": "^4.2.2", - "eslint": "^7.23.0", - "jest": "^27.4.3", - "plop": "^3.1.1", - "semver": "^7.3.5", - "ts-jest": "^27.1.1", - "@turbo/tsconfig": "workspace:*", - "tsup": "^5.10.3", - "@turbo/test-utils": "workspace:*", - "@turbo/types": "workspace:*", - "@turbo/utils": "workspace:*", - "typescript": "^4.5.5" - }, - "files": [ - "dist" - ], - "publishConfig": { - "access": "public" - } -} diff --git a/packages/turbo-codemod/plopfile.js b/packages/turbo-codemod/plopfile.js deleted file mode 100644 index 9cc2dd7..0000000 --- a/packages/turbo-codemod/plopfile.js +++ /dev/null @@ -1,46 +0,0 @@ -const fs = require("fs-extra"); - -module.exports = function plopConfig(plop) { - // controller generator - plop.setGenerator("controller", { - description: "Add a new transformer", - prompts: [ - { - type: "input", - name: "name", - message: 'key for the transform (example: "create-turbo-config")', - }, - { - type: "input", - name: "description", - message: - 'description for the transform (example: "Create the `turbo.json` file from an existing "turbo" key in `package.json`")', - }, - { - type: "input", - name: "introducedIn", - message: - 'the semantic version of turbo where this change was introduced (example: "1.1.0")', - }, - ], - actions: [ - { - type: "add", - path: "src/transforms/{{name}}.ts", - templateFile: "templates/transformer.hbs", - }, - { - type: "add", - path: "__tests__/{{name}}.test.ts", - templateFile: "templates/transformer.test.hbs", - }, - function createFixturesDirectory(answers) { - process.chdir(plop.getPlopfilePath()); - const directory = `__tests__/__fixtures__/${answers.name}`; - fs.mkdirSync(`__tests__/__fixtures__/${answers.name}`); - - return `created empty ${directory} directory for fixtures`; - }, - ], - }); -}; diff --git a/packages/turbo-codemod/src/cli.ts b/packages/turbo-codemod/src/cli.ts deleted file mode 100644 index 451816f..0000000 --- a/packages/turbo-codemod/src/cli.ts +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env node - -import chalk from "chalk"; -import { Command } from "commander"; - -import { transform, migrate } from "./commands"; -import notifyUpdate from "./utils/notifyUpdate"; -import cliPkg from "../package.json"; - -const codemodCli = new Command(); - -codemodCli - .name("@turbo/codemod") - .description( - "Codemod transformations to help upgrade your Turborepo codebase when a feature is deprecated." - ) - .version(cliPkg.version, "-v, --version", "output the current version"); - -// migrate -codemodCli - .command("migrate") - .aliases(["update", "upgrade"]) - .description("Migrate a project to the latest version of Turborepo") - .argument("[path]", "Directory where the transforms should be applied") - .option( - "--from <version>", - "Specify the version to migrate from (default: current version)" - ) - .option( - "--to <version>", - "Specify the version to migrate to (default: latest)" - ) - .option("--install", "Install new version of turbo after migration", true) - .option( - "--force", - "Bypass Git safety checks and forcibly run codemods", - false - ) - .option("--dry", "Dry run (no changes are made to files)", false) - .option("--print", "Print transformed files to your terminal", false) - .action(migrate); - -// transform -codemodCli - .command("transform", { isDefault: true }) - .description("Apply a single code transformation to a project") - .argument("[transform]", "The transformer to run") - .argument("[path]", "Directory where the transforms should be applied") - .option( - "--force", - "Bypass Git safety checks and forcibly run codemods", - false - ) - .option("--list", "List all available transforms", false) - .option("--dry", "Dry run (no changes are made to files)", false) - .option("--print", "Print transformed files to your terminal", false) - .action(transform); - -codemodCli - .parseAsync() - .then(notifyUpdate) - .catch(async (reason) => { - console.log(); - if (reason.command) { - console.log(` ${chalk.cyan(reason.command)} has failed.`); - } else { - console.log(chalk.red("Unexpected error. Please report it as a bug:")); - console.log(reason); - } - console.log(); - await notifyUpdate(); - process.exit(1); - }); diff --git a/packages/turbo-codemod/src/commands/index.ts b/packages/turbo-codemod/src/commands/index.ts deleted file mode 100644 index a7aeee6..0000000 --- a/packages/turbo-codemod/src/commands/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export { default as migrate } from "./migrate"; -export { default as transform } from "./transform"; - -export type { - TransformCommandArgument, - TransformCommandOptions, -} from "./transform/types"; -export type { - MigrateCommandArgument, - MigrateCommandOptions, -} from "./migrate/types"; diff --git a/packages/turbo-codemod/src/commands/migrate/index.ts b/packages/turbo-codemod/src/commands/migrate/index.ts deleted file mode 100644 index c4c6d02..0000000 --- a/packages/turbo-codemod/src/commands/migrate/index.ts +++ /dev/null @@ -1,215 +0,0 @@ -import chalk from "chalk"; -import os from "os"; -import inquirer from "inquirer"; -import { execSync } from "child_process"; - -import getCurrentVersion from "./steps/getCurrentVersion"; -import getLatestVersion from "./steps/getLatestVersion"; -import getCodemodsForMigration from "./steps/getTransformsForMigration"; -import checkGitStatus from "../../utils/checkGitStatus"; -import directoryInfo from "../../utils/directoryInfo"; -import getTurboUpgradeCommand from "./steps/getTurboUpgradeCommand"; -import Runner from "../../runner/Runner"; -import type { MigrateCommandArgument, MigrateCommandOptions } from "./types"; -import looksLikeRepo from "../../utils/looksLikeRepo"; - -function endMigration({ - message, - success, -}: { - message?: string; - success: boolean; -}) { - if (success) { - console.log(chalk.bold(chalk.green("Migration completed"))); - if (message) { - console.log(message); - } - return process.exit(0); - } - - console.log(chalk.bold(chalk.red("Migration failed"))); - if (message) { - console.log(message); - } - return process.exit(1); -} - -/** -Migration is done in 4 steps: - -- gather information - 1. find the version (x) of turbo to migrate from (if not specified) - 2. find the version (y) of turbo to migrate to (if not specified) - 3. determine which codemods need to be run to move from version x to version y - -- action - 4. execute the codemods (serially, and in order) - 5. update the turbo version (optionally) -**/ -export default async function migrate( - directory: MigrateCommandArgument, - options: MigrateCommandOptions -) { - // check git status - if (!options.dry) { - checkGitStatus({ directory, force: options.force }); - } - - const answers = await inquirer.prompt<{ - directoryInput?: string; - }>([ - { - type: "input", - name: "directoryInput", - message: "Where is the root of the repo to migrate?", - when: !directory, - default: ".", - validate: (directory: string) => { - const { exists, absolute } = directoryInfo({ directory }); - if (exists) { - return true; - } else { - return `Directory ${chalk.dim(`(${absolute})`)} does not exist`; - } - }, - filter: (directory: string) => directory.trim(), - }, - ]); - - const { directoryInput: selectedDirectory = directory as string } = answers; - const { exists, absolute: root } = directoryInfo({ - directory: selectedDirectory, - }); - if (!exists) { - return endMigration({ - success: false, - message: `Directory ${chalk.dim(`(${root})`)} does not exist`, - }); - } - - if (!looksLikeRepo({ directory: root })) { - return endMigration({ - success: false, - message: `Directory (${chalk.dim( - root - )}) does not appear to be a repository`, - }); - } - - // step 1 - const fromVersion = getCurrentVersion(selectedDirectory, options); - if (!fromVersion) { - return endMigration({ - success: false, - message: `Unable to infer the version of turbo being used by ${directory}`, - }); - } - - // step 2 - let toVersion = options.to; - try { - toVersion = await getLatestVersion(options); - } catch (err) { - let message = "UNKNOWN_ERROR"; - if (err instanceof Error) { - message = err.message; - } - return endMigration({ - success: false, - message, - }); - } - - if (!toVersion) { - return endMigration({ - success: false, - message: `Unable to fetch the latest version of turbo`, - }); - } - - if (fromVersion === toVersion) { - return endMigration({ - success: true, - message: `Nothing to do, current version (${chalk.bold( - fromVersion - )}) is the same as the requested version (${chalk.bold(toVersion)})`, - }); - } - - // step 3 - const codemods = getCodemodsForMigration({ fromVersion, toVersion }); - if (codemods.length === 0) { - console.log( - `No codemods required to migrate from ${fromVersion} to ${toVersion}`, - os.EOL - ); - } - - // step 4 - console.log( - `Upgrading turbo from ${chalk.bold(fromVersion)} to ${chalk.bold( - toVersion - )} (${ - codemods.length === 0 - ? "no codemods required" - : `${codemods.length} required codemod${ - codemods.length === 1 ? "" : "s" - }` - })`, - os.EOL - ); - const results = codemods.map((codemod, idx) => { - console.log( - `(${idx + 1}/${codemods.length}) ${chalk.bold( - `Running ${codemod.value}` - )}` - ); - - const result = codemod.transformer({ root: selectedDirectory, options }); - Runner.logResults(result); - return result; - }); - - const hasTransformError = results.some( - (result) => - result.fatalError || - Object.keys(result.changes).some((key) => result.changes[key].error) - ); - - if (hasTransformError) { - return endMigration({ - success: false, - message: `Could not complete migration due to codemod errors. Please fix the errors and try again.`, - }); - } - - // step 5 - const upgradeCommand = getTurboUpgradeCommand({ - directory: selectedDirectory, - to: options.to, - }); - - if (!upgradeCommand) { - return endMigration({ - success: false, - message: "Unable to determine upgrade command", - }); - } - - if (options.install) { - if (options.dry) { - console.log( - `Upgrading turbo with ${chalk.bold(upgradeCommand)} ${chalk.dim( - "(dry run)" - )}`, - os.EOL - ); - } else { - console.log(`Upgrading turbo with ${chalk.bold(upgradeCommand)}`, os.EOL); - execSync(upgradeCommand, { cwd: selectedDirectory }); - } - } else { - console.log(`Upgrade turbo with ${chalk.bold(upgradeCommand)}`, os.EOL); - } - - endMigration({ success: true }); -} diff --git a/packages/turbo-codemod/src/commands/migrate/steps/getCurrentVersion.ts b/packages/turbo-codemod/src/commands/migrate/steps/getCurrentVersion.ts deleted file mode 100644 index 3644f8b..0000000 --- a/packages/turbo-codemod/src/commands/migrate/steps/getCurrentVersion.ts +++ /dev/null @@ -1,45 +0,0 @@ -import path from "path"; -import { existsSync } from "fs-extra"; - -import getPackageManager from "../../../utils/getPackageManager"; -import { exec } from "../utils"; -import type { MigrateCommandOptions } from "../types"; - -function getCurrentVersion( - directory: string, - opts: MigrateCommandOptions -): string | undefined { - const { from } = opts; - if (from) { - return from; - } - - // try global first - const turboVersionFromGlobal = exec(`turbo --version`, { cwd: directory }); - - if (turboVersionFromGlobal) { - return turboVersionFromGlobal; - } - - // try to use the package manager to find the version - const packageManager = getPackageManager({ directory }); - if (packageManager) { - if (packageManager === "yarn") { - return exec(`yarn turbo --version`, { cwd: directory }); - } - if (packageManager === "pnpm") { - return exec(`pnpm turbo --version`, { cwd: directory }); - } else { - // this doesn't work for npm, so manually build the binary path - const turboBin = path.join(directory, "node_modules", ".bin", "turbo"); - if (existsSync(turboBin)) { - return exec(`${turboBin} --version`, { cwd: directory }); - } - } - } - - // unable to determine local version, - return undefined; -} - -export default getCurrentVersion; diff --git a/packages/turbo-codemod/src/commands/migrate/steps/getLatestVersion.ts b/packages/turbo-codemod/src/commands/migrate/steps/getLatestVersion.ts deleted file mode 100644 index a6ab7e6..0000000 --- a/packages/turbo-codemod/src/commands/migrate/steps/getLatestVersion.ts +++ /dev/null @@ -1,31 +0,0 @@ -import axios from "axios"; - -import type { MigrateCommandOptions } from "../types"; - -const REGISTRY = "https://registry.npmjs.org"; - -async function getPackageDetails({ packageName }: { packageName: string }) { - try { - const result = await axios.get(`${REGISTRY}/${packageName}`); - return result.data; - } catch (err) { - throw new Error(`Unable to fetch the latest version of ${packageName}`); - } -} - -export default async function getLatestVersion({ - to, -}: MigrateCommandOptions): Promise<string | undefined> { - const packageDetails = await getPackageDetails({ packageName: "turbo" }); - const { "dist-tags": tags, versions } = packageDetails; - - if (to) { - if (tags[to] || versions[to]) { - return to; - } else { - throw new Error(`turbo@${to} does not exist`); - } - } - - return tags.latest as string; -} diff --git a/packages/turbo-codemod/src/commands/migrate/steps/getTransformsForMigration.ts b/packages/turbo-codemod/src/commands/migrate/steps/getTransformsForMigration.ts deleted file mode 100644 index 2224c06..0000000 --- a/packages/turbo-codemod/src/commands/migrate/steps/getTransformsForMigration.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { gt, lte } from "semver"; - -import loadTransformers from "../../../utils/loadTransformers"; -import type { Transformer } from "../../../types"; - -/** - Returns all transformers introduced after fromVersion, but before or equal to toVersion -**/ -function getTransformsForMigration({ - fromVersion, - toVersion, -}: { - fromVersion: string; - toVersion: string; -}): Array<Transformer> { - const transforms = loadTransformers(); - return transforms.filter((transformer) => { - return ( - gt(transformer.introducedIn, fromVersion) && - lte(transformer.introducedIn, toVersion) - ); - }); -} - -export default getTransformsForMigration; diff --git a/packages/turbo-codemod/src/commands/migrate/steps/getTurboUpgradeCommand.ts b/packages/turbo-codemod/src/commands/migrate/steps/getTurboUpgradeCommand.ts deleted file mode 100644 index 8fd5972..0000000 --- a/packages/turbo-codemod/src/commands/migrate/steps/getTurboUpgradeCommand.ts +++ /dev/null @@ -1,182 +0,0 @@ -import os from "os"; -import path from "path"; -import fs from "fs-extra"; -import { gte } from "semver"; - -import { exec } from "../utils"; -import getPackageManager, { - PackageManager, -} from "../../../utils/getPackageManager"; -import getPackageManagerVersion from "../../../utils/getPackageManagerVersion"; - -type InstallType = "dependencies" | "devDependencies"; - -function getGlobalBinaryPaths(): Record<PackageManager, string | undefined> { - return { - // we run these from a tmpdir to avoid corepack interference - yarn: exec(`yarn global bin`, { cwd: os.tmpdir() }), - npm: exec(`npm bin --global`, { cwd: os.tmpdir() }), - pnpm: exec(`pnpm bin --global`, { cwd: os.tmpdir() }), - }; -} - -function getGlobalUpgradeCommand( - packageManager: PackageManager, - to: string = "latest" -) { - switch (packageManager) { - case "yarn": - return `yarn global add turbo@${to}`; - case "npm": - return `npm install turbo@${to} --global`; - case "pnpm": - return `pnpm install turbo@${to} --global`; - } -} - -function getLocalUpgradeCommand({ - packageManager, - packageManagerVersion, - installType, - isUsingWorkspaces, - to = "latest", -}: { - packageManager: PackageManager; - packageManagerVersion: string; - installType: InstallType; - isUsingWorkspaces?: boolean; - to?: string; -}) { - const renderCommand = ( - command: Array<string | boolean | undefined> - ): string => command.filter(Boolean).join(" "); - switch (packageManager) { - // yarn command differs depending on the version - case "yarn": - // yarn 2.x and 3.x (berry) - if (gte(packageManagerVersion, "2.0.0")) { - return renderCommand([ - "yarn", - "add", - `turbo@${to}`, - installType === "devDependencies" && "--dev", - ]); - // yarn 1.x - } else { - return renderCommand([ - "yarn", - "add", - `turbo@${to}`, - installType === "devDependencies" && "--dev", - isUsingWorkspaces && "-W", - ]); - } - case "npm": - return renderCommand([ - "npm", - "install", - `turbo@${to}`, - installType === "devDependencies" && "--save-dev", - ]); - case "pnpm": - return renderCommand([ - "pnpm", - "install", - `turbo@${to}`, - installType === "devDependencies" && "--save-dev", - isUsingWorkspaces && "-w", - ]); - } -} - -function getInstallType({ directory }: { directory: string }): { - installType?: InstallType; - isUsingWorkspaces?: boolean; -} { - // read package.json to make sure we have a reference to turbo - const packageJsonPath = path.join(directory, "package.json"); - const pnpmWorkspaceConfig = path.join(directory, "pnpm-workspace.yaml"); - const isPnpmWorkspaces = fs.existsSync(pnpmWorkspaceConfig); - - if (!fs.existsSync(packageJsonPath)) { - console.error(`Unable to find package.json at ${packageJsonPath}`); - return { installType: undefined, isUsingWorkspaces: undefined }; - } - - const packageJson = fs.readJsonSync(packageJsonPath); - const isDevDependency = - packageJson.devDependencies && "turbo" in packageJson.devDependencies; - const isDependency = - packageJson.dependencies && "turbo" in packageJson.dependencies; - let isUsingWorkspaces = "workspaces" in packageJson || isPnpmWorkspaces; - - if (isDependency || isDevDependency) { - return { - installType: isDependency ? "dependencies" : "devDependencies", - isUsingWorkspaces, - }; - } - - return { - installType: undefined, - isUsingWorkspaces, - }; -} - -/** - Finding the correct command to upgrade depends on two things: - 1. The package manager - 2. The install method (local or global) - - We try global first to let turbo handle the inference, then we try local. -**/ -export default function getTurboUpgradeCommand({ - directory, - to, -}: { - directory: string; - to?: string; -}) { - const turboBinaryPathFromGlobal = exec(`turbo bin`, { - cwd: directory, - stdio: "pipe", - }); - const packageManagerGlobalBinaryPaths = getGlobalBinaryPaths(); - - const globalPackageManager = Object.keys( - packageManagerGlobalBinaryPaths - ).find((packageManager) => { - const packageManagerBinPath = - packageManagerGlobalBinaryPaths[packageManager as PackageManager]; - if (packageManagerBinPath && turboBinaryPathFromGlobal) { - return turboBinaryPathFromGlobal.includes(packageManagerBinPath); - } - - return false; - }) as PackageManager; - - if (turboBinaryPathFromGlobal && globalPackageManager) { - // figure which package manager we need to upgrade - return getGlobalUpgradeCommand(globalPackageManager, to); - } else { - const packageManager = getPackageManager({ directory }); - // we didn't find a global install, so we'll try to find a local one - const { installType, isUsingWorkspaces } = getInstallType({ directory }); - if (packageManager && installType) { - const packageManagerVersion = getPackageManagerVersion( - packageManager, - directory - ); - - return getLocalUpgradeCommand({ - packageManager, - packageManagerVersion, - installType, - isUsingWorkspaces, - to, - }); - } - } - - return undefined; -} diff --git a/packages/turbo-codemod/src/commands/migrate/types.ts b/packages/turbo-codemod/src/commands/migrate/types.ts deleted file mode 100644 index ae90965..0000000 --- a/packages/turbo-codemod/src/commands/migrate/types.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { TransformerOptions } from "../../types"; - -export type MigrateCommandArgument = "string" | undefined; - -export interface MigrateCommandOptions extends TransformerOptions { - from?: string; - to?: string; - install: boolean; -} diff --git a/packages/turbo-codemod/src/commands/migrate/utils.ts b/packages/turbo-codemod/src/commands/migrate/utils.ts deleted file mode 100644 index 512d78b..0000000 --- a/packages/turbo-codemod/src/commands/migrate/utils.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { execSync, ExecSyncOptions } from "child_process"; - -function exec( - command: string, - opts: ExecSyncOptions, - fallback?: string -): string | undefined { - try { - const rawResult = execSync(command, opts); - return rawResult.toString("utf8").trim(); - } catch (err) { - return fallback || undefined; - } -} - -export { exec }; diff --git a/packages/turbo-codemod/src/commands/transform/index.ts b/packages/turbo-codemod/src/commands/transform/index.ts deleted file mode 100644 index e3b86aa..0000000 --- a/packages/turbo-codemod/src/commands/transform/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import chalk from "chalk"; -import inquirer from "inquirer"; - -import loadTransformers from "../../utils/loadTransformers"; -import checkGitStatus from "../../utils/checkGitStatus"; -import directoryInfo from "../../utils/directoryInfo"; -import type { - TransformCommandOptions, - TransformCommandArgument, -} from "./types"; -import { Runner } from "../../runner"; - -export default async function transform( - transform: TransformCommandArgument, - directory: TransformCommandArgument, - options: TransformCommandOptions -) { - const transforms = loadTransformers(); - if (options.list) { - console.log( - transforms - .map((transform) => `- ${chalk.cyan(transform.value)}`) - .join("\n") - ); - return process.exit(0); - } - - // check git status - if (!options.dry) { - checkGitStatus({ directory, force: options.force }); - } - - const answers = await inquirer.prompt<{ - directoryInput?: string; - transformerInput?: string; - }>([ - { - type: "input", - name: "directoryInput", - message: "Where is the root of the repo where the transform should run?", - when: !directory, - default: ".", - validate: (directory: string) => { - const { exists, absolute } = directoryInfo({ directory }); - if (exists) { - return true; - } else { - return `Directory ${chalk.dim(`(${absolute})`)} does not exist`; - } - }, - filter: (directory: string) => directory.trim(), - }, - { - type: "list", - name: "transformerInput", - message: "Which transform would you like to apply?", - when: !transform, - pageSize: transforms.length, - choices: transforms, - }, - ]); - - const { - directoryInput: selectedDirectory = directory as string, - transformerInput: selectedTransformer = transform as string, - } = answers; - const { exists, absolute: root } = directoryInfo({ - directory: selectedDirectory, - }); - if (!exists) { - console.error(`Directory ${chalk.dim(`(${root})`)} does not exist`); - return process.exit(1); - } - - const transformKeys = transforms.map((transform) => transform.value); - const transformData = transforms.find( - (transform) => transform.value === selectedTransformer - ); - - // validate transforms - if (!transformData) { - console.error( - `Invalid transform choice ${chalk.dim(`(${transform})`)}, pick one of:` - ); - console.error(transformKeys.map((key) => `- ${key}`).join("\n")); - return process.exit(1); - } - - // run the transform - const result = transformData.transformer({ - root, - options, - }); - - if (result.fatalError) { - // Runner already logs this, so we can just exit - return process.exit(1); - } - - Runner.logResults(result); -} diff --git a/packages/turbo-codemod/src/commands/transform/types.ts b/packages/turbo-codemod/src/commands/transform/types.ts deleted file mode 100644 index 9ac2db0..0000000 --- a/packages/turbo-codemod/src/commands/transform/types.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { TransformerOptions } from "../../types"; - -export type TransformCommandArgument = "string" | undefined; - -export interface TransformCommandOptions extends TransformerOptions { - list: boolean; -} diff --git a/packages/turbo-codemod/src/runner/FileTransform.ts b/packages/turbo-codemod/src/runner/FileTransform.ts deleted file mode 100644 index 3b23f73..0000000 --- a/packages/turbo-codemod/src/runner/FileTransform.ts +++ /dev/null @@ -1,94 +0,0 @@ -import chalk from "chalk"; -import { diffLines, Change, diffJson } from "diff"; -import fs from "fs-extra"; -import os from "os"; -import path from "path"; - -import type { FileTransformArgs, LogFileArgs } from "./types"; - -export default class FileTransform { - filePath: string; - rootPath: string; - before: string | object; - after?: string | object; - error?: Error; - changes: Array<Change> = []; - - constructor(args: FileTransformArgs) { - this.filePath = args.filePath; - this.rootPath = args.rootPath; - this.after = args.after; - this.error = args.error; - - // load original file for comparison - if (args.before === undefined) { - try { - if (path.extname(args.filePath) === ".json") { - this.before = fs.readJsonSync(args.filePath); - } else { - this.before = fs.readFileSync(args.filePath); - } - } catch (err) { - this.before = ""; - } - } else if (args.before === null) { - this.before = ""; - } else { - this.before = args.before; - } - - // determine diff - if (args.after) { - if (typeof this.before === "object" || typeof args.after === "object") { - this.changes = diffJson(this.before, args.after); - } else { - this.changes = diffLines(this.before, args.after); - } - } else { - this.changes = []; - } - } - - fileName(): string { - return path.relative(this.rootPath, this.filePath); - } - - write(): void { - if (this.after) { - if (typeof this.after === "object") { - fs.writeJsonSync(this.filePath, this.after, { spaces: 2 }); - } else { - fs.writeFileSync(this.filePath, this.after); - } - } - } - - additions(): number { - return this.changes.filter((c) => c.added).length; - } - - deletions(): number { - return this.changes.filter((c) => c.removed).length; - } - - hasChanges(): boolean { - return this.additions() > 0 || this.deletions() > 0; - } - - log(args: LogFileArgs): void { - if (args.diff) { - this.changes.forEach((part) => { - if (part.added) { - process.stdout.write(chalk.green(part.value)); - } else if (part.removed) { - process.stdout.write(chalk.red(part.value)); - } else { - process.stdout.write(chalk.dim(part.value)); - } - }); - console.log(os.EOL); - } else { - console.log(this.after); - } - } -} diff --git a/packages/turbo-codemod/src/runner/Runner.ts b/packages/turbo-codemod/src/runner/Runner.ts deleted file mode 100644 index 8f8803d..0000000 --- a/packages/turbo-codemod/src/runner/Runner.ts +++ /dev/null @@ -1,132 +0,0 @@ -import chalk from "chalk"; - -import FileTransform from "./FileTransform"; -import Logger from "../utils/logger"; -import type { UtilityArgs } from "../types"; -import type { - FileResult, - ModifyFileArgs, - AbortTransformArgs, - TransformerResults, -} from "./types"; - -class Runner { - transform: string; - rootPath: string; - dry: boolean; - print: boolean; - modifications: Record<string, FileTransform> = {}; - logger: Logger; - - constructor(options: UtilityArgs) { - this.transform = options.transformer; - this.rootPath = options.rootPath; - this.dry = options.dry; - this.print = options.print; - this.logger = new Logger(options); - } - - abortTransform(args: AbortTransformArgs): TransformerResults { - this.logger.error(args.reason); - return { - fatalError: new Error(args.reason), - changes: args.changes || {}, - }; - } - - // add a file to be transformed - modifyFile(args: ModifyFileArgs): void { - this.modifications[args.filePath] = new FileTransform({ - rootPath: this.rootPath, - ...args, - }); - } - - // execute all transforms and track results for reporting - finish(): TransformerResults { - const results: TransformerResults = { changes: {} }; - // perform all actions and track results - Object.keys(this.modifications).forEach((filePath) => { - const mod = this.modifications[filePath]; - const result: FileResult = { - action: "unchanged", - additions: mod.additions(), - deletions: mod.deletions(), - }; - - if (mod.hasChanges()) { - if (this.dry) { - result.action = "skipped"; - this.logger.skipped(chalk.dim(mod.fileName())); - } else { - try { - mod.write(); - result.action = "modified"; - this.logger.modified(chalk.bold(mod.fileName())); - } catch (err) { - let message = "Unknown error"; - if (err instanceof Error) { - message = err.message; - } - result.error = new Error(message); - result.action = "error"; - this.logger.error(mod.fileName(), message); - } - } - - if (this.print) { - mod.log({ diff: true }); - } - } else { - this.logger.unchanged(chalk.dim(mod.fileName())); - } - - results.changes[mod.fileName()] = result; - }); - - const encounteredError = Object.keys(results.changes).some((fileName) => { - return results.changes[fileName].action === "error"; - }); - - if (encounteredError) { - return this.abortTransform({ - reason: "Encountered an error while transforming files", - changes: results.changes, - }); - } - - return results; - } - - static logResults(results: TransformerResults): void { - const changedFiles = Object.keys(results.changes); - console.log(); - if (changedFiles.length > 0) { - console.log(chalk.bold(`Results:`)); - const table: Record< - string, - { - action: FileResult["action"]; - additions: FileResult["additions"]; - deletions: FileResult["deletions"]; - error?: string; - } - > = {}; - - changedFiles.forEach((fileName) => { - const fileChanges = results.changes[fileName]; - table[fileName] = { - action: fileChanges.action, - additions: fileChanges.additions, - deletions: fileChanges.deletions, - error: fileChanges.error?.message || "None", - }; - }); - - console.table(table); - console.log(); - } - } -} - -export default Runner; diff --git a/packages/turbo-codemod/src/runner/index.ts b/packages/turbo-codemod/src/runner/index.ts deleted file mode 100644 index 2aa323d..0000000 --- a/packages/turbo-codemod/src/runner/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { default as Runner } from "./Runner"; - -export type { TransformerResults, FileDiffer, FileWriter } from "./types"; diff --git a/packages/turbo-codemod/src/runner/types.ts b/packages/turbo-codemod/src/runner/types.ts deleted file mode 100644 index e7c37d4..0000000 --- a/packages/turbo-codemod/src/runner/types.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Change } from "diff"; - -export interface FileResult { - action: "skipped" | "modified" | "unchanged" | "error"; - error?: Error; - additions: number; - deletions: number; -} - -export interface FileTransformArgs extends ModifyFileArgs { - rootPath: string; -} - -export interface ModifyFileArgs { - filePath: string; - before?: string | object; - after?: string | object; - error?: Error; -} - -export interface AbortTransformArgs { - reason: string; - changes?: Record<string, FileResult>; -} - -export interface LogFileArgs { - diff?: boolean; -} - -export type FileWriter = (filePath: string, contents: string | object) => void; - -export type FileDiffer = ( - before: string | object, - after: string | object -) => Array<Change>; - -export interface TransformerResults { - fatalError?: Error; - changes: Record<string, FileResult>; -} diff --git a/packages/turbo-codemod/src/transforms/README.md b/packages/turbo-codemod/src/transforms/README.md deleted file mode 100644 index 8e4430f..0000000 --- a/packages/turbo-codemod/src/transforms/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# `@turbo/codemod` Transformers - -## Adding new transformers - -Add new transformers using the [plopjs](https://github.com/plopjs/plop) template by running: - -```bash -pnpm add-transformer -``` - -New Transformers will be automatically surfaced to the `transform` CLI command and used by the `migrate` CLI command when appropriate. - -## How it works - -Transformers are loaded automatically from the `src/transforms/` directory via the [`loadTransforms`](../utils/loadTransformers.ts) function. - -All new transformers must contain a default export that matches the [`Transformer`](../types.ts) type: - -```ts -export type Transformer = { - name: string; - value: string; - introducedIn: string; - transformer: (args: TransformerArgs) => TransformerResults; -}; -``` - -## Writing a Transform - -Transforms are ran using the [TransformRunner](../runner/Runner.ts). This class is designed to make writing transforms as simple as possible by abstracting away all of the boilerplate that determines what should be logged, saved, or output as a result. - -To use the TransformRunner: - -1. Transform each file in memory (do not write it back to disk `TransformRunner` takes care of this depending on the options passed in by the user), and pass to `TransformRunner.modifyFile` method. -2. If the transform encounters an unrecoverable error, pass it to the `TransformRunner.abortTransform` method. -3. When all files have been modified and passed to `TransformRunner.modifyFile`, call `TransformRunner.finish` method to write the files to disk (when not running in `dry` mode) and log the results. diff --git a/packages/turbo-codemod/src/transforms/add-package-manager.ts b/packages/turbo-codemod/src/transforms/add-package-manager.ts deleted file mode 100644 index bd6581f..0000000 --- a/packages/turbo-codemod/src/transforms/add-package-manager.ts +++ /dev/null @@ -1,75 +0,0 @@ -import path from "path"; -import fs from "fs-extra"; - -import getPackageManager from "../utils/getPackageManager"; -import getPackageManagerVersion from "../utils/getPackageManagerVersion"; -import getTransformerHelpers from "../utils/getTransformerHelpers"; -import { TransformerResults } from "../runner"; -import type { TransformerArgs } from "../types"; - -// transformer details -const TRANSFORMER = "add-package-manager"; -const DESCRIPTION = "Set the `packageManager` key in root `package.json` file"; -const INTRODUCED_IN = "1.1.0"; - -export function transformer({ - root, - options, -}: TransformerArgs): TransformerResults { - const { log, runner } = getTransformerHelpers({ - transformer: TRANSFORMER, - rootPath: root, - options, - }); - - log.info(`Set "packageManager" key in root "package.json" file...`); - const packageManager = getPackageManager({ directory: root }); - if (!packageManager) { - return runner.abortTransform({ - reason: `Unable to determine package manager for ${root}`, - }); - } - - // handle workspaces... - let version = null; - try { - version = getPackageManagerVersion(packageManager, root); - } catch (err) { - return runner.abortTransform({ - reason: `Unable to determine package manager version for ${root}`, - }); - } - const pkgManagerString = `${packageManager}@${version}`; - const rootPackageJsonPath = path.join(root, "package.json"); - const rootPackageJson = fs.readJsonSync(rootPackageJsonPath); - const allWorkspaces = [ - { - name: "package.json", - path: root, - packageJson: { - ...rootPackageJson, - packageJsonPath: rootPackageJsonPath, - }, - }, - ]; - - for (const workspace of allWorkspaces) { - const { packageJsonPath, ...pkgJson } = workspace.packageJson; - const newJson = { ...pkgJson, packageManager: pkgManagerString }; - runner.modifyFile({ - filePath: packageJsonPath, - after: newJson, - }); - } - - return runner.finish(); -} - -const transformerMeta = { - name: `${TRANSFORMER}: ${DESCRIPTION}`, - value: TRANSFORMER, - introducedIn: INTRODUCED_IN, - transformer, -}; - -export default transformerMeta; diff --git a/packages/turbo-codemod/src/transforms/create-turbo-config.ts b/packages/turbo-codemod/src/transforms/create-turbo-config.ts deleted file mode 100644 index 0e8549a..0000000 --- a/packages/turbo-codemod/src/transforms/create-turbo-config.ts +++ /dev/null @@ -1,70 +0,0 @@ -import fs from "fs-extra"; -import path from "path"; - -import { TransformerResults } from "../runner"; -import getTransformerHelpers from "../utils/getTransformerHelpers"; -import type { TransformerArgs } from "../types"; - -// transformer details -const TRANSFORMER = "create-turbo-config"; -const DESCRIPTION = - 'Create the `turbo.json` file from an existing "turbo" key in `package.json`'; -const INTRODUCED_IN = "1.1.0"; - -export function transformer({ - root, - options, -}: TransformerArgs): TransformerResults { - const { log, runner } = getTransformerHelpers({ - transformer: TRANSFORMER, - rootPath: root, - options, - }); - - log.info(`Migrating "package.json" "turbo" key to "turbo.json" file...`); - const turboConfigPath = path.join(root, "turbo.json"); - const rootPackageJsonPath = path.join(root, "package.json"); - if (!fs.existsSync(rootPackageJsonPath)) { - return runner.abortTransform({ - reason: `No package.json found at ${root}. Is the path correct?`, - }); - } - - // read files - const rootPackageJson = fs.readJsonSync(rootPackageJsonPath); - let rootTurboJson = null; - try { - rootTurboJson = fs.readJSONSync(turboConfigPath); - } catch (err) { - rootTurboJson = null; - } - - // modify files - let transformedPackageJson = rootPackageJson; - let transformedTurboConfig = rootTurboJson; - if (!rootTurboJson && rootPackageJson["turbo"]) { - const { turbo: turboConfig, ...remainingPkgJson } = rootPackageJson; - transformedTurboConfig = turboConfig; - transformedPackageJson = remainingPkgJson; - } - - runner.modifyFile({ - filePath: turboConfigPath, - after: transformedTurboConfig, - }); - runner.modifyFile({ - filePath: rootPackageJsonPath, - after: transformedPackageJson, - }); - - return runner.finish(); -} - -const transformerMeta = { - name: `${TRANSFORMER}: ${DESCRIPTION}`, - value: TRANSFORMER, - introducedIn: INTRODUCED_IN, - transformer, -}; - -export default transformerMeta; diff --git a/packages/turbo-codemod/src/transforms/migrate-env-var-dependencies.ts b/packages/turbo-codemod/src/transforms/migrate-env-var-dependencies.ts deleted file mode 100644 index ef3a34c..0000000 --- a/packages/turbo-codemod/src/transforms/migrate-env-var-dependencies.ts +++ /dev/null @@ -1,181 +0,0 @@ -import fs from "fs-extra"; -import path from "path"; -import { getTurboConfigs } from "@turbo/utils"; -import type { Schema, Pipeline } from "@turbo/types"; - -import getTransformerHelpers from "../utils/getTransformerHelpers"; -import { TransformerResults } from "../runner"; -import type { TransformerArgs } from "../types"; - -// transformer details -const TRANSFORMER = "migrate-env-var-dependencies"; -const DESCRIPTION = - 'Migrate environment variable dependencies from "dependsOn" to "env" in `turbo.json`'; -const INTRODUCED_IN = "1.5.0"; - -export function hasLegacyEnvVarDependencies(config: Schema) { - const dependsOn = [ - "extends" in config ? [] : config.globalDependencies, - Object.values(config.pipeline).flatMap( - (pipeline) => pipeline.dependsOn ?? [] - ), - ].flat(); - const envVars = dependsOn.filter((dep) => dep?.startsWith("$")); - return { hasKeys: !!envVars.length, envVars }; -} - -export function migrateDependencies({ - env, - deps, -}: { - env?: string[]; - deps?: string[]; -}) { - const envDeps: Set<string> = new Set(env); - const otherDeps: string[] = []; - deps?.forEach((dep) => { - if (dep.startsWith("$")) { - envDeps.add(dep.slice(1)); - } else { - otherDeps.push(dep); - } - }); - if (envDeps.size) { - return { - deps: otherDeps, - env: Array.from(envDeps), - }; - } else { - return { env, deps }; - } -} - -export function migratePipeline(pipeline: Pipeline) { - const { deps: dependsOn, env } = migrateDependencies({ - env: pipeline.env, - deps: pipeline.dependsOn, - }); - const migratedPipeline = { ...pipeline }; - if (dependsOn) { - migratedPipeline.dependsOn = dependsOn; - } else { - delete migratedPipeline.dependsOn; - } - if (env && env.length) { - migratedPipeline.env = env; - } else { - delete migratedPipeline.env; - } - - return migratedPipeline; -} - -export function migrateGlobal(config: Schema) { - if ("extends" in config) { - return config; - } - - const { deps: globalDependencies, env } = migrateDependencies({ - env: config.globalEnv, - deps: config.globalDependencies, - }); - const migratedConfig = { ...config }; - if (globalDependencies && globalDependencies.length) { - migratedConfig.globalDependencies = globalDependencies; - } else { - delete migratedConfig.globalDependencies; - } - if (env && env.length) { - migratedConfig.globalEnv = env; - } else { - delete migratedConfig.globalEnv; - } - return migratedConfig; -} - -export function migrateConfig(config: Schema) { - let migratedConfig = migrateGlobal(config); - Object.keys(config.pipeline).forEach((pipelineKey) => { - config.pipeline; - if (migratedConfig.pipeline && config.pipeline[pipelineKey]) { - const pipeline = migratedConfig.pipeline[pipelineKey]; - migratedConfig.pipeline[pipelineKey] = { - ...pipeline, - ...migratePipeline(pipeline), - }; - } - }); - return migratedConfig; -} - -export function transformer({ - root, - options, -}: TransformerArgs): TransformerResults { - const { log, runner } = getTransformerHelpers({ - transformer: TRANSFORMER, - rootPath: root, - options, - }); - - log.info( - `Migrating environment variable dependencies from "globalDependencies" and "dependsOn" to "env" in "turbo.json"...` - ); - - // validate we don't have a package.json config - const packageJsonPath = path.join(root, "package.json"); - let packageJSON = {}; - try { - packageJSON = fs.readJSONSync(packageJsonPath); - } catch (e) { - // readJSONSync probably failed because the file doesn't exist - } - - if ("turbo" in packageJSON) { - return runner.abortTransform({ - reason: - '"turbo" key detected in package.json. Run `npx @turbo/codemod transform create-turbo-config` first', - }); - } - - // validate we have a root config - const turboConfigPath = path.join(root, "turbo.json"); - if (!fs.existsSync(turboConfigPath)) { - return runner.abortTransform({ - reason: `No turbo.json found at ${root}. Is the path correct?`, - }); - } - - let turboJson: Schema = fs.readJsonSync(turboConfigPath); - if (hasLegacyEnvVarDependencies(turboJson).hasKeys) { - turboJson = migrateConfig(turboJson); - } - - runner.modifyFile({ - filePath: turboConfigPath, - after: turboJson, - }); - - // find and migrate any workspace configs - const workspaceConfigs = getTurboConfigs(root); - workspaceConfigs.forEach((workspaceConfig) => { - const { config, turboConfigPath } = workspaceConfig; - if (hasLegacyEnvVarDependencies(config).hasKeys) { - runner.modifyFile({ - filePath: turboConfigPath, - after: migrateConfig(config), - }); - } - }); - - return runner.finish(); -} - -const transformerMeta = { - name: `${TRANSFORMER}: ${DESCRIPTION}`, - value: TRANSFORMER, - introducedIn: INTRODUCED_IN, - transformer, -}; - -export default transformerMeta; diff --git a/packages/turbo-codemod/src/transforms/set-default-outputs.ts b/packages/turbo-codemod/src/transforms/set-default-outputs.ts deleted file mode 100644 index 44f7fd1..0000000 --- a/packages/turbo-codemod/src/transforms/set-default-outputs.ts +++ /dev/null @@ -1,97 +0,0 @@ -import path from "path"; -import fs from "fs-extra"; -import { getTurboConfigs } from "@turbo/utils"; -import type { Schema as TurboJsonSchema } from "@turbo/types"; - -import type { TransformerArgs } from "../types"; -import getTransformerHelpers from "../utils/getTransformerHelpers"; -import { TransformerResults } from "../runner"; - -const DEFAULT_OUTPUTS = ["dist/**", "build/**"]; - -// transformer details -const TRANSFORMER = "set-default-outputs"; -const DESCRIPTION = - 'Add the "outputs" key with defaults where it is missing in `turbo.json`'; -const INTRODUCED_IN = "1.7.0"; - -function migrateConfig(config: TurboJsonSchema) { - for (const [_, taskDef] of Object.entries(config.pipeline)) { - if (taskDef.cache !== false) { - if (!taskDef.outputs) { - taskDef.outputs = DEFAULT_OUTPUTS; - } else if ( - Array.isArray(taskDef.outputs) && - taskDef.outputs.length === 0 - ) { - delete taskDef.outputs; - } - } - } - - return config; -} - -export function transformer({ - root, - options, -}: TransformerArgs): TransformerResults { - const { log, runner } = getTransformerHelpers({ - transformer: TRANSFORMER, - rootPath: root, - options, - }); - - // If `turbo` key is detected in package.json, require user to run the other codemod first. - const packageJsonPath = path.join(root, "package.json"); - // package.json should always exist, but if it doesn't, it would be a silly place to blow up this codemod - let packageJSON = {}; - - try { - packageJSON = fs.readJSONSync(packageJsonPath); - } catch (e) { - // readJSONSync probably failed because the file doesn't exist - } - - if ("turbo" in packageJSON) { - return runner.abortTransform({ - reason: - '"turbo" key detected in package.json. Run `npx @turbo/codemod transform create-turbo-config` first', - }); - } - - log.info(`Adding default \`outputs\` key into tasks if it doesn't exist`); - const turboConfigPath = path.join(root, "turbo.json"); - if (!fs.existsSync(turboConfigPath)) { - return runner.abortTransform({ - reason: `No turbo.json found at ${root}. Is the path correct?`, - }); - } - - const turboJson: TurboJsonSchema = fs.readJsonSync(turboConfigPath); - runner.modifyFile({ - filePath: turboConfigPath, - after: migrateConfig(turboJson), - }); - - // find and migrate any workspace configs - const workspaceConfigs = getTurboConfigs(root); - workspaceConfigs.forEach((workspaceConfig) => { - const { config, turboConfigPath } = workspaceConfig; - runner.modifyFile({ - filePath: turboConfigPath, - after: migrateConfig(config), - }); - }); - - return runner.finish(); -} - -const transformerMeta = { - name: `${TRANSFORMER}: ${DESCRIPTION}`, - value: TRANSFORMER, - introducedIn: INTRODUCED_IN, - transformer, -}; - -export default transformerMeta; diff --git a/packages/turbo-codemod/src/types.ts b/packages/turbo-codemod/src/types.ts deleted file mode 100644 index d5c13c3..0000000 --- a/packages/turbo-codemod/src/types.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { TransformerResults } from "./runner"; - -export type Transformer = { - name: string; - value: string; - introducedIn: string; - transformer: (args: TransformerArgs) => TransformerResults; -}; - -export type TransformerOptions = { - force: boolean; - dry: boolean; - print: boolean; -}; - -export type TransformerArgs = { - root: string; - options: TransformerOptions; -}; - -export interface UtilityArgs extends TransformerOptions { - transformer: string; - rootPath: string; -} diff --git a/packages/turbo-codemod/src/utils/checkGitStatus.ts b/packages/turbo-codemod/src/utils/checkGitStatus.ts deleted file mode 100644 index 68d39ae..0000000 --- a/packages/turbo-codemod/src/utils/checkGitStatus.ts +++ /dev/null @@ -1,40 +0,0 @@ -import chalk from "chalk"; -import isGitClean from "is-git-clean"; - -export default function checkGitStatus({ - directory, - force, -}: { - directory?: string; - force: boolean; -}) { - let clean = false; - let errorMessage = "Unable to determine if git directory is clean"; - try { - clean = isGitClean.sync(directory || process.cwd()); - errorMessage = "Git directory is not clean"; - } catch (err: any) { - if (err && err.stderr && err.stderr.indexOf("not a git repository") >= 0) { - clean = true; - } - } - - if (!clean) { - if (force) { - console.log( - `${chalk.yellow("WARNING")}: ${errorMessage}. Forcibly continuing...` - ); - } else { - console.log("Thank you for using @turbo/codemod!"); - console.log( - chalk.yellow( - "\nBut before we continue, please stash or commit your git changes." - ) - ); - console.log( - "\nYou may use the --force flag to override this safety check." - ); - process.exit(1); - } - } -} diff --git a/packages/turbo-codemod/src/utils/directoryInfo.ts b/packages/turbo-codemod/src/utils/directoryInfo.ts deleted file mode 100644 index 7cb3594..0000000 --- a/packages/turbo-codemod/src/utils/directoryInfo.ts +++ /dev/null @@ -1,10 +0,0 @@ -import path from "path"; -import fs from "fs"; - -export default function directoryInfo({ directory }: { directory: string }) { - const dir = path.isAbsolute(directory) - ? directory - : path.join(process.cwd(), directory); - - return { exists: fs.existsSync(dir), absolute: dir }; -} diff --git a/packages/turbo-codemod/src/utils/getPackageManager.ts b/packages/turbo-codemod/src/utils/getPackageManager.ts deleted file mode 100644 index 1df0acc..0000000 --- a/packages/turbo-codemod/src/utils/getPackageManager.ts +++ /dev/null @@ -1,42 +0,0 @@ -import findUp from "find-up"; -import path from "path"; - -export type PackageManager = "yarn" | "pnpm" | "npm"; - -const cache: { [cwd: string]: PackageManager } = {}; - -export default function getPackageManager({ - directory, -}: { directory?: string } = {}): PackageManager | undefined { - const cwd = directory || process.cwd(); - if (cache[cwd]) { - return cache[cwd]; - } - - const lockFile = findUp.sync( - ["yarn.lock", "pnpm-lock.yaml", "package-lock.json"], - { - cwd, - } - ); - - if (!lockFile) { - return; - } - - switch (path.basename(lockFile)) { - case "yarn.lock": - cache[cwd] = "yarn"; - break; - - case "pnpm-lock.yaml": - cache[cwd] = "pnpm"; - break; - - case "package-lock.json": - cache[cwd] = "npm"; - break; - } - - return cache[cwd]; -} diff --git a/packages/turbo-codemod/src/utils/getPackageManagerVersion.ts b/packages/turbo-codemod/src/utils/getPackageManagerVersion.ts deleted file mode 100644 index 54a572a..0000000 --- a/packages/turbo-codemod/src/utils/getPackageManagerVersion.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { execSync } from "child_process"; -import type { PackageManager } from "./getPackageManager"; - -export default function getPackageManagerVersion( - packageManager: PackageManager, - root: string -): string { - switch (packageManager) { - case "yarn": - return execSync("yarn --version", { cwd: root }).toString().trim(); - case "pnpm": - return execSync("pnpm --version", { cwd: root }).toString().trim(); - case "npm": - return execSync("npm --version", { cwd: root }).toString().trim(); - } -} diff --git a/packages/turbo-codemod/src/utils/getTransformerHelpers.ts b/packages/turbo-codemod/src/utils/getTransformerHelpers.ts deleted file mode 100644 index e37da6e..0000000 --- a/packages/turbo-codemod/src/utils/getTransformerHelpers.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TransformerOptions } from "../types"; -import { Runner } from "../runner"; -import Logger from "./logger"; - -export default function getTransformerHelpers({ - transformer, - rootPath, - options, -}: { - transformer: string; - rootPath: string; - options: TransformerOptions; -}) { - const utilArgs = { - transformer, - rootPath, - ...options, - }; - const log = new Logger(utilArgs); - const runner = new Runner(utilArgs); - - return { log, runner }; -} diff --git a/packages/turbo-codemod/src/utils/loadTransformers.ts b/packages/turbo-codemod/src/utils/loadTransformers.ts deleted file mode 100644 index 9ba5ca1..0000000 --- a/packages/turbo-codemod/src/utils/loadTransformers.ts +++ /dev/null @@ -1,27 +0,0 @@ -import path from "path"; -import fs from "fs-extra"; -import type { Transformer } from "../types"; - -// transforms/ is a sibling when built in in dist/ -export const transformerDirectory = - process.env.NODE_ENV === "test" - ? path.join(__dirname, "../transforms") - : path.join(__dirname, "./transforms"); - -export default function loadTransformers(): Array<Transformer> { - const transformerFiles = fs.readdirSync(transformerDirectory); - return transformerFiles - .map((transformerFilename) => { - const transformerPath = path.join( - transformerDirectory, - transformerFilename - ); - try { - return require(transformerPath).default; - } catch (e) { - // we ignore this error because it's likely that the file is not a transformer (README, etc) - return undefined; - } - }) - .filter(Boolean); -} diff --git a/packages/turbo-codemod/src/utils/logger.ts b/packages/turbo-codemod/src/utils/logger.ts deleted file mode 100644 index 123a836..0000000 --- a/packages/turbo-codemod/src/utils/logger.ts +++ /dev/null @@ -1,47 +0,0 @@ -import chalk from "chalk"; -import { UtilityArgs } from "../types"; - -export default class Logger { - transform: string; - dry: boolean; - - constructor(args: UtilityArgs) { - this.transform = args.transformer; - this.dry = args.dry; - } - modified(...args: any[]) { - console.log( - chalk.green(` MODIFIED `), - ...args, - this.dry ? chalk.dim(`(dry run)`) : "" - ); - } - unchanged(...args: any[]) { - console.log( - chalk.gray(` UNCHANGED `), - ...args, - this.dry ? chalk.dim(`(dry run)`) : "" - ); - } - skipped(...args: any[]) { - console.log( - chalk.yellow(` SKIPPED `), - ...args, - this.dry ? chalk.dim(`(dry run)`) : "" - ); - } - error(...args: any[]) { - console.log( - chalk.red(` ERROR `), - ...args, - this.dry ? chalk.dim(`(dry run)`) : "" - ); - } - info(...args: any[]) { - console.log( - chalk.bold(` INFO `), - ...args, - this.dry ? chalk.dim(`(dry run)`) : "" - ); - } -} diff --git a/packages/turbo-codemod/src/utils/looksLikeRepo.ts b/packages/turbo-codemod/src/utils/looksLikeRepo.ts deleted file mode 100644 index 77f0e5c..0000000 --- a/packages/turbo-codemod/src/utils/looksLikeRepo.ts +++ /dev/null @@ -1,12 +0,0 @@ -import path from "path"; -import { existsSync } from "fs-extra"; - -const HINTS = ["package.json", "turbo.json", ".git"]; - -export default function looksLikeRepo({ - directory, -}: { - directory: string; -}): boolean { - return HINTS.some((hint) => existsSync(path.join(directory, hint))); -} diff --git a/packages/turbo-codemod/src/utils/notifyUpdate.ts b/packages/turbo-codemod/src/utils/notifyUpdate.ts deleted file mode 100644 index 634ffd8..0000000 --- a/packages/turbo-codemod/src/utils/notifyUpdate.ts +++ /dev/null @@ -1,35 +0,0 @@ -import chalk from "chalk"; -import checkForUpdate from "update-check"; - -import cliPkgJson from "../../package.json"; -import getWorkspaceImplementation from "./getPackageManager"; - -const update = checkForUpdate(cliPkgJson).catch(() => null); - -export default async function notifyUpdate(): Promise<void> { - try { - const res = await update; - if (res?.latest) { - const ws = getWorkspaceImplementation(); - - console.log(); - console.log( - chalk.yellow.bold("A new version of `@turbo/codemod` is available!") - ); - console.log( - "You can update by running: " + - chalk.cyan( - ws === "yarn" - ? "yarn global add @turbo/codemod" - : ws === "pnpm" - ? "pnpm i -g @turbo/codemod" - : "npm i -g @turbo/codemod" - ) - ); - console.log(); - } - process.exit(); - } catch (_e: any) { - // ignore error - } -} diff --git a/packages/turbo-codemod/templates/transformer.hbs b/packages/turbo-codemod/templates/transformer.hbs deleted file mode 100644 index 593490a..0000000 --- a/packages/turbo-codemod/templates/transformer.hbs +++ /dev/null @@ -1,45 +0,0 @@ -import { TransformerArgs } from "../types"; -import { TransformerResults } from "../runner"; -import getTransformerHelpers from "../utils/getTransformerHelpers"; - -// transformer details -const TRANSFORMER = "{{ name }}"; -const DESCRIPTION = "{{ description }}"; -const INTRODUCED_IN = "{{ introducedIn }}"; - -export function transformer({ - root, - options, -}: TransformerArgs): TransformerResults { - const { log, runner } = getTransformerHelpers({ - transformer: TRANSFORMER, - rootPath: root, - options, - }); - - log.info("Short description about {{ name }}") - - /* - Make changes to required files, and track each modified file with: - - runner.modifyFile({ - filePath: packageJsonPath, // absolute path to file - after: transformedFile, // file after modifications have been made - }); - - This automatically handles all cases of print / dry etc. - */ - - return runner.finish(); -} - -const transformerMeta = { - name: `${TRANSFORMER}: ${DESCRIPTION}`, - value: TRANSFORMER, - introducedIn: INTRODUCED_IN, - transformer, -}; - -export default transformerMeta; - - diff --git a/packages/turbo-codemod/templates/transformer.test.hbs b/packages/turbo-codemod/templates/transformer.test.hbs deleted file mode 100644 index c63a9df..0000000 --- a/packages/turbo-codemod/templates/transformer.test.hbs +++ /dev/null @@ -1,25 +0,0 @@ -import { transformer } from "../src/transforms/{{ name }}"; -import { setupTestFixtures } from "./test-utils"; - -describe("{{ name }}", () => { - - const { useFixture } = setupTestFixtures({ test: "{{ name }}" }); - - test("basic", () => { - // load the fixture for the test - const { root, read, readJson } = useFixture({ - fixture: "specific-fixture", - }); - - // run the transformer - const result = transformer({ - root, - options: { force: false, dry: false, print: false }, - }); - - // result should be correct - expect(result.fatalError).toBeUndefined(); - expect(result.changes).toMatchInlineSnapshot(); - }); -}); - diff --git a/packages/turbo-codemod/tsconfig.json b/packages/turbo-codemod/tsconfig.json deleted file mode 100644 index 0620a3c..0000000 --- a/packages/turbo-codemod/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "@turbo/tsconfig/library.json", - "compilerOptions": { - "rootDir": "." - } -} diff --git a/packages/turbo-codemod/tsup.config.ts b/packages/turbo-codemod/tsup.config.ts deleted file mode 100644 index 8e92107..0000000 --- a/packages/turbo-codemod/tsup.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { defineConfig, Options } from "tsup"; - -export default defineConfig((options: Options) => ({ - entry: ["src/cli.ts", "src/transforms/*.ts"], - format: ["cjs"], - clean: true, - minify: true, - ...options, -})); |
