1#!/usr/bin/env node
2
3const fs = require('fs');
4const path = require('path');
5
6function removePackages(expoDirectory, projectDirectory, packagesToRemove) {
7  const pkgJson = require(path.resolve(projectDirectory, './package.json'));
8  const symlinks = pkgJson.expo.symlinks;
9  const nextSymlinks = [];
10
11  symlinks.forEach((packageName) => {
12    if (!packagesToRemove.includes(packageName)) {
13      nextSymlinks.push(packageName);
14    } else {
15      delete pkgJson.dependencies[packageName];
16
17      const nodeModulesPackage = path.resolve(projectDirectory, 'node_modules', packageName);
18
19      fs.rmSync(nodeModulesPackage, { recursive: true });
20    }
21  });
22
23  nextSymlinks.forEach((packageName) => {
24    const pathToPackage = path.resolve(expoDirectory, 'packages', packageName);
25
26    const nodeModulesPackage = path.resolve(projectDirectory, 'node_modules', packageName);
27
28    const pkg = require(path.resolve(pathToPackage, 'package.json'));
29    const version = pkg.version || '*';
30
31    pkgJson.dependencies[packageName] = version;
32
33    if (fs.existsSync(nodeModulesPackage)) {
34      fs.rmSync(nodeModulesPackage, { recursive: true });
35    }
36
37    fs.symlinkSync(pathToPackage, nodeModulesPackage);
38  });
39
40  pkgJson.expo.symlinks = nextSymlinks;
41
42  fs.writeFileSync(
43    path.resolve(projectDirectory, './package.json'),
44    JSON.stringify(pkgJson, null, 2),
45    { encoding: 'utf-8' }
46  );
47
48  console.log('Removing packages complete');
49}
50
51const [expoDirectory, projectDirectory, ...packageNames] = process.argv.slice(2);
52removePackages(expoDirectory, projectDirectory, packageNames);
53