Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[wip] Use packageJson key for deepMerge or function #1064

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 56 additions & 6 deletions lib/dependency-manager-adapters/base.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,27 @@ const Backup = require('../utils/backup');
const { warn } = require('../utils/console');
const { LOCKFILE, PACKAGE_JSON } = require('../utils/package-managers');

function merge(a, b) {
const copy = {...a};

for (const k in b) {
// for merging arrays, provide your own function
if (Array.isArray(k)) {
copy[k] = b[k];
}

else if (typeof b[k] === 'object') {
copy[k] = merge(a[k] ?? {}, b[k]);
}

else {
copy[k] = b[k];
}
}

return copy;
}

class BaseAdapter {
configKey = 'npm';
defaultInstallOptions = [];
Expand Down Expand Up @@ -41,13 +62,37 @@ class BaseAdapter {
await this.backup.addFiles([PACKAGE_JSON, this.lockfile]);
}

async changeToDependencySet(dependencySet) {
await this.applyDependencySet(dependencySet);
await this._install(dependencySet);
async changePackage(packageJson) {
// packageJson can be a function
// this.debug('Change package with: %s', JSON.stringify(packageJson));

const oldPackageJSON = JSON.parse(fs.readFileSync(this.backup.pathForFile(PACKAGE_JSON)));
const newPackageJSON = this._applyPackageChanges(oldPackageJSON, packageJson);

this.debug('Write package.json with: \n', JSON.stringify(newPackageJSON));

fs.writeFileSync(path.join(this.cwd, PACKAGE_JSON), JSON.stringify(newPackageJSON, null, 2));

// find the delta of deps
// put in the delta here
await this._install({});

// ... and here
return this._findChangedDependencies(newPackageJSON);
}

_applyPackageChanges(originalPackage, packageChanges) {
if (typeof packageChanges === 'function') {
return packageChanges(originalPackage);
}

return merge(originalPackage, packageChanges);
}

async _findChangedDependencies(packageJson) {
const dependencies = {
...dependencySet.dependencies,
...dependencySet.devDependencies,
...packageJson.dependencies,
...packageJson.devDependencies,
};

const currentDependencies = Object.keys(dependencies).map((name) => ({
Expand All @@ -58,8 +103,13 @@ class BaseAdapter {
}));

this.debug('Switched to dependencies: \n', currentDependencies);
}

async changeToDependencySet(dependencySet) {
await this.applyDependencySet(dependencySet);
await this._install(dependencySet);

return currentDependencies;
return this._findChangedDependencies(dependencySet);
}

async applyDependencySet(dependencySet) {
Expand Down
7 changes: 7 additions & 0 deletions lib/utils/scenario-manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@ module.exports = class ScenarioManager {
let results = [];

for (let depManager of this.dependencyManagerAdapters) {
if ('packageJson' in scenario) {
let depManagerResults = await depManager.changePackage(
scenario.packageJson
);
results.push(...depManagerResults);
}

if (scenario[depManager.configKey]) {
let depManagerResults = await depManager.changeToDependencySet(
scenario[depManager.configKey],
Expand Down