aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/packages/turbo-codemod/src/transforms/add-package-manager.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/turbo-codemod/src/transforms/add-package-manager.ts')
-rw-r--r--packages/turbo-codemod/src/transforms/add-package-manager.ts75
1 files changed, 75 insertions, 0 deletions
diff --git a/packages/turbo-codemod/src/transforms/add-package-manager.ts b/packages/turbo-codemod/src/transforms/add-package-manager.ts
new file mode 100644
index 0000000..bd6581f
--- /dev/null
+++ b/packages/turbo-codemod/src/transforms/add-package-manager.ts
@@ -0,0 +1,75 @@
+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;