18d3f3824SCedric van Putten"use strict";
28d3f3824SCedric van Puttenvar __importDefault = (this && this.__importDefault) || function (mod) {
38d3f3824SCedric van Putten    return (mod && mod.__esModule) ? mod : { "default": mod };
48d3f3824SCedric van Putten};
58d3f3824SCedric van PuttenObject.defineProperty(exports, "__esModule", { value: true });
68d3f3824SCedric van Puttenexports.NpmPackageManager = void 0;
78d3f3824SCedric van Puttenconst json_file_1 = __importDefault(require("@expo/json-file"));
88d3f3824SCedric van Puttenconst npm_package_arg_1 = __importDefault(require("npm-package-arg"));
98d3f3824SCedric van Puttenconst path_1 = __importDefault(require("path"));
108a424bebSJames Ideconst BasePackageManager_1 = require("./BasePackageManager");
118d3f3824SCedric van Puttenconst nodeWorkspaces_1 = require("../utils/nodeWorkspaces");
128d3f3824SCedric van Puttenconst spawn_1 = require("../utils/spawn");
138d3f3824SCedric van Puttenclass NpmPackageManager extends BasePackageManager_1.BasePackageManager {
14*1a3a1db5SEvan Bacon    name = 'npm';
15*1a3a1db5SEvan Bacon    bin = 'npm';
16*1a3a1db5SEvan Bacon    lockFile = nodeWorkspaces_1.NPM_LOCK_FILE;
178d3f3824SCedric van Putten    workspaceRoot() {
188d3f3824SCedric van Putten        const root = (0, nodeWorkspaces_1.findYarnOrNpmWorkspaceRoot)(this.ensureCwdDefined('workspaceRoot'));
198d3f3824SCedric van Putten        if (root) {
208d3f3824SCedric van Putten            return new NpmPackageManager({
218d3f3824SCedric van Putten                ...this.options,
228d3f3824SCedric van Putten                silent: this.silent,
238d3f3824SCedric van Putten                log: this.log,
248d3f3824SCedric van Putten                cwd: root,
258d3f3824SCedric van Putten            });
268d3f3824SCedric van Putten        }
278d3f3824SCedric van Putten        return null;
288d3f3824SCedric van Putten    }
298d3f3824SCedric van Putten    addAsync(namesOrFlags = []) {
308d3f3824SCedric van Putten        if (!namesOrFlags.length) {
318d3f3824SCedric van Putten            return this.installAsync();
328d3f3824SCedric van Putten        }
338d3f3824SCedric van Putten        const { flags, versioned, unversioned } = this.parsePackageSpecs(namesOrFlags);
348d3f3824SCedric van Putten        return (0, spawn_1.createPendingSpawnAsync)(() => this.updatePackageFileAsync(versioned, 'dependencies'), () => !unversioned.length
358d3f3824SCedric van Putten            ? this.runAsync(['install', ...flags])
368d3f3824SCedric van Putten            : this.runAsync(['install', '--save', ...flags, ...unversioned.map((spec) => spec.raw)]));
378d3f3824SCedric van Putten    }
388d3f3824SCedric van Putten    addDevAsync(namesOrFlags = []) {
398d3f3824SCedric van Putten        if (!namesOrFlags.length) {
408d3f3824SCedric van Putten            return this.installAsync();
418d3f3824SCedric van Putten        }
428d3f3824SCedric van Putten        const { flags, versioned, unversioned } = this.parsePackageSpecs(namesOrFlags);
438d3f3824SCedric van Putten        return (0, spawn_1.createPendingSpawnAsync)(() => this.updatePackageFileAsync(versioned, 'devDependencies'), () => !unversioned.length
448d3f3824SCedric van Putten            ? this.runAsync(['install', ...flags])
458d3f3824SCedric van Putten            : this.runAsync([
468d3f3824SCedric van Putten                'install',
478d3f3824SCedric van Putten                '--save-dev',
488d3f3824SCedric van Putten                ...flags,
498d3f3824SCedric van Putten                ...unversioned.map((spec) => spec.raw),
508d3f3824SCedric van Putten            ]));
518d3f3824SCedric van Putten    }
528d3f3824SCedric van Putten    addGlobalAsync(namesOrFlags = []) {
538d3f3824SCedric van Putten        if (!namesOrFlags.length) {
548d3f3824SCedric van Putten            return this.installAsync();
558d3f3824SCedric van Putten        }
568d3f3824SCedric van Putten        return this.runAsync(['install', '--global', ...namesOrFlags]);
578d3f3824SCedric van Putten    }
588d3f3824SCedric van Putten    removeAsync(namesOrFlags) {
598d3f3824SCedric van Putten        return this.runAsync(['uninstall', ...namesOrFlags]);
608d3f3824SCedric van Putten    }
618d3f3824SCedric van Putten    removeDevAsync(namesOrFlags) {
628d3f3824SCedric van Putten        return this.runAsync(['uninstall', '--save-dev', ...namesOrFlags]);
638d3f3824SCedric van Putten    }
648d3f3824SCedric van Putten    removeGlobalAsync(namesOrFlags) {
658d3f3824SCedric van Putten        return this.runAsync(['uninstall', '--global', ...namesOrFlags]);
668d3f3824SCedric van Putten    }
678d3f3824SCedric van Putten    /**
688d3f3824SCedric van Putten     * Parse all package specifications from the names or flag list.
698d3f3824SCedric van Putten     * The result from this method can be used for `.updatePackageFileAsync`.
708d3f3824SCedric van Putten     */
718d3f3824SCedric van Putten    parsePackageSpecs(namesOrFlags) {
728d3f3824SCedric van Putten        const result = { flags: [], versioned: [], unversioned: [] };
738d3f3824SCedric van Putten        namesOrFlags
748d3f3824SCedric van Putten            .map((name) => {
758d3f3824SCedric van Putten            if (name.trim().startsWith('-')) {
768d3f3824SCedric van Putten                result.flags.push(name);
778d3f3824SCedric van Putten                return null;
788d3f3824SCedric van Putten            }
798d3f3824SCedric van Putten            return (0, npm_package_arg_1.default)(name);
808d3f3824SCedric van Putten        })
818d3f3824SCedric van Putten            .forEach((spec) => {
828d3f3824SCedric van Putten            // When using a dist-tag version of a library, we need to consider it as "unversioned".
838d3f3824SCedric van Putten            // Doing so will install that version with `npm install --save(-dev)`, and resolve the dist-tag properly.
848d3f3824SCedric van Putten            if (spec && spec.rawSpec && spec.type !== 'tag') {
858d3f3824SCedric van Putten                result.versioned.push(spec);
868d3f3824SCedric van Putten            }
878d3f3824SCedric van Putten            else if (spec) {
888d3f3824SCedric van Putten                result.unversioned.push(spec);
898d3f3824SCedric van Putten            }
908d3f3824SCedric van Putten        });
918d3f3824SCedric van Putten        return result;
928d3f3824SCedric van Putten    }
938d3f3824SCedric van Putten    /**
948d3f3824SCedric van Putten     * Older npm versions have issues with mismatched nested dependencies when adding exact versions.
958d3f3824SCedric van Putten     * This propagates as issues like mismatched `@expo/config-pugins` versions.
968d3f3824SCedric van Putten     * As a workaround, we update the `package.json` directly and run `npm install`.
978d3f3824SCedric van Putten     */
988d3f3824SCedric van Putten    async updatePackageFileAsync(packageSpecs, packageType) {
998d3f3824SCedric van Putten        if (!packageSpecs.length) {
1008d3f3824SCedric van Putten            return;
1018d3f3824SCedric van Putten        }
1028d3f3824SCedric van Putten        const pkgPath = path_1.default.join(this.options.cwd?.toString() || '.', 'package.json');
1038d3f3824SCedric van Putten        const pkg = await json_file_1.default.readAsync(pkgPath);
1048d3f3824SCedric van Putten        packageSpecs.forEach((spec) => {
1058d3f3824SCedric van Putten            pkg[packageType] = pkg[packageType] || {};
1068d3f3824SCedric van Putten            pkg[packageType][spec.name] = spec.rawSpec;
1078d3f3824SCedric van Putten        });
1088d3f3824SCedric van Putten        await json_file_1.default.writeAsync(pkgPath, pkg, { json5: false });
1098d3f3824SCedric van Putten    }
1108d3f3824SCedric van Putten}
1118d3f3824SCedric van Puttenexports.NpmPackageManager = NpmPackageManager;
1128d3f3824SCedric van Putten//# sourceMappingURL=NpmPackageManager.js.map