"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createForProject = createForProject; exports.YarnPackageManager = exports.NpmPackageManager = void 0; function _ansiRegex() { const data = _interopRequireDefault(require("ansi-regex")); _ansiRegex = function () { return data; }; return data; } function _config() { const data = require("@expo/config"); _config = function () { return data; }; return data; } function _spawnAsync() { const data = _interopRequireDefault(require("@expo/spawn-async")); _spawnAsync = function () { return data; }; return data; } function _split() { const data = _interopRequireDefault(require("split")); _split = function () { return data; }; return data; } function _stream() { const data = require("stream"); _stream = function () { return data; }; return data; } function _npmPackageArg() { const data = _interopRequireDefault(require("npm-package-arg")); _npmPackageArg = function () { return data; }; return data; } function _fsExtra() { const data = _interopRequireDefault(require("fs-extra")); _fsExtra = function () { return data; }; return data; } function _path() { const data = _interopRequireDefault(require("path")); _path = function () { return data; }; return data; } function _detectIndent() { const data = _interopRequireDefault(require("detect-indent")); _detectIndent = function () { return data; }; return data; } function _detectNewline() { const data = _interopRequireDefault(require("detect-newline")); _detectNewline = function () { return data; }; return data; } function _log() { const data = _interopRequireDefault(require("./log")); _log = function () { return data; }; return data; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const ansi = `(?:${(0, _ansiRegex().default)().source})*`; const npmPeerDependencyWarningPattern = new RegExp(`${ansi}npm${ansi} ${ansi}WARN${ansi}.+You must install peer dependencies yourself\\.\n`, 'g'); const yarnPeerDependencyWarningPattern = new RegExp(`${ansi}warning${ansi} "[^"]+" has (?:unmet|incorrect) peer dependency "[^"]+"\\.\n`, 'g'); class NpmStderrTransform extends _stream().Transform { _transform(chunk, encoding, callback) { this.push(chunk.toString().replace(npmPeerDependencyWarningPattern, '')); callback(); } } class YarnStderrTransform extends _stream().Transform { _transform(chunk, encoding, callback) { this.push(chunk.toString().replace(yarnPeerDependencyWarningPattern, '')); callback(); } } class NpmPackageManager { constructor({ cwd }) { this.options = { cwd, stdio: ['inherit', 'inherit', 'pipe'] }; } get name() { return 'npm'; } async installAsync() { await this._runAsync(['install']); } async addAsync(...names) { const { versioned, unversioned } = this._parseSpecs(names); if (versioned.length) { await this._patchAsync(versioned, 'dependencies'); await this._runAsync(['install']); } if (unversioned.length) { await this._runAsync(['install', '--save', ...unversioned.map(spec => spec.raw)]); } } async addDevAsync(...names) { const { versioned, unversioned } = this._parseSpecs(names); if (versioned.length) { await this._patchAsync(versioned, 'devDependencies'); await this._runAsync(['install']); } if (unversioned.length) { await this._runAsync(['install', '--save-dev', ...unversioned.map(spec => spec.raw)]); } } // Private async _runAsync(args) { (0, _log().default)(`> npm ${args.join(' ')}`); const promise = (0, _spawnAsync().default)('npm', [...args], this.options); if (promise.child.stderr) { promise.child.stderr.pipe((0, _split().default)(/\r?\n/, line => line + '\n')).pipe(new NpmStderrTransform()).pipe(process.stderr); } await promise; } _parseSpecs(names) { const result = { versioned: [], unversioned: [] }; names.map(name => (0, _npmPackageArg().default)(name)).forEach(spec => { if (spec.rawSpec) { result.versioned.push(spec); } else { result.unversioned.push(spec); } }); return result; } async _patchAsync(specs, packageType) { const pkgPath = _path().default.join(this.options.cwd || '.', 'package.json'); const pkgRaw = await _fsExtra().default.readFile(pkgPath, { encoding: 'utf8', flag: 'r' }); const pkg = JSON.parse(pkgRaw); specs.forEach(spec => { pkg[packageType] = pkg[packageType] || {}; pkg[packageType][spec.name] = spec.rawSpec; }); await _fsExtra().default.writeJson(pkgPath, pkg, { spaces: (0, _detectIndent().default)(pkgRaw).indent, EOL: (0, _detectNewline().default)(pkgRaw) }); } } exports.NpmPackageManager = NpmPackageManager; class YarnPackageManager { constructor({ cwd }) { this.options = { cwd, stdio: ['inherit', 'inherit', 'pipe'] }; } get name() { return 'Yarn'; } async installAsync() { await this._runAsync(['install']); } async addAsync(...names) { await this._runAsync(['add', ...names]); } async addDevAsync(...names) { await this._runAsync(['add', '--dev', ...names]); } // Private async _runAsync(args) { (0, _log().default)(`> yarn ${args.join(' ')}`); const promise = (0, _spawnAsync().default)('yarnpkg', args, this.options); if (promise.child.stderr) { promise.child.stderr.pipe(new YarnStderrTransform()).pipe(process.stderr); } await promise; } } exports.YarnPackageManager = YarnPackageManager; function createForProject(projectRoot, options = {}) { let PackageManager; if (options.npm) { PackageManager = NpmPackageManager; } else if (options.yarn) { PackageManager = YarnPackageManager; } else if ((0, _config().isUsingYarn)(projectRoot)) { PackageManager = YarnPackageManager; } else { PackageManager = NpmPackageManager; } return new PackageManager({ cwd: projectRoot }); } //# sourceMappingURL=__sourcemaps__/PackageManager.js.map